読者です 読者をやめる 読者になる 読者になる

daruma3940の日記

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

最近どうなの?じぇ

f:id:daruma3940:20160520223745p:plain

お久しぶりなのじぇ。

f:id:daruma3940:20160521003616p:plain

ほんとに久しぶりね...

最近どうなの?Squirrelは強くなってるの??

f:id:daruma3940:20160520223745p:plain

う~~~んきびしーのじぇ。

学習も探索もあんまり強くなってない.....

f:id:daruma3940:20160520223745p:plain

学習は最初のころは2日回すだけでELO+100ぐらい伸びてたのに最近はほとんど伸びていないのじぇ...

探索もLMRを実装したらLMRを実装する前よりもよわくなってしまったので何とか条件を調整してLMRを強くできないか試行錯誤中なのじぇ...

f:id:daruma3940:20160520223530p:plain

踏ん張りどころさんだね

 

f:id:daruma3940:20160520223745p:plain

いやー学習がこんなところで伸び悩むとは思ってなかったのじぇ。

伸び悩みだすのはもっと先のことだろうと楽観していただけになやましいのじぇ。

f:id:daruma3940:20160520223745p:plain

あと年末郵便局でバイトして新しいPC買ったのじぇ!i7-4770KなのでこれでAVX2関数を使える(^◇^)

f:id:daruma3940:20160521003616p:plain

でどうだったの??どれぐらい早くなった??

 

f:id:daruma3940:20160520223745p:plain

まあ簡単にAVX2に書き換えられるmeromさんに教わった_blsr_64()とoccupied256のビット演算をAVX2で書き換えたのじぇ。

結果としては同じPCでAVX2を使わずに指し手生成3.1M回psだったのが

AVX2を使って3.0M回psになったのじぇ。

f:id:daruma3940:20160709192554j:plain

AVX2使って遅くなってるじゃないですかーー

f:id:daruma3940:20160520223745p:plain

なんでなのかよくわからないのじぇ(泣)

f:id:daruma3940:20160520223745p:plain

あとは学習でソフトの棋譜を用いて学習していたけれど、もしかしたら水平線効果の指し手も教師として学習してしまっていて、無理な王手をかけるようになっている状態に陥ってしまったのじぇ。

f:id:daruma3940:20160520223745p:plain

う~~ん思うようにはいかないなぁ......

 

 

 

 

今年一年を振り返って(^◇^)

今年一年を振り返って(^◇^)
今年一年で思い出に残ったことといえばやっぱり電王トーナメントに出場したことだな(^◇^)
すごい人がいっぱいいたな~
コンピューターの仕組みにめちゃくちゃ詳しくてAVX命令などを駆使しながら高速化を図る人、学習に精通していてコンピューターの学習に力を注いでいる人、将棋についての知識をフル活用して探索部を強くしている人そしてそれらすべてを兼ね備えたPonanza......(^◇^)
私はコンピューターに詳しくもないし学習に精通しているわけではないし将棋についての知識もないので何もできない(^◇^)
ponanzaさんはやはりすごかったぜ(^◇^)
一日目の試合開始前に朝ご飯の時間があってな(^◇^)
その時に私とほかの開発者さんで楽しく朝ご飯を食べてたんだがPonanzaさんが入ってきた瞬間雰囲気が変わるのな(^◇^)ponanzaの山本さんは試合前のボクサーみたいな感じで部屋に入ってきたわけな(^◇^)
もうponanzaさんおっそろしくて話しかけられなかったぜ(^◇^)
でもなぜか試合前の練習対局でponanzaに当たってしまったのだ(^◇^)
そこでponanzaさんに「今年はどういった改良をされたのですか」と聞いてみたんだけどそこでは「まあ小さな改良を積み重ねた感じかな」としか答えてもらえなかったしponanzaさんに「君のソフトはどういった改良をしたの?」と聞かれてもStockfishを取り入れてみる以外に何も強くならなかったので「いろいろ試行錯誤してみたけれど強くならなかった」としか答えられなかったし、ちょっと会話をした後山本さんはどこかに行ってしまったのな(^◇^)
この時は小さな改良を積み重ねたと答えられたとき「ああ なんか適当にはぐらかされてしまったんだろうな」と思ったんだけれど今となってはわかるぜ(^◇^)
大会の打ち上げでponanzaは大会前1っか月で600このブランチを作って開発したって言ってたのだほんとにponanzaは小さな改良を積み重ねていってたんだぜ私がやっていた1000倍の試行錯誤をして少しずつ強くなっていってたのだんだぜ(^◇^)私はため息をつくしかなかったぜ(^◇^)
あとはきふわらべさんも本当に私の価値観を回転させた人だぜ(^◇^)
あの人は高校を中退して(←たぶん)微分も理解していなかった人なんだが微分についてのインターネットの記事を読んで羊羹を使って自分の中で再構築していたぜ(^◇^)
そしていま高校数学とかを勉強されているけれど僕が高校時代ちゃんと理解せず使っていたネイピア数とかをちゃんと理解して自分の言葉で再構築しているんだぜ(^◇^)
そしてものすごいリバースエンジニアリング能力とセンスと考える力を持っているんだぜ(^◇^)
あと平岡さんの体力にも驚いたぜ(^◇^)毎日会社から帰ってきて遅くまで開発してるのな(^◇^)マラソンをずっとトップスピードで走ってる感じ(^◇^)
自分の能力のなさに失望だぜ(^◇^)
まあ今年はいかに自分の考える力がないのか理解させられたぜ(^◇^)
来年はいろいろ考えながら
いろいろ面白そうなことに飛び込んでいけたら楽しそうだな(^◇^)

