2013年1月28日月曜日

機械学習したはいいけど。。。(失敗編1)

メカ女子将棋、評価関数を機械学習することにしました。
ただ、とりあえず大雑把にやってみたところ、失敗こきました(T_T)

ただ、学習のiterationをまだ一回廻しただけなので、まだまだ成功する
可能性は少しあります(^^)

ここにやり方を一通り書きますので、もしよろしければ、識者の方の意見を
賜りたいと思います(たしかコメント可能になっていると思います)

1. liblinearを準備する

liblinearについてはlibsvmの親戚で速いやつ、くらいに思っていただければ
いいと思います。今回はclassify(二値分類)ではなく、regression(回帰)
を使ってみることにしました。これは二値分類の場合に0か1が答えとして出てくる
代わりに、関数値がdouble型で返ってきます。この学習の種類は、trainのsパラメータとして
-s 11を使用した場合に相当します(L2-regularized L2-loss support vector regression (primal))。

今回はtrainとpredictを使うほか、評価関数内でライブラリとしてliblinearの
内部の関数を利用します。

学習のためのファイルは次のようなレコードの並びです。
regressionの場合、1か0ではなく、関数値を与えます。

関数値 素性インデックス1:素性値1 素性インデックス2:素性値2.............
この構造はlibsvmで使われるファイルと同一のものです。


2. 棋譜
色々やってみたのですが、trainで学習できる棋譜の数はon memoryでいける
最大値が大体300局くらいでした。CSA形式に準じた形の棋譜を準備します。

3. 素性抽出
まず、棋譜のすべての局面において、すべての可能手を列挙するプログラムを
書きます。そして、各局面のすべての可能手によって生じる可能性のある兄弟
局面を求めます。
その兄弟局面において、まず深さ1で探索して探索の値を求めます。
棋譜にあった局面は、歩1つぶん(100くらい)を加算します。
棋譜にあった局面よりも大きい値を持つ兄弟局面については、棋譜にあった局面
から100を引いた値を設定します。
これで、棋譜にあった局面が突出している状態になります。

次に素性を求めます。すべての兄弟局面について、素性ベクトルを求め、先ほど求めた
探索値を付与します。
今回は2駒の関係を用いました。具体的には駒の位置(100通り)と駒の種類(16通り)の
二乗になりますので、 2560000種類の素性インデックスが可能性としてあることになります。

この各素性インデックスに大して、素性値を求めます。すべての2駒の関係について、
王手を含む効きの種類が細かく分類して10通りくらいあるのですが、それを1--10で
数値化します。効きがある関係だけ素性を用意します。

こうして、1局面について、可能手の数だけレコードができます。
これをファイルに落としていきます。1局を1ファイルとしました。

4.学習
3.で作ったファイルのうち、300局をcatで固めます(kifu300.txtとします)。
その結果から、学習を行います。

$ ./train -s 11 kifu300.txt kifu300.model

膨大なメモリを使い、10分くらいでkifu300.modelファイルが出来上がります。

5. 利用
liblinearをメカ女子将棋に組み込みます。
面倒だったので、blasのライブラリと一緒に.aファイルをリンクして
しまいました。
諸般の事情で、メカ女子将棋のエンジンはshared libraryなので、
このshared libraryに対してblasとliblinearを結合します。

インクルードファイルはlinear.hになります。

まず、対局開始時にmodelファイルを読み込むように改良します。
そして評価関数をpredict関数の出力値に置き換えます。
関数出力(predict)の結果は、いい忘れましたが、-10000から10000
にクランプした上で、
-1から+1にスケールしてありますので、predictの結果に10000.0を
掛けて乱数を載せて評価関数の値として返します。

6. 結果
predictの時間が長くかかれば成り立たないなと危惧していたのですが、
大丈夫でした、predict自体の時間は短いようです。ただ、素性ベクトルを
局面に対して求めるのに時間が掛かっているようです。


結果としては、大変弱い評価関数が出来上がりました。
ただ、出来たmodelファイルからさらに、2から5を繰り替えしていけば、
強化学習ができるのではないかと思っています。

すみません、長くなりました。以上です。

2013年1月5日土曜日

メカ女子将棋出陣!!

あけましておめでとう御座います。

今年も宜しくお願い致します。

旧メカウーサー将棋(及び旧メカ将棋)はまたしても新たに改名いたしまして、
「メカ女子将棋」という名前で第23回世界コンピュータ将棋選手権に出場
することになりました。ぱちぱち!

 (まだお金払ってないので、月曜日に郵便局行ってきます☆)

今回出場に際して、豪華メンバーによる「メカ女子将棋部」を編成しましたー。うおー。
なんと、女流棋士の方がお二人joinされましたー。(@_@)

メカ女子将棋部:


  •  竹部 さゆり(女流三段)様
    • メカさゆりん
  •  渡辺 弥生(女流一級)様
    • メカみおたん
  •  T.R. (女子大学院生)様
    • メカりえぽん
  •  木村 健(メカウーサーメカ担当、実装責任者)
    • メカきむりん、プロジェクトリーダー


現在のところ、竹部さんと渡辺さんには棋譜のチェックや、評価関数のチェックを
お願いしたいと思っています。T.R.さんには広報をお願いしています。

メカ女子将棋部のTwitterアカウントも併せて新設されました。
@mechajyo になります。

 https://twitter.com/mechajyo

今年はNPSをもっと増やしたいと思います。また女流棋士の方の助けを得て、
より強い定跡部や評価関数を目指したいと思います。

長年の課題となっております、GPGPU対応なのですが、今年は後手に廻り
そうです。でもいつかはGPGPUで思考する将棋プログラムを完成させたいです☆

声援宜しくお願い致します。

(文責:kimrin)