将棋電王トーナメントの雑記

なんだか風のうわさだと今年もあるっぽい。

それも10月スケジュールだそうなんだが、7月下旬で公表されてないのはさすがに厳しいんじゃないかな。

個人的にはもう10月予定は半分ほど埋まってるので参加できないかもしれない。

昨年と同じ11月上旬と思ったからねぇ。

 

ちょっと調べ物をしたのでメモっておく。

第1回:インテル6コア12スレッド、Windows 7

第2回:インテル8コア16スレッド、Windows 8.1

第3回:Core i7-6700K(4コア8スレッド)、GTX960 2GB、Windows 10

第4回:Core i7-6700(4コア8スレッド)、GTX1060 6GB、Windows 10

第5回:Core i7-6700(4コア8スレッド)、GTX1080Ti、Windows 10

 

ここ3回は4コア8スレッドでGPUだけが極端に強化されている。

対プロ棋士の興行を意識してスペックダウンされたとかの噂もあるみたい。

PC供給スポンサーの意向とかそういう可能性もあるが、GPU使えって意図とも読める。しかしながら、スペック公表が遅すぎてそれに合わせた開発が出来ない。

もちろん、決め打ちで開発する人や公表後猛スピードで調整してくる人もいるので、そういうのを推奨されているのかもしれない。一部の人だけが事前に知ってたとか言うのはデマの類と思ってる。

 

で、今年あるとすればGPUは1080Tiからスペックダウンって話はないだろうから、維持するかTITANなんだが、さすがにTITAN沢山用意することは難しいと思う。それでも決め打ちはしづらいイメージが有る。

CPUはどうなるんだかわからないけど、さすがにもう6700は在庫も無いんじゃないかな。過去にAMD採用がないので決め打ちで悪いがRyzenも無いだろう。

とすると7700か8700辺りが予想されるんだが、前者だと6700とさほども変わらんので後者で想定しようかなぁと。

 

気にしない人もいるかもしれないけど、うちはスレッド数気にするんで。

昨年度は苦肉の策で3+2+1+1+1=8でしたので。(スレッド数多めで希望出したんですよ。)

つーことで、そういう調整に入るかなぁと思う日曜の早朝。

土曜出勤で疲れて早々に夕飯直後落ちしたせいでボーっとしてる。

---

6コア6スレッドのi5-8400とか持ってこられたら一番困るなぁとかふと思った。

大穴はゲーミングノートPCかな。

コム将ほどpythonを使って欲しい

この記事はpython-shogiの宣伝です。あしからず御了承下さい。

コンピュータ将棋界隈では諸々の事情でC++の天下です。

しかしながら,pythonでできることも沢山ありますし,pythonの方がいいことも沢山あります。

たとえば,コム将対戦の場であるfloodgateの棋譜はCSA形式ですが,このデータの処理,特に集計はpythonでやるのがおすすめです。

たとえばCSA形式のファイルひとつを持って来てjupyterで以下のように三行打ってみて下さい。

import shogi.CSA
kif = shogi.CSA.Parser.parse_file('test.csa')[0]
'startpos moves '+' '.join(kif['moves'])

例えば以下のようにCSA形式のデータがusiプロトコルの局面データになります。

startpos moves 7g7f 8c8d 2g2f 8d8e 2f2e 3c3d 6i7h・・・

 

KIF形式にも対応していますし,少々プログラムを書けばCSAの一行表記などにも簡単に対応できるでしょう。

 

また,ipywidgetsを使うと色々便利になります。

まずは以下の二行をコマンドラインから打ち込んでipywidgetsを有効にしましょう。

pip install ipywidgets
jupyter nbextension enable --py widgetsnbextension

分からなければipywidgetsでググってください。

出来たら最初の棋譜を読み込んで以下のようなプログラムを走らせてみて下さい。

import shogi.CSA
from ipywidgets import interact

kif = shogi.CSA.Parser.parse_file('test.csa')[0]
@interact(n=(0, len(kif['moves'])))
def interact_board(n):
    board = shogi.Board()
    for move in kif['moves'][:n]:
        board.push_usi(move)
    print(board.kif_str())

 以下のようにスライダーが表示されると思います。

スライダーをマウスで移動させることにより棋譜のn手目の局面がインタラクティブに表示されます。

f:id:the48:20180706005836p:plain

コム将ならこの途中になんらかの評価などの処理を盛り込むと分析が捗ったりするんじゃないでしょうか。

 

ということで,実行速度より開発速度を重要視するような簡単な実験を行うのはpythonがおすすめです。