FishTestの見方を調べるのじぇ

f:id:daruma3940:20160520223745p:plain

あとでちゃんとまとめるのじぇ

Stockfish Testing Framework

 

 

 

f:id:daruma3940:20161029021630j:plain

緑 強くなってる

赤 弱くなってる

灰色 テスト中?

LLR:Log likehood ratio 

LTC:long time control 60s+0.4s(60秒+1手毎に+0.4秒だと思われる)

STC:short time control 10s+0.1s

SPRT:sequential probability ratio test(仮説検定の一種?)

Sequential probability ratio test - Wikipedia

Chess SPRT Calculator

ELOがwindowを超えると予想される自己対戦を終了させる(もうはっきり勝敗がわかるから)

(-2.94,2.94):さっぱりわからんwindowに関係している?

[0.00,4.00]:elo0が0.00 elo1が4.00 elo0帰無仮説 elo1対立仮説

El:userの名前

W:Wins 

L:Losses

f:id:daruma3940:20161029022536j:plain

Residual:残差(現実に測定できる誤差)

 

fishtestはχ2乗検定をしている。

p値(仮説に反する統計量が観測される確率)が有意でない限り、そのテストは信頼できる。(residentialが赤色なのはデータが信頼できないやつ)

https://groups.google.com/forum/#!topic/fishcooking/00AnU9eU1O0

パラメーター調整はSPSAを用いている

GitHub - zamar/spsa: SPSA Tuner for Stockfish Chess Engine

http://www.jhuapl.edu/spsa/PDF-SPSA/Spall_Implementation_of_the_Simultaneous.PDF

 

 まずはSTCでテストされ、それに通ればLTCに移る。

 

なんでコンピューター将棋始めたのか思い出したのじぇ!

それは去年の電王トーナメント周辺の時期の話だ。
うちの大学の学科で量子力学の授業を担当していた教授の研究室がコンピューター将棋を作っているということを知り。そしてもうすぐ電王トーナメントというニコニコで放映されるコンピューター将棋の大会があることを知り、
「うちの教授がニコ生に映るの!?マジ!?見てみたろw」という超軽い気持ちで電王トーナメントのニコ生を見てみたのである。

そこで映し出されている将棋の内容は僕には全く理解できなかったが、うちの教授がホントにニコ生にちょいちょい映っていて「あっまじで映ってるw」と思ってみたり、評価値の推移を見ながら手に汗握ってみたり、「非リア代表平岡さん頑張れー!」と変な応援してみたり、「きふわらべおもろw」と笑ってみたり、大樹の枝がponanzaに一勝も出来なかったので落ち込んでみたり電王トーナメントの放送を思う存分楽しんだ。

そして僕はこう思ったのである「コンピューター将棋面白そう!」と。(この時の自分のプログラミング能力はポインタがわからず、シューティングゲーム作るの挫折したぐらい)

僕は当時美術部に在籍して絵も描かずゲームばっかりして遊び呆けまくっていた。部活の後輩の中に一人プログラミングに興味がある奴がいた(Y君とする)。そこでそいつに「一緒にコンピューター将棋やってみいひん?」と声をかけてみた。しかし返事はそっけなかった。「いやですよwめんどくさそうだしw」
僕も確かにめんどくさそうだな~と思った。この時点でこのコンピューター将棋を始めるという挑戦は頓挫してしまうことになる.....はずだった。

そのやり取りがあってだいぶ時間が経った頃、後輩の女の子(コンピューター将棋をやろうと声をかけてみたやつとは違う)が授業でプログラミングの課題を出されたのだが解けないらしく、y君に質問していたのだがY君も問題が解けないらしかった。そこで僕が頑張って解いてみることにした。(問題自体はモンテカルロ法で円周率を求めるプログラムだったので頑張るという言葉を使うほどでもなかった)
そしたらその女の子が「プログラミングできる人ってすごいです!尊敬します!」みたいなことを言って褒めてくれた。

