ニューラルネットで遊びましょ - 序盤編

...人間が将棋の手を考えるときはまず「あり得そうな手」を数手リストアップしてから(読みなり何だかんだして)良さげな手を選びます。

今回のゴールは序盤限定ですが『「あり得そうな手」を数手リストアップ』(正確には有りえそうな順に候補手を並べる)する部分を作りこみましょう。

将棋ソフトは基本的に定跡ライブラリー無しでは序盤が苦手です。そのためアンチソフトの基本テクとして「定跡から早めに外れる」はよく知られています。

...この部分を補うため序盤に定跡ライブラリーから外れても「らしい」手を選べるようにするのが今回の目的となります。

ニューラルネットワーク
http://ja.wikipedia.org/wiki/%E3%83%8B%E3%83%A5%E3%83%BC%E3%83%A9%E3%83%...

...はパターン認識(時に画像)でよく使われます。局面の情報をパターンと認識してそれと関連性の高いパターン(局面...すなわち候補手で局面を進めた局面)に反応するニューラルネットを作成する...訳で、設定は以下の様になり...

[[我はAIの専門家では無いので間違っているかもしれません]]

入力 = 「現在の局面」のデータ + 「候補手からひとつ選んで一手進めた局面」のデータ

出力 = 0.1 から 1.0 ← 「あり得る」度が高いほど1.0に近似する。逆なら0.0へ。

...これを全ての候補手に試して出力の高い候補手から考慮する...となります。

余談ですが、理想としては

入力 = 「現在の局面」のデータ
出力 = 次の手

...なのですが、さすがにこれは無理です*。(「どうやって将棋のルールをネットに仕込むの?」と思いついた時点で無理、少なくとも物凄く難しいことであるのは自明ですね。)

*ゲームによっては十分可能ではあり、これを推し進めると究極的には評価関数になってしまいます。

「現在の局面」のデータ...と簡単に書きましたが、これも一考ものです。

以下の初期盤面

ky ke gi ki oh ki gi ke ky
.. hi .. .. .. .. .. ka ..
fu fu fu fu fu fu fu fu fu 
.. .. .. .. .. .. .. .. ..
.. .. .. .. .. .. .. .. ..
.. .. .. .. .. .. .. .. ..
FU FU FU FU FU FU FU FU FU 
.. KA .. .. .. .. .. HI ..
KY KE GI KI OH KI GI KE KY

...をデータ化すると81個の数字になります。ですがこれだけでは情報不足でしょう...即ち、各駒の特徴が織り込まれていないので認識するための材料が不足しています。(と、我は思う)

この点において碁、オセロ、バックギャモンは 石の存在そのものが重要であり、各石の性能(?)に差別が無い ので(実際の有効性・難易度は別として)局面をパターンとして捉えるにはすっきりしているようで...

画像を認識するとき、その特徴を際立たせるため意図的に情報の取捨を行います。

(例)

①カラー を 白黒・グレースケール に変換 ⇒ 形状を認識するときに「色」は不要の情報

②ピクセルの数を落とし画質を落とす ⇒ 大まかな特徴を残し、些細な部分を振り落とす

③拡大・縮尺を施して比較対象とサイズを揃える ⇒ 比較対象の正規化

...今回我の場合は「補足」を行います。

ここまで書いてやっと最近実装した 「各マス毎に敵・味方の駒がいくつ利いているか」 が登場するわけですな。ニューラルネットに食わせるデータは

①現在の局面情報 (持ち駒の種類・数も)
②現在の局面の利き情報
③一手進めた局面情報 (持ち駒の種類・数も)
④一手進めた局面の利き情報
⑤王手掛かっている?

...諸々となります。

使用するライブラリーは

Encog
http://code.google.com/p/encog-java/

...です。調べたところこれがJava用では速いということらしい。

投稿者: 紫外線 投稿日時: 金, 09/24/2010 - 10:37 categories [ ]