Delphi / PascalのTD(λ)(時間差学習)
質問
Tic-Tac-Toeを再生する人工ニューラルネットワークがありますが、まだ完成していません。
私がまだ持っているもの:
- タイムステップごとに整数値を持つ報酬配列「R [t]」または「t」を移動します(1=プレーヤーAが勝ち、0=引き分け、-1=プレーヤーBが勝ちます)
- 入力値はネットワークを介して正しく伝播されます。
- 重みを調整するための式:
不足しているもの:
- TD学習:TD(λ)アルゴリズムを使用してネットワークのエラーを「逆伝播」する手順がまだ必要です。
しかし、私はこのアルゴリズムを本当に理解していません。
これまでの私のアプローチ...
遠位状態はそれほど多くの報酬を受け取らないため、トレース減衰パラメータλは「0.1」である必要があります。
学習率は両方のレイヤー(入力と非表示)で「0.5」です。
報酬が遅れる場合:ゲームが終了するまで報酬は「0」のままです。すると、報酬は最初のプレーヤーの勝利の場合は「1」、2番目のプレーヤーの勝利の場合は「-1」、引き分けの場合は「0」になります。
私の質問:
- ネットのエラー(TDエラー)はいつどのように計算しますか?
- エラーの「バックプロパゲーション」をどのように実装できますか?
- TD(λ)を使用して重みをどのように調整しますか?
よろしくお願いします:)
- TD学習:TD(λ)アルゴリズムを使用してネットワークのエラーを「逆伝播」する手順がまだ必要です。
解決
この作業を真剣に行う場合は、TD-lambdaを理解することが非常に役立ちます。サットンとバルトの本「強化学習」は、で無料で入手できます。HTML形式であり、このアルゴリズムについて詳しく説明しています。基本的に、TD-lambdaが行うことは、ゲームの状態とゲーム終了時に期待される報酬との間のマッピングを作成することです。ゲームがプレイされると、勝利する州につながる可能性が高い州は、期待される報酬値が高くなる傾向があります。
tic-tac-toeのような単純なゲームの場合は、表形式のマッピングから始めることをお勧めします(考えられるすべてのゲーム状態に対して期待される報酬値を追跡するだけです)。それが機能するようになったら、代わりにNNをマッピングに使用してみてください。しかし、最初に別のより単純なNNプロジェクトを試すことをお勧めします...
他のヒント
私もこれについて混乱していますが、これがその仕組みだと思います:
エンドノードから始めて、R(受信した出力)とE(期待した出力)をチェックします。E= Rの場合は問題なく、変更を加える必要はありません。
E!= Rの場合、しきい値などに基づいて、それがどれだけ離れているかを確認し、重みまたはしきい値を少し上下にシフトします。次に、新しい重みに基づいて、戻って、重みが高すぎるか低すぎるかを推測し、繰り返しますが、効果は弱くなります。
このアルゴリズムを実際に試したことはありませんが、基本的には、私が理解しているアイデアのバージョンです。
私が覚えている限り、既知の結果セットを使用してトレーニングを行うので、既知の入力の出力を計算し、そこから既知の出力値を減算します。これがエラーです。
次に、エラーを使用してネットを修正します-デルタルールで調整された単一レイヤーNNの場合、0.5のイプシロンが高すぎることを知っています-0.1のようなものがより良い-遅いがより良いです。バックプロパゲーションを使用すると、もう少し高度になりますが、NNの数式の説明は複雑で理解しにくいことを覚えている限り、それほど複雑ではありません。
見てください http://www.codeproject.com/KB/recipes/BP.aspx
または「バックプロパゲーションc」のグーグル-コードで理解する方がおそらく簡単です。