TadaoYamaokaの開発日記

個人開発しているスマホアプリや将棋AIの開発ネタを中心に書いていきます。

将棋AIの実験ノート:Fixup Initialization

深いResNetの訓練では、勾配爆発が起きる。そのため、Batch Normalizationを使用するのが一般的である。

Leela Chess Zeroでは、Batch Normalizationの統計情報に関連する問題が報告されている。
Pawn promotion issues in T40 · Issue #784 · LeelaChessZero/lc0 · GitHub

具体的には、訓練時の正規化はバッチ単位で行われるのに対して、推論時は訓練時の移動平均が使用されるため、頻度の少ない局面では、推論時にチャネルの出力が0になるケースがあるという問題である。
将棋でもそれに該当する具体的な局面があるかは調べられていない。

Leela Chess Zeroでは、Batch Renormalizationを採用することで、対処を行っている。
Test40 update - Leela Chess Zero


一方、KataGoでは、Batch Normalizationを使用するのをやめて、Fixup Initializationを採用している。
KataGo/KataGoMethods.md at master · lightvector/KataGo · GitHub

Fixup Initializationは、適切な初期値を設定することで、Batch Normalizationがなくても勾配爆発を解消するという手法である。
詳しい理論は、論文を参照いただくとして、以下の通りResNetを変更して、初期値を設定を行う。

  1. 分類レイヤーと各残差ブランチの最後のレイヤーを0に初期化する。
  2. 標準的な方法(He et al.(2015)など)を使用して1つおきのレイヤーを初期化し、残りのブランチ内のウェイトレイヤーのみをL^{-\frac{1}{2m-2}}でスケーリングする。
  3. すべてのブランチにスカラー乗数(1で初期化)とスカラーバイアス(0で初期化)を、各畳み込み、線形、および要素ごとのアクティブ化レイヤーの前に追加する。

重要なのは、2.で、1.、3.は訓練のパフォーマンスを向上する。

論文では、CIFER-10とImageNet、翻訳タスクでの実験結果が報告されており、CIFER-10とImageNetでは、Batch Normalizationより若干精度が下回っているが、KataGoでは、Batch Normalizationと同等のパフォーマンスを再現できたそうだ。


Batch Normalizationがなくなると訓練速度を大幅に向上できるため、dlshogiでもFixup Initializationの効果があるか試してみた。

実装

論文著者によるPyTorchの実装を参考にした。
GitHub - hongyi-zhang/Fixup: A Re-implementation of Fixed-update Initialization

始めswishのモデルに適用したら、まったく学習できなかった。
活性化関数は、ReLUである必要があるようだ。

論文は出力層の全結合の重みとバイアスを0で初期化するとあるが、policyとvaueの出力層にも畳み込みがあるため、それらを0で初期化したところ、valueが全く学習できなかった。
そこで、出力層はvalueの最終層の全結合のみ0で初期化した。

測定方法

dlshogiの強化学習で生成した60,911,062局面で訓練し、floodagteからサンプリングした856,923局面でテストした。

MomentumSGD、学習率0.01、WeightDecay0.0001でResNet10ブロックのネットワークを訓練した。

結果

訓練損失
訓練平均方策損失 訓練平均価値損失
Batch Normalization 0.68084329 0.38440849
Fixup Initialization 0.70152103 0.39291802
テスト損失
テスト方策損失 テスト価値損失
Batch Normalization 0.97448369 0.54640203
Fixup Initialization 0.97963965 0.54785213
テスト正解率
テスト方策正解率 テスト価値正解率
Batch Normalization 0.42880582 0.70676383
Fixup Initialization 0.42871940 0.70434300
考察

Fixup Initializationでも、安定して学習できることが確認できた。
Batch Normalizationと比較すると、精度は落ちている。

収束するまで学習した場合に、どうなるかまでは確認できていない。

まとめ

Batch Normalizationをなくすと訓練速度を大幅に短縮できるというメリットがあるため、dlshogiの学習でFixup Initializationの効果があるか試してみた。
結果、Fixup Initializationで安定して学習できることが確認できた。
しかし、Batch Normalizationと比べると少し精度が落ちることがわかった。

収束するまで学習した場合や、対局しての強さについては別途確認したい。

将棋AIの実験ノート:最大手数で引き分けの局面を除外

dlshogiの強化学習では、最大手数(320手)に達した局面の価値を0.5として学習対象としている。

