2020-11-16 18:00:00

将棋ソフト開発 Week4 ~ 自己対局してみる! ~

プログラミングの勉強がてらに、将棋ソフト開発をしています。4週目となりました今回は自己対局と、評価関数の部分にニューラルネットワークを使っているのでその解説をしています。4週目でやったこと、進捗報告、これからやることについて記載していきます。

これまでの記事はこちら 将棋ソフト開発 Week0 ~ 将棋アプリ開発始めます ~ | なぎなぎブログ将棋ソフト開発 Week1 ~ 将棋のコア部分を作る ~ | なぎなぎブログ将棋ソフト開発 Week2 ~ USIに対応する! ~ | なぎなぎブログ将棋ソフト開発 Week3 ~ 評価関数、探索部 その1 ~ | なぎなぎブログ

目次

進捗報告

今回は動画にしました! 軽く技術的な解説もしているのでよかったら見てください。

4週目でやったこと

  • 評価関数の修正
  • 探索部の修正

評価関数の修正

前回の記事で書きましたが、手番情報をベクトルに含めていたので、それをなくしました。 1712次元のベクトルだったのが1710のベクトルにしています。 学習ももちろんし直しです。

盤面のベクトル表現

1710次元のベクトルです。 このベクトルは0または1の2値のベクトルにしています。 動画でも少し触れていますがこのベクトルは疎なベクトルになるので、疎ベクトル・行列積は計算量を少なくすることができます。

1710次元のベクトルの各要素の意味ですが、下記のようにしています。

        // 先手持ち駒
        // 先手歩の持ち駒数: 19 、歩の数は18だが、持っていないも含めているので18ではなく19である
        // 先手香の持ち駒数: 5パターン
        // 先手桂の持ち駒数: 5
        // 先手銀の持ち駒数: 5
        // 先手金の持ち駒数: 5
        // 先手角の持ち駒数: 3
        // 先手飛の持ち駒数: 3

        // 後手歩の持ち駒数: 19
        // 後手香の持ち駒数: 5
        // 後手桂の持ち駒数: 5
        // 後手銀の持ち駒数: 5
        // 後手金の持ち駒数: 5
        // 後手角の持ち駒数: 3
        // 後手飛の持ち駒数: 3


        // 先手盤上の駒
        // 先手歩の位置のパターン 81, 81マスあるので81である
        // 先手香の位置のパターン 81
        // 先手桂の位置のパターン 81
        // 先手銀の位置のパターン 81
        // 先手金の位置のパターン 81
        // 先手角の位置のパターン 81
        // 先手馬の位置のパターン 81
        // 先手飛の位置のパターン 81
        // 先手竜の位置のパターン 81
        // 先手玉の位置のパターン 81

        // 後手歩の位置のパターン 81
        // 後手香の位置のパターン 81
        // 後手桂の位置のパターン 81
        // 後手銀の位置のパターン 81
        // 後手金の位置のパターン 81
        // 後手角の位置のパターン 81
        // 後手馬の位置のパターン 81
        // 後手飛の位置のパターン 81
        // 後手竜の位置のパターン 81
        // 後手玉の位置のパターン 81
        // 合計1710パターン

ちなみに、コンピュータ将棋では、KP(玉(K)とその他の駒(P))の関係を入力にすることもありますが、今回は上記のように単純に盤面をベクトル表現にしたものを採用しています。 KPの場合は 81 * 1548 = 125,388 次元のベクトルになります。 1548は玉以外の駒の位置を表しているので、上記の1710のパターンから玉の位置の情報を抜いたベクトルと等しいです。

125388次元のベクトルだと、評価関数が大きくなってしまうので、今回私が作ってるものは入力は1710次元で試しています。 1710次元で良い結果が出るのかはまだ不明です。やってみないとわからないですね。

探索部の修正

探索部というか、データ構造の修正になりますが、盤情報のクラスをイミュータブルにしていた関係上探索するたびに毎回新しい盤情報インスタンスを作る必要がありました。 毎回インスタンスを作るのにはコストがかかるので、副作用を許容するようにして、指してを作用させると盤が同一インスタンスで変更されるようにしました。 戻すときはundoで盤面を戻します。

現実世界の将棋を例にすると、局面ごとに新しい盤を持ってきて、その局面を再現する盤を作る(局面の数だけ将棋盤が必要)という作業をやめて、 継ぎ盤1つで探索局面を進めていくようにした。という感じです。 毎回新しい将棋盤を用意してたときに比べたら、空間計算量(メモリ)的にも、処理量的にも減っていると思います。

その結果、 3手先の読みまではすぐに結果を返せるようになりましたが、やはり5手先などまで読ませようとするとだいぶ時間がかかります。

思ったよりも深く読むことができず、既存のトップの将棋ソフトはすごいなと思って、ツイッターでつぶやいた所なんとやねうらおさんに拾っていただき、ブログで言及していただけました。

どうすれば少ない探索量で深くまで読めるようになりますか? | やねうら王 公式サイト

指し手オーダリングが重要とのことで非常に勉強になります。 このあたりは今後の課題として改善していこうかなと思っています。

これから取り組むこと

これから5週間目(week5)で取り組むことについて

そろそろ挫折気味! っていうことで、気分切り替えてフロント側でもやろうかなと思います。 アプリでもいいけど一旦Webで作ろうかなと思います。 その準備をするって感じですかね。

あまり時間トレなさそうなので、進捗はあまりなくなってしまうかも。。。

とりあえずがんばります。