はじめに
この記事は「Pylearn2で三目並べのAIをつくってみる」の続編です。
使用しているMLPモデルや棋譜のフォーマットなどの情報が書いてあるので、前の記事をお読みいただいてから、この記事を読むことをお勧めいたします。
前の記事で
今後は一度のトレーニング結果を元に、任意の入力に対する次の一手を簡単に得られるようにして、三目並べのゲームに実装してみようと思います。まずは三目並べのゲームプログラムを作らねば。
と結んでいましたので、こちらを実現します。
そのために、トレーニング済みのモデルの保存と読み込みをする必要がありました。
その方法を紹介して、実際にwxPythonで三目並べを作成します。
ソースコードなどの必要なファイルはGitHubに上げていますので、そちらから取得してください。
Pylearn2でのモデルの保存と読み込み方法
分かってみれば、簡単でした。
from pylearn2.utils import serial
...
...
ann = mlp.MLP([h0,out], nvis=9)
path = "./hoge.pkl"
# save model
serial.save(path, ann, on_overwrite='backup')
# load model
ann = serial.load(path)
'on_overwrite'は'ignore', 'backup' が選択できます。
- ignore : 無視して上書き
- backup : save前に .bak としてバックアップをし、saveが成功したら .bakファイルを削除します。saveが失敗したとき、復旧できます。
特に理由がない限り、'backup'でよいのではないかと思います。
wxPythonによる三目並べ
動作確認環境
- LinuxMint 17.3 (python2.7.6 + wxpython3.0.3)
wxPythonは2.8でも動作すると思います。
wxPythonのインストール手順はこちらなどをご覧ください。
WindowsではPylearn2のインストールが至難の業なので、Linuxで実行してください。Macでは...すいません、分かりません...
使い方
1. モデルのパラメータを設定し、学習したモデルをSaveする
右半分のパネルでモデルのパラメータを設定します。
- h0 : Sigmoid
- irange : 初期の重みの範囲。±irangeの範囲からランダムで設定されます。
- init bias : 初期バイアス値
- out : Softmax
- irange : 初期の重みの範囲。±irangeの範囲からランダムで設定されます。
- open .csv
- 読み込む棋譜ファイルの指定。tic_tac_toe.pyと同一フォルダから読み込まれます。
- save .pkl
- Saveするモデルファイル名。tic_tac_toe.pyと同一フォルダに作成されます。
- term criterion
- termination_criterion. 学習終了するEpochCounter値を設定します。
2. Game Modeの選択
- Man vs Comp : 人が先攻、Computerが後攻
- Comp vs Man : Computerが先攻、人が後攻
3.読み込むモデルファイルの指定してGame Start
4.マウスの左クリックで〇×を置きます。Computerは学習結果から自動で置きます。
一度モデルを保存すれば、それを指定するだけでそのモデルでゲームできます。
楽しむポイント
- 読み込む棋譜ファイルを先攻が勝ったもの(records_1st_win.csv)、先攻が負けたもの(records_1st_lose.csv)、全部まとめたもの(records.csv)で変更すると挙動が変わります。先攻が勝った棋譜で学習させたモデルで、Computerに後攻で打たせる意地悪をすると...
- termination_criterionを非常に小さい値にすると...
- 自分で最善手を打っている棋譜を元にすると...
などパラメータを変えて、AIの挙動を見て楽しんでください。
また、以下のようなコンソール出力されるComputerが打つ手の自信の具合(と私は呼んでいます)を見ながらゲームするのもおススメです。
[ 0.1223754 0.07839377 0.1005455 0.09967972 0.0958171 0.05355689
0.13877278 0.08772236 0.22313648]
[ 1.69255291e-01 1.79474672e-01 6.59611187e-02 8.35728072e-02
1.76704145e-01 5.69182580e-05 1.74977445e-01 1.48576416e-01
1.42118607e-03]
[ 3.94020768e-02 3.56583963e-03 9.39233627e-05 1.20089713e-01
4.85647829e-01 2.05857441e-04 2.00150417e-01 1.50013023e-01
8.31320404e-04]
[ 3.55036488e-01 8.74969597e-03 2.24572898e-04 7.35919590e-04
1.89100732e-02 3.48102279e-04 2.63566398e-01 3.48737495e-01
3.69125555e-03]
[ ]で囲まれた9つの数字は合計で1になります。9つの数字は9つのマスに対応します。
この中で最大の値を取っているマスにAIは打ちます。
この数字を確率のように考えると、
- どの数字もあまり大差がない場合 → あまり自信なし。
- ひとつだけ圧倒的に値が大きい場合 → 自信満々
自信満々に変なマスに打つと、ちょっと愛らしい。
ぜひ、いろいろと試して遊んでみてください。
参考
https://github.com/lisa-lab/pylearn2/blob/master/pylearn2/train.py
http://fastml.com/how-to-get-predictions-from-pylearn2/
http://deeplearning.net/software/pylearn2/library/utils.html