評価値計算にシグモイド関数を用いる、非線形評価関数の実装
えー、上で書いた「もう一つの課題局面」から…なんですが、どの対局だったか忘れちゃったんで局面図無しです。
言い訳すると、一次・二次合わせて16戦してるんで、ログが埋もれても仕方ない…訳は無いんですが。あと、ひょっとしたら練習対局だった可能性もあるんで、それも合わせると20戦位になりますし。
んで、課題について覚えている範囲で。
形勢としてはGA将!!!!!!!有利な中盤の終わりで、桂馬が中央(敵玉方向)か端に成れる状況でした。で、GA将!!!!!!!が選んだ手は「端に成って歩を取る」方。
…持ち駒は充分あるのに、なんでここで一歩補充に行くかな _| ̄|○
評価関数的には「駒を取りつつ成る」という非常に分かりやすい手なので高評価なんでしょうけど、これはかなり酷いです。
で、さすがに私も反省しました。これは何とかせねば、と。
ざっくり考えた結果、評価関数を非線形のアルゴリズムにするとどうかと思い、近々実装予定です。
処理の流れ的には下図の様な感じです。一番上で局面を入力し、色々計算して一番下で評価値を出力します。
GA将の今までの実装と異なるのは、それぞれの特徴量(駒割とか位置評価とか王将の移動可能範囲とか)を計算した後に、三つのグループ(駒割・駒の働き・玉の固さ)に分けてそれぞれの合計をシグモイド関数に通す所です。
(※グループは適当に分けただけなので、数は増減するかもしれません。また、グループ分けも現状の案だと非常に大雑把です。)
シグモイド関数は定義域が任意の実数・値域が0〜1で、単調増加する関数です。また、入力の絶対値が大きいほど勾配が小さくなります。
んで、三グループそれぞれをシグモイド関数に通すとどうなるかと言うと、例えば「大きく駒得しているけど、自玉・相手玉への脅威は殆ど無い」場合を考えます。上記の課題局面とかがまさにそれです。
この場合、歩を取ったり成桂を作っても、駒割合計をシグモイド関数に通した値はほとんど増加しません。
そのかわり、例えば敵陣に持ち駒を打ち込むとか、そう言う駒の働きを良くする手は評価値が大きく増加するはずです。
つまり、「駒割は充分良いから、駒の働き・玉の固さを重視して指そう」といった感じの評価を出来るのではないかと期待しています。
この評価関数は、局面の評価ロジック自体はすぐ実装出来るのですが、学習(パラメータ修正)の部分で中規模改修が必要そう*1なので、全部まとめると結構な量のコードが必要そうです。
と、いう訳でこのアイデアは実装は後回しにして、まずは他の所から着手する予定です。これを実装するのは夏頃になるかと。
*1:既存の学習ルーチンは評価関数が線形である事を期待したコードになっている