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

daruma3940の日記

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

第27回世界コンピューター将棋選手権に参加してきた。

第27回世界コンピューター将棋選手権に参加してきた。
今回はライブラリを使わずに参加しようということで前回の第4回電王トーナメントが終わった後動物将棋のエンジンを作り感覚を取り戻してから一から本将棋のプログラムを作り直した。
大会でshogi686さんからrotated bitboardはpext bitboardより高速に処理ができると教わったのでrotated bitboardを採用することにした。rotated bitboardの実装は結構大変でバグを取ったりするうちに丸一日経っていた。
bitboardには81bit必要で、飛び効きを処理するためにはこれに加えて+45,-45,90°回転(rotated)させたbitboardも必要なのだけれど,効きを遮る駒が盤の一番端っこにいる場合は一番端っこに駒がいないのと同じだけ盤上に効きを作ることができるので飛び効きの処理に必要なbitboardは81bitではなく縦横で7*9=63bit斜めで7*7=49bitあればいい。
これらは64bitに収まるので縦横斜めすべてを256bit型に格納してSIMD演算で一気に計算できると教わった。
shogi686は斜めのテーブルをどのbitに格納するとキャッシュにのりやすいかといった高速化もしていたが、私にはそこまでできない。
局面の評価は一般的な3駒関係でなく2駒関係を用いることにした。これは2コマの方が3コマよりも強いと思ったからとかそういうわけではなくて単純に2駒のほうがサイズが小さくて取り扱いやすいこと、学習に時間があまりかからないことというLazyな理由からであった。学習にはbonanza methodを使うことにした。
符号の間違いが多くてちゃんと学習させるのにはかなり手間取った。
しかし学習させた自分のソフトが自力で穴熊に組んだ時はかなりうれしかった。
探索部はチェスの最強ソフトであるStockfishの探索部を将棋用に改良してそれを取り入れた。取り入れるだけであるがなんだかんだバグが出てきて取り除くのは大変だった
今回はどれぐらい強くなるか弱くなってしまってもしょうがないなと思ったがbonanza6に勝てるぐらいのソフトになった。正直感無量だった。あのbonanza6を超えることができるとは...
なんか書くの疲れてきたので大会は楽しかったでおわりにする

大会1日目の飲み会代払うの忘れてたのじぇ!

f:id:daruma3940:20160520223745p:plain

しまったのじぇ!!

大会一日目の飲み会代払うの忘れてたのじぇ!

f:id:daruma3940:20160520223745p:plain

あの日朝2時寝の4時起きで飲み会の途中でうとうとしてしまって、飲み会を途中で抜けたので翌日お金を渡すことになっていたのじぇ

 

f:id:daruma3940:20160520223745p:plain

Claireさんに冗談でここで黙ってれば払わなくて済むんじゃないww??

みたいなことを言ったけどまさかホントに払うの忘れてしまうとは....

f:id:daruma3940:20160520223745p:plain

非常に申し訳ないので次の大会の飲み会は余分に請求していただいて大丈夫です

f:id:daruma3940:20160520223745p:plain
きふわらべさんが飛び利きbitboardを作るのに苦労されているのを見て昔の自分を思い出したのじぇ。
occupied bitboard作るのもいい方法が思いつかなくて大変だったし、
飛び利きの邪魔ゴマのindexを取ってくるのも位置がずれてたりして修正するのが大変だったのじぇ...
懐かしんでいる場合ではないけれど懐かしいのじぇ...

f:id:daruma3940:20160520223745p:plain
ようやく5000万棋譜でR+25のバイナリができたのじぇ...
条件としては定跡を開始局面として教師データを作成し、値の更新時に探索はしない目的関数は交差エントロピー値の更新方法はadadeltaなのじぇ
この方法と同じ方法で教師データをもっと作って学習を回せばもっと強くなるはず!!!
イタチの最後っ屁ではあるものの強くなってほしいのじぇ!!!

中規模棋譜学習うまくいかんのじぇ...


