rewritemath's blog

rewritemath’s blog

これマシュマロ。質問も受け付ける(https://t.co/VfNWTuMqau)

将棋の手番で、先手の有利さはどのくらい?

プロ棋戦のデータ

 

wikipediaによると、先手の勝率が基本的には良いということがわかる。以下にその引用を載せている。

全体を通じてみると、勝率は53%程だと思っていいだろう。

先手がゲームとして有利を意味するかどうかとは別のことであるが。(研究量の問題として先手のほうが研究しやすいなど)
また、年度によって勝率が異なるのは、流行りの戦型が後手番の勝率を上げた可能性があること等が原因だろうと推測される。

 

 ーー以下引用


年度    対局数    先手       後手

       勝数    勝率    勝数     勝率

2003    2337    1215    0.534    1061    0.466

2004    2335    1266    0.554    1019    0.446

2005    2344    1216    0.530    1077    0.470

2006    2325    1192    0.521    1095    0.479

2007    2381    1237    0.531    1091    0.469

2008    2387    1162    0.497    1175    0.503

2009    2422    1223    0.516    1149    0.484

2010    2404    1269    0.540    1081    0.460

2011    2446    1287    0.541    1093    0.459

2012    2553    1303    0.528    1164    0.472

2013    2443    1269    0.534    1106    0.466

ーーここまで

 

コンピュータ将棋における勝率


Ponanzaの場合。ツイッターより


pona作者

Ponanza同士で戦うと先手の勝率がどれくらいになるのか気になったのでちょっと実験してみている。

あまり深い探索ではできないけど、深さ6の探索で毎対局ごとに評価関数に乱数入れて同じ展開にならないよう調整してみて10,000試合くらいさせてみる。


ひまわり作者

@issei_y 昔、芝浦将棋時代に学習の成果を確認するためにbonanza同士の先手の勝率を調べたことがあります。

その時は一手一秒の10万局で52%程度だったと記憶してます。(家に帰れば正確に分かるのですが…)

Ponanzaでどの程度になるか気になるので期待してます!


pona作者

ちょっと終わらなそうだったので、1700試合までさせてみました。

結果はPonanzaの場合は、先手勝率51.82%でした。

案外互角の形勢なものなんですね。

 

 

先手が有利である可能性が高いようだ。自分でソフトを使って最初の局面を検討にかけてみて、評価関数で見ても、そうなっているだろうということが読み取れる。

概ね、52%から53%程先手の勝率が高くなりそうだ。

将棋ソフト開発の歴史

BONANZA以前

将棋のルールを記述して、そのルールどおりに動くソフトの発明

手筋、定跡をを記述して学習する手法が主流

探索部は、深く、選択した局面を探索。選択する局面ももちろん手入力が元となっている


BONANZA

機械学習の導入(プロの棋譜を評価する形で教師とする)

三駒関係の発明

全幅探索

三手詰めルーチン

マチュア三段から四段程の棋力と称されるが、プロ棋士も、一手十秒程度の早指しでは勝てなかったようだ。(ソースは、cakesにてmtmtさんの語るところによる)

 

ボンクラーズ

探索をクラスタ化(ボナンザクラスターズ)

探索局面が増えるごとに(指数関数的な増加に比例して)レートが伸びることの検証を行う。プロ棋士並みの実力から、名人の実力に到達した(数値上の話)

 

後にクラスタ化は、GPS将棋が引き継いで、当時A級棋士(上位十名)だった三浦九段を破る。(現在三浦九段がソフト指し騒ぎに揺れていますが、どうなるのでしょうね)

これをきっかけとして、電王戦のレギュレーションがソフトに制限を年々厳しく変更する方向に傾くこととなる。

探索局面が少なくても強いソフトとして、枝刈りが利用されるようになる。興味があるなら、αβ探索とか、ミニマックス法とかで検索したまえ。

過度な枝刈りは、悲劇を生むこととなるだろう。

AWAKEの28角による投了のような問題は、後に、BishopDangerを生み出す改良へと繋がったりする。

 


ツツカナ、やねうら王、PONANZA等々の登場

これは、将棋ソフトの裾野を広げた。プロ棋士にも勝ち越す様になっている。


現在トップソフトの推定棋力はレートにして3800は出そうだ。

 

三駒関係の進化

四駒関係、三駒+手番、二駒+効き+手番等々の、独自評価関数が生まれてくる。

 

教師データも、最近では後半の学習には、プロ棋士棋譜を用いない方が現状では強くなる。

 

三駒関係ではパラメータが多すぎて、正確な評価値の値を確定するには局面数が少なすぎる。そこで、教師データの生成と、少ない教師データでの学習、等々多彩な技術が利用されてきた。


教師データの作成をするために自己対戦を続けたソフトもあった。

 


完全にプロの棋譜を用いないで学習させる試みもある(やねうら王の磯崎さんのサイトで実験的な試みが多数行われている。)

 

現状、序盤、中盤、終盤のどれをとってもソフトの力は人間より高いだろう(終盤の一部の局面で人間が上回る場合がある)

 

左右対称問題

評価関数の学習には、左右対称にするかどうか問題というものがある。

左右対称にしないとその分、居飛車を高く評価しやすくなる。また、居飛車である評価が左美濃にも乗ることになる。

理論上は左右対称の方が正確な評価値が確定しやすいはずだが、(手番が左右で変動するという議論は、完全解明が間近に迫るまでしなくてよいだろう)実用上は左右対称にしないほうが良いと言う見解を、Apery平岡さんとPONANZA山本さんは持っている様だ。(ツイッタがソース)私も同意する。

 

次元下げ

評価関数の次元を下げることで教師データの不足を補おうということを、AWAKEが行っていて、ブームになった時代がある。しかし、根本的な問題は解決しなかっただけでなく、あまり強くならないし、もっといい方法あるし、なによりコードは複雑になりすぎて大変なので、ブームは去っていった。

 

現状、seleneの学習手法が、完全解明、完全な真の値の評価関数に一番近づける可能性を持っている。詳細は割愛する。複雑すぎてここに書くのはちょっと無理だ。

 

NDFの評価関数設計

現在の主流だ。ある局面を学習させて、その先の評価値を手前に引っ張ってくるだけ。

 

近年の強豪ソフトや、開発者に大きい影響を与えたと思われるもの

(というか、単なる将棋ソフトの説明になっている気もしなくはない…)

Apery

オープンソース時代の到来を告げたソフト。開発者の平岡さんは結婚できない独身さん。素晴らしい人だから、是非幸せになって欲しい。ネガティブ。平岡組とは独身の人達の組のこと

 

技巧

PONANZAと二強なのに(現在はそうでもないけど)電王トーナメントでは大活躍…できない不遇ソフト。定跡でよく死んでしまっている。定跡を切ったら今度は序盤が弱い。二駒+利き+手番で評価関数を組んでいる弊害か。ただし、その評価関数のお陰で、入玉の将棋にめっぽう強い。玉の安全度を図る終盤力には定評あり。PONANZAは玉の正確な安全度を読み切るのが得意なのに対し、技巧は玉の生存圏を確保するのが得意なイメージ。

このソフトの公開はオープンソース世界に新風を巻き起こした。

Aperyと技巧はオープンソース界の二大巨頭

 

やねうら王

強い。互換性好き。定跡とか時間の使い方で勝っていた、電王トーナメントから一転。第二回叡王戦では実力派になっていた。天才プログラマの磯崎さんの作品。オープンソースに転身した。

 

大合神くじらちゃん

えびちゃんさんの作品。ニコ生ユーザーによるクラスタ化、stokfish7をいち早く導入、単騎のSilentMajorityも強かったので話題に。フリーソフトの中でやっぱりかなり強い位置を占めている。序盤が苦手な技巧を使うのをやめて序盤研究はこっちに移していた人も。

 

 

 

 

レーティングの仕組み(主に将棋について)を解説する

数学的に難しい話になってしまうので、あまり分かりやすい説明は出来ていないと思うのですが…

 

基礎的な、現状の話

将棋のレーティングは基本的に、イロレーティングが用いられています。
物理学者のイロ氏が提唱したことに始まります。

ところでこのレーティングとは何なのかといいますと、1500を平均的なプレイヤーとして、勝った者がレートを吸い上げ、負けたものが吸い上げられるという形で強さを推定するものであります。

 

レーティングの仕組み

基本として、勝率が0.5の相手とは同じレートになるはずです。

また、レートの授受が行われる仕組みとして、同じ相手との対戦だけを二人で続けた場合に、回数をどれだけ重ねても二人のレートの合計としての棋力が増えてはいけません。ですからつまりこれがどういうことかというと、


AがBに三勝二敗の棋力だとします。

二人で試合をしたとして、

Aが三勝した分のレート上昇はBが二勝した分のレート上昇と等しくなります。


そうでないと、レートのインフレ、又はデフレが発生してしまいます。

 


イロレーティングの解説


200のレート差を勝率0.76と定める。

 

E_AC/E_CA

=E_AB*E_BC/E_BA*E_CB


という過程を元に作成されている。

 

E_ABは、

AのBに対する勝利確率。

 

例えば、A-BでAが5勝2敗、B-CでBが三勝二敗なら、

αをAのCに対する勝率

βをCのAに対する勝率と置いて、

AはCにa勝b敗とする。


α/β=(5/7*3/5)/(2/7*2/5)

    =(3/7)/(4/35)

    =(3*35)/(7*4)

    =(15/4)


α=a/a+b
β=b/a+b

 

α/β=(a/a+b)/(b/a+b)

    =a/b

 

よって15/4=a/bとなる。
A-Cは15勝4敗でAが勝つ。

 

この式を簡略化する。

E_ABとE_BA,E_BCとE_CB,E_ACとE_CAはどれも、分母が等しいことより、本式の勝利確率の分母を排除して、すべての値をその時の勝利数のみに変換できる。


また、ABCの入れ替えにより強い順に並べる。

すると、左辺において、分母は、弱い方の勝数、分子は強い方の勝数となる。

また、右辺おいて分母は、弱い方の勝数の積で、分子は強い方の勝数の積で表される。


よって、

AのCに対する勝数/CのAに対する勝数

=(AのBに対する勝数*BのCに対する勝数)/(BのAに対する勝数*CのBに対する勝数)


と表記できる。

(X)の(Y)に対する勝数をXYとすると、


AC/CA=(AB*BC)/(BA*CB)


と表記できる。


故に、AのCに対する勝利確率は、(AB*BC)/(AB*BC)+(BA*CB)である。

 

追記

この記事は理論の記述をさらに追加する可能性があります。

将棋ソフトってどんな高速化の工夫がされているの?

近年の将棋ソフトは高速化のための命令がたくさんあって、選ぶのが面倒ですね。説明しておかなければ混乱する人も多いでしょうから、説明しておきます。


高速化とはなんだ

高速化とは、将棋ソフトの世界では基本的に、探索の速度の高速化のことをいいます。

 

探索とはなんです?

将棋ソフトはまず、その局面で可能となる指し手を生成します。そして、その局面を評価関数に当てはめて

(評価関数は名前の通り、関数です。だから変数として現在の局面の情報を取り込んで、返り値が評価値となるわけです。)

評価値をその局面につけます。


その局面についた評価値をもとに評価を出します。

 

でも、検討とかを長い時間続けると、評価値が変わっていくよ?

 そうです。それは何故かと言うと、実際に返しているのはその局面の評価値ではないからです。

 

将棋所とかで出る評価値は何なのか

先程、探索すると言いました。探索する時、生成した合法手(指し手)を羅列していきます。
そして、羅列が終わると、その局面を評価関数に投げて、値が帰ってくるとそれを保管します。

 つまり、たくさん生成した指し手があって、探索してそれが増えていくと、その先の指し手を探索するようになっていくのです。
先の指し手をどんどん生成して、未来の局面の評価値を返しているから、評価値がどんどん変わるんだ。


じゃあ、高速化ってなんなの?

 それが今日の本題だ。ここまでの話を聞けばこれからの話がスムーズに進められるようになっているはずだから、よく聞いてくれ。

 

用語の解説をするよ

わからなかったらググってください


OS

オペレーションシステム

WindowsMac,Linuxとかのこと。パソコンを動かす基本のソフトだ。それ自体がGUIだね。コンピュータの動作は内部では2進数しか使っていないけれど、それを変換して見えるようにしてくれている。デスクトップとかを表示したり、ファイルをドラックで移動したりするのもこれのお陰でできることなんだ。


x86,x64

32bit,64bitのことだ。詳しくは面倒だから言わないけど、そのパソコンに入っているOSのよって、32bitだったり64bitだったりする。それによって動かないものもある。詳しくはぐぐってくれ。x86と書いてあったら32bit用、x64と書いてあったら64bit用だ。

 

AVX,SSE

これだよ今回話したかったのは。これに混乱する人が多かったんじゃないかと思ってこれを作ったわけです。

どちらも、高速化のためにプログラマの方が使うCPU拡張命令です。え?日本語を使えって?ググってくれれば日本語だってよく分かるはずですよ。

AVXはインテル社の4世代以降のCPUに与えられた拡張命令です。開発コードhaswell以降です。え?わからない?

貴方のパソコンのCPUを調べて下さい。とりあえず2013年くらいに買ったものは怪しいから。対応してないかもだから。調べて。

SSEは多くのCPUが対応しているから、そう書いてあるのだったら大体大丈夫だよ。AVXより古い命令だから。一応、

AVX-SSE4.2-SSE4-SSE2

みたいな順番に、左から新しいよ。

AMDのCPU?対応しているのもあるから調べて。

調べるのが面倒な人は古いのを選んでおけば大体動くから安心して。人間がソフトと将棋を指して気がつく程には差がないから。

 

高速化のためにプログラマは拡張命令を使います。でも、CPUによっては、古いとその命令が使えないので動かない場合があるのです。

 

 

注意

スマホだとCPU(演算装置)がべつものだから動かないよ。SSEなしのやつを選べばいいんだよ。

 

 

 

将棋ソフトの使い方、ファイル名編

将棋ソフトのファイルは大きく分けて、


book

eval

engine

gui

 

の4つに分けることができます

 

bookファイル

定跡のファイルです。これがないと、定跡を使えません。拡張子は、.bin,.dbが主流だと思います。他にもあったかもしれないけど忘れた。

 

eval

評価関数です。これがないと、指し手の評価が全部おなじになってランダムだったり順番に生成された手を指したり、そもそもソフトを認識してくれなかったりします。

 

engine

本体です。拡張子は.exe以外ないと思います。こいつは他に、バイナリと呼ばれたりします。この本体は、指してを生成したり探索したりメモリを確保したりします。評価関数を読み込むのはこいつです。

 

gui

グラフィック・ユーザー・インターフェースの略です。shogiguiは、将棋のそれという意味ですね。shogidokoro(将棋所)もそれに当たります。プログラムは文字や2進数で値を持っていますから、それをグラフィックにする(可視化して見やすくする)ものです。

将棋ソフト、詰むのに詰まさない時、バグとは限りませんよ

  • このソフト、詰みチェックしたらきちんと詰んでるのに、詰まさないやん!弱いの?
  • とか、このソフトは詰みが読みきれない時があるから弱いでござる(笑)
  • とか、これくらいの詰み、詰みチェックにかければ一瞬で詰むのに、なんで詰まさないんや?バグ?

 

とか思ったことがある人へ。

 

バグだと騒ぎ立てるのはちょっと待って!バグじゃないかもしれませんよ!

 

 

原因1:256手ルール

256手で引き分けになるルールがあるんです。そのルールによって引き分けになるのを回避するために開発者の方が工夫をされている場合があります。

 

例えば、王手ラッシュを食らうと手数が長くなって引き分けに持ち込まれかもしれません。それを回避する手順があるかも。

他にも、詰ますより必至をかける方が手数が短くなる場合は、そちらを選択するかもしれません。王手のかからない玉型であれば尚更ですね。

詰ます手順は短い方を選択するというソフトはあると思います。

王手の連続で詰まさなくても勝ちが決まっている場合は、短い方を選ぶかもしれません。

原因2:枝刈りしちゃった(*ノω・*)テヘ

枝刈り、つまり、一定以上先の局面で詰みが見つかるような場合ですね。

それまでの手順に、駒を大量に捨てる手順がある時

途中で評価値の低い局面を経由する時

 

枝刈りしちったのかもしれません

 

原因3:詰まさないようにした方が強いもん

Aperyさんとかそうですね。今はどうか分かりませんけど。

@HiraokaTakuyaさん

https://twitter.com/HiraokaTakuya/status/708682048441942016?s=09

詰むかどうかを計算する時間があったら、他の手を読んだ方が勝率があがるんじゃ〜!

ということもあるみたいなんです。

 

原因4:詰みルーチンない、搭載面倒

そのまんまです。詰みを確認するルーチンをくっつけると詰みに強くなりますが、それをしないがために読み抜けるというパターンです。

 

終わりに

どうだったでしょうか。コンピュータにとっては、全体としての勝率が大事ですし、ルールによっては最適な戦略が異なります。

開発者の考え方も反映されているでしょう。

ソフトの癖なのかもしれません。

詰みが発見できないのは、バグだけが原因とは限らないんです。

そう思うと、開発者さんの苦労に思いを馳せて、詰ます事のできない時にも、優しくソフトを見守ってあげられるんじゃないでしょうか。

それでは〜

エヴェレットの多世界解釈の解説

量子力学の観測についての解釈の一つ。
人は、物体をを観測する時、主に光の反射でそこにものがあることを知ることができる。これは、機械にとっても同じだ。
もっと細かく見れば、光子という光の粒をぶつけて、それが帰ってくればそこに物があることになる。
何をぶつけても物があることは分かるのだが、帰ってこなければ仕方がない。ぶつかってくるまでの時間が早ければ、ものは近いことになる。遅ければ、遠いことになる。
大きい物をぶつけてしまうと、ぶつけた先のものがそれより小さい場合にそれを弾き飛ばしてしまって、帰ってこないかもしれない。
だから、ぶつける物は小さいものがいい。
ぶつける物の中で一番小さく、軽いものが光子である。
だから、光子は基本的に物の中での一番ちっさいから、帰ってくるものである。
つまり、帰ってきやすいから、そこにものがあることを知るためにぶつける物は、光子が最適ってこと。

さて、光子をぶつけてそこに物があることがわかるのは、ぶつかることによって光子が帰ってくる時間と方向が決まるからである。

じゃあ、帰っこなかったらどうだろう。何もわからないね。
光子よりちっさいものがあったら、それがそこにあるかどうかは、わからない訳だ。
光子と同じ大きさのものがあったら?弾き飛ばしてしまうね。
弾き飛ばしてしまったら、光子が帰ってきたとしても、もともとあった場所は分かっても、今どこにあるかは分からないんだ。

他にも、物があるかどうかを音等の波で確認する方法もあるが、その方法でも同じだ。弾き飛ばしてしまったり、そもそもそんな小さいものが相手じゃ波=振動は帰ってこない。


量子を扱う学問では、これが問題なんだ。
そこに物=量子があるかどうか確かめたいとする。
でも、光子をぶつけて、帰ってきたら、そこにあったことは分かるけど、今どこにあるのかは全く分からない。そもそも、吹き飛ばして光子が帰ってこない場合だってある。

だから、今、何処に、量子があるかは観測できないんだ。


これが量子の観測問題


代表的な量子には、光子や、電子なんかがある。

原子の周りを回っている電子も、同じようにどこにあるかは分からない。

 

どこにあるかが分からない物だけど、例えば原子の周りを回っているわけだから、その辺の何処かにあるってことは分かるわけだ。
だから、量子を扱うときは、その曖昧な状態を、確率で示すことになっている。

この辺に、このくらいの確率である。

そんな感じで示すんだ。


放射性元素について、その崩壊がいつ起こるかという問題がある。
放射性元素は、状態が不安定だから、いつか壊れて、そのままの状態を保てなくなる。
その時に飛び出す破片が、放射線になる訳。

放射線元素がそこにたくさんあったとして、それを、旗を挙げる人で例えよう。

旗を上げてって言った時に、皆が50%の確率で手を上げるとする。
一人の人が、その時旗を挙げるかどうかは中々分からないね。
でも、その人が1万人居て、何人が旗を上げるかっ考えたら、大体半分の5千人だ。

確率が分かると、多くの母体がある場合の大体の結果がわかる。


その人が2回に1回の確率で旗を上げる人だと分かっていて、その人が次に旗を挙げる人かどうかを考えたいとしよう。

こういう時、その人をどう見るのかというのが、量子力学観測問題の課題になる。

量子力学の時この課題は、物体が粒子か波かという様な話になる。

この人が旗を上げる人かどうかっ考えよう。
答えの1つは、
この人は半分は旗を挙げる人、半分は旗を挙げない人っていう、両方の性質を持った人だ!
って答え。

答えの2つ目こそが今回言う、多世界解釈
この人と同じ人は別の平行世界(パラレルワールド)にも居て、この世界の人が旗を挙げる人なら、他の世界のこの人は旗を挙げない人なのさ!

という解釈の仕方。

旗を挙げる人を見た時の反応は、

1だと、この人は旗を挙げる人だったんだ。
2だと、別の世界のこの人は旗を挙げない人。この世界の人は旗を挙げる人だったのね。

という解釈になる訳。