補助タスクの学習の際に、教師データを調べていた際に、あと数手で詰みの局面で引き分けになっている局面が含まれていることに気付いた(これまであまりチェックしていなかった)。

ほぼ勝ち(or負け)の局面を引き分けで学習すると、価値の精度に悪影響がありそうなので、除外した方がよさそうなので、引き分けも学習した場合と除外した場合の精度を比較してみた。
結論から言うと、ほとんど変わらなかったが、記録として残しておく。

除外方法

強化学習で教師データを作り直すのは時間がかかるので、生成済みの教師データから最大手数に達した引き分けの局面を除外した。
なお、dlshogiで使用しているhcpeフォーマットは、局面を対局と紐づけずに記録しており、候補が1手のみの局面やリーグ戦の対局では局面が数手飛びになっている。
局面の差分が小さいかで対局か判定して、最後のevalが0の場合は千日手として残して、それ以外を除外するようにした。
除外用コード(千日手入玉を補助ターゲットとする処理も含む):
ElmoTeacherDecoder/hcpe_to_hcpe2.cpp at master · TadaoYamaoka/ElmoTeacherDecoder · GitHub

比較方法

引き分けを除外する前の局面を学習した場合と、引き分けを除外した場合を学習した場合を比較した。
引き分けを除外すると学習局面が少なくなるが、それでも精度が高くなるようであれば除外した方がよいと言える。

比較結果

約1億局面に対して、引き分けを除外すると局面数は以下の通りとなった。

引き分け 訓練局面数
あり 60911062
なし 60679983

0.379%が引き分けの対局の局面であった。

訓練損失
引き分け 訓練平均方策損失 訓練平均価値損失
あり 0.68108568 0.38443670
なし 0.68366737 0.38153932
テスト損失
引き分け テスト方策損失 テスト価値損失
あり 0.97650576 0.54598011
なし 0.97590881 0.54592327
テスト正解率
引き分け テスト方策正解率 テスト価値正解率
あり 0.42818923 0.70668091
なし 0.42822660 0.70638313

ほぼ誤差の範囲である。

初期局面集を序盤のみにして生成したデータでも比較した(上記の初期局面は終盤まで含む5億局面を使用)。

引き分け 訓練局面数
あり 5709861
なし 5699771

0.176%が引き分けの対局の局面であった。

訓練損失
引き分け 訓練平均方策損失 訓練平均価値損失
あり 0.92409930 0.50431182
なし 0.92570610 0.50405253
テスト損失
引き分け テスト方策損失 テスト価値損失
あり 1.14031462 0.62040876
なし 1.14162646 0.61995558
テスト正解率
引き分け テスト方策正解率 テスト価値正解率
あり 0.36368881 0.65681287
なし 0.36326607 0.65728349

こちらも、ほぼ誤差の範囲である。

まとめ

最大手数に達した対局を除外してもしなくても大差ないということが確認できた。
全体に対する割合は、0.4%未満であるためほとんど影響がないのだろう。

将棋AIの進捗 その55(勾配クリッピング)

dlshogiを初期値から学習を開始すると、lossがinfやnanになる場合がある。
初期値からの学習以外でも勾配爆発を防ぐために、勾配クリッピングのオプションを追加した。

KataGoでも勾配クリッピングを追加している。学習が安定してからは特に効果はないようだ。

勾配クリッピングにより同じデータを学習した場合に結果が変わるか確認した。

勾配クリッピング

PyTorchのclip_grad_norm_を使用する。
これは、勾配のノルムが閾値以下になるようにクリッピングを行う。
値でクリッピングするよりも勾配の方向が変わらないから良いのだとか、大差ないとか*1

なお、AMPを使用している場合は、クリッピングを適用する前にスケールを戻す必要があるので注意が必要である。
Automatic Mixed Precision examples — PyTorch 1.10 documentation

測定方法

dlshogiの強化学習で生成した8,939,266局面を使用して、初期値から学習する。
テストデータには、floodgateのレート3500以上の対局の棋譜からサンプリングした856,923局面を使用した。

測定結果

訓練損失
勾配クリッピング 訓練平均方策損失 訓練平均価値損失
なし 0.91759841 0.41159116
max_norm=2 0.96313657 0.41694899
max_norm=10 0.91871473 0.41199293
テスト損失
勾配クリッピング テスト方策損失 テスト価値損失
なし 1.04227679 0.58552035
max_norm=2 1.05631246 0.58615224
max_norm=10 1.04086553 0.58512790
テスト正解率
勾配クリッピング テスト方策正解率 テスト価値正解率
なし 0.38140064 0.67416036
max_norm=2 0.37752943 0.67332306
max_norm=10 0.38164004 0.67416620
考察

