训练具有大线性输出的神经网络

时间:2013-03-28 22:50:48

标签: neural-network backpropagation reinforcement-learning

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

我有三个输入,归一化为[0,1]。还有三个输出节点,它们提供从环境中获得的奖励。奖励总是消极的。一开始,当选择的行为导致错误的决定时,它可能像-50000,做出好的决定可能是-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];
    }
}

1 个答案:

答案 0 :(得分:2)

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

强调我的

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

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