棋譜を大量に生成している最中の皆さん、こんにちは!
このブログのコメント欄でNDF(WCSC25)の手法について質問があったのでお答えします。
まず質問内容ですが、
昨年のNDFの、WCSC25でのアピール文書に以下のような記述があります。
http://www.computer-shogi.org/wcsc25/appeal/NineDayFever/NDF-2015.txt
1. 対戦中や探索中に現れた局面を調べ、機械学習結果の欠陥を探して修正しています。
これについて、ほとんどの人は何のことかわからないと思います。私はNDFの開発者の金澤さんに話をお聞きしたわけでもなければ、お会いしたこともありませんので、私の推測ですが、以下の説明は大筋において間違っていないはずです。
「機械学習の欠陥」とは何か?
ここで言う「機械学習」とは、その当時に流行っていた学習手法、すなわち、棋譜からの学習を意味します。棋譜から学習させたときの、評価関数の値、すなわち、evaluate()の値に欠陥がある、evaluate()の値がおかしいということですね。まあ、evaluate()だけでなく、qsearch() (静止探索)や、浅い探索深さでの探索結果もおかしいでしょう。
では、何と比べておかしいと言っているのでしょうか?
「対戦中や探索中に現れた局面を調べる」とは?
対戦中に現れた局面というのは、そこに長い時間を費やしていますから、当然深くまで探索しているわけです。将棋型のゲームにおいては深くまで探索すると、評価関数の粗(アラ)が徐々に見えなくなっていく性質があります。無限深さで探索するなら、評価関数は詰みであるか、詰みではないかを判定できるだけの関数で十分ですよね。
そんなわけでして、深い探索の結果では、「機械学習の欠陥」=「evaluate()の不正確さ」=「浅い探索の結果」は解消していると考えられるわけです。
NDF(WCSC25)がやっていたのは?
前者が後者に近づくように強化学習させるって意味ですね。
そのためのサンプル局面をfloodgateの実戦譜から得るということです。
ところがこれだと局面数が少なすぎて過学習してしまいます。NDFではそれを回避するためにいくつか工夫をしていたのだと想像しますが、それでも過学習を回避するのに不十分であったということですね。だから、「あまり効果がなかった」ということなのでしょう。
先ほどは早急の回答ありがとうございます。
素人考えで申し訳ありませんが早速質問させて頂きます。
機械学習をするのに中間の評価関数の値をつかわずに、評価関数が詰みであるかないかを判定できる関数として学習させれば強くなるのなら、毎回初手から対戦させるのではなく膨大な実戦譜の投降からさかのぼり、詰みを回避する手を学習させれば良いのではないでしょうか。
その話題は、なんかデジャヴ感が…。http://yaneuraou.yaneu.com/2015/12/03/%E3%81%B2%E3%81%BE%E3%81%86%E3%82%89%E7%8E%8B%E5%AE%9F%E9%A8%93%E7%B5%90%E6%9E%9C%E3%81%9D%E3%81%AE3/
BishopLearningのロジックはわからないのですが、機械学習目的なので「まった」はできないかと。たとえば、詰みの5つ前の手が勝敗を決定したなら、6つ前、7つ前からやりなおして負けを回避できないものでしょうか。
> 機械学習目的なので「まった」はできないかと。
BishopLearningのどこに「待った」のが出てくるのでしょうか?あと、詰みが発生している局面は、形勢が不利だから詰みが発生しているわけで、数手前に遡ったところで負けは回避できないです。数十手ぐらい遡るならばともかく。あとshibataさんが何のために「負け」を回避しようと考えておられるのか(「負け」を回避することに何の意味があるのか)、そのへん、私にはいまひとつ理解できません。
詰みが発生している局面は、形勢が不利だから詰みが発生しているわけではなく、「完全に勝てる手がない」から詰むと考えます。ならば、詰みの状態から1手1手もどしていって何十手もどろうが勝てる手(道筋)をつぶした手をみつけ回避すればよいのではと考えた次第です
> 勝てる手(道筋)をつぶした手をみつけ回避すればよい
回避してどうなるというのでしょう?
第一文は、神様ならともかく現状では勝敗不明局面が大部分なので変でしょう。
それはそれとして、勝敗を決定付けた局面を重視して敗着を指さない学習が効果的ではないか、というご主旨と見ました。
> 勝敗を決定付けた局面を重視して敗着を指さない学習が効果的ではないか
なるほど、それでしたら意味はわかります。まあ、しかし、敗着を探すためのコストが莫大すぎるような…。現在では、80億局面程度のデータが欲しい状況ですし…。
将棋を、岐阜から出発して大阪に行くか東京に行くかを争うゲームに例えます。
将棋は有利な側がどんどん有利になるので、大きなミスのない同等程度の実力同士だと
濃尾平野をどっちに出るかで勝敗はほぼ決まります。
頓死で、羽田から伊丹に飛んじゃうかも知れませんが。
詰みの有無を現状箱根あたりで判定できるとして、その直前の静岡あたりで正着を指してもやはり手遅れで、負けを先伸ばしにするor裏返しで勝ちを確実にする学習効果しかないのでは。
そうではなくて、勝敗不明の互角局面で、僅かな有利を正しく評価して積み重ねる学習が必要なように思います。
で、互角局面での全幅探索による強化学習が現状の解ということだと思います。
的確で、わかりやすい例えですね。
勝負は、相手に勝る点が無いと作戦のたてようがありません。詰み80点、その他全科目90点のponanza に勝つには、どこかで勝る部分を作ってそこを生かす必要があります。
そこで提案ですが、強化学習を序盤から中盤の入り口にしぼり、そこでだけponanza を上回る98点の手を指し続け、中盤の入り口でponanza に300-500点差を付けるのを目標にするというのは、いかがでしょう。
そこから先はそこそこの今の評価関数にやらせて80点の指し手で、有利の追い風を利用して多少緩い手でも押しきればいいのです。
もしそうだとすると、強化学習の課題局面は、駒割りがほぼ互角で序盤に出現しうる、歩交換、歩損、飛車角交換、歩桂交換くらいまでに限定すべきように思われます。
経験的に、序盤だけ強化するより、全体的に強化して強くする(勝率を上げる)ほうがはるかに簡単なので、序盤に限定する意味はあまりないかと…。
もちろん総合力(雑巾絞り競争?)でponanzaに追いつけるならそれが一番の正道,王道です。
しかしponanzaのこれまでの蓄積と計算資源に追いつけないとするなら…弱者の戦略として一点集中はありうるかと。終盤勝負ではそこに持ち込めないと終わりですので,一点集中なら序盤逃げ切り戦略しかないと思います。
序盤と中盤と終盤で最適な評価関数が違うだろうという前提ですが,考えてみると序盤と中盤は駒の場所が違うので,同じ評価関数テーブルで普通に共存できるんですかね。
それはそれとして…序盤の強化学習のためには,深読みした先の中盤の静的評価が正しくないとダメ。中盤の強化学習のためには,深読みした先の終盤の静的評価が正しくないとダメ。終盤の強化学習は詰み探索でかなりの精度が可能?一方的に差が開いてる局面は良くても,三駒関係で詰めろ逃れの詰めろとかは評価しきれない気がしますが…
あれ,もしかして,雑巾には絞る順番があって,後ろから順にしたほうがいい?
> 考えてみると序盤と中盤は駒の場所が違うので,同じ評価関数テーブルで普通に共存できるんですかね。
KPPのような3駒関係の場合は、多くの開発者がそう(共存できる)だと思っていますね。私もそうだと思っています。
> あれ,もしかして,雑巾には絞る順番があって,後ろから順にしたほうがいい?
そういう可能性はなくはないです…が、後ろだけ絞るのもテクニックが要りますし、丸ごと絞ったほうが余計なこと考えずに済むので楽ではあります。