web-dev-qa-db-ja.com

チェスのニューラルネットワークをプログラムする方法は?

良い動きをして他のプレイヤーに勝つことを学ぶチェスエンジンをプログラムしたいと思います。私はすでにチェス盤の表現とすべての可能な動きを出力する関数をコーディングしました。ですから、ボードの特定の状況がどれほど良いかを示す評価関数だけが必要です。したがって、特定の位置を評価する人工ニューラルネットワークを使用したいと思います。出力は数値である必要があります。値が高いほど、白人プレイヤーのポジションは良くなります。

私のアプローチは、385個のニューロンのネットワークを構築することです。ボードには6つのユニークなチェスの駒と64のフィールドがあります。したがって、すべてのフィールドに対して、6つのニューロン(すべてのピースに1つ)を使用します。白い部分がある場合、入力値は1です。黒い部分がある場合、値は-1です。そして、そのフィールドにそのような部分がない場合、値は0です。それに加えて、プレーヤーが移動するニューロンが1つある必要があります。白のターンの場合、入力値は1で、黒のターンの場合、値は-1です。

ニューラルネットワークの構成はかなり良いと思います。しかし、主要な部分が欠けています:このニューラルネットワークをコーディング言語(Delphiなど)に実装するにはどうすればよいですか?各ニューロンの重みは最初は同じである必要があると思います。試合の結果に応じて、重みを調整する必要があります。しかし、どのように? 2人のコンピュータープレーヤー(両方とも私のエンジンを使用)を互いに対戦させるべきだと思います。白が勝った場合、黒はその重みが良くないというフィードバックを受け取ります。

したがって、ニューラルネットワークをコーディング言語に実装するのを手伝っていただければ幸いです(Delphi、それ以外の場合は擬似コードが最適です)。前もって感謝します!

23
caw

そこに行って、それをしました。問題には連続性がないため(1つの入力の値が1回変化するだけで、位置の値が他の位置と密接に関連していない)、NNが機能する可能性はほとんどありません。そして、それは私の実験では決してしませんでした。

位置の値を評価するために、アドホックヒューリスティック(そこにはたくさんあります)を使用したシミュレーテッドアニーリングシステムを見たいと思います...

ただし、NNを使用するように設定されている場合は、比較的簡単に表現できます。一般的なNNは単なるグラフであり、各ノードはニューロンです。各ニューロンには、現在のアクティベーション値と、入力値、つまりリンクを持つすべてのノードのアクティベーション値に基づいて次のアクティベーション値を計算するための遷移式があります。

したがって、入力層、出力層、各層に同一のニューロンがあり、時間依存性がない、より古典的なNNは、入力ノードの配列、出力ノードの配列、およびのリンクグラフで表すことができます。それらを接続するノード。各ノードには、現在のアクティベーション値と、転送先のノードのリストがあります。出力値の計算は、入力ニューロンのアクティブ化を入力値に設定し、後続の各レイヤーを順番に繰り返し、遷移式を使用して前のレイヤーからのアクティブ化値を計算するだけです。最後の(出力)レイヤーに到達すると、結果が得られます。

5
Varkhan

