【问题标题】:Training Neural Networks with big linear output训练具有大线性输出的神经网络
【发布时间】:2013-03-19 13:58:07
【问题描述】:

我正在编写一个前馈神经网络,我想将它与强化学习结合使用。我有一个以 tanh 作为激活函数的隐藏层和一个线性输出层。

我有三个归一化为 [0,1] 的输入。还有三个输出节点,它给出了从环境中获得的奖励。回报总是负面的。 At the beginning, when the chosen actions lead to bad decisions, it can be like -50000, with good decisions it can be -5.

我正在努力实现反向传播。由于奖励如此之大,因此误差值很大,从而产生了巨大的权重。经过几轮训练,隐藏层的权重如此之大,我在隐藏层中的节点只创建了值 -1 或 1。

这是我的代码:

public void trainState(double[] observation, double[] hiddenEnergy, double oldVal, int chosenAction, double target, double lambda)
{
    double deltaK = (target - oldVal) * lambda;
    double deltaJ;

    for (int j = 0; j < _hiddenSize; j++)
    {
        deltaJ = (1- hiddenEnergy[j] * hiddenEnergy[j]) * deltaK * _toOutputWeights[j][chosenAction];

        for (int i = 0; i < _inputSize; i++)
        {
            _toHiddenWeights[i][j] += deltaJ * observation[i];
        }
    }

    for (int i = 0; i < _hiddenSize; i++)
    {
        _toOutputWeights[i][chosenAction] += deltaK * hiddenEnergy[i];
    }
}

【问题讨论】:

    标签: neural-network backpropagation reinforcement-learning


    【解决方案1】:

    你说: “由于奖励是如此,错误值是巨大,这会产生巨大的权重。”

    强调我的

    我建议使用奖励日志。这是控制巨大值的数学标准技巧。这样,您的错误和权重将更易于管理。

    log_of_rewards = log(rewards);
    // use this value in calculations
    

    【讨论】:

    • 使用 log 方法没有帮助,但你的想法引出了另一个想法:我找到了一种将奖励标准化为 [-1,1] 的方法,这让事情变得更容易。
    猜你喜欢
    • 1970-01-01
    • 2011-04-07
    • 1970-01-01
    • 2017-04-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-20
    相关资源
    最近更新 更多