チェスエンジンの作成、機械学習と従来のエンジンのどちらですか?


17

私は熱心なチェスプレイヤーであり、コンピュータープログラマーでもあります。チェスとプログラミングは、私が最も時間を費やす2つのことだと思います。当然、私は自分のエンジンを作成し、最終的にはLichessボットを作成したいと考えています。

昨年のStockfishに対するAlphaZeroの圧倒的なパフォーマンスを受けて、このエンジンを機械学習(ある種のニューラルネットワーク、場合によってはTensorflowを使用する)で作成するか、従来のハードコーディングされたヒューリスティックで作成するかを検討しています。

私は他の種類のハードコーディングよりもニューラルネットワークに詳しくありません。それでも、ニューラルネットワークを操作することを学ぶのは良い方法かもしれません。

私が検討しているもう1つのことは、エンジンのコーディングにどの言語を使用することが重要かどうかです。私は多くのチェスエンジンがC ++を使用していることを知っています。私は同じことの多くを行う他のCベースの言語を使用しましたが、ほとんどの構文は異なります。私はSwiftとJavascriptに最も精通していますが、Pythonにも精通しており、それが私にとってのトリックになると感じています。

したがって、可能な限り強力なチェスエンジンを作成するという観点から、ニューラルネットワークを使用するか、ハードコーディングする必要がありますか?


4
新しいAIエンジンの鍵は、強化学習ほどNNではありません。RLは複雑なトピックですが、UCLでのDavid SilverのRL講義(彼のWebサイトのスライドとYouTubeでの講義など)のような優れたオンライン入門リソースがあります。ハードコードされたヒューリスティックとRLを使用したNNなしのエンジンこれがalphagoの始まりです!
asac-モニカを

それはチェスではありませんが、最近の本「Deep Learning and the Game Go」は、ゲームエンジンにNNを使用する方法を示しています。Alpha-GoとAlpha-Zeroは、ボンネットの下で似ています。
ジョンコールマン

あなたのPythonの経験を考えるとそれは価値ニムを見ているかもしれない
ダレン・H

NNにアクセスしたい場合、これは興味深いです:arxiv.org/abs/1509.01549 githubにもコードがあります:)
Ant

@Antは、Giraffeがトップエンジンと比較して非常に強力ではなかったことに注意してください。(〜2800エロ)
オスカースミス

回答:


8

最初のステップ:目標/理由を定義する

これが主な要因だと思います。次のうちどれがあなたにぴったりですか?1つだけ選択してください)

  1. 楽しくてやりがいのあるコーディングタスクを楽しみたい
  2. 非常に優れたチェスエンジンを作りたい
  3. チェスエンジンの仕組みについて学びたい
  4. コーディングスキルを習得/実践したい
  5. コンピュータサイエンスの概念/理論(機械学習など)を学習/実装したい
  6. (その他)

IMO 2以外の場合は、「コインを投げる」ことは問題ありません。他のすべてについては、MLを選択するかハードコーディングを選択するかにかかわらず、目標を達成できます。ただし、選択するための選択肢の比較が必要な場合があります。

ハードコーディングの場合

(人間として)チェスをすることは論理的な思考を伴います。あなたとあなたの対戦相手が取ることができる可能な行動の空間を探索します。これにより、ゲーム全般を分析するための理論的枠組みを含むゲーム理論と呼ばれる分野が生まれました。

あなたが詳細に取り組み、具体的で物事について推論することを楽しむなら、これはあなたのためにうまくいくかもしれません。それに比べて、機械学習には、ファジーで不透明な「ブラックボックス」アルゴリズムが多く含まれています。何が起こっているのか正確にはわかりません。

また、機械学習ではなくハードコーディングの方法を採用すれば、「自分で設定する」のが楽になると思います。あなたが完全に理解していないコピーペーストの少ないもの。

機械学習の事例

