コンピュータ将棋ソフト開発のススメ
こんにちは、手塚規雄です。
今週末8日~10日に第4回電王トーナメントが開催されます。
http://denou.jp/tournament2016/
ニコニコ生放送はこちら。
初日:http://live.nicovideo.jp/watch/lv274667169
二日目:http://live.nicovideo.jp/watch/lv274667505
三日目:http://live.nicovideo.jp/watch/lv274671127
今日は電王トーナメントについて、ではなくコンピュータ将棋ソフト開発はプログラマーにオススメできるというコラムになります。
コンピュータ将棋ソフトといえば機械学習
機械学習により他のソフトを圧倒したBonanzaが第16回世界コンピュータ将棋選手権に優勝してからは、コンピュータ将棋ソフトの開発といえば機械学習という認識になり、ついにはプロ棋士に勝つまでの棋力を得ることができました。
今でも機械学習や強化学習がコンピュータ将棋ソフトの開発のメインと言っても過言ではありませんが、実際に開発に携わるとそれ以外の部分もなかなか興味深いものでした。
コンピュータ将棋ソフトは速度に対する追求
私は普段は業務システムの開発に携わっているのですが、運用上問題がなければ処理速度について気にすることがあまりありません。もちろん基礎的、初歩的な速度向上のアルゴリズムはできますし、致命的に遅くて問題が発生する場合にはアルゴリズムの見直しなども行います。言い換えると初歩的なものだけでシステム運用に問題なければチューニングなどは行いません。そんな私がコンピュータ将棋ソフトに関わると、かなり新鮮でした。
チェスソフトで使われ、将棋ソフトにも取り入れられている手法にBitBoardという手法があります。かんたんに説明すると、速度向上のためにわざわざ1マスを1bitでコマの利きを表したりするのです。昔COBOLをやっていたときにbit関係はお世話になったのですが、速度向上のためにここまで使われるのか?と正直驚きました。他の業界では使用されているのだと思いますが、業界システム開発においてbitでマスクをかけて速度向上なんて、まずやりません。1秒間にM(メガ)単位の局面数から最善手を選択するので0.1%でも速度の向上を目指し、結果大きな差となって、棋力向上に結びついてきます。
1つ1つは大したことのない基礎的なチューニングかもしれませんが、それをすべてに対して行っているので最初はソースを見たときには本当に驚きました。
自分の実装能力のなさを知って辛いけど
ソースコードを解析して今度は実装し始めてわかったのは、ボトルネックと思われる部分や修正したい部分がわかっても、どのように実装すれば速度向上するのか?がまったくわかりません。そして参考書となる本やサイトもほとんどない。だから単純に自分の実力がそのままでてしまう。そのために何もできずにモチベーションが下がることや自分の実力の無さを思い知る機会もたくさんありました。
それでも少しずつでも内容を理解したり、自分の作りたい方向へ近づけると大きな喜びになります。個人的には現在公開されているコンピュータ将棋ソフトの多くはソースコードはC++で作成されているので、C++をきちんと知っていればもっと楽に開発できたような気がします。
プログラマー以外の開発者が多いコンピュータ将棋
IT業界以外の人がコンピュータ将棋ソフトの開発をして、入賞するのは珍しくありません。プロ棋士になれなかった人、アマチュア強豪の人、なんとなくの興味から始めた人、そんな非プログラマーでも強いソフトが作れるのは、ひとえにソフト開発の情熱の大きさ、強さだと思います。つまり最初はプログラミングを知らなくても、超がつくほど頑張ればコンピュータ将棋ソフトを作るのはできるという事です。
じゃあ、コンピュータ将棋ソフトの開発はかんたんなのか?といえばNOだと思います。まず、トップクラスのソフトの開発者は24時間365日開発をしているのではないかと思うぐらい時間をかけています。開発者のTwitterをフォローするとその凄さを知ることができます。
次に機械学習や強化学習をしっかり学ぶには相応の学力と知識が必要となります。私も初歩的な本を読んでもあまり理解できませんでした。その理由に実装能力の問題もありますが、単純に学力的な問題があります。コンピュータ将棋ソフトで強豪ソフトの開発者はものすごく頭がいいです。学力、学歴、知力をしればなんとなくわかると思います。数学をちゃんと勉強しておかないと機械学習や強化学習は大変です。
最後に
私のように、ただ大会に出て満足レベルからガチな開発者まで一斉に勝負する大会というのは他にもありませんし、プログラミング大会というのも魅力的です。力試しをしてみたい方や単純な興味がある方は是非ともコンピュータ将棋ソフト開発をしてみてください。
------------------------------------------------------------------------------
コメント欄やTwitter(@noriwo_t)にて書いて欲しいコラムの題材をいつでも受け付けております。ただしその内容に応えられるかどうかはわかりません。基本的にコメント欄には私自身がコメントしないのですが、題材リクエストに関してはレスをすることもありますので、よろしくお願いします。