百折不撓

live.nicovideo.jp

 

昨日もKristallweizenの出番がありました。

小林健二九段は最後まで「なんとなくクリスタル」とか茶化して正式名称を読んで下さらなかったのでちょっと残念です。

色々思うところはあり言語にしづらいのですが,木村九段最終局までよくひっぱりました。

おじさんの夏は終わりません。

 

百折不撓はもちろん木村一基九段の揮毫される文言です。

百が数の多いことを表しており,何度失敗しても志を曲げないという意味です。

 

今回解説されていた自称小林健29段は志在千里と書かれていました。

中国だなってのはすぐ気づくんですが,これ曹操なんですね。

乱世の奸雄と悪く評されるのは三国志演義の影響でしょうか三国志随一のカリスマの言葉ですが,実は晩年の作のようです。

50歳を過ぎた曹操が自分も年をとったが志はまだまだ大きく持っていると言う詩を詠んだわけです。

ということで,小林九段もまだまだ志高くタイトルを狙われていると思います。

 

そう言えば叡王戦の九段予選では小林九段を下した塚田九段が残っており,次の対戦相手が木村九段と森内九段の勝者となっています。

叡王戦予選も大詰めですね。

モンテカルロ法の精度の話

若い頃,はじめて就いたボスの勧めで電子状態をモンテカルロ法を使った空間積分する手法を少々触った。

私の結論は簡単だった。精度の低い荒い解を求めるのには高速だが我々の欲しい精度のエネルギー状態などを得るのには使えない。

 

昨今,ガチャというものが流行っている。ルール上のもので確率が表示されていたりするが,ドラクエXでダイスが等確率でなかったりとか不透明なものであっても気づきづらい。つまり,ある程度の数の実験を行わないと精度が出ないのである。

 

具体的な式に関してはWikipediaにもあるので略すが,実験数が増えると精度が単調に上がるし,絶対的な収束性は保証されているのでうっかりしやすい。

精度が上がるためのコストの方が爆発的に上がるのである。

6面ダイスの各面が出る確率を0.16666の桁まで実験で求めろと言われると何回の試行が必要になるだろう。

 

ところで,逆もある。

世の中には運のいい人もいるので初めて行った競馬場で3レース連続で勝つ人も少なくはない。ビギナーズラックと言われるものだが,こういうのは話のネタになるので特別広まりやすい。

 

もっとひどい話もあるだろう。麻雀で初心者が役満上がったとか,適当に埋めたマークシートの試験で90点取ったとか可能性は0ではない。

 

で,100%同じ環境が再現できるなら以下のようなことが可能になる。完全情報ゲームであれば容易だ。

 

  

こういうのを自動化するのも比較的容易だ。昨年はソニック・ザ・ヘッジホッグを題材に大会があったようだ。

contest.openai.com

 

将棋では「待った」と言う。対戦では禁じられているが,学習には非常に有効に思うのだが・・・

寝起きで書いたのでイントロとオチの整合性がない。

 

AobaZeroで遊ぼう6(頓死編)

bleu48.hatenablog.com

 

前回に続きます。

この後,二手目84歩の設定でfloodgateでも投入してみました。同じplayout 800なのですが,対戦記録やレーティングを見る限り優位に強いようです。ということで近いうちに学習するでしょう。

ついでに気になった点として矢倉戦は学習していないのか下手な気がします。

 

ところで,頓死の話です。

以下の論文にも書かれていることですがモンテカルロ木探索の終盤が酷いのは既知のようです。

関栄二, et al. "将棋におけるモンテカルロ木探索の特性の解明." ゲームプログラミングワークショップ 2012 論文集 2012.6 (2012): 68-75.

 

実際,floodgate上でも選手権の対戦でもモンテカルロ木探索を用いている勢は序盤優位を築いても負けてしまうケースが大変多いようです。

 

そうこうすると,やね師匠の試算もある通り一般的な家庭用PCでは同アルゴリズムで技巧に勝てるかどうか程度であるという話に信ぴょう性が増しております。

AlphaZero Shogi弱すぎクソワロタ | やねうら王 公式サイト

 

AlphaZeroの論文中では評価値の優位が確認できた時点で勝ちとして対戦を打ち切っているそうですが,残念ながら相当恣意的なものと考えなければなりません。

否定的意見を挙げるのが目的ではなく,改良の余地があると考えて頂ければ前向きになります。 

 

具体的な取り組みのひとつがやはり山岡さんですね。

 

tadaoyamaoka.hatenablog.com

 