そういえばローカル対戦をさせるスクリプトがやねうら王で利用されていたと思いますし,dlshogiでも学習用データの管理に利用されていたように記憶しています。

そんな風な話が10月の広島で聞けるとかそういう宣伝も最後に挟んで久しぶりのblog更新を終わりにします。

 

hiroshima.pycon.jp

 

追記:

pythonの正式表記はPythonです。P大文字です。

千田先生の定跡への機械的回答

定跡も公開でしたので,公開私信モードです。

遅くなってすみません。

以下の計算自体は先週末に終わっておりました。(それでも約3日)

うちの定跡との照らし合わせがまだですが職務等で少々時間かかりそうなので,機械的な部分だけ先行します。

 

具体的には以下の2つのファイルです。

行った行為は千田先生の定跡ファイル(5月15日付)をBookConvのR8でやねうら王形式に変換。

その後,各局面と定跡の指し手局面の評価値を比較し,評価値が300以上下がった局面および500以上下がった局面を自動的に抜き出したものになります。思った以上にゴミがある風に感じます。(私が定跡を管理するなら自動削除するレベルという意味です)

ファイルの中身はテキストファイルで1行に1局面のデータがあり,sfen文字に続き,指し手,指す前の評価値,指した後の評価値となります。手番視点の評価値ですのでもちろん符号が異なります。

BookConvの不具合か手数に不自然な数字が入ってるケースがありますが,今回は特に気にしていません。

使用したのは評価関数Qhapaq_wcsc28,実行ファイルYaneuraOu 2018 Otafuku KPPT 4.82 64AVX2,探索深さノード指定1000000です。ノード数指定の理由は所要時間の見積りがやりやすい点と各局面の所要時間がほぼ等しくなる点です。

 

https://1drv.ms/t/s!AqprfPHDsDdxh6pmwyLuX0T5lq_FXA

https://1drv.ms/t/s!AqprfPHDsDdxh6pl9yPG6AwLQtVggg

 

コメント等頂ければ幸いです。

序盤限定に絞ってもう少し探索ノード数を増やせばよかったとかは自覚してます。

長時間戦でのAperyについて

bleu48.hatenablog.com

 

前回の続きですが,あんまり長いので別にします。

i9をフルに使って長時間戦(持ち時間30分)を行ってましたが,なんと再起動されており以下の数で中断しておりました。感想戦ばかりしていられないのでこの辺で切らせてください。(以下ので5日間かかるんです)

 

勝敗 Boo13 52 Apery_WCSC28 41 レート差 31
先手勝 Boo13 : 29 Apery_WCSC28 : 22
後手勝 Boo13 : 23 Apery_WCSC28 : 16
千日手 9 持将棋 19 平均手数 184 対局数 121

 

まず,平均手数が長いw。そして時間が短いのも両方とも引き分けが多い。

勝率は思ったほど変わりませんでした。66%から56%って具合ですね。

これだけじゃどちらとも断定しづらいですね。

 

やねうら王長時間戦には枝狩り過ぎ説は難しい課題なのでとりあえずは保留とします。

まぐれ度計測の話

選手権優勝の件,やはり出来過ぎ感があります。

ネタっぽく世界チャンピオンですと言ってもなんか笑い以外のモノが混じる感じです。

 

昨年と同じように順番に検証していきたいと思います。

今回の我々のチームはエンジョイ勢なので何より楽しめるかどうかに重点が置かれています。私の部分においては例えばMulti Ponderを見てもらいたいなと思っており,昨年の懇親会など面白いことをアピールし続け,今大会はクジラちゃんとの合体を打診したこともあります(フラれましたけど)。先行読み部を上手に可視化すると面白いんじゃないかと思ってますが,何分そういうのは苦手で止まったままです(この辺はドワンゴさんに話してあります)。Tamaさん部はもちろん人造棋士18号の評価関数合成ツールを皆に使ってもらいたいとのことです。今大会の懇親会においてはコブラさんと並んで,評価関数「何してるか分からん」群に入っていたようです。

もちろん,ある程度勝たないと面白みは伝わらない(気にもされない)のでネタの0秒指しでも勝たないとダメとの認識でした。0秒指しはLANとWANの両方の通信遅延のチェックも兼用してるのでちょっと賢いメソッドです。

 

github.com

 

また,ふたりの共通の敵はたぬきとHoneyWaffleなので(理由はSDT5参照)二次予選のたぬき戦と決勝のHoneyWaffle戦が終わった段階で軽い祝勝会を行いました。ミッションコンプリートです。

