強化学習と組み合わせて使用したいフィード フォワード ニューラル ネットワークをプログラミングしています。アクティベーション関数として 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];
}
}