待つ

待つのも待たせるのも苦手である。

待ち合わせは書店やコンビニ等の待ち時間が潰せるところにしている。

 

www.shogi.or.jp

人間の手番待ちの姿勢は重要だなぁと学びがある。

 

つい先日,近頃の学生って自分が質問に来たのに,こちらが資料探している間スマホのゲームをするんですよって偉い先生が言ってた。特に罪悪感や悪意はないらしい。

もしかしたら私より忍耐力がないのかもしれない。私は飲食店での待ち時間が嫌いだ。

 

携帯電話がなかった頃,待ち合わせの時間ロスは膨大だったと思う。帯ドラマのエンディングが留守電やポケベルの音が定番だった時代もあったよね。思えば何して待ってたんだろう。

 

文庫本を読んで時間が潰せるようになったのは海外出張が増えてからだし,仕事を選り好みして少々資金が減った今は将棋の棋譜で時間が潰せるようになった。順位戦レベルの棋譜だと一局2,3時間はいける。

 

そう言えば非同期の仕組みが普及してサーバの利用効率も劇的に伸びているらしい。数十万人ユーザのサービスを数台で捌くとかそういう話も聞く。awaitである。

python code for yaselmo

少しくらいpython書くの上達した証拠を見せてみよう。(承認欲求)

elmoと野生の読み太(7月3日版)から通称yaselmoを作成するスクリプトである。

短くすっきり書けるようになったでしょ。

where句はC++との整数演算の差を埋めてみる試みで,これでも配布物とちょっとズレてるみたい。

どうしたんだろう?

 

import numpy as np
import os

def kpp_load(evaldir):
kk = np.fromfile(os.path.join(evaldir, 'KK_synthesized.bin'), dtype='int32').reshape(81, 81, 2)
kkp = np.fromfile(os.path.join(evaldir, 'KKP_synthesized.bin'), dtype='int32').reshape(81, 81, 1548, 2)
kpp = np.fromfile(os.path.join(evaldir, 'KPP_synthesized.bin'), dtype='int16').reshape(81, 1548, 1548, 2)
return kk, kkp, kpp

def kpp_save(evaldir, kk, kkp, kpp):
kk.tofile(os.path.join(evaldir, 'KK_synthesized.bin'))
kkp.tofile(os.path.join(evaldir, 'KKP_synthesized.bin'))
kpp.tofile(os.path.join(evaldir, 'KPP_synthesized.bin'))
return

kk1, kkp1, kpp1 = kpp_load('elmo')
kk2, kkp2, kpp2 = kpp_load('yy0703')