残念ながら,大将軍には土を付けられたままになっておりますので今後のターゲットは「大将軍」となります。PALとコブラ相手には2勝1敗なので勝ち越しカウントです。

 

では,本題の事後検証です。

とりあえず,公表の早かったクジラちゃんとAperyで測定を行いました。うちで選手権直前で調整に用いた4コアのPCで30分切れ負けとしてあります。(一手20秒固定より時間の無駄が少ないかと思ってます)

クジラちゃんとは決勝戦で当たったのですが,棒銀に上がったところで切れ負けされてしまったので勝負は勝ちですが,戦った気がしません。要検証の相手です。

Aperyとは二次予選で得意の横歩を取ったにも関わらず引き分けまで粘られてしまいましたのでこれも要検証の相手のひとりです。特にそれほど改良してきていないとの平岡氏の言葉が真実なら,高パフォーマンス戦においては枝狩り過剰による読み抜けの方が危険とのことを検証する機会になります。

 

6700HQ,4コア8スレ,30分切れ負け,ResignValue 3000、hash 4096,定跡なし

対局数300 先手勝ち173(61%) 後手勝ち109(38%) 引き分け18

Boo13
勝ち149(52%) 先手勝ち91(64%) 後手勝ち58(41%)

GodwhaleChild-5.0.5 KPPT 4.80 64AVX2 TOURNAMENT
勝ち133(47%) 先手勝ち82(58%) 後手勝ち51(35%)

 
6700HQ,4コア8スレ,30分切れ負け,hash 4096,定跡入り

対局数300 先手勝ち155(58%) 後手勝ち111(41%) 引き分け34

shot_gun 0.32 ←(定跡入りPonder無し仕様のやつ)
勝ち176(66%) 先手勝ち100(74%) 後手勝ち76(58%)

Apery_WCSC28
勝ち90(33%) 先手勝ち55(41%) 後手勝ち35(25%)

 

とりあえず,両方ともPonder無しでも思ったほど分が悪くないようです。

クジラちゃん相手に後手だと危ない感じですか。

対Aperyは長時間戦を用意していたのですが先週の私がボケてたのか設定ミスのためこれから再計測します。また,公開されたのは決勝バージョンのようで,一次予選や二次予選でうちが使った棋譜が丸ごと取り込まれていてAperyの名の通り平岡さんの柔軟かつ迅速な対応に驚かされました。(決勝でAperyがうちの横歩定跡をなぞったらしいです。)

 

次は河童と河童巻きですが,河童の方がマシンが落ちてしまったため勝率が出ておりません。棋譜が残っているので後ほど(スクリプトで)集計します。手動嫌です。しました。(uuunuuun様ありがとうございます。)

定跡アリもやってみたいところです。

 

Ryzen7 1800X,15スレ、一手10秒、ResignValue 3000、hash 4096,定跡なし

対局数201 先手勝ち108(55%) 後手勝ち86(44%) 引き分け7

Boo13
勝ち70(36%) 先手勝ち41(41%) 後手勝ち29(30%)

QQR
勝ち124(63%) 先手勝ち67(69%) 後手勝ち57(58%)

 

6700HQ,4コア8スレ,30分切れ負け,ResignValue 3000、hash 4096,定跡なし

勝敗 Boo13 58 Qhapaq_wcsc28 88 レート差 62
先手勝 Boo13 : 32 Qhapaq_wcsc28 : 48
後手勝 Boo13 : 26 Qhapaq_wcsc28 : 40
千日手 15 持将棋 7 平均手数 140 対局数 168

(300戦分なかったのは途中落ちたんでしょうか遅延書き込みでしょうか。)

 

やはりQhapaqもQQR強いですね。今期のレーティング覇者でしょうか。(300戦予定を途中で切ったのは仕事のためです。御容赦下さい。)

 

最後にelmoです。直接要望がありましたので一手10秒固定にしました。こちらもSDTでは当たったら負けを覚悟してた昨年チャンピオンですので強敵認識です。

 
4コア、一手10秒、ResignValue 3000、hash 4096,定跡なし

対局数300 先手勝ち114(41%) 後手勝ち162(58%) 引き分け24

Boo13
勝ち160(57%) 先手勝ち67(49%) 後手勝ち93(66%)

elmo_wcsc28
勝ち116(42%) 先手勝ち47(33%) 後手勝ち69(50%)

 

後手勝ちが多いですね。何なのでしょうか。ちょっと精査しなくてはなりません。相性問題意外とややこしいですね。

  

