将棋方程式を発見した!(10)


今回は、何をどう評価するかについて書く。


局面の静的な評価で、駒得だけしか見ていないとしよう。


このとき「駒の価値」をどれだけ精密に評価してもそっぽのほうに銀を打ったり、と金の製造に勤しんだりするコンピュータ将棋が出来あがる。


「駒得」しか見ていないと言うことは、その他の特徴(駒の働きや王の固さなど)はすべて 0 だとみなしていると言うことだからだ。


学習の方法によってはidealなものからどれだけの誤差があるのかがしばしば問題になるが、このケースでは100%無視しているのだから駒の働きに関しては100%の誤差率である。


このように評価していない因子については誤差率100%である。そして、何をどう評価しないといけないのかについて、コンピュータ将棋ではまだ確固たるものがあるわけではない。


しかし、駒の働きを全く評価していなくとも、20手ぐらい先読みするなら、「駒の働き」を考慮しているかのように振る舞うことがある。これは、20手後になるべく駒を損しないような指し手を選択した結果、駒の働きを考慮したかのような指し手になったと言うことである。


裏を返せば、それっぽい評価因子を選択して、ある程度先読みするなら、選択されていない因子もきちんと考慮しているかのように振る舞う。(ことがある)

女流の方がおっしゃってましたけど「コンピュータは、細かいプラスになる手をうまく指す」って。
でも、それって、むしろ今までは苦手だったんですよね
昔は、コンピューターは駒得重視で、大駒を大事にし過ぎで、大味の試合が多かった。
細かい得点を積み重ねたり、小駒の活用は、人間が上手くて、それが人間の長所と言われていた。

それが逆に、コンピュータの方が、細かい手を積み重ねるのが上手くて、受けも強くて、どんどん人間的になってきている……


今回、決勝戦で感じたのは「受けのすごさ」(小宮日記)
http://d.hatena.ne.jp/mkomiya/20080506/1210043661

このようにコンピュータのほうが「細かいプラスになる手をうまく指す」ようになってきたのは、読みが深くなってきたことや、たくさんの因子を評価するように変わってきたことが直接的な要因だと思う。(私が思うに特に前者)


「攻めは飛車角銀桂」の形にしようにも、歩をふたつ突いて(2手)、飛車を移動させて(1手)、桂馬を跳ねて(1手)、角道を開けて(1手)、銀を4段目まで移動させる(3手)のに合計8手かかる。相手の指す8手も入れれば全部で16手だ。つまり少なくとも16手先まで読まなければ攻めの形を想定した駒組が出来ない。そんなわけで、16手ぐらいが序盤をアマチュアの有段者レベルに引き上げるための一つ目のターニングポイントになるのではないかと思う。


王の囲いにも同じく8手(合計16手)ぐらい必要なので、序盤をプロレベルに引き上げるには(いまの評価関数のままだと)32手ぐらい先読み出来なければならないのではないかと思う。これはまだ当分先のことだろう。


ところで、棋譜から学習させるとして、評価因子(特徴ベクトル)として何を選択すれば良いのだろう?


Bonanzaにしても何を評価因子として評価しているのかは本当のところわからない。保木さんのGPW2006の発表資料の7ページ目に書かれている情報がすべてである。

駒割(歩の交換値は100点程度)
王と他の駒2つの位置
王と王に隣接した味方駒とその他味方の駒と他の味方の駒3つの位置
隣接しあった駒2つの位置関係
竜馬飛角桂香の利き上にいる駒の種類
竜馬飛角香が動ける枡数
pin analysis ピンされて駒の種類・方向、王との距離を考慮
角と同じ色の枡にいる味方の歩の数
歩桂銀が前進できるか
竜飛香の前・後の歩
王周囲25枡の利きの配置

ちなみに、このうち「王に隣接した味方駒」の「隣接」の部分は、情報処理学会Vol.47 No.8 P.889(2006.8)に保木さんが書かれた資料によると「隣接した(周囲8枡の)」と補足してある。


上記の資料を見る限り、とても将棋の棋力の低い人が選んだとは思えない。私から見ても、計算量が少なくてなおかつ、特徴的な因子をうまく選んであるなぁと言う感触はある。

たぶん、選んだ因子が「評価にきちんと寄与しているか」をテストする方法を確立されているのではないかと思う。その因子を取り去って学習させたときに、指し手の一致率がどう低下するかを注意深く調べながら、調整したのではないかと思う。これがもし「指し手の一致率」という指標がなければ実戦(自己対戦)のみに頼らざるを得ないので、チューンに非常に時間がかかる。


私は15年ぐらい前に、以下のようなことを考えた。

もしスパコンでも使えるなら、評価因子を1億個ぐらい事前に用意しておき、それぞれの評価因子の計算時間を設定し、設定された計算時間の範囲でプロの棋譜と指し手の一致率が一番高くなる評価因子の組み合わせを自動的に選出してはどうか?


単純に考えるとこの問題はNP困難だけど、近似解なら現実的な時間で解けると思う。また評価因子は、基本的なものを最初に用意しておけば、あとはその組み合わせを自動生成する仕組みを用意する。私はLISPで概念を自動合成して概念を敷衍させていくプログラムを書いたことがあるが、これは、それと同じ手法で出来る。

現代の視点で見直してもこのアイデアを実現するには、2008年現在のスパコンでも荷が重いと思う。概念の自動合成も、熟練した人間が手作業でやったほうがいいものが出来ると思う。(1億個もの評価因子を手作業で用意出来るのかと言うことはあるだろうが…)


まあ、このように、評価因子として何を選ぶかが棋譜からの学習において最大の問題なのだが、


・評価因子として何を選ぶか
・選んだ評価因子の優秀さをどう評価するか


と言うのはまだまだこれからの研究だと思う。


冒頭で「評価していない因子については誤差率100%」と説明したが、ある程度先読みすれば駒得しか評価していないのに駒の働きを評価しているように振る舞うことがあるの同様に、評価していない因子についてもまるっきり考慮されないと言うわけでもない。ある程度妥当な評価因子の集合を選択すれば、どのように選択しても20〜30手ぐらい先読みするなら同じような結果が出ると言う可能性はある。(もちろん、選択した集合によってRに換算して500ぐらいの差は出るだろうから、それをどううまく選択するかが決め手ではあるのだが。)


計算機的に最適な評価因子の集合を探す研究と言うのは非常に興味深いのだが、その研究の成果を出すためにはスパコンクラスのマシンが必要だし、その結果が出るころにはコンピュータ将棋はもうプロ棋士のレベルに到達していると言う気は少しする。


そういう意味では、計算量が少なくて効果がありそうなものを手動で選んで、あとは自己対戦で結果を見て採用/不採用を決めるという手法も案外実戦的なのではないかと思えてきたりして…。