その日の晩YくんからLINEが来た。「やっぱりコンピューター将棋やりましょう!」
どうやらY君もプログラミング頑張ってその女の子に褒められたいみたいだったw
しかしまあ僕もその頃にはもうコンピューター将棋始めるのめんどくさくなってしまっていたので「これは面倒なことになったなー」と思った。
しかしまあ一緒にやろうとこちらから声をかけたのだからしょうがない。頑張ってコンピューター将棋の勉強を始めることにした。

僕もY君もプログラミングなんてほとんどわからなかったので池さんのブログのコードを二人で読んで勉強していくことにした。
しかし、Y君は一週間ぐらいであきらめてしまった。そして私だけが残ってしまい今に至る....................

電王トーナメントにおける棋譜の公開なのじぇ!

f:id:daruma3940:20160520223745p:plain
電王トーナメントの棋譜をこうっかいするのじぇ!
f:id:daruma3940:20160520223530p:plain
こんなもの公開して誰得なの??

f:id:daruma3940:20160709192554j:plain
まあ僕が頑張った思い出の記録として公開したいんだよ~~
f:id:daruma3940:20160521003616p:plain
Squirrel君得みたいね..

www.dropbox.com


~~追記~~
f:id:daruma3940:20160521003616p:plain
調べてみたら電王トーナメントの公式サイトでも棋譜が公開されていたわよ。
ここでも棋譜を公開したって何の意味もないんじゃない?
f:id:daruma3940:20160520223745p:plain
そんなこともないのじぇ。
公式ではテスト対局の棋譜は公開していなかったけれどここではちゃ~んと公開しているのじぇ。
テスト対局の相手はponanzaなのじぇ。ponanzaファンは喉から手が出るほど欲しがるんじゃないかだじぇ?
f:id:daruma3940:20160521003616p:plain
それは確かにそうでしょうけれどponanzaの相手がSquirrelじゃあねぇ....
f:id:daruma3940:20160520223745p:plain
それは言っちゃ駄目なのじぇ。

電王トーナメントで得られた知見についてなのじぇ!

電王トーナメントで得られた知見についてそろそろまとめておこうじぇ!


~~事前準備日
ハクビシンさんからの情報

技巧は今回
tree strapとalpha goの技術を用いているのではないか

tree strap...深い探索を行ったすべての局面の末端ノードの値を近似する。

一日目にもう一度お話を伺ったところ、実際はtree strapは行っておらず、
alpha goの方法はポリシーネットワークを用いているらしい。
tree strapに関しては昨日のやねうらさんと技巧さんの会話の中でやねさんが難色を呈していた。

syogi serverを用いれば自己対局が上手くいくのではないか

ハクビシンさんのソフトでは評価関数をメモリから読みとるのが全体の計算時間の30%を占めているのでそこを高速化したいそう。
そこでハクビシンさんは上手く評価関数がキャッシュに乗るようにpaddingを入れている。
キャッシュはマシンごとに違うのでこの電王トーナメントのマシン用に事前準備の日にチューニングされていた。


1日目
やねうら王さん
詰みを見つけやすい評価関数であればcheckのextensionはいらない。
今後はどの特徴量を追加していくか

どの手を重点的に読むかにdeep learning?

ponanzaは持ち時間にNNを使っている?

ツツカナ
持ち駒だけで進行度を図っている。
実現確率探索はreducationだけそこで考えて、extensionは他の項目で考えている。
null moveの代わりにmulti cutを使っている。(selene も)
→その局面でテキトウな指し手を一手指してみてそれが何個beta値を超えるかどうかで枝切り。
null moveを超える指し手がこの中にあればmulti cutのほうが精度が良くなる?

カパック
教師データの精度を上げている。
反省した局面は教師データに入れていない?

ラプンツェル
Sibling conspiracy number searchを用いている。
他のゲームでは上手く行ったらしいが、
将棋では上手く行かなかったらしいので
静止探索は行ったらしい。

selene
ABC探索の考えを取り入れた枝切りを行っている。
→複雑な局面には行きたくないという考え方?

技巧とやねさん
技巧 futility marginを120+80*progressで強くなった??

razoring パラメーターがバラバラ。深いほうが大きくないとおかしい。これは本当に必要なのか?
技巧ではrazoring入れてELO+10ぐらい。
razoringは割りと安全な枝切り?(このあたり周りがうるさくてよく聞こえなかった)
外してもそんなに強さ変わらない

静止探索は軽くならないか?
飛車角成を省く?
歩のcaptureよりも価値のある成を入れる?
技巧 歩以外の成を枝切りでELO-13

終盤の歩のcaptureなんて要らない

成を探索しなければいけないような評価関数か?

大抵はfutilityによって枝をかられる。

