終盤用の評価関数を何故作らないのか?

掲示板で質問を受けたのですが回答が長文になるのでこちらに書いておきます。

ちなみに(終盤では)モンテカルロ、駒割 + 位置評価 型以外にどのような選択肢があるのでしょうか?

私は好みませんが、終盤に特化した別の評価関数を用意するのが普通だと思います。
終盤特有の手筋(挟撃形や、玉を上から押さえ込むこと、etc..)に対して評価のときに加点するのです。
そして進行度のようなパラメータを持たせて、序盤と終盤の評価関数の値を進行度で内分して評価値を算出します。


これはそこそこ正確な評価が出来る可能性はあるのですが、次のようなデメリットがあります。


1. 進行度の調整が難しい。適当に見積るとその副作用で痛い目に遭う。
2. 序盤用と終盤用と2つの評価関数を常に計算しないといけないので全体的な探索速度に影響する。
3. 終盤特有の手筋を考えるためには将棋の棋力がそこそこ必要。
4. 競合する評価因子があったり、副作用があったりで、モグラ叩きのように対処療法の繰り返しとなる。
5. 評価因子に意味があるかを検証するためにパラメータを学習させなおして自己対戦をさせるなどTATが非常に悪い。棋譜からの学習にBonanzaでは1ヶ月ぐらいマシンを動かし続ける必要があるが、これより短い時間だと十分にパラメータを学習できない、などの懸念がある。
6. プログラムが非常に複雑になる。序盤用の評価関数のシンプルさとは対照的に、とても複雑な評価関数となる。
7. 差分計算がとてもやりにくくなる。
8. 終盤特有の手筋は、どこそこに利きがあるかなど利きに関する評価項目を取り入れる必要があるが、Bonanzaのように利きを持たないタイプの将棋ソフトではこれを計算するのが(計算コスト的に)大変。


Bonanzaのように利きを持たないタイプのソフトでは、8.のせいで、不向きなのではないかと思います。
また、1〜6.の手間が馬鹿にならないため、趣味で作っているレベルの個人開発の人にも向かないと思います。


GPS将棋のようにチーム体制で開発していて、優秀な人が何人もいて、マシンが何台もあるなら、評価因子を考える人とコードを書く人と検証する人とがそれぞれ分業でやるといいのかも知れません。


終盤用の評価関数を用意することが、上のようなデメリットに見合った効果が出るのかどうかはいまの私には判断がつきません。GPS将棋の快進撃を見る限り、そういうアプローチが正しいのかも知れません。これについては、もっと正確に検証せねば、と私は思っています。