ヴァルヘルのソフト開発日記

動画管理や録画予約、本の発売予定などの便利ツールの開発状況のお知らせ

2013年09月29日

オセロゲームを作る!盤面を画像認識で評価

 オセロの盤面を回帰分析で評価しようと色々な分析の本を立ち読みしまくっていたらニューラルネットワークというおもしろそうな手法を見つけた。

人間の脳のニューロンを模したAIとか遺伝的とか言われているロジックで回帰分析で解けないような問題も解ける場合があるという。

画像認識などにも使われているのでオセロの盤面を画像認識で評価してみようと思う。

とりあえずエッジや角・Xの駒の並びパターンが出てこなくて評価が難しい序盤戦の盤面をパターン認識させて評価してみようと思う。

評価するのは6手目~20手目前後・・・何手目までパターン認識できるかはやってみて決める。

ちなみに1手目は1種類、2手目は3種類しか手がないので評価しない。2手目は3種類均等に打つようにしている。

オセロの本によると2手目~11手目くらいは鼠定石、牛定石、兎定石、虎定石という具合に名前がついていた。

鼠定石

牛定石

虎と兎は4手目にどこに打つかで決まるそうな。

虎・兎定石

4手目を右下に置くと虎、真下に置くと兎。

今のところ勝率は 虎・兎 > 牛 > 鼠

4手目は61種類、5手目は340種類しか手がないのでランダムにちらす(多少勝率が良い手に寄せているけど)

オセロの場合は最終的には勝つか負けるか、何手差かなどの答えがあるので教師あり学習方式を使うことにする。

ニューラルネットワークの中でも構造が単純なバックプロパゲーション法で作ることに。

画像認識などでよく使われている方式。

入力層・中間層 x 1・出力層の3層構造にする。

入力信号は128個。8 x 8 の 64マスの駒の状態を 入力1~64が駒が黒の場合ON、65~128は駒が白の場合にON、駒がない場合はOFFにする。

ただこれだと信号が1次元なので隣接するマスの状態を表現できていないが、良い方法が思いつかない。

中心のマスとその周りの8個のマスを入力にして隣接するマスを表現するという手を思いついたが・・・。

その場合は64コマ×9個×2個(白黒)の入力になる。

とりあえずお試しで単純な128個の入力でやってみる。

1つの盤面につき90°ずつ回転させ、さらに鏡面反転させて8通りを覚えさせる。

中間層は何個でもいいらしい(最適な数を出すのはむずかしいらしい)ので8個・・・盤面が 8 x 8だからという無理やりな理由。

出力層は-64コマ~64コマのコマ差分の129個作ろうかと思ったが、はずしたときに関係のない数になる可能性があるので1個にして0.0~1.0の出力を 129分割して出す事に。

しかし問題が。はじめは出力信号をコマ差にしようと思ったが序盤ではどの手もコマ差が-64~64の範囲という雑な棋譜ばかりなので使えなかった。

しかたがないので各手の勝率を出力信号にすることに変更。

で、結果は・・・朝から回しているけど学習が終わらない。

どうやったら効率よく学習するかテスト的に九九を教えてみる。

入力層は9個、中間層3個、出力層1個。全部答えが正しく出るまで学習を回してみる。

1.1 x 1~9 x 9を1回ずつ学習させるパターンを繰り返す

2.1 x 1~9 x 9を正しく答えが出すまで1つずつ学習を繰り返す

  9 x 9を覚えた時には 1 x 1を忘れているので、最初からやり直し

どちらも正しく答えを出した場合は学習させない。

という方法をとったら2のほうが早く学習が終わった。 速いと言っても20万回くらいかかった。

プログラム的にも2のほうは入力信号のセット回数が少ないので効率がいい。

ただオセロの場合は教えている答えが正しい保証がないので適当な回数で学習を切り上げることにする(1手あたり1000回くらい)

それでも遅い・・・序盤戦だけでも500万手くらいあるので全部教えるには何日もかかりそう。

ニューラルネットワークの参考書を色々立ち読みしたところ、オライリーのゲーム開発者のためのAI入門がよかった。


プログラミング
オセロ