2018 年、Google は AlphaGo ニューラルネットワークで GO チャンピオンを打ち破り、大きな話題になりました。さらに、家庭用 GPU を使って学習プロセスを高速化する優れたオープンソース機械学習ライブラリも利用可能になりました。
私は Abak でそれを試す決意をしましたが、始めた当初はニューラルネットワークが何かさえ、ほとんど分かっていませんでした。大学時代(1996 年)に少し誘惑はあったものの、データも GPU も目標もなく、取り組むのは難しかったのです。さらに数学的にも、ニューラルネットワークは重いテーマで、多くのひらめきが必要です。
長く激しく取りつかれたような研究の末、私はモデルを構築し、それに学習させることができました。
巨人の肩の上に立ちながら、私の最初の意図は、1990 年代に TD-Gammon を開発した Gerald Tesauro 博士から学ぶことでした。記憶が正しければ、これは強化学習アルゴリズムの最初の実用的実装でした。
しかし Abak は二次元ゲームなので、提案されたモデルは使えず、自分のものを開発しなければなりませんでした。私は一部のアルゴリズムの出力を、専門知識としてモデルの一部に組み込むことに決めました。そうすると NN の学習プロセスが楽になるのです。そうするのは少しズルのようにも感じました。
以下は両モデル、Backgammon と Abak の比較です。
Backgammon で広く使われる TD モデルは列を記述します。盤上の各列について、それを表すために 4 つの入力が使われます。
- チェッカーなし: [0,0,0,0]
- チェッカー 1 個: [1,0,0,0]
- チェッカー 2 個: [1,1,0,0],
- チェッカー 3 個: [1,1,1,0]
- チェッカー 3 個超: [1,1,1,1].
これを各チームごとに 28 セット(盤の各列に 1 つ)持つため、合計入力は 28*2*4 に、バー上のチェッカー数を数えるいくつかの入力が加わります。残念ながら、これは記憶だけを頼りに書いているので、正確でないかもしれません。
Abak のモデルはかなり異なります。これはチェッカーを記述し、それぞれに特徴量のセットを持たせます。新しいバージョンでは補完のために簡略化した盤面記述も追加しましたが、結果はそれほど驚異的ではありませんでした。それでも特徴量群は残っています。
ゲーム記述モデルは 4 つの部分から成ります [477 inputs]:
- チェッカー記述(14x30):チェッカーのステータス、距離、高さなどを含みます。クラス自体は含みません。クラスはモデル内の位置から継承されます。
- チーム状態(4x2):いくつかのチェッカー数や状態特徴の集計。
- 強さマップ(24x2)。
- ゲーム状態:次に誰が振るか! (1).
モデルの完全な説明は以下で確認できます。
バージョン:
1.- Python Cumpy (TD-V1)。
この AI の最初のバージョンは、GPU 上で動く Numpy 風ライブラリ Cumpy を使い、純粋な Python で学習させました。ゼロから学びたかったので、Tensorflow も少し触ったものの、あえて裸で行くことに決めたのです(つまり、素晴らしい Python と Cumpy の組み合わせだけを装備して)。
特徴:
- チーム 0 の勝率を推定する 1 つのネットワーク。
- ポイント制に未対応。
- 「次に誰が振るか」フラグを持っていなかった。
- 強さマップを持っていなかった
- 隠れ層 1 層、活性化は sigmoid。
- 専門知識入りの旧 AI(GOFAI)に勝つまで 45.000 ゲームかかった。
- 4.500.000 ゲーム学習し、GOFAI に対して 75% 勝った。
- 2 年間本番稼働した。
2.- Tensorflow (TD-V2)。
Version 1 で痛かったのは、「次に誰が振るか」フラグなしで学習していたため、勝率計算が得意ではなかったことです。どういうわけか、良い手を選ぶという点では NN の結果はかなり良かったのですが、数学的には一貫していませんでした。Version 2 ではその問題を修正し、ゲームが 1、2、3 ポイントで終わる確率を計算する新たなネットワークも追加しました。
今回は新しいモデルを学習するために Tensorflow を選びました。フレームワークを学びたかったことと、良い出発点になる優れたサンプルを見つけたからです。
特徴:
- チーム 0 の勝率を計算する 1 つのネットワーク。
- ゲームが 1、2、3 ポイントで終わる確率を計算する 1 つのネットワーク。
- 新しい強さマップを含む。
- 隠れ層 2 層。活性化関数は隠れ層で Leaky RELU、出力層で sigmoid。
- 12.000 ゲームで TD-V1 に 50% 勝つようになった。
- 350.000 ゲーム学習し、TD-V1 に対して 80% の勝率に到達した。
3.- Version 3:保留中。
最善手を選ぶ意思決定の最後の一歩として、最良の Equity [%W*%p1+%W*%p2+%W*%p3] を探す単純なアルゴリズムがあります。
マッチの目標、各プレイヤーが勝つのに必要な点数、キューブ値に応じて、ネットワーク出力に異なる重みを与えます。
これを扱える NN を作りたいと思っています。それが V3 になります。今は開発していません。
Abak のニューラルネットワークモデル:
チェッカー記述(14 inputs x 30 checkers):
- ホームまでの距離 x/25
- 上にいるチェッカー数 x/4
- 下にいるチェッカー数 x/4
- バーにいるか [0,1]
- ホームにいるか [0,1]
- 安全か(距離 = 0 の位置)。 [0,1]
- 別のチェッカーとブロックを形成しているか [0,1]
- Druid に捕まえられうるか [0,1]
- Druid に捕まっているか [0,1]
- 拘束しているか(この入力は各 Druid にのみ適用) [0,1]
- 近距離ゾーン(前方 6 ポジション)でヒットされるリスク [0..1]
- 長距離ゾーン(前方 12 ポジション)でヒットされるリスク [0..1]
- Druid に捕まるリスク [0..1]
- 移動可能性 [0..1]
各チームに関連するゲーム入力(4x2):
- バー上のチェッカー数。 x/15
- 安全なチェッカー数。 x/15
- すべてのチェッカーがホームにある。 [0,1]
- 安全なチェッカー 0 の数。 [0,1]
強さマップ:(24*2):
最後に、Doctor Tesauros が Backgammon に提案したものに似た、しかし簡略化された force マップがあります。各位置と各チームについて、そのブロックがどれだけ強いかを 0 から 1 の数で表します:
- 0.0空なら。
- 0.1チェッカーが 1 個あるなら。
- 0.5そのチェッカーが Guard なら。
- 1.0チェッカーが 2 個以上あるなら。