AIプログラムとかUnityゲーム開発について

探索や学習などを活用したAI系ゲームを作りたいと思います。

オセロゲームを作る(2) 評価関数の学習を試みる

評価関数を学習させてみました。
勝った場合は、勝った方の手による局面にプラス。負けた方の局面にマイナス。
これをやると、それぞれが打った手で変わってない配置は、プラマイゼロで評価が変わりません。
本来は、強化学習は末端から係数をかけて、だんだん報酬を減らしていくようですが、とりあえず関係なくやってみました。


学習させてる特徴はお試しで、左上の隅の3x3の範囲です。オセロは左右上下対象なので、この評価は4隅にそれぞれ使っていいとは思いますが。
盤面の配列には、0:空白、1:黒、2:白の3パターンですので、
9マスだと、3^9=19683の組み合わせがあります。
評価値が大きくなりすぎると、過学習するので、評価値自体に係数かけて少しだけ値が減る方向に引っ張ります。
機械学習ではL1ノルムってやつですね。
あ、絶対値にするの忘れてた(´・ω・`)
いや、eval3_3が負値なら、増やす方向に働くし、正値なら減らそう方向なので、このままでいいのかな?

int index = 0;
index += ban[1, 1];
index += ban[2, 1] * 3;
index += ban[3, 1] * 3 * 3;
index += ban[1, 2] * 3 * 3 * 3;
index += ban[2, 2] * 3 * 3 * 3 * 3;
index += ban[3, 2] * 3 * 3 * 3 * 3 * 3;
index += ban[1, 3] * 3 * 3 * 3 * 3 * 3 * 3;
index += ban[2, 3] * 3 * 3 * 3 * 3 * 3 * 3 * 3;
index += ban[3, 3] * 3 * 3 * 3 * 3 * 3 * 3 * 3 * 3;
if (turn == learnTurn)
    eval3_3[index] += 0.1f - eval3_3[index] * 0.0001f; // win
else
    eval3_3[index] += -0.1f - eval3_3[index] * 0.0001f; // lose

評価値も0.1だけ足しこんで、実際は(int)でキャストして使ってるので、ある程度複数の評価が集積しないと働かないはずなので、
オンライン学習におけるミニバッチみたいな感じで動ているような気がします。
あと、同じ局面が増えないように手の選択にランダム要素を入れています。同じ評価の手が複数あれば違う手を選択するので、同じ局面になりにくい=過学習しにくいはず


白は学習評価関数使用。黒は使用せずで、自己対戦させて、現在、1405戦で、白が810勝ち、黒が565勝なので、あきらかに白が勝ち越してますね。
まだ対戦数が少ないので、なんとも言えませんが。あと、過学習してるだけで、汎用性のある強さを獲得しているかは不明。
f:id:yasu9780:20161206225825p:plain


breakbee.hatenablog.jp
↑これ見てるとL2ノルムっているのかな?と思ってしまう