電王トーナメントで得られた知見についてなのじぇ!
電王トーナメントで得られた知見についてそろそろまとめておこうじぇ!
~~事前準備日
ハクビシンさんからの情報
技巧は今回
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!
そろそろ開発にもめどが立ってきたのじぇ。
ここらで今のSquirrelの特徴をまとめておくのじぇ。
今日は眠いので詳しくは明日なのじぇ。
Squirrel!!!!
基本となっているのはやねうら王ナノ!
探索部の基本設計はstockfish7!
独自性!
進行度を絶対PとKEの線形和で評価!
KEのEは王の周りの升に効きがある升が何マスあるかを調べる!
王の周りに壁がなかった場合→王の周り8マスの計算
王の周りに壁がありかつ王のいる場所が盤の4隅でなかった場合→盤内の5マス
王が4隅にいた場合→その周りの3マスのみの計算だけではなく、王の2マス前と王のいる位置に桂馬をおいた場合に効きが発生する場所における相手の利き
進行度の学習はfloodgateでrating 2800以上のソフトの棋譜からadadelta!!
進行度によって王手を延長して探索するか、静止探索で王手も探索するかを決めている!
また指し手のorderingについてもorderingに用いられる点数が格納された局面との進行度の差によってorderingに用いられる点数を補正している!
定跡は多腕バンディット問題のucbを用いて作成!ucbそのままでは初手の方の定跡手が少なくなってしまい、数手で定跡が外されるということがあったが、ucbに初手からの手数の逆数に比例する項を加えたことで初手の方の定跡も豊富にした!
3手詰関数、1手詰関数は積んでいない!
評価関数はそのままでいくか、学習に挑戦した結果1手目から56玉を指すような読み筋になってしまった評価関数で出場するか悩み中..
評価関数の学習方法は棋譜の局面で3手探索をした評価値と今の局面での静的評価値をすり合わせるようにパラメーターを動かす方法で実装した!しかし実装方法は滅茶苦茶で、次元下げもしていなければ(KPPのPP対称性だけは考慮した)パラメーターを動かすのは傾きが負の方向にパラメーターを0.01動かすだけ!そりゃ、弱くなりますわ...
ざっとこんなもんなのじぇ。
前までは独自性を入れる度に強くなってるか弱くなってるか図ってたけど、焼肉オフ会に行ってからは自分のソフトの独自性がなさすぎることに焦りを感じてもう強さを図らずに独自性をバンバン入れていくことにしたのじぇ
ライブラリ勢じゃない人もsquirrelくんの独自性を認めてくれると嬉しいのじぇ
コンピューター将棋開発者オフ会in梅田に行ってきたのじぇ!
今日はコンピューター将棋開発者オフ会に行ってきたのじぇ
将棋ソフト開発者オフ会 in 梅田、本日が募集締め切りです。開催は14日20:00~。参加したいという開発者の方おられましたら、ぜひともご参加のほど、よろしくお願いします! https://t.co/5ESAAmgWFt
— 香上 智@Labyrinthus+# (@kagami_tomo) 2016年9月11日
なう! pic.twitter.com/anHvOaLsMn
— 香上 智@Labyrinthus+# (@kagami_tomo) 2016年9月14日
将棋ソフト開発者オフ会おわったりっ。焼き肉おいしかったでよっ!( ^ω^)
— 香上 智@Labyrinthus+# (@kagami_tomo) 2016年9月14日
参加者はSquirrelの開発者であるまりちゃとLabyrinthus+#の開発者の香上さんとCGPの開発者のwainさんだったのじぇ
どんなひとなのかわからない人はここをみて確認すればいいのじぇ。
denou.jp
どうだったの焼き肉は?
いや~~もうお二方の賢さに圧倒されるだけの焼き肉だったのじぇ。
特にwainさんのコンピューターの根本に関わることに関する知識は半端なかったのじぇ
でも色々役に立つお話を聞くことが出来て大変良かったのじぇ!
leaと呼ばれる命令があってその命令を使えば*5,*9も普通の掛け算演算子を使うよりも早く計算できるらしいのじぇ!(11/7修正)
if()でCPUが過去の履歴から予測したのと逆の条件分岐に移るときに10clockぐらいロスになり、最近のプロセッサでは1clockで3命令ぐらい処理できるのでかなりのロスに成ってしまうらしいのじぇ!(11/7修正)
まりちゃの使っているパソコンのcpu:core2duoでの3秒探索は最新のcpuで言うところの0.5秒探索ぐらいらしいのじぇ!
そしてまりちゃのソフトがレッサー改より弱くなり、20キロnpsしか出ていないという話をするとStockFish7式の探索でcore2duoであれば250キロnpsは出るはずであるのでバグを探せと教えて頂いたのじぇ!
ゆゆっ!?すごい情報を手に入れたね!
そうなのじぇ!これからは頑張ってコードの無駄な部分を探してnpsを増やしていく改良をしていくのじぇ!
めざせ!250knps!!!
電王トーナメント出場が決まったのじぇ!!
電王トーナメント出場が決まったのじぇ!!
やったね!!
やったわね!
やったよ!!
最近なかなかモチベーションが上がらなかったけど
モチベーション回復したのじぇ!!
大会までもうひと踏ん張りなのじぇ!!
floodgateの棋譜を技巧風DBに変換するツールなのじぇ。
floodgateの棋譜を技巧風の学習用DBに変換するためのツールを作ったのじぇ。
技巧が読み込んでいる棋譜ファイルは
1行目: <棋譜番号> <対局開始日> <先手名> <後手名> <勝敗(0:引き分け,1:先手勝ち,2:後手勝ち)> <手数> <棋戦> <戦型>
2行目: <CSA形式の指し手(1手6文字)を一行に並べたもの>
という形式になっているみたいでこれは便利だと思ったのじぇ。
ちなみに2015年からFGの棋譜の中に対局者のレートが載るようになったようなので
それを利用してレート2800以下のソフトの棋譜は使わないように設定しているのじぇ。
これを用いて2015年のFGの棋譜を変換してレート2800位上のソフトの棋譜14380局が集まったのじぇ!!!
これでSquirrelお勉強計画が進むわね!!!!
えっお勉強...??
お勉強は嫌いだよ~~楽して強くなりたいよ~~!
楽して強く慣れれば苦労しないのじぇ。
これから強くなるまで一週間でも2週間でもぶっ続けでお勉強させてあげるのじぇ(暗黒微笑)
(´;ω;`)
ただこのツールは自分用にかなり適当に作ったのでバグ等や改善等あればプルリクしていただけると嬉しいのじぇ!!
このソフトは「なのは(将棋)」の作者さんの作られたfggatherを参考に作ったのじぇ。ありがとうございますなのじぇ。
でもwindows.h関連が理解できなかったからまりちゃが作ったのはwindows.hを用いなかったので、コードとしてはぜんぜん違うのじぇ。
ADADELTAの論文を読もうじぇ
タイトルの通りなのじぇ。
論文はここにあるのじぇ
http://www.matthewzeiler.com/pubs/googleTR2012/googleTR2012.pdf
第3.2章から何言っているのかわからなくなってしまったのじぇ.....
Unitってなんなのじぇ.....
まあ備忘録的にここにまとめて残しておくのじぇ。
~~ABSTRACT~~~
Adadeltaとは
勾配効果法の為の次元ごとの学習率調整方法
(ここで言う次元とはベクトルの要素数のことだと考えられる。例.(x,y,z):3次元)
(特徴)
ファーストオーダーインフォメーションしか用いない
(ファーストオーダーインフォメーションとは一回微分の結果のことだと考えられる)
何もなしのSGDを超える小さな計算時間
外乱に対する耐性
~~1 INTRODUCTION~~
SGDでは学習率ハイパーパラメータ(η)は手動で与えなければならなかった
(ADADELTA アプローチの利点)
手動で学習率を決める必要が無い
ハイパーパラメータ関係ない
次元ごとに学習率を分ける。
計算量が少ない
外乱に耐性がある
localまたは分散のある環境にも適応できる。(どういうこと?)
~~2 RELATED WORK~~
Newton methodではヘッセ行列の逆行列を使って計算をする。
しかしこれでは時間がかかりすぎるので
一回微分の結果を用いるか2回微分の値を予測するかする改良をする必要がある。
~~2.1 学習率焼きなまし~~
ローカルミニマムでは学習率を下げればよい学習率であるといえる。
極小値の周りで値は振動してしまうのでこれを防ぐために、一つの方法としては、
学習率が下がってくるに従ってパラメータの更新を遅くする方法もある。
しかし、その代わりに何epoch(epochとはなに???)が経過したかによって学習率を焼き鈍す方法が提案されている。
~~2.2 次元毎の一回微分Method~~
次元あたりに異なる学習率を用いる方法を紹介する
~~2.2.1 Momentum~~
Momentum Methodの主な考え方は
勾配が同じ方向を向いて変わらないdimensionには学習を加速させ、勾配の符号が変化し続けているところでは学習率を下げる。
これは前回のパラメーター更新の値を指数関数的に減衰させながら利用する事によって実装されている。
ρは前回のパラメーター更新の値の減衰をコントロールするための定数。
谷底が緩やかに傾いているような谷を想像すれば良い
谷底に沿うような方向には学習率を上げて、谷をまたぐ方向には学習率を下げることで谷をまたぐ方向の振動を和らげる。
~~2.2.3 ADAGRAD~~
この方法は一回微分の結果に頼っているが2回微分の結果と焼きなましの特性も持っている。
分母はこれまでの全次元ごとの学習率の勾配のL2ノルム
ηはすべての次元で共有される学習率
手動で調整しなければならないηは全次元共通ではあるけれども、それぞれの次元は自分の動的学習率を持っている。
学習率は勾配の大きさの逆数に依存するので大きな勾配は小さな学習率小さな勾配は大きな学習率を持つ。
最初の勾配が大きいものであれば残りの学習率も小さいものになってしまう
学習率はどんどん小さくなっていくので偶然0になって学習が停止してしまうことも起こりうる。
~~2.3 2回微分を用いたメゾッド~~
2回微分の情報はとても有益であるが計算に時間がかかるため
ヘッセ行列の対角成分の近似方法が提案された。
~~3 ADADELTA~~
ADAGRADの2つの欠点を改善させるためにADADELTAのアイディアをこの論文に発表する。
ADAGRADの欠点
(1)トレーニング中ずっと学習率が低下していってしまう
(2)学習率を手動調整しなければならない
~~3.1 idea1 蓄積に直近何回まで蓄積するかを設ける~~
ずっと勾配の2乗和を蓄積する代わりに、直近何回蓄積するかの窓を設ける。
これによって分母は無限まで大きくなることはない
ずっと誤差の2乗和を保存しておくのは効果的ではないので指数関数的減衰させていく。
~~3.2 idea2 ヘッセ行列の近似により、Unitを修正する~~
(Unitとは何なのか??)
パラメータの更新を考えるときunitsは調和されなければならない。
パラメータの変化はunitsの変化でもあるはずである
SGDやMomentumと言った方法ではunitsは勾配と結びついていた。
しかし、2回微分を用いる方法ではunitはパラメータの更新と関係がある????
(此処から先はよくわからない.......)