2020-11-05 18:00:00

将棋ソフト開発 Week3 ~ 評価関数、探索部 その1 ~

プログラミングの勉強がてらに、将棋ソフト開発をしています。3週目となりました今回は評価関数と、探索部の開発を始めていきます。今回探索部はアルファベータ法を使い、評価関数はニューラルネットワークを使って作るものとします。3週目でやったこと、進捗報告、これからやることについて記載してきます。

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

目次

進捗報告

きふわらべさんに勝てるようになりました!

きふわらべさんの最新版がこれでいいかわからないですが、こちらからダウンロードさせていただきました。

ぐれーすけーる

なぎなぎ将棋は今の所3手の読み入れてるので、3手詰めまでは解けます!つよつよ!

3週目でやったこと

  • 探索部の実装
  • ニューラルネットワークの実装

ちょっと今回は忙しくて、記事をしっかり書いてる時間はなかったのでメモ書き程度に

探索部の実装

今回探索部はアルファベータ法を使っています。

はじめはネガアルファでやっていたんですが、ネガアルファだと評価値を出すときにちょっと困るときがありました。 ネガアルファは探索を進めていった局面の評価を常にその評価の盤面の手番のプレイヤーにすることで実装を単純にしています。

しかしそうすると、最終的に帰ってくる評価値が、自分の手番とは逆(相手の手番)で評価された評価値が帰ってくることがあります。 そうすると評価値を表示する上でちょっと困るかなと思い、常に最初に打った手番側の観点から評価するアルファベータ法を使うようにしました。

最善手を求めるだけであれば、ネガアルファでも構わないと思います。 もしくは後手番の評価を先手番に直すとかもできそうでもありますが。

というわけで一旦今は常に最初に打った手番側の観点から評価するタイプのアルファベータ法を使っています。

今の所3手先を読むのに5秒〜60秒くらいかかります。 本当は深さ4か5くらいまでは読めてほしかったのですが、、、

次の局面の生成時に毎回盤のインスタンスを作っていたり、合法手生成で時間を取っていそうでした。 ニューラルネットワークの行列積の計算のほうが時間がかかると思っていたので、このあたりは人間がわかりやすい実装や、バグが起きづらい実装を意識して作成しており、パフォーマンスはかなり犠牲にしていました。 その影響が出てしまったのかもしれません。

ニューラルネットワークの実装

今の所ピュアなJavaで実装しています。 入力層は01のスパースなベクトルにしているので、それ用の計算をしているので、そんなに計算量はないと思うのですが、2層以降は密になるので、若干計算量が多くなります。 それをピュアなjavaで計算するとやはり遅くはなりそうです。

ただ今の所ボトルネックはこの計算部分かと思いきや、合法手生成など探索部のコストのほうがボトルネックになっていそうでした。

ネットワーク構成

入力層: 1712 (盤上の駒の表現、+ 先手、後手の手番情報) 隠れ層1: 512 隠れ層2: 32 隠れ層3: 32 出力層: 1

というネットワークにしていました。

入力に手番は必要なのかどうか?

入力に手番情報を入れていましたが、将棋では手番が重要で、手番が変われば勝敗が変わることもあるので非常に重要なパラメータと思っていました。 ニューラルネットワークの入力に入れればこの手番の価値も学習してくれるだろうという意図で入れていましたが、これを入れると同一局面でも先手版か後手版かで最善手が異なるということが起きてしまいました。

本来同一局面であれば先手、後手にかかわらず最善手は同じのはず。 なので無駄に関数を複雑にしているだけかなーと、なので今度からは先手後手のパラメータは外してみようかと思います。

手番のパラメータを使わない場合は、つねに手番側からのみた盤の表現を入力として渡せば良い。つまり盤面を反転させて渡せば良さそうです。

学習

とりあえずランダム対局で作った、詰みと詰みの1手前の局面だけ20000局くらいを学習しました。 その結果持ち駒をもつとなんか無駄に王手をかけるようになってしまった気がします。。。

既存の強いソフトの棋譜と評価値を使えば強くなると思いますが、今後変則将棋とか学習させるとなると何もないところからの学習とかも必要になってくるので、どうしたら良いのかなぁと悩んでおります。

これから取り組むこと

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

  • 評価関数の作成
  • 探索部の改良

まだ学習もまともにやっていなかったりするので、しばらくは、評価関数、探索部周りの改良になるかと思います。