テーブル ルックアップを使用して、SARSA アルゴリズム (ワンステップと適格性トレースの両方を使用) を正常に実装しました。本質的に、各行が状態に対応し、各列がアクションに対応する q 値マトリックスがあります。
何かのようなもの:
[Q(s1,a1), Q(s1,a2), Q(s1,a3), Q(s1,a4)]
[Q(s2,a1), (Q(s2,a2), Q(s2a3), Q(s2, a2]
.
.
.
[Q(sn,a1), Q(sn,a2), Q(sn,a3), Q(sn,a4)]
各時間ステップで、行列から行が選択され、ポリシーに応じてアクションが選択され、SARSA ルールに従って更新されます。
現在、勾配降下法を使用してニューラル ネットワークとして実装しようとしています。
私の最初の仮説は、2 層ネットワークを作成することでした。入力層には状態と同じ数の入力ニューロンがあり、出力層にはアクションと同じ数の出力ニューロンがあります。各入力は各出力に完全に接続されます。(したがって、実際には、上記のマトリックスのようになります)
私の入力ベクトルは 1xn 行ベクトルで、n は入力ニューロンの数です。現在の状態に対応するインデックスが 1 になることを除いて、入力ベクトルのすべての値は 0 になります。
[0 0 0 1 0 0]
状態 4 のエージェントの入力ベクトルになります。
したがって、プロセスは次のようになります。
[0 0 0 1 0 0] X [ 4 7 9 3]
[ 5 3 2 9]
[ 3 5 6 9]
[ 9 3 2 6]
[ 2 5 7 8]
[ 8 2 3 5]
ランダムなサンプルの重み行列を作成した場所。
結果は次のようになります。
[9 3 2 6]
つまり、貪欲なポリシーが選択された場合、アクション 1 が選択され、4 番目の入力ニューロンと最初の出力ニューロンの間の接続が次のように強化されます。
dw = dw_old + learning_rate*(reward + discount*network_output - dw_old)
(SARSA アルゴリズムから取得した式)
ただし、この実装は私を納得させません。私が読んだことによると、ネットワークの重みを使用して状態とアクションのペアの Q 値を計算する必要がありますが、そのような値を表す必要があるかどうかはわかりません。(特に、重みの値が 0 から 1 の間にしか含まれていないことがよくあるためです。)
何かアドバイス?