オセロAI世界1位が最弱オセロAIを作った話(技術編)

# 前置き

強いオセロAIで世界1位のにゃにゃんです。以前こんな記事でバズった人です。

https://qiita.com/Nyanyan_Cube/items/195bdc47bb1d7c6f8b24

この記事は、強いオセロAIが作れるなら弱いオセロAI、正確には **負けることに強いオセロAI** も作れるんじゃないかと思って作ってみた話です。

この記事は比較的技術に寄った内容です。読み物に近い方はこちら。併せて読んでいただけると理解が深まります。

https://note.com/nyanyan_cubetech/n/n2674dd6f5973

作った最弱オセロAIはWebサイトとして公開しています。ぜひ遊んでみてください！

https://www.egaroucen.nyanyan.dev/

# 最弱は評価関数逆転ではない

負けようと頑張るオセロAIは、強いオセロAIの評価関数を逆転するだけでは作れません。反転しただけでは、負けることに強いというよりは、単に相手を翻弄することが苦手な、勝つことにも負けることにも弱いだけのオセロAIになってしまいます。

では勝ちを目指す評価関数がそのまま負けを目指すオセロAIでも使えるかと言われれば無論使えません。負けを目指すオセロAIの評価関数は一から作る必要があります。

# 負けを目指すオセロ、学習データがない…！
負けを目指すオセロはそもそも人間のプレイヤーがほとんどいませんし、AIを作る人もほとんどいません。勝ちを目指すオセロであれば人間による対戦の棋譜が簡単に手に入ったりするのですが、負けを目指すオセロAIは評価関数の学習に使えるような棋譜などのデータがインターネット上に存在しません(※1)。

※1: さすがに学習データが転がっていないのは負けオセロを作るハードルが高すぎると思ったので、私が自前で生成したものを公開しました。自由にお使いください。

https://github.com/Nyanyan/Egaroucen/tree/main/records

# 強化学習的なことをしてみる

先に言うと、これは強化学習ではないと思います。強化学習で一般に使われる報酬は使っていません。ただ、考え方は強化学習と似ていると思います。

学習データがないのであれば、自前で作るほかありません。最初はランダム打ちの自己対戦から始めて、棋譜を生成して、その棋譜を使って評価関数を深層学習して、その評価関数を使ったAIで自己対戦をして…を繰り返しました。

ランダム打ちから始めて良いのかと直感的には思ったのですが、ランダム打ちの棋譜から学習させただけで私と対戦した体感では結構負けることに強くなっていました。このループを繰り返すと徐々に負けへの強さが増していきます。

小さめのモデル(パラメータ数はトータルで46380個だけ)で深層学習を行ったので、学習データは数千局で十分そうでした。このために学習ループはトータルで数十時間だけで済みました。ちなみに学習(RTX3090を使用)よりも自己対戦(Core i9 11900Kを使用)の方が5倍くらい時間がかかりました…。夜、パソコンが頑張って計算している横で私は眠っていました。

# 評価関数のモデルは勝ちを目指すものと大体一緒

評価関数のモデルについて少し詳しく話します。

基本的には私が作った世界最強(自分調べ)のオセロAIの評価関数と同じモデルで、石の配置のパターンによる評価と着手可能位置による評価を使いました。ただ、世界最強の方は16個の石の配置のパターンを使っているのに対して、今回作った最弱の方は14個に減らしました。これは、「まあこのパターンはそんなに重要じゃなさそうだからまあいいだろう」という適当な考えによるものです。

各パターン(石の配置と着手可能位置)はone-hotエンコーディングでニューラルネットワークに入力して、 **それぞれのパターン内で、他のパターンとは断絶して** 全結合層にかけるようにして、最後に全てのパターンの出力を加算層でまとめて出力します。太字のところが大事で、こうすることで各パターンに現れる状態数が高々数万なことを利用して前計算を使って高速化できます。言葉の説明だとわかりにくいかもしれないので、気になる方は以下の記事をご覧ください。

https://note.com/nyanyan_cubetech/n/nb6067ce73ccd?magazine_key=m54104c8d2f12

余談ですが、データをとても大量に用意できるのであれば深層学習で前計算した状態全部をそれぞれ別々に最急降下法などで最適化することで、深層学習よりも高い性能が得られることが経験的にわかっています。

# アルゴリズムは勝ちを目指すものと一緒

ゲーム木探索アルゴリズムとして、勝ちでも負けでも、強いオセロAIを作るならminimax系統のアルゴリズムであるNegascout法が良いでしょう。そして、このアルゴリズムは適度に抽象化して書いていれば勝ちでも負けでも全く同じものを使えます。私は以前に世界最強のオセロAIを作っていたので、そのコードを拝借して微妙に書き換えることで探索アルゴリズムを書きました。

# Webサイトとして公開した

こうして無事負けることに強いオセロAIができたわけです。オセロAIを作ったらWebサイトとして公開したくなりますよね(？)

ぜひ遊んでみてください！

https://www.egaroucen.nyanyan.dev/

# 世界最弱に！(？)

ちょっと前にとても流行って、今でも定期的に誰かが遊んでいる超有名な最弱オセロAIがありますね。

https://avilen.co.jp/service/othello/?weak

これには余裕で負けられました！

https://twitter.com/Nyanyan_Cube/status/1516384150114402309?s=20&t=HOfPZtqbIjzZnoQq0qxhBQ

そして、実はこの有名なAIよりも弱い(負けることに強い)オセロAIがあります。こちらです。

https://unityroom.com/games/make-reversi

これにも(結構僅差ですが)負けられます。

https://twitter.com/Nyanyan_Cube/status/1516694504514125825?s=20&t=oTMAcaHOv5E-LJGuCEdtaA

ちなみにこの負けリバーシは噂によれば20手読みしているらしいですが私のオセロAIは15手です。

この負けリバーシ以上に弱い(負けることに強い)オセロAIは見つけられていないので、多分私のEgaroucenが世界最弱です。

# 最後に

世界最強と世界最弱、2つのオセロAIを作りました。なんだか嬉しいです。

せっかくなので最強と最弱に戦ってもらういましょう。

![egaroucid_egaroucen.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/494375/4cb92d6c-a847-f276-0858-eb3843f96a4d.png)

黒が最弱、白が最強です。かなり大差でした！

ちなみに最強AIを搭載したパソコン向けアプリは以下のURLで無料公開しています。

https://www.egaroucid-app.nyanyan.dev/

今回作った最弱オセロAIのGitHubレポジトリはこちらです。

https://github.com/Nyanyan/Egaroucen