チェスルールのようなルールをニューラルネットワークに適用すると、ネットワークは無効な移動を予測/訓練しません。ニューラルネットワークの出力でチェスの合法性のようなルールを適用するにはどうすればよいですか?
答えて
AlphaZero Chessの例では、ネットワークの出力シェイプにより、任意の四角形から始まるすべてのピースの移動が可能です。
Mastering Chess and Shogi by Self-Play with a General Reinforcement Learning Algorithm紙から:移動する部分を選択し、その部分の法的移動うち 選択:
チェスにおける動きは、二つの部分で説明することができます。確率分布を4,672以上の可能な移動量で符号化するプレーンの8×8×73 スタックによってポリシーπ(a | s)を表現する。各8×8 の位置は、ピースを「ピックアップ」する正方形を識別する。最初の56個のプレーンは、すべてのピースに対して の可能な「クイーンの動き」を符号化します:8個の相対コンパスの方向{N、NE、E、SE、 S、SW、W、NW}である。 次の8つの飛行機は、その駒に対して可能な騎士の動きをエンコードします。最後の9つの飛行機は、ポーンの移動やキャプチャの可能性のあるアンダープロポーションを、2つの可能な対角線、騎士、ビショップまたは ルークにそれぞれエンコードします。第7位の他のポーンの動きやキャプチャは、 のクイーンに昇格されます。
は、したがって、たとえばネットワークがポーンがe7
に存在しない場合でも、出力にg1
の騎士が存在しない場合であっても、移動g1-f3
用正確率をを許可、または移動e8=Q
用されます、d1
に女王がいる場合はd1-h5
ですが、別の部分が対角線を遮っています。
鍵は、可能な移動に対して確率分布を出力し、法的な移動のみが許可されている場所でプレーすることによって訓練されるため、不正な移動に対して非常に低いまたはゼロの確率を出力することを学習します。
さらに正確には、設定された回数の自己再生ゲームの後、ネットワークは教師付き学習を使用して訓練され、ボードの位置が与えられたときの移動の確率と価値を予測します。自己再生の冒頭では、ネットワークにランダムな重みがあり、多くの不可能な動きに対して大きな確率を出力しますが、1回以上の監視学習の反復後に、移動出力確率ははるかに合理的に見えるようになります。
AlphaZeroチームがこのアーキテクチャをネットワークでルールを適用するものよりも優れている理由は簡単です。出力ニューロンが固定されている必要があるため、出力は固定サイズにする必要があります。異なる数の法的な動きに対応する異なる数の出力ニューロンを有することは理にかなっていない。あるいは、ネットワーク内の非法的な動きに対するアウトプットをゼロにすることは意味がありません。これはバックプロパゲーションを実行するのはおそらく悪夢になるでしょう。あなたはチェスムーブジェネレータを区別する必要があります!
さらに、ネットワークがポリシー出力を使用してゲームをプレイする場合、法的な動きだけで各出力を正規化することができます。このようにして、私たちは自己再生システム内での移動の適法性を強制していますが、ニューラルネットワークのアーキテクチャ自体ではありません。これは移動ジェネレータの助けを借りて行われます。
あなたは具体的には、あなたがこのような出力層を表すことができ、kerasについて求めているので:要約で
model.add(Dense(4672, activation='softmax'))
:それは神経のアーキテクチャで移動合法性を強制することは必ずしもありませんチェスの動きを予測するためのネットワークでは、可能なすべての動き(不正なものを含む)を許可し、違法な動きの確率が低いかゼロになるようにネットワークを訓練します。次に、再生のために移動確率を使用するとき、法的な動きだけで正規化して所望の結果を得ることができるが、これはニューラルネットワークの外部で起こっている。
多くの感謝!非常に良い答え! –
あなたは大歓迎です!あなたの質問に完全に答えられたと思えば、答えを受け入れてください。 – Imran
- 1. ニューラルネットワーク層の出力はどのように有用ですか?
- 2. (バッチ)行の最後のプログラムに出力リダイレクトを適用するにはどうすればよいですか?
- 3. snakemake出力ルールでワイルドカード値のベース名を取得するにはどうすればよいですか?
- 4. tkinterの出力をCLIではなくGUIに出力するにはどうすればよいですか?
- 5. JSONObjectのtoString出力にエンコードを適用するにはどうすればよいですか?
- 6. gcc-xmlのようなclangでメタデータ出力を生成するにはどうすればよいですか?
- 7. QMLのTextFieldにスタイルを適用するにはどうすればよいですか?それは "スタイル"属性が利用できないようです
- 8. Tensorflowニューラルネットワークの入力データとしてCSVを使用するにはどうすればよいですか?
- 9. console.logsの出力値が同じになるようにするにはどうすればよいですか?
- 10. SwiftでassociatedTypeを持つプロトコルとの適合性をテストするにはどうすればよいですか?
- 11. このデータセットに対して適切な出力を得るにはどうすればよいですか?
- 12. sparsennの出力をどのように解釈すればよいですか?
- 13. numpy.fft.rfft2の出力をどのように解釈すればよいですか?
- 14. glewinfoの出力をどのように解釈すればよいですか?
- 15. このようなJSON出力を作成するにはどうすればよいですか?
- 16. casper.logの出力をフォーマットするにはどうすればよいですか?
- 17. Jenkinsの出力をカスタマイズするにはどうすればよいですか?
- 18. PHPで適切なJSON形式で出力するにはどうすればよいですか?
- 19. コンピュータの出力をプリンタのように受け入れるにはどうすればよいですか?
- 20. 値型の入力でニューラルネットワークを構築するにはどうすればよいですか?
- 21. PSQLが行数を出力しないようにするにはどうすればよいですか?
- 22. 3Dのラジアルグラデーションを適用するにはどうすればよいですか?
- 23. スクリプトとCSSルールをiframeに動的に適用するにはどうすればよいですか?
- 24. 一貫性のある計算のみを出力するにはどうすればよいですか?
- 25. DartでLISP(適用)を行うにはどうすればよいですか?
- 26. コンソールプログラムの出力をスレッドセーフな方法でテキストボックスにリダイレクトするにはどうすればよいですか?
- 27. forループ出力とforループ出力を結合するにはどうすればよいですか?
- 28. 隠しサブメニューにCSSルールを適用するにはどうすればよいですか?
- 29. シリアライザでJSONを出力するにはどうすればよいですか?
- 30. Pythonでエラーを出力するにはどうすればよいですか?
もっと重要な質問はおそらく、これは正しいアプローチですか(そうでないかもしれません)? AlphaGoにはポリシーとバリューネットワークがありましたが、Goのムーブルールはチェスに比べてずっとシンプルです。すべての働くチェスアプローチはおそらく価値ネットワーク(および古典的な移動ジェネレータ)を使用しました。キリン。 – sascha