kk3 = np.where(kk1 + kk2 > 0, (kk1 + kk2)//2, (kk1 + kk2 + 1)//2)
kkp3 = np.where(kkp1 + kkp2 > 0, (kkp1 + kkp2)//2, (kkp1 + kkp2 + 1)//2)
kpp3 = np.where(kpp1 + kpp2 > 0, (kpp1 + kpp2)//2, (kpp1 + kpp2 + 1)//2)

kpp_save('yaselmo', kk3, kkp3, kpp3)

ショットガンフォーメーション

shotgunの命名についてPR文を読まれてないんだなぁと思う。

まぁ,ビールでも飲みながら書いた気もするのでホント適当なのは事実だが

あれはアメリカンフットボールのショットガンフォーメーションが由来なのです。

興味ある人は大変面白い競技なので動画でも探して見てください。少しでも分かる人に解説してもらうとなお楽しいものになると思います。

で,ショットガンフォーメーションってのが要となるQBのポジションから,複数の先行したWRのひとりにパスを送ることで成立します。優秀なQBが居れば戦力の総和が負けていても拮抗した試合ができることとパスが通りさえすれば圧倒的な勝利が得られることから本件の命名に至るわけです。

で,QBは当初ディープラーニングでしたが後に技巧に代わり,WRはやねうら王とそういうことです。

(140文字を超えたのでtwitterから転記)

第5回電王トーナメント感想戦

第5回電王トーナメント
感想戦

 

初戦,Novice
相手の不具合なのでパス

二戦,メカ女子
メカ女子なのでパス

三戦,なのは
後手番だがこちらは52手まで定跡テーブル
抜けた段階で若干有利な局面と評価されている
特別大きな悪手は見られないが長手数をじりじりと差をつけての勝利
評価関数カーブを見るにわずかだがこちらの方が探索深さが勝ったのかもしれない

四戦,Ponanza
27手まで定跡の矢倉戦
80手付近まで評価関数均衡,持ち時間優位の作戦通りだが
盤面は相手の馬が玉の近くにあり,人間視点で怖い。
コンピュータ将棋的には馬を消しに行った手が敗着に近いのかもしれないが
探索の浅さが目立って評価値急落
実力差ということかな

五戦,やねうら王
51手まで定跡の横歩取り青野流
ツボにドはまりしたのに171手までの長期戦
定跡にはまらなければ負けてるだろう

六戦,Yorkie
こちら後手の青野流
余裕があれば避ける定跡を作ろうと思っていたところ
定跡抜けたところで分が悪い上に
どうやら探索速度も完敗の様子
開発者コメントを話している間に切れ負けていた
この辺は新参っぽい感じでやね師匠に遅延大き目にしとかんと危ないよとのアドバイスを頂く

七戦,わっふる
ここは振り飛車なのは分かってた
後手番8手で定跡を抜ける
うちの定跡はfloodgate依存の部分が多分あるので振り飛車対策は弱い
異例だが評価関数の中で対振り飛車勝率の高いものをここだけ投入
序盤策で築いた若干の時間的優位も中盤のねじり合いで失う
251手の長手数で負け。途中引き分けを祈った。

八戦,TMOQ
先手63手まで青野流横歩定跡
相手も定跡に乗っていたようであっという間の中盤戦
そのまま一気に押し切る


五勝三敗で予選通過
ギリギリ決勝に残したが強豪感負けてるし,注目株ではないつもり


決勝R1,Selene
振り駒で先手をとったが手順前後で横歩に行かず矢倉模様
定跡を9手で抜ける
60手近くまで大きな差がない評価だが消費時間に30分差をつける
相手の時間が無くなるのに対し徐々に押していく
139手にて勝利,結局の消費時間が14分24秒

決勝R2,Yorkie
振り駒で先手を取り55手まで横歩青野流定跡。
ほぼ勝ちを確信するレベルなんだが,ここからねじり合い。
一時は+400の評価値も均衡に
敢えて言うなら93手目88歩を27龍とすべきだったか。

ここの解説は西尾先生がコメントしてた。

 

準決勝,読み太
まふ定跡との対決ですねと事前に挨拶してたのだが
何かを感じたのか定跡を外して対戦されたようだ
自分で精査してないので大一番を任せられないとのこと
確かにうちとの戦いで定跡だけで差がつく勝負になるのを嫌がるのは分かる
対戦棋譜は見ていてためになるレベル
ゆるゆると差をつけて勝てた

 

決勝,ぽんぽこ
なぜか決勝まで来てしまったのでしかたない
3戦並行で後手2つなので終わってる感がある

先手横歩とった棋譜だけ精査する
やはり定跡抜けの61手目の52角成が強引すぎたようだ
16角ならそれほど過激でない
それと75手目の53成桂のところを68金打とするのでもまだよかったはず

これを解説の西尾先生は一目でコメントしてたので
プロの感覚って恐ろしいなぁと感じた

 

モータースポーツの話

高校の頃,F1ブームってのが来てた。

ブラジルの英雄アイルトン・セナがホンダエンジンを駆って最速を誇ってた。

もうひとつは日本人初のフル参戦ドライバー,中嶋悟の存在だ。

 

彼のエピソードには雨の峠道をドラム缶積んだトラックで攻める練習だとかF1ドライバーにカップ焼きそばを流行させたなど多くのものがあるが,私が一番好きなのは

彼が学生時代に同級生と自転車レースをして負けた翌日にバイクに乗ってきたという話である。

あー,負けず嫌いも相当あるんだがモータースポーツ向けなんだなぁと思わせるエピソードである。

 

彼を知ったのはF1以降なので,それまでどういう苦労をされたのか知らないが最年長F1デビューを支えたのは好景気の日本企業であることは言うまでもない。つまり,彼が日本人でなければ苦労無く早々にデビューしたかもしれないし,時代背景が無ければデビューの機会がなかったかもしれない。そういうことだ。

 

速いマシンに乗るためなら何でもする。本当に何でもした。彼を支えたセイコーエプソンのテレビCM用に歌も歌った。

この「悲しき水中翼船」が私がはじめて買ったCDである。(その前はテープだし)

 

レーシングドライバーは速く走るだけが仕事じゃないんだ。スポンサーを集めるのはレーシングドライバーの能力だよ。F1で走るには桁違いの金がいるんだがそれを用意した。

黄色いロータスホンダのペア(セナ・中嶋)は中嶋が稼いだ金でセナがポイントを取るシステムだとまで言われた。

翌年移籍したセナがワールドチャンピオンになったのだから見事な踏み台になったわけである。

 

まぁ,そういうのを見てた。大学生になってもサークルの先輩が草加ゼミだと言う口実だけでゼミ合宿まで参加してた。若い奥様も参加されるスキー合宿でマイクロバスをドリフトされるところはさすがラリードライバー。

泥酔してた草加先生が「僕わ見合いなんだよぉ・・君も見合いしないか」と御提案頂いたのを覚えている。お受けしてたら資産家の婿養子だったんだろうかw

F1用のアクティブサスペンションの共同研究期間が終わったという理由で配属希望を外したが,貴重な体験をさせて頂いた。

 

いあ,話がそれた。

今回のアレは個人的にモータースポーツだと思ってる。走り出したらメカニックの仕事はない。走る前にすべての準備をするのが仕事の大半だ。

入手可能な「速いエンジン」があれば多少無茶をしても載せる。新参プライベーターに仁義はない。ワークス勢は他社エンジンは使えないだろうがね。

何か他チームに差をつける可能性のあるものは試してみる。失敗が9割を超えるのは当然だ。徒労とか気にしない。

細かい空力パーツひとつの改造でも手を抜かず慎重に行う。全てのバランスをレース前まで煮詰める。信頼性の検証は航空宇宙分野並みだ。

不安要素を抱えたままだと胃がキリキリする。

(未だ少々興奮気味で寝れないおっさん)

 

手の内を晒す

スクリプトでの定跡自動拡張は比較的属人性が低いんだけど

うちは手動で精査してる

(それでコンピュータ将棋かと言われるとしらんがなとしか返せない)

一晩で同じ筋に3回はまると定跡ファイル手動更新したくなるでしょうが!!

 

一部見るに堪えそうな手動ログを残す。

 

wdoor+floodgate-300-10F+sg_test07+Yane32bit-KppKkpt_PentiumM_Mem1G+20171012103003
l2gk2nl/1r4g2/2n1ppspp/p1pps1p2/1p7/P1PP1P1P1/1PS1PSP1P/2G1G2R1/LNK4NL b Bb
56銀より36歩の方がいいかな

l5rnl/2gkgs3/2nspp1+b1/p1pp3p1/1p2PP2P/P1PP1RPP1/1PSS2NB1/1KGG5/LN6L b Pp 63
38角

wdoor+floodgate-300-10F+sg_test06+yaselmo-chida-4c+20171002203002
ln5nl/1r1s2gk1/p2p1gsp1/1ppbppp1p/P6P1/2PPP1P1P/1PS2PN2/2G1GS1R1/LNBK4L b - 35
67金より46角がベター?

wdoor+floodgate-300-10F+sg_test06+Jscf3720+20171001193001
ln5nl/1rs1gkg2/p1p1pp2p/1P1p1spp1/1N3N3/2PB+B1P2/P2PPP2P/1SGK2S2/L4G2L b r2p 51
46歩か35歩か44角

wdoor+floodgate-300-10F+ECLIPSE+sg_test07+20171012040003
lr5nl/2sg1kg2/p1n1p1sp1/2pS1pp1p/1p1p3P1/P1P2BP1P/1PSPPP3/2GKG2R1/LN5NL w b 36
54歩より31玉の方がよかった?

wdoor+floodgate-300-10F+ECLIPSE+sg_test07+20171012033002
ln1gk1snl/2s3gb1/p2ppppp1/2p5p/9/P5r2/1GPPPP2P/1B1K2SR1/LNS2G1NL w 2P2p 24
73桂ではなく35飛

wdoor+floodgate-300-10F+daigorilla+sg_test06+20171002213001
lns4nl/1pg1k1g2/p1pppps1p/1R7/9/2r6/P1NPPPP1P/2GSK1G2/L5SNL w B3Pb2p 28
44銀じゃなく74飛とぶつける

sfen lnsgk1snl/1r4gb1/p1ppppppp/1p7/9/2P4P1/PP1PPPP1P/1BS4R1/LN1GKGSNL w - 6
ここで74歩はないな

RasPi3_1 vs. sg_test06 (2017-10-16 08:00)
ln1gk1snl/1rs3gb1/p1ppppppp/9/7P1/P1P6/1P1PPPP1P/1BG2S1R1/LNS1KG1NL w p 16
34歩でいいのでは?

yaselmo_testeval_2c vs. sg_test06 (2017-10-18 21:30)
わからん

sg_test06 vs. Curry (2017-10-20 10:00)
lnsgk1snl/1p7/p1ppppg1p/1R7/9/2r6/P2PPPP1P/2GK5/LNS2GSNL b B3Pb2p 23
77桂じゃなく,58玉か28歩

sg_test06 vs. Curry (2017-10-20 09:30)
ln1g3nl/2s1k1g2/2ppppbsp/pr7/9/2P4R1/PP1PPPP1P/1BG1KSG2/LNS4NL b 2P2p 29
77角じゃなく,36歩とか

sg_test06 vs. DirectMotemitsu (2017-10-20 14:00)
lnsgkg1nl/7r1/pp1pppspp/2p3p2/9/2P4P1/PP1PPPP1P/1S1K2SR1/LN1G1G1NL b Bb 15
75歩じゃなく,

yaselmo_testeval_2c vs. sg_test06 (2017-10-22 00:00)
lnsg3nl/1r3kgs1/p1ppppb1p/1P4R2/9/2P3P2/P2PPPN1P/1BGK5/LNS2GS1L w 2P2p 24
23金じゃなく23銀かな

daigorilla_win7_32bit_1c vs. sg_test06 (2017-10-22 03:00)
l6nl/1rg2kg2/p1nsppspp/2pp2p2/1p5P1/P1PP1SP2/1PS1PP2P/2GKG2R1/LN5NL w Bb 30
難しいが,この辺りかな?

FL vs. sg_test06 (2017-10-22 05:00)
lnsgk1snl/6gb1/p1pppp2p/2r3p2/9/9/P1BPPPP1P/1SG4R1/LN2KGSNL w 2P3p 20
23歩じゃないな

i5-4590 vs. sg_test06 (2017-10-22 10:00)
典型的早指しミスw

sg_test06 vs. WRC (2017-10-22 16:30)
lnsg3+Pl/4ks3/ppppppn+Pp/9/9/2r3P2/P1NPPP2P/2GSK4/L4GS+b1 b BGLrn3p 41
48銀じゃなく66香(depth24だと足りない,要確認)

sg_test06 vs. WRC (2017-10-22 18:30)
lnsg3+Pl/1p2ks3/p1ppppngp/1R7/4b4/2r3P2/P1NPPP2P/2G1K4/L1S2GSNL b BP3p 33
68銀じゃなく66歩

sg_test06 vs. tamore_i7-7700K (2017-10-23 00:00)
lnsg3+Pl/1p2ks3/p1ppppngp/1R7/4b4/2r3P2/P1NPPP2P/2G1K4/L1S2GSNL b BP3p 33
68銀じゃなく66歩

yabaino01 vs. sg_test06 (2017-10-23 04:30)
lnsg3nl/1r3kgs1/p1ppppb1p/6R2/9/2P3P2/P2PPPN1P/1BGK2S2/LNS2G2L w 3P2p 24
勇気流の後手番もってどうかという話。とりあえず,88角成は稚拙(要確認)

sg_test06 vs. tamore_i7-7700K (2017-10-23 15:30)
lnsg3+Pl/1p2ks3/p1ppppngp/1R7/4b4/2r3P2/P1NPPP2P/2G1K4/L1S2GSNL b BP3p 33
68銀じゃなく66歩(一晩で3回目かよww)(要確認)

sg_test06 vs. Incinerator (2017-10-24 15:00)
lnsg3+Pl/1p1k5/p1ppp1s1p/5p3/9/6P2/P2PPP2P/1S2K4/L1G2GSNL b RBNrbgn4p 51
43角じゃなく,11と。
千田定跡の3択で3番目だが,これは一択だろう。(似たような局面がある可能性大)

sg_test06 vs. AENEMY (2017-10-24 16:00)
相掛かりの歩交換の是非を問う

Raina_i3-2c vs. sg_test06 (2017-10-25 00:00)
ln1gk1snl/1rs3gb1/p1ppppppp/9/1p5P1/9/PPPPPPP1P/1BGK2SR1/LNS2G1NL w - 10
千田定跡4番目の手(削除)

  

まぁ,最初に準備したのが公開されている定跡類をマージしただけなので,荒く自動で削った後実践投入した。floodgateで戦って,私とPCで感想戦やってた。

自分自身の棋力は前述のblogにも書いた通りなんだけど何か月もやってると何か一目で見えてくる気がしてね。(私が学習してるw)

 

連盟の次の一手のやつ応募してみました。92円切手同封するやつね。

羽生先生が竜王位取られたら免状申請してみようかと思ってる。

(未来の通販有段者)

shotgunのponderの話

出張先のホテルで寝付けなくて困ってる。

軽口叩く割にストレス性胃痛が持ち味だ。

せっかくの地酒が用意された懇親会でもほとんど呑めてない。

 

そこそこ反響のあるponderについて手の内を盛大に明かしておこうと思う。

ソースを提出しない分のお詫びも含めてね。

私がやったチューニングよりよいものが出来ると楽しい。

結論から言うと技巧2のmultiPVで挙げた候補+前探索のponderを加えたものの中から最善手からある許容範囲の手を選び上限5手を並べる。(王手局面とか2手とかになる)

そうしておいてて5つのやねうら王に各3,2,1,1,1スレッドの負荷で先行分岐探索を行っている。(二手なら4,4だったかな)

ざっくり書くとこれがshotgunの先行分岐探索(multi ponder)

ちょっと分かれば実装できそうでしょ?

 

効果のほどはニコ生の通り(私はまだ見てないが)

当初は持ち時間を使わないことがかっこいいと思ってて,PR文の中にこれを「ダニーシステム」と命名するとか書いて消した。優柔不断な主人公が云々の辺りが残骸ねww

実は本当に効いたのは相手のponderの役割を奪うことだったようだ。

これは本戦参加ではじめて感じた。かっぱさんが熱く語ってた件のひとつがこれで,かっぱさんもそういう思想の時間制御を入れているらしい。うちはもっとえげつない極振りですがw。序盤は3/8の探索力で戦うくらいのノリ。

 

で,本当はここに至る経緯が重要。(学者っぽいね)

当初ディープラーニングで候補手をリスト化してた。詳しくは山岡さんのblogを見てください。ここも本当に参考になります。ソースも出されているのですが,私は当初機械学習を習熟するのが目的だったので手順だけ参考にpythonで実装する。

分岐した先の探索がやねうら王なのは何より速いからだ。

それから・・・評価関数が複数プロセス間でメモリ共有できるので5プロセスでも評価関数部分のメモリは1個分で足りる。(これ本来自己対戦用の機能です)

もうひとつはやねうら王,option機能がゲーム中に可能です。具体的にはstopコマンドの後に「setoption name Threads value 4」とか送るとそのプロセスのやねうら王が次のgoコマンドから4スレッド使うようになります。

 

次に確認したのはponderのヒット率。打率が低いと意味がないので。

で,比較対象は技巧2クラスタで行われている浅い探索のmultiPVという発想。

技巧2は時間で切ってたがうちはどうしてもマシン内クラスタなのでもっと軽くする意味でdepth6,8,10と3種類テストしてみた。同様にやねうら王エンジン&複数の評価関数のdepth6,8,10もやってみた。

floodgateで対戦しながら・・・とか最初思ってたが,これ過去棋譜でいいんじゃないかなって過去棋譜を半年分くらい落として全局面のponderヒット率を計測した。

コーディング2日計算3日くらいの作業。結論から言って技巧2が偉い。深さはそんなに差がつかないのでdepth6でいいやとしておいた。ここでディープラーニングが消えた。

#じつはこのころ技巧人気のためにたまたまfloodgateに技巧が多かったのかもしれない。

 

ってことで,候補手を並べるのが技巧になった。pythonで作り始めたのでまぁ,やねうら王もsubprocessで呼び出してるんだから技巧もそれでいいかって落ち着いた。都合6プロセスがメインのスクリプトから呼ばれることになる。

最後はpython独自のGILの問題でうまくリソースが使えなくてイラついたが,まぁカリカリにチューニングして優勝を狙うわけでもなく極端な時間制御を実演して他の開発者にウケたらいいかくらいで思ってた。

 

python使った恩恵もあって,pythonにはデフォルトで辞書型というデータ構造を持ってて,これが定跡管理にちょうど使えた。オブジェクト指向言語なのでメモリは無駄に使ってる感じがあったけどなんとか許容範囲だった。

やねうら王型の定跡を複数管理して串刺し検索するのは簡単に実装できた。

 

「二種類の定跡を交互に参照して定跡抜ける局面を全探索する」って開発者なら何してるかわかりますよね。pythonpython-shogiで簡単に書けます。便利ツールです。

棋譜の手を順に進めて評価値が一定値以上下がる局面をリスト化する」とかも簡単です。自動感想戦できそうでしょ。

 

以上がshotgunの基本実装。ネタバレしたら一日で実装できる人もいるよね。

今からはpythonじゃなくgoとかrustでやった方がいいよw

ーーー

追記:

バージョン03および03aってのが,やねうら王のC++ソースに手を入れて上記に準ずるアルゴリズムを組み込んだもの。multiPVもやねうら王になる。置換表がスレッド間共有されるって言っても開発者しか意味わからないだろうな。レーティングは上がるんよ。floodgateでこいつが一番高かったからね。シングルバイナリでメモリ効率もいいし,使い勝手いいやつよ。03aがうちの最強エンジンと思う。

ガチ勝負ならこれをベースにチューニングするべきだった。ただ,細かい実験がしづらい上,御本尊がバージョンアップを止めないしgitの使い方はあまり分かってないのでキャッチアップする自信がなかった。プログラムをチーム開発するような経験がないのでねぇ。(ソースのマージで爆発したら困るじゃない)

まぁ,私が既に考えている強化案だけでも結構あるのよ。実装が追いつかないだけで。

実施してない数値実験も幾つもあります。お楽しみに。

#エンジョイ,コンピュータ将棋