seeは利きを持っていれば相手の効きがそこにあるかどうかで省略できる。
王手のseeはききのかずさえあれば省略できる?

王手延長
技巧 SEEが+でONE_PLY
SEEが-でHALF_PLY
王手延長は王手をかけた後の局面の指し手の少なさから考えて積極的に延長スべし

教師データ作成のときは枝切りなしのdepth3で作成したほうがいいか?
枝切りありのdepth6ぐらいが普通のdepth3ぐらい?

boot strapの論文はデータが胡散臭い
Tree strapよりもRoot strapのほうが信頼できる?
探索のパラメーター調整はsingler extensitonの関係で他のソフトとやったほうがいい。

マルチスレッドの場合はhistoryの値の入り方がぜんぜん違うのでぜんぜん違う進行になる!
激指の研究ではKPが一番進行度を表現できるらしい。

shogi686さん
PEXT bitboard 飛車の利きを一回で求められるがmargeしないといけない
rotetedはmargeしなくていいところは早いけれども、利きは一回では求められない。
shogi686さんは両方試してみてrotetedのほうが早かった模様。
PEXTテーブルが大きいのでキャッシュに載るか乗らないかでソフトによるところが大きい?
レイテンシがどうこう言われたけれどわからなかった
_blsr_u64()
一手詰め関数はtemplateを使って短くしている。
強くなるときというのは遅くなるもの。
null moveが上手く行かなかった指し手の保存

2日目飲み会
次元下げは値の波及が激しい。
教師データが変わったのがソフトの気風の変化に影響?
Alpha Goも人間の棋譜からのほうが強くなっているところもある!
→人間の棋譜とソフト起伏の違いは?

発想の漏れを見つけなければならない。

ponanzaはKPP KKPTを使っている。(KPPTではない)だからめちゃくちゃ速い。
やねさん KPPTでもいいのでは。KPPTでパラメーターチューニングしなければならず、細かい比較はできていない。
去年の電王トーナメントバージョンに9割勝つ。
直近3ヶ月でパラメーター調整のために600のブランチを作った。

Squirrelについて2!

f:id:daruma3940:20160520223745p:plain
そろそろ開発にもめどが立ってきたのじぇ。
ここらで今のSquirrelの特徴をまとめておくのじぇ。
今日は眠いので詳しくは明日なのじぇ。

Squirrel!!!!
f:id:daruma3940:20160709192554j:plain
基本となっているのはやねうら王ナノ!
探索部の基本設計はstockfish7!

独自性!
f:id:daruma3940:20160520223530p:plain
進行度を絶対PとKEの線形和で評価!
KEのEは王の周りの升に効きがある升が何マスあるかを調べる!
    王の周りに壁がなかった場合→王の周り8マスの計算
    王の周りに壁がありかつ王のいる場所が盤の4隅でなかった場合→盤内の5マス
    王が4隅にいた場合→その周りの3マスのみの計算だけではなく、王の2マス前と王のいる位置に桂馬をおいた場合に効きが発生する場所における相手の利き
進行度の学習はfloodgateでrating 2800以上のソフトの棋譜からadadelta!!
進行度によって王手を延長して探索するか、静止探索で王手も探索するかを決めている!
また指し手のorderingについてもorderingに用いられる点数が格納された局面との進行度の差によってorderingに用いられる点数を補正している!
f:id:daruma3940:20160521003616p:plain
定跡は多腕バンディット問題のucbを用いて作成!ucbそのままでは初手の方の定跡手が少なくなってしまい、数手で定跡が外されるということがあったが、ucbに初手からの手数の逆数に比例する項を加えたことで初手の方の定跡も豊富にした!

3手詰関数、1手詰関数は積んでいない!

評価関数はそのままでいくか、学習に挑戦した結果1手目から56玉を指すような読み筋になってしまった評価関数で出場するか悩み中..
評価関数の学習方法は棋譜の局面で3手探索をした評価値と今の局面での静的評価値をすり合わせるようにパラメーターを動かす方法で実装した!しかし実装方法は滅茶苦茶で、次元下げもしていなければ(KPPのPP対称性だけは考慮した)パラメーターを動かすのは傾きが負の方向にパラメーターを0.01動かすだけ!そりゃ、弱くなりますわ...

f:id:daruma3940:20160520223745p:plain
ざっとこんなもんなのじぇ。
前までは独自性を入れる度に強くなってるか弱くなってるか図ってたけど、焼肉オフ会に行ってからは自分のソフトの独自性がなさすぎることに焦りを感じてもう強さを図らずに独自性をバンバン入れていくことにしたのじぇ
f:id:daruma3940:20160520223745p:plain
ライブラリ勢じゃない人もsquirrelくんの独自性を認めてくれると嬉しいのじぇ