教師局面を生成するときにランダムムーブを入れている。合法手のなかからランダムに1手指させる。これにより、生成される教師局面を散らばらせる働きをする。
ところが、これをどのぐらい入れるのがベストなのかということについてはいまひとつわかっていない。そもそも教師局面を生成するときに定跡を用いるべきなのかどうかもよくわからない。
私の考えでは、教師生成時に定跡を用いなくともランダムムーブを適度に入れておけば、いずれは穴熊を自力で発見するし、穴熊の勝率が高いのだとしたら、elmo式により、穴熊の評価値が高くなるはずである。ただ、このことは自明ではないし、証明されてもいない。私がそう信じているというだけである。
ランダムムーブにより穴熊に玉を潜っても、穴熊の外にいるほうが評価値が高いなら、次の指し手で自ら穴熊から出てしまうはずだし、そうなると穴熊の勝率を計測していることにはならないから、elmo式によるフィードバックが得られない。こういうケースばかりだと学習に失敗する。そうはならないと私は信じているのだが…。
さて、やねうら王の最新のコミットで、learnコマンドにおいて、ランダムムーブの適用される最大手数(初期局面から何手目まで適用するのか)と、1局におけるランダムムーブの回数とを指定できるようにした。
最近、評価関数をゼロから自力で学習させるのが流行っているようなのだが、ランダムムーブや採用する定跡など色々条件を変えて学習させてみて、何がベストであったのかコメント欄で教えてもらえると嬉しい。
評価関数を作ってみた感想ですが、
やね式学習部のアルゴリズムが強力だなと。
教師局面の性質をモロに反映するので定跡で方向性を変えれます。
今やっているのは「まふ定跡」ver1からver11までを学習させています。
元々、前verの悪い所を直しながら作っているので、それを追体験させている感じです。
そのままだとさすがに局面が狭いので、7六歩25%、2六歩25%、中飛車10%、四間飛車10%、その他30%くらいに定跡を70手まで使用で任意に散らしています。
※定跡が多く当たったと思われる生成時と、ほとんど当たらなかったと思われる生成時間の差は最大で3割程度です。
あとは「雑巾絞り」は複数回絞るのが普通だと思うので、爺さん世代の教師局面も学習に使っています。
例)ver3で生成したdepth3の1億局面をver5で生成したdepth3の1億局面のときも使って学習しています。(競走馬のインブリード的な発想とdepth3で生成される教師局面に棋力の差はあまり無いだろうと)
uuunuuun氏のブログとの比較ですが、同じdepth3でもレート向上が大きいと思います。
とりあえず頭打ちになったと思ったら結果を報告します。
> 教師局面の性質をモロに反映するので定跡で方向性を変えれます。
やはりそうですか…。定跡使って学習させると穴熊とかちゃんと囲いますか?リゼロ評価関数、穴熊どうやっても指さないようで気になってます。
> あとは「雑巾絞り」は複数回絞るのが普通だと思うので、爺さん世代の教師局面も学習に使っています。
計算資源が乏しいころ(4年ぐらい前)、Ponanzaがそんなことをしてました。教師局面の数が少ないと悪影響を及ぼすので、それよりはマシだということで…。
uuunuuun氏のブログでBonanza6に勝ち越す棋力が有りながら穴熊に負けていると見たので、四間飛車を10%入れました。
その半分は穴熊にするので、全体比率の5%程度は定跡的に学習出来る局面になっていると思います。
(人間だとアマ2段相当※R2000あれば穴熊の崩し方を知っているのが普通なので、かなりのギャップがあると思います)
その結果「居飛車穴熊」は覚えたようです。相手に四間飛車をさせると7七角とかやりますが、その後は相手次第で「居飛車穴熊」「左美濃」「銀冠」になります。
ただ私の定跡は「振り飛車穴熊」は採用していないので、振り飛車側はほぼ「美濃囲い」か「片美濃囲い」で学習したようです。
> その結果「居飛車穴熊」は覚えたようです。
いやー、これは凄い発見ですね!定跡を与えるだけでその戦型を指す(指しこなす?)ようになるとは!棋風を覚える将棋ソフトと言えるのではないでしょうか。
大会向けに勝率の向上を目指すのとは別に、攻め重視や守り重視、自然な手または奇手を好むなど、コンピュータ相手に人間が指すときに楽しめるような棋風の先鋭化を目指すのも楽しそうだと思いました。
短手数の勝利(敗北も?)を重視させれば攻めの棋風…になったりしないですかね。
> 短手数の勝利(敗北も?)を重視させれば攻めの棋風…になったりしないですかね。
それは、なるかも知れませんね。
強い人とやるとうまく受けられて自滅しそうですが…。
ランダムムーブを切るにはどうすれば良いですか?usi optionに、random_move_minplyの欄がないようなので。。この記事に反するようで申し訳ないですが、棋力上昇の観点とは別に、私個人の得意形(主に振り飛車)ばかりを指すように誘導したいのですが。。
すみません、これの方法については解決しました。
ただ、shivorayの編集で
gensfen [random_move_min 17] depth 3 loop 10000000 eval_limit 32000 output_file_name generated_sfens.bin
と[]内を追加するとバグります。
gensfenのときにrandom_move_minplyに1以外を指定すると落ちることがあるようですね。修正しておきました。次のバージョンのやねうら王もしくは、次のShivorayで修正されています。
①相手玉を最短で詰ます
→もし無理なら
②自玉を最長の手順で逃がす
もしソフトが上のような思考をしているのなら、①と②を逆にしたソフトを作るか、駒損を嫌うエンジン(相手に駒得させないようにするソフト?)を作れば、振り飛車とか穴熊を指してくれそうな気がするんですが、そんな簡単ではないんでしょうか…?
> もしソフトが上のような思考をしているのなら
そういう思考方法を採っているわけではないのですが、おっしゃりたいことはわかります。まあ、実際の対局シミュレーションの勝敗を人為的にいじっていいなら、振り飛車の勝敗を少し上げておけば振り飛車を指すようにはなります。(これは、たややんさんの振電がそう)
でも、なるべくならばそこ人為的にいじらずに完全に自力で穴熊とか振り飛車とかを発見して欲しいんですよね…。