ゆるく(簡単に実装できて)ふわっとした(理論を使わない)評価関数の学習

はじめに

これは、

www.adventar.org

の12/19分です。nozomiというソフトでコンピューター将棋の大会に出ています。この前の第4回電王トーナメントでは1回戦負けでしたが、決勝トーナメントまで行けました。

 

コンピューター将棋は、ここ近年いろいろなフリーソフトや情報が出回ってきて、だいぶとっつきやすいものとなってきています。

だけれど、評価関数を自分で学習するとなると、機械学習が難しかったりマシンパワーを使ったりでとても大変です。

ここでは、強くするには役には立ちませんが、ゆるく(簡単に実装できて)ふわっとした(理論を使わない)学習で、楽しくコンピューター将棋の評価関数を作成してみます。

 

指せば指すほど強くなる?

機械学習って、詳しくない人からすると、「対局を繰り返していけば、コンピューターは学習していきどんどん強くなる」みたいなイメージのようです。

今回の方針として、「対局後にその対局を振り返り、学習をする」プログラムを目指してみます。 

基本的には、以下の感じでやってみようと思います。

  • プログラムはnozomiをベースに作成
  • 評価関数はnozomiで使用しているKPP(玉と任意の駒2つ)とKKPT(先後の玉と任意の駒と手番)
  • 対局相手は、「技巧」を使用する

    github.com

  • 対局は、秒読み0.1秒で、1局ごとに先後を入れ替える
  • 対局後、評価関数のパラメーターを更新する

 

褒めて伸ばす

結局、モノを教える場合の基本は褒めて伸ばすことだと思うんですよね。勝った局面に対して加点をしていけば、同じ間違いをなんども繰り返してしまう人間なんかと違って、コンピューターはどんどん学習して、良い手ばかり指すようになっていくんじゃないのかな。

というわけで、以下のような感じで、学習をしてみようと思います。

  • 先手が勝ったのなら、各局面のパラメーターに、+1加点する
  • 後手が勝ったのなら、各局面のパラメーターに、-1加点する

そんな感じで、10000局対戦して得られたパラメーターの結果がこんな感じです。

秒読み0.1秒で、3000局対局させてみました。 

f:id:saihyou:20161209153846p:plain

0対局後は、パラメーターが全て0の状態です。

 

うーん、これじゃあまり強くならないようです。ちょっと対局を見てみると、序盤の得点がすごいことになっています。

f:id:saihyou:20161209154915p:plain

 

?って伸ばす

ほめて伸ばすのはよくなさそうですので、叱って伸ばすことを考えてみます。

負けたのに自分に有利な点数をつけている局面があったら、叱って修正してあげましょう。また、勝ったのに自分に不利な点数をつけている局面も、同様に修正して行きましょう。以下のような感じです。

  • 先手が勝った場合、+の点数をつけていない局面に対して、各パラメーターに+1加点する
  • 後手が勝った場合、-の点数をつけていない局面に対して、各パラメーターに対して-1加点する

10000対局後の結果を見てみましょう。同じく、秒読み0.1秒で3000対局の結果です。

f:id:saihyou:20161209155350p:plain

いい感じです。もうちょっとやってみた結果は、こんな感じです。

f:id:saihyou:20161211205852p:plain

順調に強くなっているようです。

 

終わりに

最高の教師を用意したので、そこそこは強くなりましたが、でもまだ全然弱いです。今公開されているフリーソフトの数々には足元にも及びませんし、Bonanza6.0と対戦させてもまだまだ勝てません。

もうちょっと対局を続ければもう少しは強くなりそうですが、それも限界がありそうです。70000対局終了時点で、点数のついているパラメーターは約7%しかなかったので、局面をばらけさせるともう少し伸びしろはあるかなといった感じです。

技巧を教師としたのなら、出来れば技巧と同じくらいまだ強くなってほしいですが、そこを目指すならゆるふわより、難しい理論とか大量の棋譜とかが必要になりそうです。

そうでもないなら、それなりにどんなやり方でも、KKPとKPPの3駒関係を使う限り、そこそこ上手く行くのではと思っています。