多層パーセプトロンとバックプロパゲーションを使用して、三目並べの AI をプログラムしようとしています。私の考えでは、ニューラル ネットワークをトレーニングしてボードの状態を正確に評価できるようにしようと考えていましたが、問題は、何千ものゲームを分析した後でも、ネットワークが正確な評価を出力しないことです。
27 個の入力ニューロンを使用しています。3x3 ボードの各正方形は、正方形に x、o、または空白があるかどうかに応じて、0 または 1 の値を受け取る 3 つの入力ニューロンに関連付けられています。これらの 27 個の入力ニューロンは、10 個の隠れニューロンに信号を送信します (10 個を任意に選択しましたが、5 個と 15 個も試しました)。
トレーニングのために、現在の評価関数を使用して自分自身と対戦し、各側に最適な動きと見なされるものを選択することで、プログラムに一連のゲームを生成させました。ゲームを生成した後、NN は、特定のボード状態の正しい出力を (評価関数を使用して) ボード状態の値として取得することにより、(ボード状態と正しい出力で構成される) トレーニング例をコンパイルします。ゲームシーケンス。これは、ジェラルド・テサウロが TD-Gammon をプログラミングするときに行ったことだと思いますが、記事を誤解した可能性があります。(注: 重みを更新するための特定のメカニズムについては、この投稿の最後に記載しています)。
学習率のさまざまな値とさまざまな数の隠れニューロンを試しましたが、何も機能していないようです。何時間も「学習」した後でも、戦略に目に見える改善は見られず、評価関数はどこにも正確にはほど遠い.
三目並べをプログラムするもっと簡単な方法があることを認識していますが、後で接続 4 に適用できるように、多層パーセプトロンを使用して実行したいと考えています。これは可能ですか?妥当な量の隠れニューロンを備えた三目並べボードの信頼できる評価関数はないと考え始めています。
宿題のために提出するための簡単なコードを探しているわけではないことを保証します。私はしばらくうまくいっていませんでしたが、何が間違っているのか知りたいだけです。すべてのアドバイスをいただければ幸いです。
これは、NN に使用した特定のメカニズムです。
27 個の入力ニューロンのそれぞれは、微分可能なシグモイド関数 1/(1+e^(-x)) を通過する 0 または 1 を受け取ります。各入力ニューロン i は、この出力 (i.output) に何らかの重み (i.weights[h]) を掛けて各隠れニューロン h に送信します。これらの値の合計は、隠れニューロン h (h.input) によって入力として取得され、この入力はシグモイドを通過して、各隠れニューロン (h.output) の出力を形成します。すべての非表示ニューロンの (h.output * h.weight) の合計を lastInput とします。ボードの出力値は sigmoid(lastInput) です。
学習率をアルファ、エラーを正しい出力から実際の出力を差し引いたものとします。また、dSigmoid(x) を点 x でのシグモイドの微分に等しくします。
各非表示ニューロン h の重みは、値 (alpha*err*dSigmoid(lastInput)*h.output) によって増分され、指定された入力ニューロン i から指定された非表示ニューロン h への信号の重みは、値によって増分されます。 : (alpha*err*dSigmoid(lastInput)*h.weight*dSigmoid(h.input)*i.output)。
バックプロパゲーションに関するこの講義からこれらの式を取得しました: http://www.youtube.com/watch?v=UnWL2w7Fuo8 .