今のところ,とりあえず以上です。主に評価関数部分のみですが,優勝がまぐれでもない結果にはなってるかと思います。Mutli Ponderクラスタについては来月の第40回ゲーム情報学研究会で一部発表予定です。その他追加計測も出していきますが,そこそこ長くなったので追記にするか新規に立てるかは未定です。

現在計測対象の評価関数は棋人ブゥ13番だけですが,サブエース12番や定跡部生成で頑張った7番9番などがそこそこ面白い動きと勝率を誇ります。魔改造技巧も一軍登板へボチボチ詰めていきたいものです。

また,巷では既にYaneuraOuにNNUEが取り込まれるなど多数の改造が加えられているとの話もありますので今後もコンピュータ将棋業界はどんどん進化していきそうです。 

コンピュータ将棋選手権の話

早めに書いておかないと熱が冷めるので書こうと思いますが,あれ以来睡眠周期が乱れて酷い体調になってるのでこんな時間でもあるし,きっちり整理できてる気がしません。

まぁ,いつもの追記にするか訂正することを前提にメモっておきます。

 

アピール文の話

書き方が雑というか予定ばっかりで確定的な情報が皆無であったこと。実際に確定事項がほんとうにありませんでした。評価関数を人造棋士18号の松下さんに頼る決断をしたのは4月に入ってからですし,魔改造技巧エンジンの使用用途は最後まで迷いました。

証人は松下さんしかいませんが技巧型の評価関数と今回たぬきが導入したようなディープラーニング型の評価関数や指し手確率分布の試みは既にこちらも行っておりました。

AWSのテストができたのは4月末でnpsのベンチマークでm5.24xlargeがベストと確認しましたけど,複数利用するには事前申請が必要と分かりまして,この制限が申請後解除されたのは本当に5月1日の午前のことです。Amazon外資系なので休日出勤がないというのは事実のようです。(ここのネタを公に言うのはこれが初めてです)

相手の手を予測する部分のベンチマークは結局間に合わず,大会後間違ってなかったんだろうなぁってデータが集まっていたことを確認しました。魔改造した技巧は無駄でなかったことをアピールできます。一次予選はそういう意味でリアルタイムの実験でした。時間制御をあんなことしたのは遅延時間計測も含めてのことですので御理解下さい。

 

定跡の話

昨年のshotgunの定跡の大半が自動生成されたものであることは記載済ですが,これがdepth24で探索されたものです。今回の選手権ではAWSクラスタが用いられるためdepth24には秒以下で到達します。つまり,depth24で切ったデータなどは悪手のリスクしかない塊になりかねません。事実長時間対戦では定跡の粗が多く見られました。

そこで,取り急ぎ全てdepth26で再探索することにしました。これがi9含め手持ちのリソース全投入して一か月程度の計算量であることを確認しました。というか28とか30は間に合わないことを確認していた。26は苦肉の妥協です。使わないという選択肢も対戦勝率計測時に用意していました。

未確認ですが,5月5日朝に最終更新した4000局面強で99.9%程度は更新できたと思っています。i9とのリモートデスクトップ通信が不調でなければ4日朝に更新できたと思われる分です。

また,同時に自動での定跡延長を行いファイルサイズは二か月で2割程度増えました。

ちなみに,若干規模深さなどが異なりますが,たぬきさんも今回同様の自動定跡生成を行っているらしいですね。

 

評価関数の話

正直シボレーでうまくできた試しがありません。結構作ったつもりだがあまり強いものができなかったのでライブラリ使用規定範囲内でキメラ対応かと思ってました。また,遺伝的アルゴリズムで評価関数合成し短時間対局で強いものを選ぶ的なスクリプトを用意していましたが,実用時間での解は得られ無さそうであることを確認してました。

そういう愚痴を松下さんに零したところ人造棋士18号からさらに進化した棋人ブゥの存在を知らされ,こちらでテストさせて貰うことにしました。作成手法については人造棋士18号の使い方などを参照してください。(私はあんまり理解していない。)

sdt5でのたぬき,かっぱ,えるも,aperypaq,wakameなど公開評価関数との対局相性を確認しながら棋人ブゥの改良に努め結局通し番号で14番まで作成して頂きました。

結果として12番13番のダブルエースで行くことに決まりましたが,選手権で使ったのは13番のみです。12番は対かっぱ(qhapaq_sdt5, aperypaq)専用であったが対戦前に設定を忘れてました。実際の対戦がアレなので事後検証してみたいと思ってます。

