1

強化学習と組み合わせて使用​​したいフィード フォワード ニューラル ネットワークをプログラミングしています。アクティベーション関数として tanh を持つ 1 つの非表示レイヤーと、線形出力レイヤーがあります。

[0,1] に正規化された 3 つの入力があります。環境から受け取った報酬を与える 3 つの出力ノードもあります。報酬は常にマイナスです。最初に、選択したアクションが悪い決定につながる場合、それは -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];
    }
}
4

1 に答える 1

2

「報酬が非常に大きいため、エラー値が非常に大きくなり、大きな重みが生じます」とあなたは言いました。

強調鉱山

報酬のログを使用することをお勧めします。これは、巨大な値を制御するための数学の標準的なトリックです。このようにして、エラーと重みがより管理しやすくなります。

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