誰かがこのページをランダムに見つけた場合。私たちが今知っていることを考えると、OPが提案することはほぼ確実に可能です。実際、状態空間がはるかに大きいゲームでそれを行うことができました-Go( https://deepmind.com/research/case-studies/alphago-the-story-so-far )。

11
siemanko

アルファベータ法で古典的なミニマックス先読みを行う場合、静的評価者用のニューラルネットを使用できない理由がわかりません。多くのチェスエンジンは、断片などを合計するだけのブレインデッド静的評価器を備えたミニマックスを使用しています。十分なレベルのミニマックスがあれば、それほど重要ではありません。ネットがどれだけ改善するかはわかりませんが、失うものはほとんどありません。ただし、トレーニングには注意が必要です。多くの動きを先取りする(そしてCPUの負荷などを必要とする)エンジンを使用して、より少ない動きを先取りするエンジンの評価者をトレーニングすることをお勧めします。そうすれば、CPUをそれほど消費しないエンジンになってしまいます(うまくいけば)。

9
Silas S. Brown

ANNをトレーニングするために必要なのは、 バックプロパゲーション学習 または何らかの形式の 遺伝的アルゴリズム のいずれかです。しかし、チェスは非常に複雑なゲームであるため、単純なANNがチェスのプレイを学習することはあり得ません。学習プロセスが監視されていない場合はさらに多くなります。

さらに、あなたの質問は層の数について何も述べていません。 385個の入力ニューロンを使用して現在の状況をエンコードするとします。しかし、どのように何をすべきかを決定したいですか?フィールドごとのニューロンについて?最高の興奮が勝ちますか?しかし、多くの場合、複数の可能な動きがあります。

さらに、いくつかの隠しレイヤーが必要になります。隠しレイヤーなしで入力レイヤーと出力レイヤーで表現できる関数は実際には制限されています。

ですから、私はあなたがそれを試すのを妨げたくはありませんが、例えば1年かそこら以内に成功する実装とトレーニングのチャンスは実質的にゼロです。

私は16歳かそこらのときに、三目並べをプレイするためにANNを構築してトレーニングしようとしましたが、失敗しました。最初にそのような単純なゲームを試してみることをお勧めします。

4

ここで私が目にする主な問題は、トレーニングの1つです。あなたは、ANNに現在のボードの位置を取得して、それがプレーヤーにとってどれほど優れているかを評価してほしいと言います。 (私はあなたがプレーヤーのために可能なすべての動きを取り、それを現在のボード状態に適用し、ANNを介して評価し、そして最も高い出力を持つものを取ると仮定します-すなわち:山登り法)

私が見ているあなたの選択肢は次のとおりです。

  • ボードの状態を評価し、それからネットワークをトレーニングするためのヒューリスティック関数を開発します。しかし、ヒューリスティックを使用できるのに、なぜANNを使用するのかという疑問が生じます。

  • 「このボード構成から白または黒で勝ったゲームの数」などの統計的尺度を使用します。これにより、白または黒の間の適合値が得られます。それの難しさは、問題のあるスペースのサイズに必要なトレーニングデータの量です。

2番目のオプションを使用すると、グランドマスターゲームからボードシーケンスをいつでもフィードでき、ANNがソリューションを開発するのに十分なカバレッジがあることを期待できます。

問題が複雑なため、トレーニングをあまり遅くせずに、できる限り最大のネットワーク(つまり、多数の内部ノード)をそこに配置したいと思います。

4
geofftnz

それは可能ですが、決して些細なことではありません。

https://erikbern.com/2014/11/29/deep-learning-for-chess/

彼の評価関数を訓練するために、彼はそうするために多くの計算能力を利用しました。

一般的に要約すると、次のように説明できます。評価関数はフィードフォワードNNです。行列の計算により、移動がどれだけ優れているかを評価するスカラー出力が得られます。ネットワークの入力ベクトルは、ボード上のすべてのピースによって表されるボード状態です。たとえば、白いポーンは1、白い騎士は2 ...、空のスペースは0です。ボード状態の入力ベクトルの例は、単純に0のシーケンスです。 -12の。この評価は、多くのゲームでグランドマスターゲーム(たとえば、ficsデータベースで入手可能)を使用してトレーニングでき、現在のパラメーターが最高の評価であると言うことと、グランドマスターが行った動き(最高の評価を持つ必要がある)との間の損失を最小限に抑えます。もちろん、これはグランドマスターの動きが正しく最適であることを前提としています。

4
skim

入力アルゴリズムは健全です-すべての位置、すべてのピース、および両方のプレーヤーが考慮されます。過去のイベントが再び入力として使用されるように、ゲームボードの過去の状態ごとに入力レイヤーが必要になる場合があります。

出力レイヤーは、(何らかの形で)移動するピースと移動する場所を指定する必要があります。

すべてのニューロンの重みとシナプスの強さを含むコネクトームを使用して遺伝的アルゴリズムを記述し、それぞれに多数のコネクトームを含む複数の分離された遺伝子プールを開始します。

それらを互いにプレイさせ、最高の一握りを維持し、クロスオーバーし、最高のコネクトームを変異させてプールを再構築します。

1
user563205

Blondee24を読む: http://www.Amazon.co.uk/Blondie24-Playing-Kaufmann-Artificial-Intelligence/dp/1558607838

チェスの代わりにチェッカーを扱いますが、原則は同じです。

1
emyr666

シラスが言ったことを言うためにここに来ました。ミニマックスアルゴリズムを使用すると、N回の移動を先読みできることが期待できます。アルファベータ法を使用すると、理論的には2 * N移動に拡張できますが、より現実的には3 * N/4移動に拡張できます。ここではニューラルネットワークが本当に適切です。

おそらく、遺伝的アルゴリズムを使用することもできます。

0
Steve Pierce