創造物を産み、それがそれ自身の生活を引き継ぐのを見るのはエキサイティングです。ハードコーディングは精度と詳細がすべてですが、機械学習は柔軟です。いくつかのニューロンを取り除くと、結果はおそらく同様になります。

ハードコーディングとは、チェスを勉強することです。機械学習とは、作成したクリーチャーを研究することです。

もちろん、機械学習は非常にホットなトピックです。

ハードコーディングの言語選択

「他のCベースの言語」とはどういう意味かわかりません。C ++は、Cに似た唯一の主流言語です。C/ C ++の利点は、それらが高速であることです。他の言語は長年にわたって追いついてきましたが、C ++は依然としてお金を稼ぐことができます。

C ++は簡単ではありません。Rust、Golang、Swiftなどの最新のコンパイル言語から優れたパフォーマンスが得られます。しかし、JIT言語を使用する場合は、それほど悪くないはずです。すなわち、CPythonインタープリターを使用しません。IronPythonまたはJython、またはNode、またはC#またはJavaを使用します。

GPUプログラミングには別のアプローチが必要であり、この時点でこれに反対することをお勧めします。

機械学習の言語選択

TensorFlowの問題は、非常に低レベルであるということです。機械学習専用のインターフェイスというよりも、数値演算アルゴリズム(並列ハードウェアに組み込むことができる)の作成についてです。

もちろん、それは素晴らしい学習体験になる可能性があります!そして、確かに今日は非常に学ぶ価値があります。ただし、KerasまたはPyTorchから始めることをお勧めします。


1
これは驚異的な反応であり、私が述べたすべてのポイントに本当に当たります。まさに私がエンジンを作りたい理由を言うのはちょっと難しい。現実的には、Stockfish、Komodo、Leelaなどと競争することはないでしょう(結局、私は大学生です)。それでも、私の仕事が他のエンジンにつま先まで立ち向かい、毎回押しつぶされるのを見るのは楽しいでしょう。私の主な理由が強力なエンジンを作ることであったとしても、おそらく新しいプログラミング言語を学び、エンジンを作る副産物としてチェスの知識を向上させるでしょう。
デビッドショパン

1
何よりも、私が長期にわたって作り、育て、微調整できるものが欲しいと思います。また、コードがどれだけ優れているかを客観的に教えてくれるプロジェクト(Wins / Draws / Losses、ELOなど)も必要です。
デビッドショパン

1
これは非常に興味深い答えですが、パフォーマンスの問題のためにCpythonよりもNodeを真剣に推奨していますか?
Evpok

>「C ++は、Cのようなものである唯一の主流言語です。」C#?さび?Java?少なくとも「Cのようなもの」である多くの言語があります
Maaark

「like C」は、コンパイルされ、高度に最適化され、Cスタイルの構文を持つマシンに実装された言語であると考えました。C#、Java、およびPHPはすべて仮想マシンを使用し、そのコードはCPU固有のバイトコードではなくオペコードにコンパイルされます(そしてPHPのコンパイルはPythonやBashのように完全に透過的です)。また、Rustは主流ではありません。構文スタイルを他のいくつかの主流言語と共有しているにもかかわらず、これらの点でC ++のみが「Cのよう」です。
ゲディパンク

24

最強のエンジンを可能にしようとしているのであれば、絶対にNNエンジンを使用してください。

従来のエンジンは素晴らしい-Stockfishは、ほぼ間違いなく、コンセンサスの等しいハードウェア上で地球上で最も強力なエンジンですが、書くのは難しいです。これらのエンジンは、夜通しの場所に到達しませんでした。彼らは何年もの仕事をしました。例えば干し魚は6年間着実にエロを得ています。最初から始めた場合、Stockfishの強度に近い場所はすぐには得られません。実際、あなたは現在Stockfishがいる場所から数百エロを失速させる可能性があります。比較のために、現時点で最も強力な単著者エンジンのいくつかはEtherealLaser、およびXiphosです(オープンソースではないため、Houdini&Fireは無視しています)。これらのエンジンはすべて、Stockfishよりもかなり脆弱です。

