一時期話題になったGoogleのAlphaGo、その後継のAlphaZeroの考え方をベースにしています。
AlphaZeroはAlphaGoに比べて強くなっているのはもちろんですが、よりシンプルな作りになっているので試しに作ってみるのにおすすめです。
ただ、AlphaZeroを再現しようとしても19路盤は個人レベルのパソコンでは不可能です。
Googleが大量のコンピュータリソースに物を言わせて作られたものなので、個人でやるならより小さい盤で試すことになります。
ぷよ碁は入門向けで5路盤や7路盤の小さい盤を学習させれば十分なのでなんとかなっています。
また、ルールに関しても正式な囲碁ルールにすると意外と複雑なため、囲碁をやったことのない人にもとっつきやすい純碁のルールを採用しています。
AlphaZeroの仕組み
ざっくりとした感覚で言うと、
MCTS: ”読み"に相当する部分
DualNet: "直観"に相当する部分
になります。
MCTS単体やDualNet単体だけでも囲碁をプレイすることはできますが、単体だと大して強くはないです。2つを組み合わせることで相乗効果で強くなるのが画期的なところです。
MCTS自体は昔からある手法で、ランダムに終局まで何千局も打って確率的に良さそうな手を探索していく方法です。途中経過盤面の優劣の評価が難しい囲碁のようなゲームには相性がよいのでよく使われています。
DualNetはAlphaZeroで初めて考案されたものですが、実態はただのニューラルネットワーク(ResNet)です。なぜDualという名前が付いているかというと、ある盤面を入力すると「次の1手の確率分布」と「現在の勝率」、という2つの値を出力する仕組みになっているからかと思います。
MCTSとDualNetを組み合わせる
通常のMCTSでは、今の盤面から良さそうな手を選んで数手先までは真面目に探索しますが、それより先は探索しきれないのでランダムに終局まで打って手を確率的に評価します。
この良さそうな手を選ぶ、ところとランダムに打って評価する、という2つの部分をDualNetが担当するように代えることで飛躍的に強くなります。
囲碁では着手可能な手が多いので、次の1手を選ぶ際に人間は感覚的に数を絞ってから読みを入れますが、この感覚的に手を絞るという行為をResNetが代替している感じです。
ランダムに終局まで打つという方法も人間の大局観的なものを再現する素晴らしい方法なのですがコンピュータリソースを食いすぎます。ResNetがうまく代わることで、読まなくてよいルートを飛ばしてより深く読むことができるようになります。
DualNetの学習
ここまでDualNetが良い感じに直観に相当する機能を担ってくれていましたが、それにはもちろん学習が必要になります。初期状態のままのDualNetではただランダムに手を選ぶのと変わりません。
できるだけたくさんの棋譜を集めて途中経過の盤面をDualNetの入力とします。実際の棋譜の勝敗をそのまま勝率100%もしくは0%を答えとしてニューラルネットワークの学習を進めていきます。
ぷよ碁のAI
ぷよ碁の思考エンジンはこのAlpaZeroをブラウザでも動くように簡易化した小さいモデルで開発しています。32チャンネルの残差ブロックを9個積んだモデルでtensorflow.jsに変換して数百KBのため、スマホでも動作可能です。
まだまだ学習途中ですが、うまく学習を進めるうえでのコツもあるので今度また紹介します。