f:id:daruma3940:20160520223745p:plain
う~~んう~~ん
中規模棋譜学習うまくいかんのじぇ...

一応損失はiteration回すたびに小さくなってるし
ゼロベクトルから始めた学習がゼロベクトルのものよりは強くなってるので
アルゴリズムがおかしいわけではないと思うのだけれど...

次元下げをすると多少勝率がましになるけど、それでも元のものよりはR100は低い...
f:id:daruma3940:20160520223745p:plain
う~~んう~~ん

ランダム開始局面データがマズすぎるのかもしれないので
開始局面は定跡から読み込ませることにするかなのじぇ....
でもこれが強くならない本質的な原因だとは思えないんだよなぁ...

評価値の符号は間違ってないはずだし...

Bonanza6たおしたのじぇ!

f:id:daruma3940:20160520223745p:plain

twitterで書くのははばかられる内容なのでここにかくのじぇ

f:id:daruma3940:20160521003616p:plain

どうしたのまりちゃ?

f:id:daruma3940:20160520223745p:plain

Squirrel君がついにBonaza6を倒したのじぇ!(1thread 1s)

 

f:id:daruma3940:20170421222036j:plain

f:id:daruma3940:20160520223530p:plain

おめでとうだよ!

 

f:id:daruma3940:20160520223745p:plain

いろいろな出来事が走馬灯のように思い出されるのじぇ...

 

開発をするためにクラスとポインタで挫折していたC++を勉強し直したあの頃...

池さんの「HTML版コンピュータ将棋のアルゴリズム」を読んで将棋プログラムの作り方を勉強したあの頃...

れさ改に勝てずに、もがき苦しんだあの頃..

Bonanza完全解析ブログで3駒関係について勉強したあの頃...

f:id:daruma3940:20170421223139j:plainf:id:daruma3940:20170421223203j:plain

フラッドゲートで稲庭将棋に2回引き分けを繰り返してようやく勝ち星をつけレーティング表に乗ったあの頃...

f:id:daruma3940:20170421223332j:plain

徹夜でrotated bitboardを作成したあの頃...

学習の実装を失敗し続けて全然評価関数が強くならなかったあの頃...

なのはミニに勝ったあの頃...

bonanzaに追いついたあの頃...

そしてbonanzaに勝った今...

f:id:daruma3940:20160709192554j:plain

感無量だねっ...

 

 

f:id:daruma3940:20160520223745p:plain

ううっ...!中規模棋譜学習に手を出してみたけれどなかなかうまくいかないじぇ...

深い探索の評価値と浅い探索の評価値の差の2乗は学習でどんどん小さくなっているので実装は間違っていないはずだし、差し手生成祭りの局面でもすぐにこの局面が悪いということに気が付いているのだけれど...

f:id:daruma3940:20160521003616p:plain

中規模棋譜学習ってあれでしょ?

自分の深い探索の結果を教師として学習を行うやつでしょ?

Squirrel君の強さじゃちゃんとした教師を作れてないんじゃないの?

f:id:daruma3940:20160520223745p:plain

う~~ん一応bonanza6よりちょっと弱い位の強さになってきたので頃合いじゃないかと思ったのだけれど...

f:id:daruma3940:20170418200035j:plain

f:id:daruma3940:20160709192554j:plain

ありしゅが言ったこと以外にも初期局面データ集が悪かったとか教師データをちゃんと作れてなかったとかハフマン符号化、復号化に失敗してたとか探索時に置換表を使ってなかったこととか、いろいろ考えられるねっ...

f:id:daruma3940:20160520223745p:plain

あと初期局面データを作るときに気づいたけど探索深さ8では評価値の絶対値が100以下だったのに、探索深さが9になると1000近くになったり評価値が不安定だったことも原因に考えられそうなのじぇ...

技巧や習甦みたいにボナメゾに浅い探索結果と深い探索結果との誤差の損失項を入れたほうがよかったのかもしれないのじぇ..

f:id:daruma3940:20160520223745p:plain

まあ一旦別のところに手を付けようじぇ。