コンピュータ将棋開発の思い出を振り返ってみた。

「コンピュータ将棋 Advent Calendar 2016」のトップバッターの平岡です。よろしくお願いします!
「コンピュータ将棋 Advent Calendar 2016へのリンクはこちら。
http://www.adventar.org/calendars/1457



コンピュータ将棋を初めて6年弱になるので、色々とダラダラ振り返っていこうと思う。



僕がコンピュータ将棋を始めたきっかけから。
2008年に大学卒業して会社に入り、しばらくして、お仕事でプログラミングする事になったので、Cの勉強してた。
ちょうどBonanzaソースコードが公開されたのでCの勉強がてらBonanzaを読んでいた。
GUIのアプリとか作れる気がしなかったし、Bonanzaは複雑だけれど、コマンドラインのアプリとして丁度よかった。
C++ではなくCだったのも、当時は読む為の心理的障壁が少なくて良かった。
仕事で良く読んでいた、H.264 reference software の JM (http://iphome.hhi.de/suehring/tml/) に比べれば大抵のプログラムのソースコードは綺麗で読みやすい。
ぼんやりコンピュータ将棋は面白そうだと思いつつ、いきなりは難しそうなので練習でオセロのプログラムを作ったりした。
その後C++を勉強し、ようやくAperyの開発を始めたのが2011年の1月。
今思えばいきなりコンピュータ将棋を始めても良かった気もするが、
Aperyが最初からそこまで破綻したプログラムにならなかったのは、長い準備期間のお陰かも知れない。
始めたきっかけはそんな感じ。




開発ではまずはMagic Bitboardを作ろうと思い、Ponanzaの一成さんの発表していたスライドとかを参考にした。
しかしすぐに困った事に。
どうしても2九、6九の位置の飛車のマジックナンバーがランダム生成で見つからずに、一成さんの当時のブログで質問した。
するとすぐに解決策を教えて貰って感動したのを覚えている。
Aperyのコードには今もその部分が残っている。

// Magic Bitboard で利きを求める際のシフト量
// RookShiftBits[17], RookShiftBits[53] はマジックナンバーが見つからなかったため、
// シフト量を 1 つ減らす。(テーブルサイズを 2 倍にする。)
// この方法は issei_y さんに相談したところ、教えて頂いた方法。
// PEXT Bitboardを使用する際はシフト量を減らす必要が無い。
const int RookShiftBits[SquareNum] = {
    50, 51, 51, 51, 51, 51, 51, 51, 50,
#if defined HAVE_BMI2
    51, 52, 52, 52, 52, 52, 52, 52, 51,
#else
    51, 52, 52, 52, 52, 52, 52, 52, 50, // [17]: 51 -> 50
#endif
    51, 52, 52, 52, 52, 52, 52, 52, 51,
    51, 52, 52, 52, 52, 52, 52, 52, 51,
    51, 52, 52, 52, 52, 52, 52, 52, 51,
#if defined HAVE_BMI2
    51, 52, 52, 52, 52, 52, 52, 52, 51,
#else
    51, 52, 52, 52, 52, 52, 52, 52, 50, // [53]: 51 -> 50
#endif
    51, 52, 52, 52, 52, 52, 52, 52, 51,
    51, 52, 52, 52, 52, 52, 52, 52, 51,
    50, 51, 51, 51, 51, 51, 51, 51, 50
};


色々と作りながら困ったりしたけど、基本的に一人でコード書いてたのが楽しかった。
完全なる自己満足だけで作っていたが、最初に将棋所でAperyが動いた時は感動した。
当時僕はコマンドラインのプログラムしか書けなかったが、GUIに反映されて動いているのがとても楽しかった。




2012年5月に初めて世界コンピュータ将棋選手権に出場した。
コンピュータ将棋関係の多くの方々とはこの時に初めてお会い出来た。
同じ趣味を共有する楽しさ、競い合う楽しさ、将棋の楽しさが詰まっていた。
棋士の勝又さんに初めてAperyの将棋をニコ生解説してもらったのとても思い出深い。相手はSeleneだった。
この大会は、上位5ソフトが電王戦に出られるという事で、トップ層の争いも見ていてとても楽しかったし、憧れた。
この時の大会が本当に楽しかった。これがあったからこれまで大会出場し続けているのだと思う。




初めての大会の後はモチベーションも上がり、翌年には将棋電王トーナメントも始まり、楽しく開発と大会出場を続ける事が出来た。
その中で色々な経験をする事が出来て良かった。
完全にフロックだけれど選手権優勝したり、他にも電王戦に出たり、Aperyを公開して沢山の方々に使って貰ったり、
お名前オークションや学習データ生成を皆さんに手伝ってもらったり。
プログラミングのお勉強で始めたのに、結果的に沢山の方に会ったり出来たのは本当に良かった。




僕はコンピュータ将棋をかなり楽しんだ方だと思う。開発と、それ以外の色んな経験で。
楽しんだというか、楽しませて貰った面も大きい。
本当に人や運に恵まれていると感じる。
しかしそんな楽しいコンピュータ将棋だが、最近は全く開発をしていない。
ちょっと疲れてしまった。いつの間にやら30代おっさんである。
開発はやったら楽しいし、まだ評価関数も強く出来そうだし、探索も強く出来るだろうけど、まあ趣味というスタンスを崩したくないので、
やりたくて仕方なくなるまで放置が良さそう。
次の選手権はどうしようか。出るだけ出るか。う〜ん。




色々他にもやりたい事があるからバランスが難しい。
もっと能力が高ければ色々手を出しても大丈夫なんだろうけど。
他の開発者の方々では、結婚しててお子さんもいる人はなかなか開発時間が取れなくて、強くするのは大変らしい。
やっぱり開発時間は正義。みんな時間の捻出から真剣に考えている。




最近思う事として、Aperyを公開したのは本当に良かったと思う。ソフトウェアは使われてなんぼ。
コンピュータ将棋が進歩しているのが、大会後に公開されるソフトが毎回どんどん強くなっている事で、
皆さんに肌で感じて貰えたのは良いことだと思う。
最初に公開したApery電王戦FINAL版と比べて、最新版は99%くらい勝つんじゃないだろうか。(実験してないけど。)




ただ、Aperyを公開してライブラリ登録してから、大会でそれを使えば簡単に勝てるのは競技としてどうかという意見がある。
しかし新しいアイデアを試すには最新の将棋ソフトが誰でも使えた方が良い。
コンピュータ将棋の発展と大会の発展が矛盾する可能性があるのは、ある意味仕方ないが、しかしどうにか出来ないかと思った。
とりあえず公開してからは、ライブラリ使ってるソフトには負けないように頑張って開発した。
ライブラリを使う事を否定するつもりは全然ないし、僕だって昔はBonanzaライブラリを使っていたし、
ライブラリを使っている人だってそこから独自の改良をいれようと努力しているのも知っている。
だけどまあライブラリ使えば勝てるという事だけは否定したかった。独自に強くしないと勝てない事、競技として成り立つ事を示したかった。
Aperyライブラリが使えた大会は、過去に3回。
第3回将棋電王トーナメント、第26回世界コンピュータ将棋選手権、第4回将棋電王トーナメント
これら全部でAperyライブラリ使ってるソフトには負けなかったし、頑張れば勝てるし競技として成立はすると言えるんじゃないかな〜って思って貰えたら嬉しい。




コンピュータ将棋は本当に本当に楽しい。大会の放送とか見て、楽しそうって思って興味持って貰えたら最高。
プログラミングに興味持って貰えたらもっと最高。大会に出ると多分さらに最高になれるよ。
将棋に興味持って貰えても嬉しい。将棋を指す人がいるから、将棋ソフトを作るモチベーションにもなるのだ。




これからコンピュータ将棋はどんな風に強くなるのか?新しい画期的なアイデアは生まれるとしたらそれはどんななのか?
自分が今後頑張るかは分からないけれど、今後どんな進歩を遂げるかとっても楽しみ。
まだまだ強く出来る鉱脈は残っていると思うし、今からコンピュータ将棋を始めてもきっと遅くないし、楽しめる所は沢山あると思うから、
コンピュータ将棋開発をやってみるか迷っている人がいるなら、是非最初の一歩を踏み出して欲しいなと思う。

チャリティーオークションで決まったお名前は

命名権のチャリティーオークションでまさかの891000円という高額にて落札して頂きました!
http://page12.auctions.yahoo.co.jp/jp/auction/p522903971


そして第4回将棋電王トーナメント出場時のお名前は、


「浮かむ瀬」(読み:うかむせ)


となります!
高額なので企業かと思いきや、個人の将棋好きのお方でした。
お名前についてもう少し詳しく電王トーナメントのPR文書にも書きました。
トーナメント前には公開されるでしょう。
せっかく決めて頂いたお名前、少しでも多く呼ばれる事があるように頑張るぞ!優勝するぞ!
よろしくお願いします!!

今年も第4回将棋電王トーナメントでのAperyの命名権をチャリティーオークションするよ!

題名の通りです!
8月11日の24時頃に締め切りなので、皆さん奮ってご入札して下さい!
http://page12.auctions.yahoo.co.jp/jp/auction/p522903971

第26回世界コンピュータ将棋選手権に行ってきた。

第26回世界コンピュータ将棋選手権が終わった。

なんだかめっちゃ楽しかった。
ちょっと楽し過ぎてびっくりした。


・選手権までの開発
開発続けるのしんどくて映画(TSUTAYAで借りたDVD or Blu-ray)ばかり観ていた。
20本以上観た。友情や家族愛がテーマの映画が好き。
だらだら何とか開発する中で、探索をちまちま書き換えて強くした。
評価関数は色々変えてみて実験した。
金と成金を区別して学習したり、
nozomi風に同じ方向に移動出来る駒でまとめて学習してみたり、
floodgateの棋譜を大量に使ってみたり。
でもそれらで強くはならなくて、結局L2正則化に変えて追加学習して52%程度勝てる微妙な出来のものしか出来なかった。
これなら探索だけをやってた方が効率良かったな。まあでも仕方ない。
もう3駒関係の次元下げだけでは限界に近いって気持ちになれたのが成果だ。


クジラちゃんのスレーブがめっちゃ強い事を選手権直前に知った。
Stockfish7ベースにAperyを書き換えたものらしく、
結果としてはその方針の方が早く成果を出せたか。
僕は一つ一つどの変更がどれだけ強くなるか検証しながら、強くならないものは取り入れないようにして変更してた。
やる気の問題もあって、選手権までに counter_move を入れる事が出来なかったし、まあ探索性能で負けても仕方ないか。
クジラちゃんのスレーブが探索だけで7割以上勝てるようにしてるとは思ってなかった。すごい。伸び代の存在を知る事が出来て有り難い。


一次予選の日の朝にやっとリモートマシンでAperyが動くようになった。
やってみればssh呼び出すプログラム書くだけだったので3行程度で済んだ。


合議は決勝までに作ろうと思ってたけど面倒なのとやる気がないのと眠いのとで出来なかった。
結局 AWS c4.8xlarge の 18コアマシン1台で戦う事になった。
これでも1600万〜2800万NPSくらいは出るから結構強くなったはず。Core i7 にはマシン性能差だけで7割以上は勝てるはず。


・選手権前日
選手権前日は普通にお仕事に行った。まだリモートマシンを使って対局する仕組みは準備出来てなかったが、まあ調べれば何とかなると思った。
Twitterで楽しそうな選手権準備の様子が見られた。


・一次予選
会場に行くのが楽しみだった。
今回はなんか戦いよりも、久しぶりに皆さんにお会い出来る事の方が楽しみだった。
Aperyはシードだから関係ないけど、Aperyなどのライブラリを利用したソフトが多く、
非常に厳しい一次予選だった。nozomiが一次予選敗退するとは。
nozimiも電王トーナメントバージョンに8割勝つらしいから、運とマシンパワーが足りなかった感じだ。


帰りに一緒にいるみんなでご飯に行った。こういうのも開催地によってはやりにくくて、
川崎の会場はとても良いと思った。


・二次予選
Aperyもここで敗退は十分あると思った。
結局学習用途に借りてたAWSのスポットインスタンスをそのまま使った。
価格は変動制で、入札しておく仕組みなのだが、いきなりシャットダウンされないように大会では入札価格を非常に高くしておくか、
そもそもスポットインスタンスを使わないようにする事で安定稼働させるのが望ましい。
また、応答性を高める為に出来るだけ東京に近い位置にあるマシンを借りるのがなお良い。
僕は設定を変えるのが面倒だったのと、アメリカのサーバーでもそれなりに応答速度も保てていたのと、かなり価格が安定していた事もあり、
上限0.8ドルなんていう安過ぎる価格で入札したままで本番を迎えた。
実際の価格は0.3ドル付近で推移していた。
意識が低過ぎたので次回以降はきちんとしたい。


AWAKEに3年振りに勝てた。AWAKEは二次予選落ちしてしまったが、AWAKEも半年前のAperyに7割程度勝てるらしく、十分強い存在だった。
ただLazy SMPを実装していないらしく、ハードウェア面でもXeon勢に劣っていたのが厳しかったのかなと思った。


NDFに負けた。壁銀の評価がAperyは上手く出来てない感じ。
NDFは結構今年開発サボってたので勝ち進むのしんどいって話だった。
サボると如実に結果に表れてくるから厳しい世界だよね。


大将軍と戦った時は謎の飛車バサミにあってあっけなく不利になって負けた。
評価関数の精度上げたいな。大将軍には負けた事無かったのにな〜。
大将軍はお高いマシンを選手権に合わせて購入したらしく、マシン性能で負けていたが、
どれくらいマシン性能差はレーティングに表れるのだろう。Xeon18コア(Apery)とXeon24コア(大将軍)。


技巧はLazySMPは実装しているがそれ以外ではレーティング10点しか伸びて無くて、クラスタの伸びがほとんどみたい。
意外と単体の差は小さいのかも。
技巧とPonanzaには負けても悔しいとすら思わなくなっている。
それはそれで選手権では人と会うのが楽しみだったし、そういう楽しみ方もありかも知れないけれど、
もう一度やる気出して追い付き追い越さないとなあ。


激指が強化学習になっているらしく、棋風が全く異なるとの事だったが、
対局してないし、確認していない。あまりお話できていないが、Aperyがライブラリでキツいというような事を鶴岡さんに言われた。


GPS将棋は現在ほとんど森脇さんだけで開発しているらしい。
GPSは選手権でAWAKEに相性が良い。偶然なんだろうけど。


YSSはアピール文書からは3駒関係をついに使った感じに思えたけれど、詳しく聞く事が出来なかった。
決勝にはYSSも激指もGPSも残らなかった。大きく顔ぶれが変わった。
Aperyは運良く決勝には残れた。本当に運の要素が大きい。


技巧がPonanzaを破って、明日の決勝が非常に楽しみという感じだった。


この日も駅前で一緒に帰った皆でご飯に行った。


・決勝
クジラちゃんに勝てた。Aperyの方が単体では弱いはずだけれど、クラスタ性能的にあんまり不利にはなってないのかも知れない。
クジラちゃんは浅い探索してオーダリングしてから良いマシンに良さそうな手を優先させて読ませると良いと思った。
ponderも無いようだし。


技巧は半年前の反省から、Aperyみたいに定跡に点数をつけて一定以下の点数の定跡は使わないようにしたらしい。
その点数を付ける為に30手読みしているらしく、すさまじいと思った。
Aperyなんてそういう枠組みだけはあるのに今の定跡には面倒で点数付けてないから、意識の違いを思い知らされる。
その代わりAperyはワンサイドゲームから定跡作ってるから相対的にマシなんだけど。


何と保木さんが現れた。
少し話せた。昨日の結果とかは全く知らなかったようで、
山下さんや鶴岡さんなどいなくて、昨日だったら棚瀬さんも来てたという事を伝えたら、
昨日来たら良かったとおっしゃっていた。


NDFに初めて勝てた。おそらく今回が一番レーティングが離れていなかったと思うから、何とか初めて勝てて良い思い出になった。


最終局の相手は大将軍。この将棋は非常に難解で、どうやってAperyが攻めるのかと見守っていた。
攻め合いになった時は玉形からApery優勢になったかと思ったが、勝てなかった。
終盤で大将軍が一気に大将軍有利と評価を出した時に、Aperyはどう評価しているか、Aperyのブースにいる人に聞いた時に
千田さんがハンドサインで✕印を作って伝えて下さったのがとても面白かった。めっちゃ分かりやすかった。
今回の大将軍は強かった。


Ponanza対技巧の優勝決定戦となる最終局、それまで全勝の技巧が乱戦でポッキリ折れた。
何だかWCSC22のGPS対Ponanzaの対局を思い出した。
Ponanzaは強かった。15年ぶりの連覇。おめでとう。


技巧の出村さん、オープンソース化を前向きに検討との事。素晴らしい。
これからどんどんコンピュータ将棋が発展していきそう!


千田さんと保木さんを囲む会が川崎駅前で開かれて、とても楽しかった。
幹事をnozomiの大森さんがやってくれて大変感謝。


(まだ適当に修正・追記するかもだけど一旦アップロード)

コンピュータ将棋6年目突入

ブログ完全に放置してた。。(´・_・`)
第3回将棋電王トーナメントは3位。
WCSC25バージョンに対して勝率70%程度。
電王戦FINALバージョンに対しては勝率85%程度はあるので、
まあ一年間の成果としては、他のソフトよりも伸びたと思う。
技巧の前では伸びも霞むけどね。


今年はコンピュータ将棋6年目。
この前の大会終わってからまだ全く強くしていない。
そろそろ前向きにならないとねー。

第3回将棋電王トーナメント直前!

「大樹の枝」で第3回電王トーナメント出場します。
PR文書が公開されています!
http://info.nicovideo.jp/denou/tournament2015/soft.html


大樹の枝のPR文書読んでみたら分かるけど、ペラッペラの内容です。
時間無かったんや。
9月末にエントリーして、10月初旬に提出することになってたので、全然時間ないのと、2ヶ月も前なので本番の自分のソフトがどんな形になるか決まってなかったのもある。


結局やったことは、
・NDF流の3駒関係による手番評価
・floodgateで一定以上のレーティングの棋譜を沢山集めて学習
・探索のどろどろした改善(細かすぎて書けないので大会後にコード見て。)
・玉移動時の評価関数の差分評価による高速化
・AVX2を使った評価関数の高速化
・王手生成(使うかは微妙)


とこんなもの。
強くはなったけど、常識の範囲内だ。。。


話は変わって、
PV撮影の時に技巧の出村さんが出場と聞いた時すごく嬉しかった。
3年前の選手権で会っただけだけど、当時は初出場同士で、二次予選で当たるも千日手で。
当時は短い開発期間でAperyよりきちんと作られていた印象で、すごいなーって思ってた。
翌年の第23回選手権には出ないって言っててそれっきりなのかと思ってたけど、
まさかこんなに強くなって帰ってくるとは!!
Ponanzaも技巧もめっちゃ強いけれど、それでも負けたくない。
まだ少しは時間あるから何とか勝率を少しでも上げて後は運まかせ。

命名権の結果、新しい名前は……

第3回将棋電王トーナメントでのAperyの命名権ヤフオク!のチャリティーオークションに出品しました!


http://d.hatena.ne.jp/hiraoka64/20150912/1442043350


そして決まった名前は……











「大樹の枝」(たいじゅのえだ)
です!!!






カッコイー!
ではでは、大樹の枝で優勝目指して頑張ります!!