なぜ彼らはそんなに弱いのですか?2つの理由:

  1. このレベルでは、エンジンの開発には多くの計算能力が必要です。あなたがすることは、コードを調べて、エロを得る可能性のあるアイデアを特定することです。例のアイデアは、「この動きがおそらく良いことを知っている場合、その動きを逆にするブランチを検索しないでください」です(これが意味をなさない場合は、高い学習曲線もあることを意味します)。次に、アイデアを実装するパッチを作成し、変更されたエンジンを前のバージョンに対してテストします。このレベルでは、パッチが有効かどうかを判断するのに十分なサンプルサイズを取得するには、数万のゲームが必要です。これらのゲームをプレイするには、膨大な計算能力が必要です。Stockfishはスーパーハードウェアにアクセスできます。執筆時点では、StockfishテストグラウンドFishtesting1038コアで実行されています。比較のために、一般的なデスクトップコンピューターには4〜8個のコアがあります。

  2. もう1つの理由は、Stockfishが多くの脳に支えられていることです。執筆時点で、テスト中の5人によって8つのパッチが作成されています。パッチの履歴を見ると、パッチを書いた開発者がたくさんいます。ストックフィッシュのアクティブな開発者が何人いるかはわかりませんが、確かに20を超えています。

一方、NNエンジンは(比較的)Ethereal / Laser / Xiphosをはるかに上回る強度に容易に到達します。最新のTop Chess Engine Championshipトーナメントで自分の目で確かめてください。Ethereal / Laser / Xiphosはリーグ1にあります。これは十分に信頼できますが、トップディビジョン(ディビジョンP)のエンジンは次のとおりです。

  • Stockfish(コミュニティが支援する従来のエンジン、Fishtestingで実行)
  • Komodo(従来の商用エンジン、常勤の開発者がいます)
  • Komodo MCTS(商用の準伝統的なエンジン、フルタイムの開発者がいます)
  • Houdini(従来の商用エンジンは1人の努力であり、2年間更新されていません)
  • リーラチェスゼロ(コミュニティに支援されたNNエンジン、Fishtestingのアナログとも呼ばれる大量のハードウェアで実行)
  • AllieStein(2人のNNエンジン)
  • Stoofvlees(NNエンジン)
  • ScorpioNN(NNエンジン)

最後の3つのエンジン(AllieStein、Stoofvlees、ScorpioNN)はすべて、私が知っている限りではフルタイムの開発者ではなく、あなたのような愛好家である人々による小さなコラボレーションです。2年も経たないうちにDiv Pの強さを獲得しました(これらのNNエンジンはすべてAlphaZeroの後に登場しました)。比較のために、最近のコンピューターチェスの歴史では、Stockfish&Komodoと独自に競合する伝統的なエンジンを書いた人は1人しかいませんでした(Roud Houdart、Houdiniの著者)。

おそらく、Lc0と競合するハードウェアはないでしょうが、Lc0は「ゼロ」エンジンであるため、これほど多くの計算能力を必要とします。ルール以外の人間の知識がなくてもチェスをプレイするはずです。同じ方法を使用する必要はありません。たとえば、教師あり学習を使用するスタイン手法を使用できます。これは間違いなく「ゼロ」になるよりも優れています。結局のところ、Lc0ではなく、スーパーファイナルでプレイしているAllieSteinです。

結論は次のとおりです。もしあなたの目標が世界で最高のエンジンと競争することであるならば、あなたは従来のエンジンよりもNNエンジンで成功する可能性がはるかに高いです。


6
たぶんあなたの結論の反対側に言及するかもしれません:あなたの目的が、いくつかのプログラミングをしている間にチェスの理解を深めることであるなら、伝統的なやり方に進んでください。
ブルース

