28

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

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

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

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

4

9 に答える 9

10

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

編集: 私は 2010 年に上記を書き、現在 2020 年にStockfish NNUE がそれを実行しました。「ネットワークは最適化され、中程度の検索深度で数百万の位置の[古典的なStockfish]評価でトレーニングされ」、静的評価器として使用され、最初のテストでは、この静的評価器を以前のもの (または、同等に、CPU 時間が少し少ない同じ elo)。はい、機能します。最初に提案したように、ネットワークを高い検索深度でトレーニングする必要さえありません。中程度の検索深度で十分ですが、重要なのは何百万もの位置を使用することです。

于 2010-05-16T19:33:27.947 に答える
6

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

むしろ、ポジションの価値を評価するために、アドホックなヒューリスティック (そこにはたくさんあります) を備えたシミュレートされたアニーリング システムを見たいと思います...

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

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

于 2009-04-15T22:30:50.577 に答える
4

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

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

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

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

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

于 2009-04-15T22:24:52.417 に答える
4

ここで私が目にする主な問題は、トレーニングの 1 つです。あなたは、ANN に現在のボード ポジションを取り、それがプレーヤーにとってどれほど良いかを評価してほしいと言っています。(プレーヤーの可能なすべての動きを取り、それを現在のボードの状態に適用し、ANN を介して評価し、最高のアウトプットを持つものを取ると仮定します-つまり、山登り)

私が見ているあなたのオプションは次のとおりです。

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

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

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

問題が複雑なため、トレーニングをあまり遅くすることなく、できる限り最大のネットワーク (つまり、多くの内部ノード) を投入したいと考えています。

于 2009-04-15T23:58:37.777 に答える
1

Read blondie24 : http://www.amazon.co.uk/Blondie24-Playing-Kaufmann-Artificial-Intelligence/dp/1558607838.

It deals with checkers instead of chess but the principles are the same.

于 2011-07-22T15:18:10.457 に答える
1

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

出力レイヤーは、(なんらかの形式で) 移動するピースと移動先の場所を提供する必要があります。

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

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

于 2011-06-24T00:23:56.210 に答える
0

サイラスが言ったことを言いに来た。ミニマックス アルゴリズムを使用すると、N 回先を見通すことができると期待できます。アルファ ベータ プルーニングを使用すると、理論的には 2*N の移動に拡張できますが、より現実的には 3*N/4 の移動に拡張できます。ここでは、ニューラル ネットワークが非常に適しています。

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

于 2010-12-06T02:11:34.440 に答える