Skip to content

Instantly share code, notes, and snippets.

@ohga ohga/wcsc28_memo.md
Last active May 5, 2018

Embed
What would you like to do?

WCSC28感想文

はじめに

余韻のあるウチに残しておきますが、記憶が破綻してたらご容赦を。今回、大合神クジラちゃん2 の開発に関わったので、その視点で。

最初に感謝と謝罪を、  
応援してくださった方、クラスタに参加してくださった方、ありがとうございました。
前評判を見事ひっくり返し、立てたフラグを回収して、前年より悪い結果になりました、、期待してくださった方、ごめんなさい。 開発者として名を連ねているのでその責は私にもあります。さらにえびちゃんには配信の方にも注力してもらってたので、風当たりをモロに受けさせてしまいました。 原因はこれから考えるとして結果だけ見ると、ちょっと分業しすぎました、ってことだった気がします、もうちょっとやりかたがあったかなぁ、と。      

お詫びでは無いですし、もう公開されてますけど、私からの成果物は、検索部最終的な評価関数(qzilla9) です。
放送を含め、楽しんで頂けるなら報われます。

あと、elmo,Noviceのトラブルの遠因は私にもあります。 ツイッターに上ってた画像にあったコード、違うプロジェクトにインポートされてたみたいですが、おそらく一年くらい前に書いたものです。本当にごめんなさい。 自分でまったく使わなくなったので放置してましたが、まさか、こんな時限爆弾が。。 あと、UsiUtilを改造したのでそこにもバグがあるかなと思ってツイートしてたのですが、たぶん、Console.ReadLine()の文字数制限が原因じゃない気もする(これって一行の長さの話ですよね?)ので、私の先のツイートはいいがかりです、ごめんなさい。streambufferとの滝澤さんのツイートもあり、落ち着いたらメンテします。(って、もうだれも使わないなら閉じるかな。。と言う気もしてます)  
 

以下、その償いじゃないですが、やったことです。
結果が結果なので、参考にならんかもですし、無闇に長いので、興味があればどうぞ。  

まず、きっかけは以下。

えびふらい氏の支援をすることになりました
動機は、彼は私の事を読み太の中の人だと思っていたようで、そんな感じで勧誘を受けたのですが、人違いである旨を説明した後の微妙な空気に耐えられなくなった為です、よろしくおねがいします(?) - 22:45 - 2018年1月31日

読み返してみると自虐というか天邪鬼というか。

きっかけのきっかけはWCSC27。 連休に行く予定だったツーリングがまるまるキャンセルになって、ぼーっとえびちゃんの放送を見て、まぁ、ツーリングで使う予定だった金だし、いっか、とクラスタに参加したのがそもそもでした。 けど、実際に使う予定だった全額までは投入してないです。なので残念ながら石油王じゃないです、普通の小市民でごめんなさい。ちょっとAWSとかLinuxを使えるリスナーの1人としての参加なんじゃなかろうか。今年は秒課金になって、細かく上げ下げしてたので、だいぶ懐に優しい感じです。ブラウザじゃなくて aws cli で試合開始前と終了後に一回づつ叩くだけで世界中のリージョンで同時に操作できるので楽でした。最近は、スポットインスタンスも aws ec2 run-instances で上げられるので良いです。(GCP も使い勝手がよさそうなのがあるみたいですね)

で、参加するものの、どーすっか、と考えてみて、先のツイートの通り、私はそこそこ天邪鬼です。 最近は人間の棋譜を使わないのが流行っているし、すごくすごいと思うので、その反対っぽいのをやってみたくなりました。 私は棋力5なのですが、幸運な事にまふさんの協力を得られるので、彼の意見で方向性を決めて調整することにしました。私はノープランですし。独自性とか無いです。単独での参加はできんでしょうね。

評価関数

ベースはまふさんに作ってもらいました。mafu110よりは強いものだったと思います。棋風は昭和だとのこと。私から見ても見慣れたコンピュータ将棋とは色が違う面白いものでした。 評価関数の学習は野生の読み太の時にかなりの挫折を味わってるのと、天邪鬼な気持ちがあり、キメラで強くしてやろうかと。

大会ルールでライブラリ申請してない評価関数をベースに使うと面倒なことになるかもなので(えびちゃん的にはそれも面白そうですが。。)、手元にある自由に使えるすくないカードで評価関数を単純合成し対戦させて棋譜を共有したところ、まふさんに意見を貰いました。曰く「角の使いかたに特徴がある」とのこと。それ以外にも棋力5の私にも解る例えで、コンピュータ将棋の特徴的な駒使いについて講義してもらいました。

