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