「たこっと」は,電王戦を見てコンピュータ将棋に興味を持った筆者らが, フルスクラッチで実装した (している) 将棋プログラムです。 Web 上の解説記事や論文,Stockfish, Apery, やねうら王, tanuki- (wcsc28 版), Bonanza 6.0 のソースコードを参考にしています。
以前のたこっとから引き継いでいる特徴については過去のアピール文書を参照してください。
以下のライブラリの最新バージョンを使用申請しています。
ライブラリを提供していただき,Apery の平岡様,やねうら王の磯崎様, tanuki- (wcsc28 版) の tanuki- 製作委員会様 (野田様、岡部様、鈴木様、日高様、那須様、河野様) には感謝いたします。
WCSC28 で tanuki- が CPU で計算するニューラルネットワーク型の評価関数で成果を上げました。
当時 KPPT 型の三駒関係のモデルでは強化学習しても棋力の向上が微々たるものになっており,新たなモデルを考えるのが急務となっていました。 ニューラルネットワーク化するという発想にいたっても,線形の三駒関係のモデルより計算速度が遅くなり,弱くなりそうという意見が多かったように思います。 そんな中,非線形のニューラルネットワークのモデルでも十分戦えることを示した tanuki- 製作委員会の皆さまの成果は素晴らしいの一言につきます。
というわけで,たこっとの評価関数もニューラルネットワーク化しました。 単純に tanuki- の真似をしても計算資源の乏しいたこっとチームでは強化学習競争に負けてしまいます。 新たな新天地を求めて特徴を KP 2 駒から別のものに変えました。
特徴名は KKPAR とします。
2019/05/17 更新
将棋の局面 (駒の配置) を評価する場合,以下を考慮する必要があります。
1. については金などの駒を考えるとわかりやすいです。金は斜め後ろに移動することができません。 先手側の金と後手側の金では移動可能な方向が異なるため,同じ駒であっても先後が異なる場合は別の特徴として扱う必要があります。
2. については駒当たりがある局面を考えるとわかりやすいです。手番がある側は相手の駒を取ることができます。 逆に手番がない側は相手に駒を取られてしまいます。そのため,手番の有無についても評価したほうが良さそうです。
これらを踏まえると評価モデルへ入力する特徴は以下の 4 種類の状態を表現できる必要があります。
従来のモデル (KPPT 型の三駒関係) では,上記の特徴を以下のように表現しなおした特徴を使用しています。
これらの特徴は以下の 2 種類のモデルを組み合わせて評価します。
この方法は精度よく局面を表現できる反面,メモリ使用量と計算量が 2 倍になってしまうという問題がありました。 計算量の多いニューラルネットワークではこの問題を看過できません。
そこで,先手と後手という表現をやめ,攻める側と守る側と表現することにしました。 先後と手番は一致しないため 4 種類の状態を表現する必要がありますが,攻守と手番は必ず一致するため 2 種類の状態だけを 表現すれば良いことになります。
具体的には 1 手毎に交互に 180 度回転させた盤面 (Alternate Rotating shogi board) から KKP を抽出します。 たこっとはこの特徴 (KKPAR) をニューラルネットワークに入力することで局面を評価しています。
ただし,この方法にも欠点があります。
将棋の局面は 1 手前から変化する部分が少ないため,KPPT 型の三駒関係では,前局面の評価値から現局面の評価値を差分計算することで評価速度を向上させていました。 速度アップは探索深さが深くなって棋力向上につながります。KKPAR では 1 手毎に盤面を 180 度回転させるため 1 手前から差分計算できません。
そこで,2 手前の局面から差分計算することで速度を向上させました。 思考開始時に現局面と 180 度回転させた局面の 2 つの局面の評価値を全計算します。1 手毎に両方の局面を差分計算し,それぞれの評価値を交互に返します。 モデルがニューラルネットワークになっているため,実際には入力層だけを差分計算しています。
また,探索時に手を進めたり戻したりできるように上位ノード局面の入力層の計算結果はキャッシュできるような構造にしました。
今のところ強くなってないため,誰の興味も引かないかもしれません...
以下に挙げるような近代的な機械学習の機能を一通り実装してあります。
最近 (2019 年 2 月末頃),新しい最適化手法が発表されました。
AdaBound と AMSBound と呼ばれるものです。
以下に URL を上げておきます。
Adaptive Gradient Methods with Dynamic Bound of Learning Rate
これを実装予定ですが,PC のメモリが不足しており (ニューラルネットワークのモデルがメモリを大量に消費する),動作はさせられないかもしれません。
また,学習の効率アップとは質の良い教師データ作成と考え,いくつかの手法を実装しました。
2019/05/17 更新
Apery の評価関数バイナリを用いて約 25 億局面の教師データを作成しました。 このデータにおいて出現した KKP の特徴数は 7558668 でした。
KKP の特徴数 | 補足 | |
---|---|---|
全特徴 | 10064574 | = 81 * 81 * 1534,非合法な特徴 (駒の重なりやルール上許されない配置) を含む |
合法な特徴 | 8475500 | |
詰んでいる特徴 | 1944 | 合法な特徴に含まれる |
上表から詰んでいない合法な特徴のうち出現した特徴の割合は 7558668 / (8475500 - 1944) * 100 ≒ 89.2% となります。 約 11% の特徴は出現していないため,このデータを使って学習した場合,その特徴については何も学ばないことになります。 対局中にほぼ出てこない特徴だからどうでも良いという考え方もできますが,もし出てきてしまうとまともに評価できないことになります。 また,出現している特徴についても,だいぶ偏りがあると思われます (手抜きして特徴の出現割合を調査していないため推測です)。
少し話がそれますが,KPPT 型の三駒関係のモデルを学習するために約 100 億の教師局面が必要だという情報があります。 特徴数が KKP の約 19 倍ということを考慮すると 100 億ではだいぶ不足していると推測されます。 逆に対局時にはほぼ出現しない特徴がたくさんあるため,無駄にメモリを消費しているとも言えます。 KKPP とか KPPP とかの四駒関係のモデルも考案されていますが, 出現しない特徴が増加してメモリ効率が悪化するばかりで強くするのは難しいと推測されます。
出現する特徴の偏りを解消するために KKP の合法な特長が 1 つ以上含まれるようなランダム局面を生成するツールを作成しました。 このツールで作成した局面から対局を開始させて教師局面を作成しました。数億局面作成し,上記 25 億局面と混ぜた上で 後述する水増しをして学習したところ弱くなってしまいました...
対局しているところを眺めたところ変わった駒組などを覚えてしまったようです。 ランダムに駒を配置するのではなく対局で出現しそうな配置にするなどの工夫が必要だと考えられます。 大会参加時のモデルではこのツールで作った局面を学習に使用することはやめました。
KPPT 型の三駒関係のモデルを学習するとき Apery などの手法では学習局面に出現する特徴だけではなく 以下の局面に出現する特徴に対する重みも更新しています (ミラー位置の学習)。
これは将棋の駒の特性を考えると,少ない教師局面で効率よく学習するためには効果的な手法のように見えます。 しかし,モデルがニューラルネットワークの場合,入力層にだけしか適用できません。 入力層だけとはいえそれなりに効果があるようなのですが,中間層以降の層の扱いに不満が残ります。
そこで画像認識などで行われる教師データの水増しを行うツールを作成しました。 といっても教師局面を左右反転した局面を生成するだけのツールです。 KKPAR の場合 180 度回転した局面は意味がないため,左右反転だけを行います。 単純に計算すると教師局面を 2 倍に増やすことができます。
以下の 3 種類の学習方法のうち,どの手法が良いのかは検証できていません。 計算資源に余裕のある方に検証して結果を公表していただきたい...
大会参加時のモデルは 3. の手法で学習しました。