2016年に互角局面集というのを本ブログで公開した。従来、強くなったかの計測は将棋所を用いて定跡なしで自己対局させていた。しかしそれだと同じ進行・同じ戦型に偏るため何らかの互角に近い局面を用意する必要があった。
ここで少し歴史的な背景を書いておくと、当時、将棋ソフトは、チェスのStockfishというオープンソースのソフトを参考にする開発者が増えてきているところであった。Stockfishでは、わずかな改良をして何万対局と自己対局を行うことでその改良が適切なものであるかを判断するという手法を採っていた。ごくわずかな改良を何千と積み重ねるというわけであるな。将棋ソフトでもこれに倣おうというムーブメントがあったわけである。
そこで、対局回数をこなさないといけないために、計測は効率化のために1スレッドで対局させたかった。40コア(論理80スレッド)のPCだからと言って80スレッドにしてしまうと、その√ぐらいの実効(実際の強さ)にしかならないので無駄が出るからである。1スレッドだと、SMP(≒複数スレッド)のときのような指し手のばらつきが現れない。置換表などの効果により、多少指し手はばらつくがその程度である。
よって、何らかの定跡局面集を用意しなければならなかった。
そこで私は将棋ソフト『技巧』の出村さんに触発され、連続自己対局用のスクリプトをpythonで書いた。そのスクリプトから使うために互角に近い局面を用意した。
これが現在、将棋ソフト開発者の間で使われることが多い「互角局面集」という奴である。
これは、やねうら大定跡というMultiPV10で探索させて作った定跡集から、24手目時点でdepth 18で探索して評価値が[-100,100]の範囲にあるものだけを取り出したものである。
やねうら互角局面集を用いることに対する批判
この互角局面集を用いて強さを計測することに対するよくある批判として次のものがある。
1) 当時のソフトであるから精度的にどうなの?
2) depth 18浅すぎ いまのソフトでもっと深い深さで探索させるべき
3) [-100,100]だと振り飛車が居飛車より悪いと思っているソフトだと振り飛車の局面が少ないのでは
4) 実戦で出現する確率の高い局面を選んだほうが良いのでは?
批判に対する反論
まず、1),2)についてだが、仮にいまのソフトでdepth 36で+300の値がついてる局面が混じっていたとして、これを短時間(2スレ1手1,2,4秒)での自己対局で咎められるのかという問題がある。片方のソフトがつねに優勢な側(+300の側)を持つとしても勝率で言うと+10%程度しか上がらない。もっと桁違いに強いソフトだと事情は異なるかも知れないが、いまのソフトは短時間では+300のほうを持っても6割勝つレベルにはない。
ちなみに評価値を勝率に変換するのは、以下のシグモイド関数を用いる。この600という定数はPonanzaが用いていた定数で、Ponanza定数とも呼ばれる。
※ 勝率 = 1 / (1 + exp(-評価値/600))
この式によると評価値の+300の期待勝率は6割程度なのだが、短い持ち時間の対局ではそこまで勝率は高くない。序盤の有利さを維持して勝ちまで持っていけないためであろう。
いずれにせよ、実際には片側のプレイヤーに常に有利なほうを持たせるわけではなく、互角局面集から局面をランダムに選んで対局させるので、そのような偏りは均される。計測結果が互角に近いほうに寄るというのは確かにそうなのだが、実際にR100の差があるものが計測上R80に見える、ということがあるぐらいで、十分な対局数をこなすなら、基準ソフトからのRの差を以て強さの比較をする程度のことはできると考えられる。(後述)
無論、いまどきのソフトで深くまで探索させて互角に近い局面を選ぶほうが好ましいというのは確かにそうであるが、強さの計測上、そこまでこのことが問題にはならない。
結果が、互角に少し寄るのでストレートに二項検定などを行ってはまずいが、対局数を1000回とか2000回とするなら十分なマージンは確保されていると考えられる。
次に3)についてだが、私は言われるまで気づかなかったのだが確かに振り飛車の局面は少ないようだ。
しかし、教師生成のための対局シミュレーションの開始局面は、例えばやねうら王では2017年までは、初期局面からランダムムーブ5手などとして教師を生成していた。2018年には、MultiPVで16手目まで進めてそこがなるべく互角の局面であることを確認してから対局シミュレーションを開始していた。Aperyは(SDT5の時点では)floodgateの棋譜の任意の局面をランダムに1つ選んできて、ランダムムーブで何手か進めてから、対局シミュレーションを開始していた。
要するに、2018年前半までのソフトでは学習に用いている局面自体が居飛車・振り飛車がそこまで偏らずに存在していたはずで、居飛車の戦型にだけ得意な評価関数などというものは狙っても作れないのである。居飛車で強くなっていれば、振り飛車でも自動的に強くなっていたわけであるな。だから、互角局面集に振り飛車の局面が1つも含まれていなかったとしても、さほど問題ではなかったわけである。
例えば初期局面から86歩と指した局面は、その局面そのものが学習対象局面に含まれている。実戦に現れやすいからと言って、この局面を互角局面集に入れて棋力を計測する場合、学習用の局面=検証用の局面となってしまう。これは機械学習のcross validationの考えかたに反するわけだ。
だから互角局面集はあえて学習用の局面にはなるべく存在しないような局面(それでも、初期局面から自然に到達できる局面であって欲しいが…)にする必要があった。
どうせ、特定の戦型・特定の局面だけに対して評価関数を強くすることはできなかったからであるな。
つづく..
長くなってきたので
・計測するときの同一局面での先後入れ替えに関する議論
・2018年後半以降に出現した序盤特化型の評価関数の計測手法について
・illqha3 / orqha-1018は序盤特化型なのか?
などの話は別の記事で書く。
おまけ
互角局面集に偏りがあるとして、それは計測上さほど影響はないという数学的な証明。なんとかちゃんねるの書き込みより引用して終わる。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
38名無し名人 (ワッチョイ b192-EMC6)2019/04/20(土) 21:55:02.79ID:48kCnAsL0>>43 >>32 AとBが対局するとしてAのレートのがx高いとする 先手側にレートがプラスaされる程度の先手有利な局面集を使うとする Aが先手引いたときに勝つ確率は1/(1+10^-((x+a)/400)) Aが後手引いたときに勝つ確率は1/(1+10^-((x-a)/400)) だからAが勝つ確率は1/2*1/(1+10^-((x+a)/400))+1/2*1/(1+10^-((x-a)/400))だな Aの期待勝率が=1/(1+10^-(x/400))=f(x)であるとき f'(x)=-(1+10^-(x/400))'/(1+10^-(x/400))^2 =-(1+exp(-(x/400)*ln(10)))'/(1+10^-(x/400))^2 =1/400*ln(10)*10^-(x/400)/(1+10^-(x/400))^2でf'(0)=1/400*ln(10)/2^2 このときxが0に近ければ一次近似によりf(x)≒f(0)+f'(0)x=1/2+ln(10)/1600*xだから「x±aが0に近ければ」1/2*f(x+a)+1/2*f(x-a)≒f(x)だから お前の言うような極端なレアケースを除けば問題ないんだよ 48名無し名人 (ワッチョイ b192-EMC6)2019/04/21(日) 01:25:14.79ID:5LdhB13R0>>49 >>43 >局面毎に先手有利だったり後手有利だったり、そのレート差も一定範囲内でバラバラ ランダムに選んだ局面の先手側の有利さを表すレートをaとするとaは一定ではないってことだね ならばaは期待値0、分散σ^2の正規分布に従う確率変数と改めましょう Aの勝率pは、p=f(x+a)≒1/2+ln(10)/1600*(x+a)となる このときn回対局させたときの勝数を確率変数Xと書くとして、 nを大きいと見て正規分布に従うと考えて標準正規分布に従う変数zを用いて一次近似すると X=np+z√(np(1-p)=n/2+n*ln(10)/1600*(x+a)+z√(n(1/2+ln(10)/1600*(x+a))(1/2-ln(10)/1600*(x+a)) =n/2+n*ln(10)/1600*(x+a)+z√(n(1/4-(ln(10)/1600*(x+a))^2)≒n/2+n*ln(10)/1600*(x+a)+z√(n(1/4)なので Xの期待値=E(X)≒E(n/2+n*ln(10)/1600*(x+a)+z√n/2)=n/2+n*ln(10)/1600*E(x+a)+E(z)√n/2 =n/2+n*ln(10)/1600*(x+0)+0*√n/2=n/2+n*ln(10)/1600*x Xの分散=V(X)=V(n/2+n*ln(10)/1600*(x+a)+z√n/2)=0+(n*ln(10)/1600)^2*V(x+a)+V(z)(√n/2)^2 =(n*ln(10)/1600)^2*(0+σ^2)+1*n/4=(nσln(10)/1600)^2+n/4 これで分かるのは ①Xの期待値はaの影響を受けずに済むこと ②Xの分散は影響が少しあって多少分散が大きくなり信頼区間の幅を狭めるのに多少サンプルが必要になること ③しかし例として挙げられたσ^2=80^2程度であればごくわずかに過ぎないこと、かな ④そして今のは先後入替えをしないケースで考えたけどそれですらってことね 49名無し名人 (ワッチョイ b192-EMC6)2019/04/21(日) 01:31:41.06ID:5LdhB13R0 >>48 すまんX=np+z√(np(1-p))じゃなくて煤ip+z√(p(1-p))だからV(X)=n(σln(10)/1600)^2+n/4のミスだわ |
横歩取りの後手番は早指しでも4割行かないですが33角の時点で評価値-300もつかないです。
横歩取りの33角の局面、いまのところ私のテラショック定跡では評価値-118ですね。-100未満を足切りしてしまうと互角局面集からこの局面が除外されてしまいます。
先日のロタさんの1秒18T(4秒1T相当)調査だと横歩取り.592なので6割は勝ててないですが、118が59.2%になってるので「勝率 = 1 / (1 + exp(-評価値/定数))」に代入するなら定数は600よりずっと小さい数になるかと思います。ポナンザ山本さんが「評価値300が6割」と言ってから4年も経ってますしこれを根拠に「300ぐらいじゃ6割も勝ち越せない」というのは無理があるんじゃないでしょうか。
あー、そういう意味ですか。横歩取りの33角の局面で0.592はちょっと高すぎるような…。その後の進行が偏っている気がします。後手側、dolphinなどでは52玉型を多用すると思うのですけど、42玉もあったりして、先手の勝率そこまで良くないような…。
とりま、序盤の評価値とその後の勝敗(勝率)のグラフは..Qhapaqさんがなんとかしてくれそう。(とよそに振る)
>・計測するときの同一局面での先後入れ替えに関する議論
囲碁の gogui での自動対局では、このオプションがありますね。まあ、nが大きければ関係ないですか。
あと、「持ち時間の短い対局で、正しい評価ができるのか」というのにも興味があります。
同一ソフトの変更前後の比較であれば、どちらが良いかの判断にはつかえると思いますが。
npsが異なるソフトである持ち時間の時に互角だとして、時間を2倍にすると結果が異なってきそうに思います。
長い持ち時間にしたときに勝率が逆転する例はelmoのときにありましたね…。そこ以降はelmo式を用いての学習なのでコンピュータ将棋界ではあまり起きていない現象ではありますが…。
本番では1手目~23手目は定石ファイルを使って進むんですよね
そうじゃないと序盤の訓練が全くされてないことに
本番とはなんでしょう?
私の書き方が悪かったですね。
24手以降を使って学習したら、序盤の学習はされない。それは大丈夫なの?
コンピュータ選手権の試合では序盤24手くらいまでは90%定石たどるとか、そんな感じ?
> 24手以降を使って学習したら、序盤の学習はされない。それは大丈夫なの?
そうやって学習させるとあんまり大丈夫ではないでしょうね…。しかしKPPT型などはもともとそんな汎化能力はないでしょうから、あまり問題にならない気はします。NNUEだと問題になるかもですねぇ…。
コンピュータの形勢判断は良くわからないです。
例えば横歩取り2三歩戦法とかでも、将棋神やねうら王の将棋神レベル同士で対局させたら、後手が勝ったりしますよ。+700位で先手が有利な状態から始まりますが、この程度の差であれば、あまり関係ないのでしょうか?
いまの将棋ソフト、将棋の神様から見るとまだまだ読み抜けは多々あるということなのではないでしょうか。(´ω`)
長い持ち時間になればなるほど読みぬけは減っていきますけども、それでも…。
お互い、王玉以外の駒を全部持ち駒としている状態からスタートした場合、どのくらいまで読んでいけるものなんでしょうか?
持ち駒を使い尽くすまで、流星雨3回どころではないチートの応酬状態になりそうな気はしますけどw
それは持ち駒が多くて、読み抜けがありまくりですね…。