max_norm=2は、なしに比べて学習が遅くなっている。
max_norm=10となしはほとんど変わっていない。

まとめ

初期値からの学習を安定化させるため勾配クリッピングを試した。
小さめの値にすると学習が遅くなることがわかったため、通常の学習に影響がない適当な値(10くらい)に設定しておくことにする。
KataGoでは学習率に合わせてスケーリングしているが、そこまでの調整は必要ないだろう。

将棋AIの実験ノート:方策の分布を学習

一般的な方策勾配法では、選択した行動aに対して、損失を計算するが、
\displaystyle
l_{policy} = - \log p(a)
AlphaZeroでは、方策の損失は、探索から求めた方策の確率分布\pmb{\pi}を使用している。
\displaystyle
l_{policy} = - \pmb{\pi}^\top \log \mathbf{p}

dlshogiでは、前者をベースにしたActor-Criticで更新を行っている。
後者の確率分布を学習する場合と、どちらが良いのか比較してみた。

実装

損失関数

選択した行動を学習する場合は、方策がソフトマックス関数で、出力がロジットの場合は、PytorchのCrossEntropyLossを使用して損失が計算できる。

確率分布を学習する場合は、組み込みの損失関数がないため、以下のように損失関数を定義した。

def cross_entropy_loss_with_soft_target(pred, soft_targets):
    return torch.sum(-soft_targets * F.log_softmax(pred, dim=1), 1)
教師データ

方策の確率分布が教師データに必要になるため、dlshogiで使用しているhcpeフォーマットでは対応できない。
また、合法手ごとの訪問回数を記録するため、局面により合法手の数が異なるため可変長フォーマットになる。
hcpeを拡張して、以下のようなフォーマットにした。

HuffmanCodedPosAndEval3 = np.dtype([
    ('hcp', dtypeHcp),
    ('eval', dtypeEval),
    ('bestMove16', dtypeMove16),
    ('result', np.uint8),
    ('seq', np.uint8), # 開始局面からの手数/2(今のところ使わない)
    ('candidateNum', np.uint16),
    ])
MoveVisits = np.dtype([
    ('move16', dtypeMove16),
    ('visits', np.uint16),
    ])

MoveVisitsはcandidateNumの数だけ繰り返す。
可変長フォーマットの場合は、今までの固定長のようにディスク上のデータすべてをメモリにそのまま読み込んで使用することができないので、シーケンシャルに読み込む処理が必要になる。
その場合は、開始局面のhcpと指し手のみ記録した方がデータサイズを節約できる。
また、resultを全局面に記録する必要もなくなるので、フォーマットはもう少しスリムにできる。
とりあえず実験したかったので、上記のような冗長なフォーマットになっている。

測定方法

強化学習で新たに教師データを生成するには時間がかかるため、方策の分布が記録されているAobaZeroの棋譜を使用した。
棋譜はarch000015000000からarch000015190000を使用し、合計19,695,636局面を学習した。

テストデータには、floodgateのレート3500以上の対局の棋譜からサンプリングした856,923局面を使用した。

比較対象のActor-Criticは、dlshogiで使用している式を使用した。
これはエントロピー正則化も含んでいる。

分布を学習する場合は、エントロピー正則化は行わない。

比較結果

訓練損失
訓練平均方策損失 訓練平均価値損失
Actor-Critic 0.90724320 0.58483684
分布を学習 1.97043909 0.58462431
テスト損失
テスト方策損失 テスト価値損失
Actor-Critic 0.98559491 0.57659638
分布を学習 0.93136043 0.56870430
テスト正解率
テスト方策正解率 テスト価値正解率
Actor-Critic 0.40432432 0.68084011
分布を学習 0.41709992 0.68707843
テストエントロピー
テスト方策エントロピー テスト価値エントロピー
Actor-Critic 1.67369065 0.60195279
分布を学習 1.82972054 0.59813645
考察

方策の訓練損失は式が異なるため直接は比較できない。
テスト損失は、dlshogiの損失計算に合わせている。
テスト損失、テスト正解率どちらも、分布を学習した方が、方策、価値どちらも良い値になっている。
ただし、価値については初期値の影響による誤差の範囲かもしれない。