この話を合成に反映させたかったので、test evalmergeを拡張して駒による合成コマンドを作成。(一応、push しましたが、実はオリジナルは一回無くしてしまって、たぶん動くと思いますが、確認してなく、windowsのバイナリも作ってません。。)
良いと言われた駒で合成したら、まんまと成功。ちょうど手持ちの自由に使える評価関数も少なかったので、試しまくりました。 それぞれから歩の評価を抜き出して、対戦、強かった方でベースを作って、それぞれから香を合成、対戦計測、桂を合成、対戦計測、、合成比率も試して、、地獄です。手持ちの評価関数の駒の価値の適切なもので編み上げるのが初期のqzillaシリーズです。 ここらの計測棋譜は多過ぎて捨てました。(というか、飛してしまった。。)

その後、学習にも手を出し、思うような結果にはならなかったのですが、まふさんに振り飛車も指す、みたいな意見も聞けたので、振り飛車強制で絞ったり、わざと浅い評価値で教師を作成させて学習、マイナスで合成したりして、最終的に qzilla7, qzilla8 の二本できました。

20180224, 20180310, 20180325

手元の計測では aperypaq, apery_sdt5 と同程度にはなったはずで、そっから上は適当な対戦相手がなく、まいっか、と、一段落。 qzilla7, qzilla8 に計測上の差はほとんど無く、定跡と合わせないとダメなので、まふさんの好みで決めてもらい、qzilla8 は欠番となりました。

なのですが、どうも、えびちゃんの放送では負けてる将棋が多く、だいぶダメな感じの印象になってました。弱い弱いと騒ぐコメントを見ながら「一桁の対戦でなに言ってるんだ、こいつら、、」と思いましたが、まぁ、私もリスナーなので、そっちにいたら同じことを言ってたに違いありません。そのうち、えびちゃんまでも裏切り出して弱いとか言い出す始末。世論には勝てません。。いや、おもしろいです。

世論には逆らえないので、急遽、学習を走らせることにしました。ただかなり強引なキメラなので、depth10の30億程度ではダメで(だからマイナスキメラなどで調整してた)、どうせなら、仕上りつつある定跡で調整して(まふさんに学習用定跡を用意してもらいました)、SF9をマージした検索部を使用して教師を用意。depth8を100億。だいぶやけっぱちになってたので三日弱で作成。負のエネルギーというのはえらいもんです。

この頃は実践を意識して定跡ありの測定もしてたので、最悪、強くなくても定跡を指しこなす物になってりゃいっか、というノリで学習させたのが qzilla9 です。 定跡なしではあまり真面目に測ってないですがqzilla7より+R40はあったと思います。(最終的にqzilla9dにナンバリング)

20180421, 20180421_2, 20180422, 20180422_2

qhapaqさんの技術書典4の時には出来てたのですが、大会というお祭ですし、教師データも含めて共有してたので、最後のお願いで絞ったら強くなるかもですし、公開タイミングはえびちゃんにお任せしました。(で、これ以上は有意差が出るものにはなりせんでした)

検索部

話は2月にもどります。 検索部は、やねうら王魔女で迷ってました。理由は、WCSC27はukamuseベースだったので魔女も捨てがたかったのです。 また、手元の計測では、評価関数と検索部には相性があったので、今回の評価関数との相性を見てみたかったのも理由の一つです。 ただ、さっさと決めないと、クラスタサーバ側の開発も滞るので、評価関数のベースをまふさんに用意してもらったらすぐに計測しました。 圧倒的にやねうら王でした。魔女に軍配が上ったら、真面目にSF9に書き換える予定でしたが、無しににりました。

20180210

そっからはgithubで公開してるママですが、ウラではcommitはしてないですが、SF9でマージされた箇所を引っ張り込んで計測、やねうら王で #if 0されている箇所を生かして計測、パラメータを調整して計測、さらに調整して計測、、また地獄です。どんな悪い事したら落される地獄なんです?。。で、結局、パラメータを SF9 に全戻ししてほぼ互角に。そっから調整して、なんとか 2σ でたので、commit をまとめてPR納品、という流れでした。 ただ、最初にある通り、評価関数との相性があると思うので、まぁ、メインは定跡とクラスタだし、リスナー(参加者)に喜んでもらえればいっか、と公開しました、魔女もそんなんだったし。

20180407