しかしながら,コンピュータ将棋では20手近い詰めろが頻発しているため効果は微妙なようです。

何かよい方法はないものかと思案案件のリストに入れておくという自分用のメモでした。

---

先日の叡王戦の羽生藤井戦,86歩が奇跡的な長手数の詰めろ逃れの詰めろでしたね。

こういうのが将棋の醍醐味ですよねぇ。

KPPTについてふと考えた

ある休日に珈琲を飲みながらふと気が付いた。

イデアが浮かぶのはオフィスでも会議室でもないのだが,これは一般的だろうか。

 

コンピュータ将棋でKPPの三駒関係の評価関数が作られた経緯をざっくり学んだ後,少し検証してみた。あれの一番の利点は差分計算が高速に行われることにある。

KPPTになったときも手番分を加え二倍の計算をして最後に和か差を取ることになる。手番と非手番を独立させると差分計算がうまくできないからだ。さらにSIMD命令で計算時間は二倍にはならない。

 

で,KPPは先手後手のKと任意のPの組み合わせなので2*38*37/2と回数ループを回す。手番分評価も同様である。

 

しかし,考えてみて欲しい。一回で動かす駒はひとつだ。手番分の評価値が多すぎないか?動かさない駒の分も手番ペナルティがあるのは妙な気がした。

ってことで,「ある駒を含むKPPの手番分評価」が最大(非手番では最小)となる駒の分だけ評価するのが筋ではないだろうか。

 

これはネタだけで未実装である。差分高速化を放棄する上に比較コストまで払うことになるからねぇ。

 

諸刃の剣

もろはのつるぎである。

雑に言うと効果的であるが大きなリスクを背負うと言う意味。

ドラクエ世代なら絶大な攻撃力の見返りに毎回使用者にダメージがある剣と記憶があるだろう。(まぁ,最強の武器でもないので使わない人の方が多いだろうけど)

 

近代の製造設計では高機能のために少々のリスクをとるスタイルが普及している。構造計算や制御技術が高まったためにリスク管理ができているのが前提である。航空機や大型建造物など普通に初歩的な力学を学んだ人だと驚くようなものが多い。

 

数値計算においても似たような問題がある。ある仮説をおいて数値を設定すると高確率で計算時間が大幅に短縮できる。逆に低確率であるが収束が困難になる。巨視的に見れば利益があるので導入するしそれが一般的になって普及するが,計算機の能力が桁違いにに上がってくると低確率の事象が無視できなくなり除外して計算する方がよくなることもある。両方計算して早い方を取る的なアルゴリズムもある。

素人目には停滞期で伸びていないように見えるだろうがアルゴリズム的な過渡期ではよくあることだ。

 

木探索において諸刃の剣と言えば前向き枝刈りである。

詳細は多くの文献があるので省くが,先日ふと思い立って自前のアイデアを実装してみた。比較的安全サイドから少し刈っただけで一桁くらいの速度向上が得られたが対戦成績は微妙である。つまり,既に弊害が拮抗している。

手軽に使える実装が既に普及しているので簡単に考えていた部分もあったが,さすがに既存のソフトはよくできているんだなぁと感心することになった。

よく分からないマジックナンバーには歴史があるってことだろう。

AobaZeroで遊ぼう5(8四歩編)

bleu48.hatenablog.com

 

シリーズは更に続きます。

今回は二手目,8四歩の話です。

 

現在AobaZeroが絶賛学習中なのですが,後手番で3四歩,4四歩と突いて雁木形で組むパターンが多いようです。

AlphaZeroと藤井君は8四歩じゃないの?と思った方はちゃんと棋譜を見てる方ですね。

AlphaZeroの追実験として行われているAobaZeroが8四歩じゃないのは何故でしょうか。

公式サイトでも今風なのか先手勝率が高いのとか若干関係があるのかどうか気になります。

 

www.yss-aya.com

 

ということで,簡単な実験をしてみました。

使用したのはAobaZeroの開発版,学習率を落とした現状最強の評価関数,多スレッドで3200プレイアウトでの対戦です。

ただ一つ,後手の二手目を8四歩と固定しました。

結果,100戦で後手が68勝27敗5分と7割程度勝ち越すようです。

幾つかの棋譜をみたところ,まず当然ですが雁木系の駒組はなくなり角換わりや相掛かりの戦型ばかりになります。

あとは憶測になります。なんとなく直感ですが先手の対応が(結果負けているので当然と言えば当然なのですが)下手に感じます。類似局面が十分学習されていないのかもしれません。