また、方策のエントロピーが分布を学習した方が高く、より偏りの少ない方策になっていることがわかる。

まとめ

方策をActor-Criticで学習する場合と、探索後のルートノードの訪問数を使用した確率分布を学習する場合の比較を行った。
実験結果から、方策は分布を学習した方がよさそうということがわかった。

結果を受けて、dlshogiの強化学習でも分布を学習可能にする予定である。
教師データのフォーマットの見直しから行うことにする。

BoostでZlib Filtersを有効にしてビルドする

C++で、gzipの圧縮解凍を標準ストリームで行いたかったので、ライブラリを調べたところ、Boost.IostreamsZlib Filtersを追加することで対応できることがわかった。

しかし、Windowsではデフォルトでは有効になっておらず、「conda install -c conda-forge boost」のビルド済みパッケージにも含まれていない。
そのため、ソースからビルドする必要がある。

この記事では、zlibを有効にいsてビルドする方法について記す。

Windows

boostダウンロード

boostをダウンロードする。
https://www.boost.org/

適当な場所に解凍する(以下、boost_1_75_0をC:\に解凍したとして記述する)。

zlibのソースダウンロード

zlibのソースをダウンロードする。
https://zlib.net/

適当な場所に解凍する(以下、zlib-1.2.11をC:\に解凍したとして記述する)。

boostビルド

b2コマンドの引数「-s ZLIB_SOURCE=」にソースのパスを指定してビルドする。
以下は、staticリンクライブラリをビルドする例。

cd boost_1_75_0
bootstrap
b2 toolset=msvc threading=multi variant=debug,release link=static runtime-link=static address-model=64 --stagedir=stage/x64 -j 8 -s ZLIB_SOURCE="C:\zlib-1.2.11"

なお、Boost.Pythonを有効にするには、ビルド前に「C:\Users\\user-config.jam」に、以下のように記述しておく。

using python : 3.8 : C:\\Users\\kei\\anaconda3\\python ;

マニュアルには、user-config.jamにuse zlibの記述が必要なように書かれているが、必要なかった。

Ubuntu 18.04

Linuxではデフォルトでzlibが有効になっている。

conda install boost

でインストールしたboostで使用できる。
libboost_iostreamsに含まれるので、libboost_zlib相当は必要ない。

コード例
#include <iostream>
#include <fstream>

#include <boost/iostreams/filtering_streambuf.hpp>
#include <boost/iostreams/filter/gzip.hpp>

int main() {
	std::ifstream ifs("a.gz", std::ifstream::binary);
	if (!ifs) return 1;

	boost::iostreams::filtering_streambuf<boost::iostreams::input> filter;
	filter.push(boost::iostreams::gzip_decompressor());
	filter.push(ifs);

	std::istream stream(&filter);
	char buf[256];
	stream.read(buf, sizeof(buf));

	for (size_t i = 0; i < sizeof(buf); ++i) {
		std::cout << std::hex << (unsigned int)(unsigned char)buf[i] << " ";
	}
	std::cout << std::endl;
}
ビルド例
g++ -I$CONDA_PREFIX/include -L$CONDA_PREFIX/lib a.cpp -lboost_iostreams

のようにboost_iostreamsをリンクする。

将棋AIの実験ノート:オフポリシー補正

強化学習において、サンプル効率が低いという課題の対処として、リプレイバッファを使用して過去の方策で生成したデータも学習に使用するということが行われている。
一般的に挙動方策(経験を蓄積する際の方策)と推定方策(学習する方策)が異なる場合をオフポリシーと呼ぶ。
逆に一致する場合をオンポリシーと呼ぶ。

方策勾配法などのオンポリシーの手法で、サンプル効率を高めるためにリプレイバッファを使用することは、経験的に破壊的に大きなポリシー更新につながることがある。

AlphaZeroの強化学習

AlphaZeroもリプレイバッファを用いておりオフポリシーで学習を行っている。
ただし、AlphaZeroはシミュレータ内で探索を行った結果を方策としており、いわゆるモデルベースの手法なので、オフポリシー/オンポリシーの分類は適切ではないかもしれない。

AlphaZeroでは、方策の分布を学習しており、Actor-Criticとは異なります。
分布を学習する場合には、オフポリシーでも適用可能は不明です。

dlshogiの強化学習