この間,多数の評価関数の評価と並行して定跡延長を行う術を思いつきましたので,この間の評価関数は定跡抜け局面限定の定跡間対局となります。また,定跡の生成も途中から7番,9番,12番,13番と使用評価関数の異なる混ぜ物となりました。(いいのか悪いのか知りませんが現実解としての妥協です。)

 

そうこうしているうちに定跡が延長され,悪手が減って,強い評価関数が選別されました。

最終段階では某サイトでトップスコアのwakame相手に7割弱程度の勝率を誇る程度まで仕上がります。ここで,13番がqhapaqとaperypaqだけに相性が悪いことも確認されており,この際12番を控えのエースとすると予定しました。(事後確認ですがaperypaq相手だと7番とか9番が優位だったのは忘れてました。)

 

計算リソースの話

事後で考えればAWSのリソースを早めに導入し金にモノを言わせるのが正解だったでしょう。貧乏性が足をひっぱったのもあると思います。しかしながら,個人的には一応コンセプトとして電王トーナメントの賞金の範囲でやろうと決めていたので仕方ありません。

新規に購入したのは昨年職場に入れたi9デスクトップと自宅用のryzenノート(ASUSの8コア)です。前者はちょっとした空き時間に応答のいい検討ができるので非常に便利でした。後者は評価関数を松下さんに頼ることを決定したときに選手権まで預けることにしましたので購入僅か2週間足らずで手を離れることになりました。

実際の対戦ではryzenで行う予定にしていたのですがAWSSSHの設定などの手間を考えてテストしていたモバイル機で行くことにしました。これは選手権現場での決断です。余ったryzenノートは現地でクジラちゃんの養分となったことは現場にいた人たちは目撃したと思います。(断っておきますが,対戦マシン以外の会場回線への接続は禁止されておりますので自前スマホによるテザリングでのクジラクライアント参戦です)8コア3.2GHzですのでそこそこ戦力になったと思っています。

 

ソフトウェア公開の話

うちのソフトと対戦したいとの要望があるようなのですが,既に24で松下さんが流す準備をしています。(もう流れているのかも)うちでfloodgateも流したいと思いますが連戦となるとちょっとマシンの準備をさせて下さい。他の案件との兼ね合いで高速なマシンは用意できないかもしれません。もちろん,スポンサーがいればAWSでfloodgateに繋ぎます。遠慮なく申し出下さい。

また,個人的には対人戦は好まないのですが,大学のイベントの余興として広報から依頼されましたのでshotgunを展示予定にしていました。5月29日以下のイベントです。勝ち負けとか気にしない軽い感じでお願いします。

OPUフォーラム2018

AWSクラスタではありませんが,Hefeweizenの劣化バージョンも準備しようと思っています。たぶん定跡と評価関数くらいしか変わりません。対戦御希望でしたら是非御来場お待ちしております。

将棋所などが導入されたPC持ち込みでしたらLANケーブル直結で対戦できるかもしれません。

 

最後に,実行ファイル等の配布は行わないと明言しておきます。今回多くの方と交流させて頂いてファイル公開を希望している人の多くが局面検討を目的としているようですので,我々のような対戦特化型のエンジンは不要と思います。序盤定跡におきましても上記のような作成方法のもので万が一プロや奨励会の方が真に受けて影響を受けられても私が困惑してしまいます。floodgateにDDoS入れるのも好ましくありません。また,松下さんも評価関数作成のノウハウは公開するがファイルそのものの公開は行わないポリシーのようですので御了承下さい。

ーーー

一部ネットで批判されている公私混同の件については一言申しておきます。

まず,電王トーナメントは完全にプライベート参加でした。その後,大学の広報等が私のプライベート活動を利用した形になります。現時点では大学運営側から支援も頂くことを確認しておりますし,詳しいことは出せませんが学生の希望する研究テーマとしてスタートしております故完全に職務の範囲となっております。研究成果は公的な発表を行うことになると思いますので御期待下さい。

知る人ぞ知る話ですが,学生時代に創設したF-tecと言う人力飛行機チームを彷彿とするエピソードになります。おっさんの武勇伝に興味ある人は酒の席にでも聞いて下さい。

技巧型の評価関数

github.com

 

前回,ちょっとだけ強くなったのが出来たってやつを公開しとく。

選手権本戦で使うかどうかは未定。

割とモダンな差し回しをするのが分かると思う。学習データの差かな。

 

探索部は未検証過ぎるので保留。

選手権後に考えることにする。