と油断しまくったら、大会4日前にやねうら王が 4.81, 4.82 に。 うわー、マジかー、デスマかー、最後の試練かー、つれー、と計測。

20180429, 20180430, 20180501

qzilla9 には有効では無い模様。 追試で対wakame1stは長めで測定。R差は縮まってたのでコードで調査したけどわからん。qzilla9は私のSF9パッチ版で作成した教師で学習させたので相性がよかったのかな。。 とりあえず、見なかったことにして、逆に少しcherry-pickしておしまい。。と思ったら。初日の放送中に本人みずから更新したとのコメントが。。おい。

20180503

だ、大丈夫だったのでスルー。。 大会中に本家の更新が来ても、参加者に配布する手間があるので手当てしきれんのでもう放置です。

クラスタ部

ここへの私の参入は、4月にはいってからでした。 まぁ、担当はえびちゃんですし、本格始動もここらです。

実験用にEvalShareの実装をお願いされたのですが、私の能力不足でclangではダメでした。boostとwin32とコンパイラオプション(-fno-rtti)とかが入り組んでギブアップ、えびちゃんにVSでビルドしてもらいました。 Linux版の方は、いにしえのmmapで実装しましたが、この機能を使ったのは私だけでしょう。

あとは、クラスタサーバに繋ぎまくりました。最大1940クライアントとか繋いで通信飽和させて邪魔してやりました。 というのも、接続数が増えると切れ負けが発生してて、そこと格闘してたらしいのですが、いろいろ体力測定やって、プログラムやパラメータを調整して、結局、良いインスタンスを借りたら解決したという結論だった気がします。が、それだとえびちゃんの努力がうっすいものになってしまうのは内緒です。(ウソです、私も横で右往左往してました) 安定稼動を始めてからは、よそから見ても強くなっていました。私はRAMディスクの掃除スクリプトを書いたり、lsof してIOを見たり、くらいです。

コードを共有してもらったので読書しましたが、彼の努力と意外と真面目な部分に関心しただけで、手は出していません、というか出せませんでした。 自分の世界を構築して、そこに閉じ籠れるプログラマは優秀だと思ってて、自分の世界に手が入るのは、あんまりやられたくないと思うので、最後まで見るだけしかできませんでした。 優秀ですよ、彼。使い所を間違わなければお買い得だと思います。 あー、あと、こういった長文は読まないので、伝えたい場合は3行にまとめる必要があります。

定跡部

正直、ここはまふさんに頼りっぱなしです。 定跡データを共有してもらったら、72スレとか64スレの、10秒とか20秒で最強クラスの評価関数と対戦させて弱点を見付けた棋譜を生成して共有、フィードバックを貰ってまた棋譜を生成。これを3,4回やりました。

たぶん、まふさんが一番くじらちゃんの将棋を見たはずで、少なくても大会時の彼女の気持ちを一番理解できる人だったと思います。 評価関数の差し替えは何回もありましたが、それでも、変っていく過程を棋譜で見てたのですから、裏方やってて棋譜の行間が読めない私には羨しくもありました。 ほんとうにいろいろお世話になりました。

本番

第28回世界コンピュータ将棋選手権の題名でここらへんにあるので、どうぞ。

さいごに

特に最終戦の定跡部は不遇でしたが、検索部、評価関数、定跡、クラスタサーバ、全部あわせて、今回のくじらじゃんで、そこで測定して調整しています。 ばらばらの評価はあると思いますが、まぁ、あんまし本意じゃないかもしれません。

AIとかDLとかに限らず、ここらの技術的な進歩は、そんな感じで進んできているので、あたりまえっちゃあたりまえなのですが。 「名人に勝ちました、人間の棋譜は使わないです、プロの棋譜も使わないです、効率が悪いので」みたいなのは当然の流れですし、すごくすごいです。 けど、きっと彼女の気持ちが少しでもわかった方が、楽しいですし、結果を残せなくて悔しいのですが、納得できます。そうやって進む方が好きな私は、やっぱ天邪鬼なのでしょう、好きなのは勝手ですよね。 好きな理由とか納得の理由は人それぞれです、諸々、そこらを楽しめれば良いですかね。

というわけで、いろいろ、ありがとうございました。
ぼちぼちリスナーに戻ります。機会があれば、また。(えびちゃんにやる気があるかどうかはわかりませんが、千日手のクライアントはなんとかできるとしても、クラスタサーバで入玉形の調整はめんどうだしやらないだろうなぁ、、)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.
You signed in with another tab or window. Reload to refresh your session. You signed out in another tab or window. Reload to refresh your session.