1
私はあなたの結論に同意しますが、ゼロから始めるのではなく、強力なエンジンからの最近のネットワークを(もちろん許可を得て)開始点として使用することもお勧めします(ただし、「自己再生と更新によるトレーニングレイヤーを追加または削除する、入力フィーチャを追加する、追加の出力を要求するなど)。Lc0がシングルヘッドかデュアルヘッドかは思い出せませんが、3ヘッド(ijcai.org/proceedings/2018/0523.pdf)は現在チェスエンジンによって実装されておらず、state-ofで改善される可能性があります-アート。
スティーブンジャクソン

アリーの検索は、Steinネットワークではなく、より弱いエンジン(KMCST、Stoofvlees)に対してより強力になると思います。
私の

@bluesチェスエンジンをプログラミングしても、実際には優れたチェスプレーヤーになるわけではありません。LarryKaufman(Komodoの開発者の1人)を除いて、トップエンジンはプレイヤーを開発者としてタイトル付けたり、開発者にタイトルプレーヤー。
アリュール

@me 'は可能ですが、LeelensteinはLc0バイナリを使用するSteinネットワークであり、chess.comのコンピューターチェスチャンピオンシップでうまく機能しているため、Steinネットワークは少なくともLc0ネットワークに匹敵します。
アリュール

9

したがって、可能な限り強力なチェスエンジンを作成するという観点から、ニューラルネットワークを使用するか、ハードコーディングする必要がありますか?

ばかげた(数百台のNvidia V100)にアクセスできない限り、NNを選択しないでください。チェスをするためにNNをトレーニングするには、非常に多くのハードウェアが必要です。2億以上のゲームをトレーニングするためにLc0に貢献している人々をご覧ください。おそらくハードウェアにアクセスするのに問題があるので(Google Colabatoryで入手することもできますが、それだけではトレーニングは非常に遅くなります)。

編集:NNを使用して、教師あり学習では、Google Colabと1つの強力なGPU(2080、2080Ti、Radeon VII)だけで済ますことができます。

私が検討しているもう1つのことは、エンジンのコーディングにどの言語を使用することが重要かどうかです。私は多くのチェスエンジンがC ++を使用していることを知っています。私は同じことの多くを行う他のCベースの言語を使用しましたが、ほとんどの構文は異なります。私はSwiftとJavascriptに最も精通していますが、Pythonにも精通しており、それが私にとってのトリックになると感じています。

PythonとJavascriptはおそらく強力なチェスエンジンには遅すぎます。私はSwiftを使用したことはありませんが、おそらくmacOS以外のプラットフォームは気に入らないので、CまたはC ++を使用することをお勧めします。Rustを使用することもできますが、これには迷惑になる多くの安全機能があり、実際には必要ありません。また、特定の低レベルの最適化を行うのが難しいため、優れたパフォーマンスを得ることも難しくなります。もちろん、いつでもアセンブリで作成できますが、それはおそらく非常に多くの作業になるでしょう。https://www.chessprogramming.org/Languages/を参照してください


1
素晴らしい、情報をありがとう!おそらくFENの位置を取り、計算された動きを出力するAPIを作成しようとします。これがLichessボットと統合する最良の方法だと思います。
デビッドショパン


1
lc0のネットワークのみを使用する別のNNエンジンを実装するオプションですか?
RemcoGerlich

1
@RemcoGerlichが理解しているように、NNエンジンは2つのことを使用します。バイナリとニューラルネットワークです。バイナリの記述は簡単ではありませんが、ニューラルネットワークのトレーニングは比較的簡単です。この意味で、Lc0派生物はすでに存在します-Leelenstein&Deus X(aka。Fat Fritz)はそのような派生物です。
アリュール

@RemcoGerlichはその場合、実際には別のエンジンではなく、異なるラッピング/インターフェイス/なんでもあるIc0エンジンになります。
ペトロス

3

私は純粋におもちゃのチェスエンジンを使用して構築しました。Pythonチェスは、ゲームのルールを自分でコーディングする必要がなく、ロジックに集中するだけで本当に良かったです。ただし、1秒あたりに評価できたポジションの数は非常に少ないです。これは良い出発点かもしれません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.