rewritemath's blog

rewritemath’s blog

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

囚人のジレンマと量子的戦略と日本人の間の文化

皆様、お元気でしょうか。元気ではない?

なるほど。

お元気そうで何よりです(静かなる大衆の声は聞こえませんねぇ)

 

今回の話題は、囚人のジレンマです。

ご存じない?

ご存知ですよね。

ざっくり言うと、…いや、wikiから引用します

 囚人のジレンマ(しゅうじんのジレンマ、英: prisoners' dilemma)とは、ゲーム理論におけるゲームの1つ。 お互い協力する方が協力しないよりもよい結果になることが分かっていても、協力しない者が利益を得る状況では互いに協力しなくなる、というジレンマである。

 こういうことです。

さて、今回この記事でこれと結びつけて考えるもう一つが、「間」というやつです。

 

間が悪い、間柄、間延びする

 

そんな使い方がありますね。

要するに「間」というやつは人間関係の中に存在する余白のようなものであります。

「間」をうまく操れるものこそが、人間関係を制するといっていいでしょう。(日本においては)

最近、日本人の使う日本語が乱れているという話をよく耳にします。日本人の語彙が貧困になっているということは、実感する限り事実であります。

自分自身は、”やばい”とかいう万能の言葉を使うことは控えているのですが。理由としましては単に、自身の伝えたいことが伝わらないからです。

例として食事の時のことを挙げますと、この”やばい”という語は、味が濃すぎる、薄すぎる、美味しい、不味い、豪勢である、熱い…他、多くの形容を指し示せるポテンシャルを持っているのです。

一方でそのポテンシャルが、伝えるべき部分がどこで有るのかを正確に双方が把握するのを困難にしているというわけです。

そのデメリットを有しているこの語の扱いには、私はなかなか慣れることができないのであります。

 

しかしながら、別に現代人が抽象的な言語を用いて会話における必要語彙の圧縮を図っていることを批判するのには、これまた注意が必要でしょう。

 

すみません

この語の扱いには多種多様な場面が想定されますが、これを語彙の貧困の一因だと指摘する人は聞いたことがありません。

 

そもそも、

かの徒然草にさえこんな文章が。「最近の若者は~」という話です

徒然草116段

寺院の号、さらぬ万の物にも、名を付くる事、
昔の人は、少しも求めず、たゞ、ありのまゝに、やすく付けけるなり。
この比は、深く案じ、才覚をあらはさんとしたるやうに聞ゆる、いとむつかし。
人の名も、目慣れぬ文字を付かんとする、益なき事なり。
何事も、珍しき事を求め、異説を好むは、浅才の人の必ずある事なりとぞ。

ざっくり言うと、

最近の若者は何にだって偉そうな字を使って大層な名前をつけやがる。我々の頃はもっとそのままな感じで適当な名前をつけたものだ。訳の分からない珍しくて読みにくい字を使うなんてことをしても、そんなことをするのは馬鹿のすることじゃわい。読みにくくって仕方がないし、いいことなんてないじゃあないか。

 

みたいな感じです。

これ以上言っても特に益はないので、詳しく知りたい人向けにリンクを乗っけておくこととします。

55096962.at.webry.info

d.hatena.ne.jp

 

相手に解釈の余地を残すように話しかけるのが日本流なんでしょう。

それは、昔から日本人の考え方の根底に流れているんじゃないかな。

 

 

日本人は、仲のいい人とは親しくしますが、そうでない人とは距離を置く傾向が強いのだそうで。

www.youtube.com

 

 

要するに、日本人はなかなか態度を決めないわけである。

海外では「日本人はYESやNOということができない優柔不断な民族なのか」と揶揄されたり。

 

しかしこれを、量子的戦略だと解釈したらいかがでしょう。

量子で囚人を解き放つ | 日経サイエンス

 

人が、相手の態度を伺って、それまで自身の態度には柔軟さを持たせて保留しながら会話すると、その会話の仕方は、全体の利益として帰ってくるんじゃあなかろうか。

 

 

まぁ、結局言いたかったのは、こういう話です。

ブログのメインをどれにしようか悩んでいる話

本題そのままなんですけれど、このままはてなブログに居座るのか、それともBloggerGoogleのお膝元)に移るのか、はたまたライブドアブログにするのかで悩んでおります。

 

現状最有力は、Bloggerへの移転です。ということで、このブログにある記事と同じ記事がBloggerでも読めるようになります。お好きな方でお読み下さい。しばらくはこのまま、両方で運用を続ける形にしようと思っていますのでよろしくお願いします。

 

驚いたことに、このブログへ訪問してくれた方々は主にウェブ検索からの流入にも関わらず、リピーターの方も6割程度いらっしゃる様です。ありがとうございます。それだけで励みになります。

 

正直、書き始めた最初の頃は何を書いていいやら、どのくらいの長さがいいやらと悩み続けていましたけれど、最近になってやっと自分なりのペースみたいなものを掴み始めてきた感触があります。

これからも暖かく見守ってやって下さい。

完全に移行することが決まりましたらその時はまたお知らせします。

 

ここからは、はてなブログからなぜ移転を考えたかという話に移ります。

まだ弱小ブロガーの癖にサービスを選んでいるんじゃねえよ!

と思った方も大勢いらっしゃることと思います。

そんなことはどうでもよくて、自分がやってみたいと思ったら膳は急げとサクサク挑戦してしまう身軽さが私の売りの一つでもありますから。

 

はてなブログBloggerの違いはまた別の記事に預けるとして、今回は少しだけことのあらましを話そうかと思います。

 

流れとしては、

はてなブログにGoogleAnalyticsも導入したし、ブログ面白くなってきたな。私の発信する情報が見たいと思ってくれている方がいるのは嬉しいことだ。

じゃあいよいよ、AdSenseも導入してみよう!

独自ドメインが必要…!

はてなプロはまだまだ敷居が高い

サービスを変えよう

 

 

ということであります。

 

無料ブログでも独自ドメイン無しでAdSenseを導入する方法という記事を今度書きますので、そこからの流れはそちらの記事で。

 

 

 追記

ということでそちらの記事は、Bloggerの方のブログで記事を書きました。

 

色々試行錯誤してみます。

 

 

追記2

はい。結論が出ました。私はまだ若いので、有用な情報を発信するなら自分が著名な地位や教授職、研究職辺りについてから、ブログか本かどちらかで発信するという形にした方が明らかにいいに決まっています。

ブログは敗者復活戦だという人々の意見に同意します。(そもそも別に、最初から収益化目的で始めたわけじゃないし)

ということで特にブログを頑張って育てたりはしません。

日記とか雑記とかメモとか、たまに有用で発信するべきだと思えた情報を発信するツール(気になって調べた誰かの助けになればいい)として使うだけにします

ということで、便利で簡単にある程度見栄えが良くなる方を選んだらはてなブログでした。おしまい。

ということで基本はやっぱり、はてなで更新します。というかそもそもあんまり更新しないかな。

たまに、はてなに載せると流石に内容が雑多になりすぎるな…と思ったことはBloggerに載せる感じだと思います。

 

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

プロ棋戦のデータ

 

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進数で値を持っていますから、それをグラフィックにする(可視化して見やすくする)ものです。