また,勝率の偏りですが,初期乱数の出方で部分的な過学習が出ている可能性は当然あります。もちろん偏った勝率を考えるとこの学習も単なる過渡期でそのうち8四歩を学習する可能性も十分考えられます。まぁ,もう少しデータを集めないと結論めいたことは言えないでしょう。

ただ,初手絞るだけで同じエンジンで7割の勝率って結構すごいですね。

 

ということで,似たようなことを先手にもしてみました。大半が2六歩である初手を7六歩にしたところ,これは勝率ほぼ五分でした。ただ,千日手比率が10%近くまであがります。実験数が半端なので数値を出すのは控えておきます。

 

まぁ,非常に簡単な実験ですがちょっとしたヒントに繋がりそうなので早めに公開しておきます。類する実験等をどんどんやって何がどうなってるか確認して頂ければ幸いです。

---

追記:

個人的には自己対局のみによる強化学習は戦型選択が偏るためにあまりよろしくないって説を以前より提唱しております。

AobaZeroで遊ぼう4

bleu48.hatenablog.com

 

さらに続きます。

前回CPUのp200を投入しました。

思っていたよりちょっと弱い気がしましたので比較実験をしました。

 

使った評価関数はこちらの「20190722_193305log_win500k_lr00001_wd00002_m64_iter_856000.txt」です。

Re: FloodgateのAobaZero命名則について | コンピュータ将棋や囲碁の掲示板 | 3515

学習率を下げて強くなったものだそうです。手元計測ではw674に対してGPUでp800の対戦を20戦させて17勝3敗でした。有意に強いですね。

 

1.1スレッドCPU vs 4スレッドCPU

前者は公式バイナリ,後者は開発版をビルドしたものです。さすがにアレなのでp50での比較。

500戦で335勝140敗25分。有意差ありですね。

 

2.GPU vs 4スレッドCPU

前者が開発版CPUビルド,後者は開発版GPUビルドです。理由はRyzenのノートでテストしたため公式バイナリだとOpenCLがうまく動かなかったためです。p100で対戦してみました。

500戦で280勝196敗24分。こちらも有意差ありとみていいでしょう。

 

3.AobaZero_w667_n_p200 vs AobaZero_w667_n_p200_t4

floodgateにてGPUでp200(ほぼ即指し)とCPUの4スレッドのp200を投入しておりました。上記の件に気付いてからGPU版を投入したので対戦数が異なりますが,レーティング差が60ほどあります。(見た範囲では常に30~80の間)

評価関数はw667で合わせてあります。

これだけでどのくらいの精度と言えませんが常に差があって逆転はなかったように思います。

 

ということで,低プレイアウト数でマルチスレッド側が若干弱いようです。

理由がマルチスレッドだけだとすれば,バーチャルロスの効果かなぁと推測してみます。バーチャルロスとは探索中のスレッドの結果を負けと仮定しておくマルチスレッドの計算法です。仮定しなければ同時に走っているスレッドが同じ探索をする可能性があるためなるべく他のスレッドを探索させようとするものです。

しかしながら,p50くらいで4スレッドだとバーチャルロスが1割近くになります。これは悪影響大きそうです。相対的にプレイアウト数が多くなれば無視できるものと考えます。

 

ところで,マルチスレッド化は当然CPU専用ではありません。

GPUの場合は1スレッドでは十分な負荷がかからず待ち時間に取られているようです。

CPU・GPUの環境に寄りますが手元のベンチマークではマルチスレッド化で3倍から4倍程度の負荷をかけることが可能になっているようです。当然GPUの排熱には注意しましょう。

 

ってことで,ゲーミングノートでもカジュアルにp3200級を計測可能になったので連休に色々対戦してみました。

AobaZero側がp3200,対戦相手は一手10秒です。

vs dlshogi_wcsc29 14勝6敗

vs dlshogi_wcsc28 17勝3敗

vs 技巧2(1スレッド) 4勝16敗

AobaZero側がp6400,対戦相手は一手10秒です。

vs 技巧1(1スレッド) 8勝11敗1分

vs ぽんぽこ(1スレッド) 6勝14敗

これで優劣をコメントするつもりはありませんが,一方的な展開になっていないって位の結論は言えます。

 

ちなみにfloodgateで1080Tiでp20kを投入してみます。p30kの結果も出てますが,評価関数が違うので比較を楽しみんで下さい。

マルチスレッド版そのうち公式にリリースされれば学習速度も3倍増するんでしょうか?