Neural network 大线性输出神经网络的训练

Neural network 大线性输出神经网络的训练,neural-network,backpropagation,reinforcement-learning,Neural Network,Backpropagation,Reinforcement Learning,我正在编程一个前馈神经网络,我想与强化学习结合使用。我有一个以tanh作为激活函数的隐藏层和一个线性输出层 我有三个标准化为[0,1]的输入。还有三个输出节点,用于提供从环境收到的奖励。回报总是负面的。一开始,当所选择的行动导致错误的决定时,它可能是-50000,而好的决定可能是-5 我正在努力实现反向传播。由于回报如此之大,误差值非常大,这就产生了巨大的权重。经过几轮训练后,隐藏层的权重非常大,我在隐藏层中的节点只创建值-1或1 这是我的代码: public void trainState(d

我正在编程一个前馈神经网络,我想与强化学习结合使用。我有一个以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];
    }
}
public void trainState(双[]观察,双[]隐藏能量,双oldVal,int chosenAction,双目标,双lambda)
{
双德尔塔克=(目标-oldVal)*λ;
双三角酒店;
对于(int j=0;j<\u hidensitize;j++)
{
deltaJ=(1-hiddenEnergy[j]*hiddenEnergy[j])*deltaK*_toOutputWeights[j][chosenAction];
对于(int i=0;i<\u inputSize;i++)
{
_toHiddenWeights[i][j]+=deltaJ*观测[i];
}
}
对于(int i=0;i<\u hidensitize;i++)
{
_toOutputWeights[i][chosenAction]+=deltaK*hiddenEnergy[i];
}
}
你说过: “由于回报如此之大,误差值非常大,从而产生了巨大的权重。”

重点矿山

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

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

使用log方法没有帮助,但您的想法引出了另一个想法:我找到了一种方法,将奖励标准化为[-1,1],这使事情变得更容易。