web-dev-qa-db-ja.com

人工ニューラルネットワーク(Tic-tac-toe)をコーディングする方法は?

人工ニューラルネットワークを使って三目並べをしたいです。ネットワークの構成は次のとおりです。9つのフィールドのそれぞれに、2つの入力ニューロンを使用します。もちろん、18個の入力ニューロンがあります。すべてのフィールドに対して、プレーヤー1の一部に1つの入力ニューロンがあり、プレーヤー2の一部に1つのニューロンがあります。それに加えて、現在のボード位置の評価を提供する1つの出力ニューロンがあります。出力値が高いほど、プレーヤー1の位置が良くなります。出力値が低いほど、プレーヤー2の位置が良くなります。

しかし、私の問題は次のとおりです。そのニューラルネットワークをどのようにコーディングできますか?私のアイデアは、入力ニューロンにArray [1-18]を使用することでした。この配列の値は入力の重みです。ループを使用して配列をウォークスルーします。活性化するニューロンがあるときはいつでも、出力値に重みを追加します。したがって、出力値は、アクティブ化された入力ニューロンの重みの合計です。

Output = SUM(ActivatedInputNeurons)

これはネットワークをプログラミングする良い方法だと思いますか?もっと良いアイデアはありますか?

あなたが私を助けてくれることを願っています。前もって感謝します!

21
caw

さて、18個のニューロンの入力層と1個のニューロンの出力層があります。それで大丈夫です。ただし、ニューラルネットに入力を関係付ける機会を与える必要があります。そのためには、少なくとも1つの中間層が必要です。中間層で9個のニューロンを使用することを提案します。これらのそれぞれを各入力ニューロンに接続し、出力ニューロンを各中間体に接続する必要があります。このような接続にはそれぞれ重みがあり、各ニューロンには活性化レベルがあります。

次に、一度に1つのレイヤーですべてのニューロンを通過します。入力層は、ボードの状態でアクティブになります。それ以降のすべてのニューロンについて、それぞれの接続をすべて調べ、接続されたニューロンのアクティブ化レベルと接続の重みの積を合計します。最後に、この合計にシグモイド関数を適用して、アクティベーションレベルを計算します。

これが動作原理です。今、あなたはより良い結果を得るためにこのネットを訓練する必要があります。これにはいくつかのアルゴリズムがあり、グーグルと読み取りを行う必要があります。最後に、結果が十分に速く説得力がない場合は、ニューロンと層の数を調整することをお勧めします。たとえば、入力層を9ニューロンに減らし、Xの場合は+ 1、Oの場合は-1でアクティブ化できます。おそらく、別の中間層を追加すると、より良い結果が得られるか、層のニューロンの数が増えます。

15
Svante

1つの出力ニューロンからボードの状況の意味のある要約を取得する方法を特に理解していません。私は持っていることをもっと見ていきます:

    I I I             O O O
    I I I      x      O O O
    I I I             O O O
9 input neurons  9 output neurons

完全に接続されたネットワーク、つまり81の重み。次に、その位置で再生することの相対的な望ましさについて出力ニューロンをトレーニングします。

5
chaos

私のTicプロジェクトを見てください。私はこの問題をニューラルネットワークと遺伝的アルゴリズムの両方で解決しました。ソースコードは無料で入手できます。

http://www.roncemer.com/tic-tac-toe-an-experiment-in-machine-learning

4
Ron

伝達関数を使用して「従来の」 フィードフォワードANN を実装する必要があると思います。これにより、バックプロパゲーションを使用してトレーニングできるようになります。これらのコードは通常、次のような数行のコードになります。

SetupInputs();
for (l = 1 .. layers.count)
    for (i = 0 .. layers[l].count)
        sum = 0
        for (j = 0 .. layers[l-1].count)
            sum += layers[l-1][j] * weights[l-1][j]
        layers[l][i] = TransferFunction(sum)
3
FryGuy

これはAIコーディングの優れたスタータープロジェクトですが、完全なソリューションを考え出すことは、SOの大きな答えになるでしょう。

ほとんどのソフトウェアと同様に、オブジェクト指向設計を使用することをお勧めします。次に例を示します。入力、重み、および出力関数を持つNeuronクラスを定義します。次に、ネットワークを構築するために、これらのNeuronオブジェクトをいくつか作成します。

良い出発点については、 人工ニューラルネットワーク に関するウィキペディアの記事を参照してください。

コードで頑張ってください!とても楽しそうですね。

1
e.James

FANNやNeurophなどのニューラルネットワークライブラリを使用すると、時間を節約できます。

入力をエンコードする1つの方法は、9つの入力ニューロンを使用することです。出力は9ニューロンでも良好です。他のリプレイでは見られないのは、隠しレイヤーのサイズです。従来の3層でMLPを使用することになると思います。隠された層のサイズは常に謎です。私は10個の隠されたニューロンを試します。

伝達関数がシグモイドの場合、次のように入力をエンコードできます。

0.0-Oプレーヤー。

1.0-Xプレーヤー。

0.5-空です。

ANNの出力は9つの実数になります。この場合、一部のセルはすでに占有されています。空のセルに対応する最大の出力値を検索できます。

0
Todor Balabanov

重みを追加した後、関数を使用して合計を正規化する必要があります。負の数を許可する場合は、通常、TANHを使用します。

編集:

これは私が数年前に取り組んだJava多層パーセプトロン 実装です。これはチェッカーに使用されましたが、入力が少ないのでチェッカーにも使用できます。

また、勝つためにそれを教える方法をおそらく理解する必要がありますが、それは別の問題です

0
mkoryak

それはあなたの質問に対する直接の答えではありませんが、次のフレームワーク/ツールを見る必要があります: [〜#〜] snns [〜#〜] またはそのJava対応する JavaNNS 。あなたの質問に対する答えがそこにあると確信しています。

0
paweloque