我正在编写一个前馈神经网络,我希望将其与强化学习结合使用。我有一个隐藏层,其中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];
}
}
答案 0 :(得分:2)
强调我的
我建议使用奖励日志。这是控制巨大价值的数学标准技巧。这样,您的错误和权重将更易于管理。
log_of_rewards = log(rewards);
// use this value in calculations