一方、dlshogiの強化学習は、分布を学習すると教師データのデータ量が増えるので、指し手のみを学習に使用している。
方策の学習則には、Actor-Criticを使用しており、これはオンポリシーの手法である。

オンポリシーの手法に、リプレイバッファを使用するのは問題があるのではないかと考えていたが、うまく学習できているのもあって、ちゃんと検証していなかった。
今回一度確認しておこうと思って、検証することにした。

オフポリシー補正

Actor-Criticをオフポリシーで使用するために、V-TraceやACER、PPOといったアルゴリズムがある。
ここでは実装が簡単なV-TraceとPPOを試すことにする。

V-Trace

V-TraceをActor-Criticに適用する際の方策の目的関数は以下の通り。
\displaystyle
\rho_s \nabla_\omega\log\pi_\omega(a_s|x_s) \big( r_s+\gamma v_{s+1} - V_\theta(x_s)\big) \\
ここで、
\rho_t=\min\big(\bar\rho, \frac{\pi(a_t|x_t)}{\mu(a_t|x_t)}\big)\bar\rhoは定数である。\piは推定方策、\muは挙動方策を表す。

参考:[1802.01561] IMPALA: Scalable Distributed Deep-RL with Importance Weighted Actor-Learner Architectures

PPO

PPOの目的関数は以下の通り。
\displaystyle
L^{CLIP}(\theta) = \hat{\mathbb{E}}_t \big[ min(r_t(\theta)\hat{A}_t, clip(r_t(\theta), 1-\epsilon, 1+\epsilon)\hat{A}_t) \big]
ここで、r_t(\theta)=\frac{\pi_\theta(a_t|s_t)}{\pi_{\theta_{old}}(a_t|s_t)}\epsilonは定数である。

参考:[1707.06347] Proximal Policy Optimization Algorithms

検証方法

強化学習を回すのは時間がかかるので、AobaZeroの棋譜を使用して検証することにする。
AobaZeroの棋譜には候補手の訪問回数が記録されているため、それを挙動方策の遷移確率に利用する。

AobaZeroの棋譜のarch000015000000 ~ arch000015090000を使用。
AobaZeroは、探索結果の行動価値が記録されていないので(最近は記録されている)、アドバンテージのベースラインは0とする。
テストデータにはfloodgateからサンプリングした943456局面(レート3500以上、50手以上の対局、30手目以降)を使用する。

検証結果

訓練損失
平均方策損失 平均価値損失
Actor-Critic 1.90775840 0.62536926
V-Trace 1.87498970 0.62457944
PPO -0.00017280 0.61246887
テスト損失
テスト方策損失 テスト価値損失
Actor-Critic 1.06661845 0.55477527
V-Trace 1.06576384 0.55451178
PPO 2854212034370635596562432.0 0.58852763
テスト正解率
テスト方策正解率 テスト価値正解率
Actor-Critic 0.40007314 0.72041744
V-Trace 0.40022049 0.72101849
PPO 0.00014841 0.67355092

V-Traceは、Actor-Criticよりも少しだけ良い値だが、ほぼ誤差の範囲である。
PPOは全く学習できなかった。


アドバンテージのベースラインに、学習時に推論した価値を使用するパターンでも試してみた。

訓練損失
平均方策損失 平均価値損失
Actor-Critic 0.75596953 0.62025761
V-Trace 0.74280808 0.62022987
PPO 0.05604221 0.61169946
テスト損失
テスト方策損失 テスト価値損失
Actor-Critic 1.10852726 0.55280487
V-Trace 1.10677386 0.55142957
PPO inf 0.59008008
テスト正解率
テスト方策正解率 テスト価値正解率
Actor-Critic 0.38780105 0.72076196
V-Trace 0.38771095 0.72095700
PPO 0.00033497 0.67275483

傾向は変わらない。


Actor-CriticとV-Traceの差がほとんどないので、訓練データを倍にしてみた。PPOは学習できないので除外。

訓練損失
平均方策損失 平均価値損失
Actor-Critic 1.75861482 0.61717799
V-Trace 1.74029188 0.61730657
テスト損失
テスト方策損失 テスト価値損失
Actor-Critic 1.02857797 0.52934007
V-Trace 1.02989807 0.52900566
テスト正解率
テスト方策正解率 テスト価値正解率
Actor-Critic 0.41769314 0.73888017
V-Trace 0.41761576 0.73889289

やはり差は誤差の範囲である。

