1

我正在编写一个前馈神经网络,我想将它与强化学习结合使用。我有一个以 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];
    }
}
4

1 回答 1

2

你说:“既然奖励这么,那么误差值就很大,这就产生了巨大的权重。”

强调我的

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

log_of_rewards = log(rewards);
// use this value in calculations
于 2013-03-29T20:59:11.097 回答