daruma3940の日記

理解や文章に間違い等あればどんなことでもご指摘お願いします

久しぶりなのじぇ

f:id:daruma3940:20160520223745p:plain
はふ~~お久しぶりなのじぇ!
f:id:daruma3940:20160521003616p:plain
ほんとにひさしぶりね..
f:id:daruma3940:20160520223745p:plain
最近記事を書いていなかってけれど
プログラムのバグを取れないので息抜きに記事でも書くのじぇ。
f:id:daruma3940:20160520223530p:plain
ゆゆっ?きょうはSquirrelくんがいないね?
f:id:daruma3940:20160520223745p:plain
Squirrelくんはいま将棋の勉強中なのじぇ~~
大局観(KPP,KKP)を磨くため(機械学習するため)にここ2日ぐらいずっと勉強に励んでもらっているのじぇ~~
f:id:daruma3940:20160520223530p:plain
ひぇ~~大変だよぉ(´・ω・`)
f:id:daruma3940:20160520223745p:plain
でも多分今の学習方法では上手く行かないと思うので学習方法を変えてもう一度やり直してもらうのじぇ!
f:id:daruma3940:20160521003616p:plain
更に大変ね...
ところでまりちゃ、いまはどんなプログラムを書いてるの?
f:id:daruma3940:20160520223745p:plain
いま書いているのはUCBを用いた定跡作成のためのコードなのじぇ!
UCBって言うのの解説はここを見てほしいのじぇ!
d.hatena.ne.jp
ここで紹介されている他椀バンディット問題というのを利用してponanzaは定跡を作っているらしいのでそれをパクらせていただいて、
SquirrelではUCBを用いて定跡を作ろうということなのじぇ!!!
f:id:daruma3940:20160521003616p:plain
なるほど...ポナンザがやっている方法なのならこの方法でSquirrelくんの定跡もいい定跡を指すようになってくれるかもしれないわね!
f:id:daruma3940:20160520223745p:plain
まりちゃが思いついたアルゴリズムとしてはこうなのじぇ。

まず
指し手とUCBとその指し手を指した後のノードの情報が格納された構造体へのポインタを格納するための構造体を作る。

struct ucbMove {
double ucb;
Move move=MOVE_NONE;
Move pondermove = MOVE_NONE;
NodeInfo* next=nullptr;//次のnodeinfoへのポインタ
};

またゲーム木のノードの情報を格納するための構造体を作る。
struct NodeInfo {
vector um;//ひとつの局面に対して最大でも3つまでの定跡手を用意する。
bool is_mattan = false;//これがtrueであれば末端ノードであるのでここから探索を再開する。
NodeInfo* previous=nullptr;//一つ前のnodeのnodeinfoへのポインタ(これがnullptrであるということはrootである)
int this_arm_tried = 0;//これは過去に渡っても更新しなければならない。
string sfen_;
int depth;
NodeInfo() { um.resize(3); }

初期局面から探索を始める。
探索が終われば、探索の結果、指し手の評価値が高かった上位3つの指してを取り出して、
その3つの指し手からucBmoveを作り、NodeInfoのvector umにする。

ここでNodeInfoのumをucbが大きい順にソートする。

um[0]で局面を一手進る。
ここは新しいノードであるので新しいNodeInfoの*previousを一手進める前のNodeinfoの番地情報にして
一手進める前のnodeinfo.um[0].nextを新しいnodeInfoの番地情報にするにする。
そしてもう一度探索をして3つの指してに対してucbを計算。
そして連結リストを遡って指し手のucbを更新していく。

umはucbが大きい順に並んでいるはずであるが、先程のucbの更新で順番が壊れているところがあるはずであるのでそのノードをrootから探していく。
そのノードを見つけたら、umをucbの大きい順に並べ替えてその指し手で局面を一手すすめ、NodeInfoをその局面に合わせる。
その後そのノードは末端ノードではないかもしれないので末端ノードまで移動する。
そして次はそこから同じことを繰り返す。

f:id:daruma3940:20160520223745p:plain
アルゴリズムとしてはこれでいいはずなのじぇ。
細かい実装が出来ないのじぇ~~難しいのじぇ~~

コンピューター将棋開発者オフ会in梅田に行ってきたのじぇ!

f:id:daruma3940:20160520223745p:plain
今日はコンピューター将棋開発者オフ会に行ってきたのじぇ

f:id:daruma3940:20160520223745p:plain
参加者はSquirrelの開発者であるまりちゃとLabyrinthus+#の開発者の香上さんとCGPの開発者のwainさんだったのじぇ
どんなひとなのかわからない人はここをみて確認すればいいのじぇ。
denou.jp
f:id:daruma3940:20160521003616p:plain
どうだったの焼き肉は?
f:id:daruma3940:20160520223745p:plain
いや~~もうお二方の賢さに圧倒されるだけの焼き肉だったのじぇ。
特にwainさんのコンピューターの根本に関わることに関する知識は半端なかったのじぇ
でも色々役に立つお話を聞くことが出来て大変良かったのじぇ!
f:id:daruma3940:20160520223745p:plain
leaと呼ばれる命令があってその命令を使えば*5,*9も普通の掛け算演算子を使うよりも早く計算できるらしいのじぇ!(11/7修正)


if()でCPUが過去の履歴から予測したのと逆の条件分岐に移るときに10clockぐらいロスになり、最近のプロセッサでは1clockで3命令ぐらい処理できるのでかなりのロスに成ってしまうらしいのじぇ!(11/7修正)

まりちゃの使っているパソコンのcpu:core2duoでの3秒探索は最新のcpuで言うところの0.5秒探索ぐらいらしいのじぇ!

そしてまりちゃのソフトがレッサー改より弱くなり、20キロnpsしか出ていないという話をするとStockFish7式の探索でcore2duoであれば250キロnpsは出るはずであるのでバグを探せと教えて頂いたのじぇ!


f:id:daruma3940:20160520223530p:plain
ゆゆっ!?すごい情報を手に入れたね!

f:id:daruma3940:20160520223745p:plain
そうなのじぇ!これからは頑張ってコードの無駄な部分を探してnpsを増やしていく改良をしていくのじぇ!
めざせ!250knps!!!

応援していただいているのじぇ!


f:id:daruma3940:20160709192554j:plain
いろんな方に応援していただいているよ~うれしいよ~~
f:id:daruma3940:20160520223745p:plain
ゆゆっ!ほんとなのじぇ!
応援していただいていうれしいのじぇ!
頑張って開発しますなのじぇ!

電王トーナメント出場が決まったのじぇ!!

f:id:daruma3940:20160520223745p:plain

電王トーナメント出場が決まったのじぇ!!

denou.jp

 

f:id:daruma3940:20160520223530p:plain

やったね!!

f:id:daruma3940:20160521003616p:plain

やったわね!

f:id:daruma3940:20160709192554j:plain

やったよ!!

 

f:id:daruma3940:20160520223745p:plain

最近なかなかモチベーションが上がらなかったけど

モチベーション回復したのじぇ!!

 

f:id:daruma3940:20160520223745p:plain

大会までもうひと踏ん張りなのじぇ!!

 

 

SF7式の探索部なのじぇ。

f:id:daruma3940:20160520223745p:plain

探索部をSF7を参考にして実装してみたのじぇ。

f:id:daruma3940:20160520223530p:plain

以前のバージョンとの対戦結果はどうだったの?

f:id:daruma3940:20160520223745p:plain

今までのversionの中で一番強いversion old_progとの自己対戦結果で言うと

0.1秒自己対局で38-168だったのじぇ。

f:id:daruma3940:20160521003616p:plain

えっ!??滅茶苦茶よわくなってるじゃない!

f:id:daruma3940:20160520223745p:plain

そうだったのじぇ。

まりちゃはこの結果に疑問をいだいたのじぇ。

探索部をSF7形式にするだけでApery-twigに7割勝てるようになったSilent Majorityというソフトがあるのになぜここまで弱くなってしまったのか。

まりちゃの実装には不備があったのか。ミスは無いつもりだったのじぇ。

0.1秒対局が悪いのではないのかとまりちゃは思ったので持ち時間を1秒に変えてみたのじぇ。

その結果137-223という結果になったのじぇ。

f:id:daruma3940:20160521003616p:plain

それでもまだ負け越してるわね。

f:id:daruma3940:20160520223745p:plain

更に持ち時間を2秒にして実験してみたのじぇ。

その結果57-54という結果が出ているのじぇ。

強さはほぼ変わらないのじぇ。

f:id:daruma3940:20160520223745p:plain

恐らくSF7の探索手法はある程度探索に時間をかけないと強さが発揮できない手法だとおもわれるのじぇ。ということは短い持ち時間での自己対局では探索部の強さは測れなくなってしまったということなのじぇ。

 

それに実戦に近い形で自己対局をさせたいというまりちゃの気持ちもあるので、今後の自己対局は1手x秒で指し手を返させる方法ではなくて持ち時間x秒以内に試合を終わらせる形式で行こうと思うのじぇ。

 

f:id:daruma3940:20160520223745p:plain

これで上手く強さを図れるかどうかはわからないし、上手く行かないような気のほうが大きいけれどこれでやっていこうじぇ。

 

(追伸 2016 9/8)

 持ち時間を3秒に増やして対局させてみたところ

67-38という結果になったのじぇ。

対局数は105局と少ないながらもELO+98で勝ち越しているのじぇ。

f:id:daruma3940:20160520223745p:plain

ほかの人のブログを見たらSILENTMAJORITYは大樹の枝に0.1秒では負け越し、1秒で勝ち越した。と書いているので

ソフトは違えどもまりちゃのPCはその人の持って居るPCの速度の1/3ぐらいしかでていないということかもしれないのじぇ。

f:id:daruma3940:20160520223745p:plain

まりちゃのPCでは自己対局に少なくとも1手3秒以上使わなければ正しく測れない可能性が出てきてしまったのはなかなか辛いのじぇ。

どうすればいいのか....

進行度の学習なのじぇ 3

f:id:daruma3940:20160520223745p:plain

昨日の晩から進行度の新しい実装のversionと進行度の昔の実装のversionを持ち時間0.1秒で自己対局させてたのが1500局試合が終わっていたので結果を見るのじぇ。

 

f:id:daruma3940:20160520223745p:plain

ちなみに昔の実装とは進行度をKKPだけを用いて計算しようとした、テスト局面でもきちんと終盤度を測れていなかったversionなのじぇ。

ちなみに王の周りの利きを調べるのをやめてるのじぇ。何故かと言うとKKPにはその辺りのことも考慮された値が格納されているだろうと思ったからなのじぇ。

f:id:daruma3940:20160520223745p:plain

結果がこれなのじぇ。

newprog vs old prog
588 24 891

1479局 588勝 891敗

勝率: 0.3975659229208925
標準誤差: 0.012731969696552983
0.95% 信頼区間 [0.37322515212981744, 0.42258282623394183]

相対イロレーティング: -72.20015118429453
標準誤差: 9.234666517194077
0.95% 信頼区間 [-90.05626256611926, -54.231141337971955]

 

f:id:daruma3940:20160521003616p:plain

ちょっと待って,,,進行度はちゃんと計算できている方が滅茶苦茶弱くなってるじゃない...進行度をちゃんと計算できていないほうが強いってどういうこと??

 

f:id:daruma3940:20160520223745p:plain

 進行度は正しく計算できてはいるものの、計算しているのはKPのような方法だからその計算の分深くまで読めなくなってしまっている可能性があるのじぇ。

もともとHistoryに格納される値は残り深さの2乗に比例する値で、補正する値は1乗の値なので全然補正の効果も出ていないし、そもそも何か補正を入れなくともhistoryの値は局面の変化に対応して、値が変わっていくのじぇ。

f:id:daruma3940:20160520223745p:plain

まあ言ってみれば補正なんてしないほうが強いソフトになるということだったのじぇ。

まあまりちゃがしたことは無意味だったのじぇ。

f:id:daruma3940:20160520223745p:plain

しかしPR文書にhistoryを進行度にあわせて補正しますって書いちゃったのでもうこれは独自性として変更不可能なのじぇ。だから今の静的評価値を進行度として用いようと思うのじぇ。これなら計算量も増えないし、正しく優制度を見積もれるはずなのじぇ。

 (P.S.このやり方でもELO-64下がってたのじぇ。何が悪いのかわからないのじぇ!!とりあえず元のバージョンに戻すのじぇ。独自性を立てれば強さが立たず、強さを立てれば独自性が立たないのじぇ....)

f:id:daruma3940:20160520223745p:plain

まあ微々速前進なのじぇ??

 

 

 

 

 

進行度のがくしゅうなのじぇ2

f:id:daruma3940:20160520223745p:plain

いや~~Squirrelくんゴメンなのじぇ。

前回の学習の失敗はまりちゃのプログラミングにミスが有ったからだったのじぇ。

ミスは取り除いたので今回こそはうまくいくと思うのじぇ。

f:id:daruma3940:20160709192554j:plain

えっ?またお勉強タイムですか^^;

f:id:daruma3940:20160520223745p:plain

まあ仕方ないのじぇ諦めるのじぇ。

じゃあ早速行くのじぇ。

f:id:daruma3940:20160709192554j:plain

ひえ~~~(´;ω;`)

 