まとめ

Actor-Criticのオフポリシー補正手法であるV-TraceとPPOを試した。
結果、Actor-CriticとV-Traceでほとんど違いは見られなかった。
AlphaZeroの自己対局では挙動方策はMCTSで探索した結果であるため、以前のパラメータで探索した結果と現在のパラメータで推論した結果で差がでにくいのかもしれない。
そもそもモデルベースなので、正確にシミュレーション可能なモデルがあればオフポリシーでも学習できそうである。

PPOはなぜか全く学習できなかった(実装の誤りの可能性もある)。

AlphaZeroと同じように分布を学習した場合についても別途検証してみたい。

将棋AIの実験ノート:Attention Branch Network

以前に、Mask-Attentionについて記事にしたが、同様の手法にAttention Branch Network(ABN)がある。
ABNは、Attention Branchの損失も計算して訓練する点がMask-Attentionと異なる。
f:id:TadaoYamaoka:20210129213306p:plain
ここでは、ABNをdlshogiのネットワークに適用して、AIが注視している座標を可視化してみる。

ネットワーク構成

policyブランチとvalueブランチそれぞれに、Attentionブランチを追加する。
policyブランチとvalueブランチは、元のネットワークから変更していない。
f:id:TadaoYamaoka:20210129220935p:plain
policy attention mapとvalue attention mapは、2Dの画像になっており、AIが注視している箇所を表す。

損失

policy attentionブランチの損失はソフトマックス交差エントロピーvalue attentionブランチの損失はシグモイド交差エントロピーとして、元のネットワークの損失に加算したものを全体の損失とする。

訓練

dlshogiの強化学習で生成した60,679,983局面を使用して訓練した。

可視化

訓練したモデルを使用して、いくつかの局面で可視化してみた。

初期局面

f:id:TadaoYamaoka:20210129222532p:plain:w300

policy attention map

f:id:TadaoYamaoka:20210129223155p:plain:w300

value attention map

f:id:TadaoYamaoka:20210129223225p:plain:w300

policyの予測は「2六歩」と「7六歩」が高いが、policy attention mapはその位置の値が低くなっている。
高くなるなら分かりやすいが、低くなっているので、値が何を示しているのか良くわからない。

逆に、value attention mapは、「2六歩」と「7六歩」の位置の値が高くなっているので、なんとなく注視している箇所を示していそうである。

サンプル局面

f:id:TadaoYamaoka:20210129223852p:plain:w300

policy attention map

f:id:TadaoYamaoka:20210129224157p:plain:w300

value attention map

f:id:TadaoYamaoka:20210129224224p:plain:w300

policyの予測は「3三桂成」が高いが、policy attention mapはその位置の値が低くなっている。
やはり値が何を示しているのか良くわからない。

value attention mapは、「3三」の値が高くなっている。
玉の周りも値が高いので、注視箇所を示していそうである。

精度

ABNは可視化とパフォーマンス向上を両立できる点に利点がある。
SENetでは、チャネル方向にAttentionの導入してパフォーマンスを向上している。
ABNでは画素方向にAttentionを適用している。

元のネットワークとABNを追加したネットワークで、精度を比較した。

訓練損失
policy平均損失 value平均損失
元のネットワーク(resnet+swish) 0.68139506 0.38120323
ABN 0.63697344 0.37672683
テスト損失

floodgateからサンプリングした棋譜で評価した際のテスト損失

policy損失 value損失
元のネットワーク(resnet+swish) 0.97505525 0.54548708
ABN 0.97899158 0.54168929
テスト正解率
policy正解率 value正解率
元のネットワーク(resnet+swish) 0.42881633 0.70599075
ABN 0.43730732 0.71036645

policyのテスト損失は良くなっていないが、正解率は高くなっている。
valueのテスト損失、正解率ともに、元のネットワークよりも良くなっている。

ソース

Attention Branch Network · TadaoYamaoka/DeepLearningShogi@d62f7c7 · GitHub

まとめ

将棋のニューラルネットワークにABNを適用することで、注視している箇所の可視化ができるか試してみた。
policy attention mapについては、値の意味が良くわからなかったが、value attention mapについては注視している箇所を示しているかもしれない。

AIが注視している箇所を可視化することで、初心者がどのあたりに注目して形勢を判断すればよいかのヒントに使えないかと思って試してみたが、これが役に立つかは将棋がわからないとよくわからないのであった・・・。