762alpha アピール文書 2018年3月30日 V0.1 天野史斎 ■ まえがき 762alphaは学習の自動化を目的とするコンピュータ将棋ソフトウェアです。 今回も新機軸(と私が勝手に思い込んでいるブツ)が盛りだくさん! …orz ■ 新機軸(と私が勝手に思いこんでいるブツ)     _人人人人人_ (その1) > 今さら < 新しい局面表現 FlowBoard      ̄Y^Y^Y^Y ̄ 局面を(駒の移動先dst, 移動方位bn)の集まりとして表現します。 これは置駒の手番を無視して移動可能性のみ抽象化したもので、Flowと勝手に名づけました。 盤面を構成する一連のFlowは、[dst]にある駒の価値(手番を考慮しない絶対値)の降順に ソートされた状態を保ちます。 <メリット> 1. あえて手番を含まない形をとることで、盤上の利きの書き換えを最小化する規則が簡単化、 2. 置駒を[dst]に移動させたときの駒得が常時丸見えのため、理想的なオーダリングを行える。 3. 分割指し手生成しやすい 2に関しては、次の順で指し手生成します。  - 駒を捕獲する手(捕獲する駒の価値の降順)  - 駒を捕獲せず、かつ移動先の当方利きが相手利き以上となる手(ただし成れる場合の不成りは後回し)  - 移動先の当方利きが相手利き未満となる置駒移動(ただし成れる場合の不成りは後回し)  - 上で後回しにした、成れる場合の不成り  - 当方利きが相手利き以上であるマスへの駒打ち  - 当方利きが相手利き未満であるマスへの駒打ち 個々の指し手は置駒についてはFlow単位、持駒については(駒の種類×筋)単位で分割生成です。 駒の捕獲の有無や指す位置の利きの大小を考慮した指し手生成順序とすることで、 何年か前にやろうとした、駒の移動を7種類に分類してオーダリングするという蒸気プランに なんと実装が与えられたことにになると思います。 指し手生成速度は、超シンプルなαβ法の下でCore i7-860 @ 2.80GHzで24万NPS。 (その2)壁打ち式学習法 良い評価関数とは、次の3条件を満たすブツのことだ、と思います。 (1) 水平線をもたらさないこと(無矛盾性(?)) (2) 有利に指し進めるという目的に照らして妥当であること(健全性(?)) (3) 同じ尺度で局面の良し悪しの比較が成立すること(全順序性(?)) (1)は対象の評価関数で探索と着手を繰り返したときの評価値の推移でテストできます。 指し進める中で当方手番の評価値の低下があったら水平線を生じた証拠。 (2)のテストのためには、当方の着手xによって当方が見込んだ最悪の利得が 本当に正しいのか、対戦相手に当方の評価関数が想定していないかもしれない 様々な手を指させて試す必要があります。 (3)は今回非考慮(後述)。 で、(2)のテストの相手役をベイジアンフィルタに務めてもらうというのが壁打ち式学習法です。 |{KPP}|個の単語を認識し、2クラスを識別するベイジアンフィルタが 評価関数サイド(当方=挑戦者)の評価値を下げる手を学習しつつ繰り出します。 (単語やクラスの生起回数だけとはいえ)過去の履歴を「全部」憶えているような学習器を 長期的に騙し通すことはまず不可能。評価関数サイドピンチ…! (その3)KPPの高速調整 一方評価関数サイドはKPPに対する荷重和という普通の評価関数です。(KPP以外に移行しない理由は後述) KPPというとTO、NY、NK、NGをKIと同一視したとしても|{KPP}| = 1696*(1696+1) = 29万種類あり、 ある探索結果の評価値を変更しようにも、どれを上げ下げすれば良いのか迷ってしまいます。 ここではその選択にもベイジアンフィルタを使います。 すなわち、|{KPP}|個の単語を認識し、|{KPP}×{UP/DOWN}|クラスを識別するベイジアンフィルタを設けて…… … 嘘です。そんなことをしたら今日日のPCのメモリに乗りません。 そこはさすがに縮小したタイプのベイジアンフィルタを使います。 (その4)ダイナミックアスピレーションサーチ 反復深化する中で、PVの先頭の手(当座の着手候補手)が変化したときの 評価値の変化量のヒストグラムをとり続け、上側と/下側のx %境界点を 初回探索時の窓の上端と下端とします。 これは探索結果の評価値の振れ幅が大きいと成立しませんが、 局面評価基盤に上記工夫を積み重ねたのだから成立してほしい… ■ 前回と同じ点 Futility purningしきい値の動的調整は今回もやります。 ■ 前回と違う点(新機軸以外) 場合分け方針は一時転進。KPPの荷重和による局面評価のアラを 非力な軽量評価関数でカバーするのまうまくいかなかった。 Null move purningは探索ルーチンの書き直しに伴い削除。 復活は後日検討。 ■ 局面評価をKPPのままとする理由 KPPによる局面Sの評価というのは、BonaPiece全体の集合から Sに含まれるBonaPieceのサブセットを得るという離散的な選択過程を含むため、 能力の解析はできなもとい非常に困難ですが、どうも関数近似能力は無いらしい。 しかしながら、現行の探索処理という 1度の探索で限られた範囲の局面同士しか比較されない条件において、 局面の順序を学習するには十分なのではないかという印象をもっています。 (あるKPP xの重みの変更は、xを共有するその他の局面の評価値にも変化をもたらすが  その変化を打ち消すことが他のKPPの重みの調整で成し得ないケースを想定し難い。  および、順序の学習といってもβ値、最善のPV、それ以外、の3種類の評価値が  現実に起こる比較の範囲で降順で並びさえすれば良いので比較的緩いのではないか。) 以上