.......

f:id:daruma3940:20160521003616p:plain

。。。。学習の様子はどうなの?

f:id:daruma3940:20160520223745p:plain

今回はうまくいってると思うのじぇ。

このログを見るのじぇ。

f:id:daruma3940:20160904100836p:plain

f:id:daruma3940:20160520223530p:plain

ちゃんとiterationごとに損失が下がっていってるね!!

startpositionの進行度もいい感じになってきてるよ!

 

f:id:daruma3940:20160520223745p:plain

Squirrelくんのがんばりに期待なのじぇ。

 

 

 

....

 

 

f:id:daruma3940:20160904101055p:plain

 

f:id:daruma3940:20160521003616p:plain

 

あら...Startpositionにおける進行度が上がってきてしまっていないかしら?

f:id:daruma3940:20160520223745p:plain

う~ん...でも全体としての損失は下がってきているので様子をみるのじぇ。

 

 

 

......

 

 

f:id:daruma3940:20160904101238p:plain

f:id:daruma3940:20160520223530p:plain

ゆゆっ!!学習が終わったみたいだよ!

f:id:daruma3940:20160709192554j:plain

ようやく1000iteration終わったよ~~~

疲れたよ~~

f:id:daruma3940:20160520223745p:plain

お疲れ様なのじぇ。

ちゃんと進行度を学習できているかテスト局面を与えてみたら、適切な値を返してくれたのじぇ。大成功なのじぇ!(まだ収束はしていなかっただろうけれど)

f:id:daruma3940:20160521003616p:plain

後は探索部をこの値を用いた実装に作り変えてちゃんと強くなるかどうかね....

f:id:daruma3940:20160520223745p:plain

まあそれは次のお話なのじぇ。

今まで機械学習なんて何やってるか分からなくて怖くて手をつけられなかったけど、今回の学習で恐怖感はなくなったのじぇ(きちんと方法を理解できているとはいっていない)この調子でKKP,KPPの機械学習にも手を出せるんじゃないかだじぇ??

 

 

f:id:daruma3940:20160520223745p:plain

しかし、これだけの学習なのにかかった時間は11時頃~16時頃の5時間ぐらいだったのじぇ。他の開発者の方がマシンが足りないマシンが足りないと言っている理由がわかったのじぇ。まりちゃももっとマシンが欲しくなってきたのじぇ。

自己対局用、教師データ作成用、機械学習&定跡作成用、プログラミング用.....

f:id:daruma3940:20160520223745p:plain

まあ贅沢は言わないのじぇ。ほどほどにがんばるのじぇ~~