エンジンプレイのランダム性


11

2つのエンジンを同じ色で互いに対戦させると、毎回同じゲームが発生しますか?そうでない場合、エンジンプレイのランダム性はどこから来るのですか?(冒頭の本を無視します。私が誤っていない場合、本は2つの動きをランダムに選択するようにエンジンに指示することができます。それらは同等に良いためです。)

Alphazero vs. Stockfishの試合では、同じゲームが何度も連続して行われなかったため、ランダム性があると想定しています。しかし、なぜかわかりません。おそらくこれを行う唯一の方法は、エンジンに時々サブパームーブを行わせることです。これは切腹のように聞こえます。


AlphaZeroはプレイすることで学習するため、各ゲームの後でモデルが更新されます。
フェリット

評価に小さなランダム値を追加することは、可能な方法の1つです。干し魚はそうしていると思います。
hoacin

回答:


7

Stockfish試合対AlphaZeroに関しては、この質問は、既にカバーされている、ここSmallChess

通常のヒューリスティックスベースのチェスエンジン(ストックフィッシュなど)のために、構造によって非決定的になるように作られたAlphaZeroは脇にあります(特殊なモンテカルロ1ルーチンを採用しています)。MCベースのルーチンを持つエンジン、以前はAFAIK Rybkaにそのような機能がありました)、ランダム性のソースは、エンジンの意思決定でアルゴリズムによって意図的にランダム性が導入されるのではなく、一般に実装における技術的側面の結果にすぎません。抽象的に言えば、その理由の1つは、エンジンが純粋に順次的な方法で実行されていない(1つのタスクを次々に実行する)ことです。代わりに、エンジンをより効率的にするために、可能な移動のツリーのさまざまなブランチで並列検索を実行します。それらは、いわゆるマルチスレッド(または-processingですが、少し異なります)を介して行います。したがって、CPUの複数のスレッドが同時にツリーを検索する操作(および訪問した位置の評価をキャッシュする操作)を実行するため、各スレッドにサブツリーが割り当てられることを想像してください。この種の実装の問題は、スレッドの全体的な実行があらゆる種類の条件(待機時間、RAMスワップなど)に大きく依存するようになるため、結局、他のすべてを許可せずに主要なバリエーションを選択できる可能性があります。検索を終了するスレッド。

これは、エンジンが特定の時間の下で決定を行うように設定されているため、実際に頻繁に発生するため、時間管理によって動作が変更されます。また、このステートメントを元に戻すこともできます。アルゴリズムを理解し、確定的スレッドルーチンを実装するだけでは、任意の時間t後のプログラムの状態を確実に予測するには不十分です。もちろん、すべてのスレッドが常に検索を完了することを許可し、その実行中に同時実行の問題が発生しなかった場合(たとえば、アクセスできない特定のキャッシュにアクセスしようとするスレッドなど)、動作は完全に再現可能です。それ以外はすべて同じです2


1:追加のトレーニング(たとえば、自己再生)を通じて、そのニューラルネットワークが進化し続ける(パラメーターを再調整する)か、または評価関数に一定の固定定義がない(ヒューリスティックベースのエンジンとは異なります) )。

2:それでも、あなたが言ったように、オープニングレベルでは、オープニングブックでは、どのバリエーションを選択するかについて、エンジンによって意図的にランダムに決定されることがあります。同様に、オープニングフェーズの外で、複数のバリエーションが(Evalに選択された解像度内で)ほぼ等しい評価を持つ瞬間があり、設計に基づいて、ランダムに1つを選択する場合があります。最後に、エンジン設定のレベルでも注意が必要です。たとえば、各エンジンに選択された検索の深さと熟考時間(そして、互いの熟考時間中にさらに計算できるかどうか)です。


6

私の以前の答えを詳しくカバーしてくれた@Phononに感謝します。ポイントをもう1つ追加します。時間コントロールです。

決定論的な時間制御はノードの数のみですが、これは一般的ではありません。より一般的な時間制御- 固定秒数またはゲーム時間は、一般的に確定的ではありません。

例を試してみましょう。ターミナルでストックフィッシュを実行します。タイプ:

movetime 20000に移動

このコマンドは、20秒後に移動するようにエンジンに指示します。私の結果:

info depth 23 seldepth 32 multipv 1 score cp 6 upperbound nodes 24325860 nps 1216171 hashfull 999 tbhits 0 time 20002 pv g1f3 d7d5
bestmove g1f3 ponder d7d5

移動は1.Nf3でした。次に、私はストックフィッシュを殺して、新しいものを始めました。もう一度、20秒。私は得ました:

info depth 23 seldepth 32 multipv 1 score cp 20 nodes 26185280 nps 1309067 hashfull 999 tbhits 0 time 20003 pv d2d4
bestmove d2d4 ponder g8f6

1.d4です!同じ位置、両方とも20秒で検索!

見える?どちらも20秒で移動しましたが、Linuxオペレーティングシステムの変動により、2回目の実行ではより深い検索が行われました(26185280> 24325860)。

この小さな実験はマルチスレッド化されていなかったことに注意してください(スレッド数= 1)。マルチスレッド化により、物事はさらに非決定的になります。

ストックフィッシュは、Google AlphaZeroの試合で1動きあたり1分が与えられました。スレッドの数は64 でした。試合におけるストックフィッシュの決定は、おそらく決定論的でありませんでした


確かに、非常に有益な例と発言。
user929304 2017

いいね!1スレッドのケースでも紹介するクールなアイデア。
フォノン2017

答えてくれてありがとう。愚かなフォローアップの質問:ノードは何ですか(チェスをプレイするエンジンのコンテキストでは)?
アリュール

@ user3727079ノードは、ゲームツリーの頂点(一意の位置)です。たとえば、ルートノードが開始位置である場合、20の子ノードがあります。これは、ルートから1層離れた20の一意の正当な位置です。
フォノン2017
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.