TadaoYamaokaの開発日記

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

強化学習におけるバッチサイズとエントロピー正則化

※ほぼ自分用の実験ノートです。

世界コンピュータ将棋選手権の少し前から、自己対局におけるノードの再利用とバッチサイズの変更(1024→2048)を行った。
250万局面の生成と学習を8サイクル行ったところ、技巧2に対して勝率が上がったため、大会には最新のモデルを使用した。

しかし、その後学習を続けたところ、valueの損失(floodgateの棋譜の勝敗に対する交差エントロピー)が一時的に下がったが、policyの損失が上がり続けるという結果になった。
valueの損失も上昇しだしたため、実験を中止した。
f:id:TadaoYamaoka:20190510220606p:plain
※173サイクルから変更
173サイクル以降、accuracyも徐々に低下した。
f:id:TadaoYamaoka:20190510220918p:plain

原因の考察

policyの損失が上昇し続けていることから、局所的な戦略を覚えてしまい新しい手を試さなくなってしまったと考えられる。
valueの損失が下がり続けているのは、わかりやすい局面での勝敗の予測精度が一時的に上昇したためと考えられる。

局所的な戦略を覚えてしまう状況では、policyの予測手が特定の一手に偏る傾向になると思われる。
そのことを確かめるために、floodgateの棋譜の局面をpolicyで予測した際のエントロピーを測定した。

エントロピーは、すべての手が均等に選ばれる場合に最大となり、特定の1手の確率が高くなる場合、低い値になる。
測定用コード

エントロピーの測定

f:id:TadaoYamaoka:20190510231016p:plain
予測通り、173サイクル以降エントロピーは下がり続けていた(最後だけ少し上昇しているが)。

バッチサイズの影響

ノードの再利用とバッチサイズのどちらが影響しているかを確認するため、生成した同じ局面を使ってバッチサイズの1024で学習してみた。
f:id:TadaoYamaoka:20190510223118p:plain
エントロピーは、次のようになった。
f:id:TadaoYamaoka:20190510233437p:plain

174サイクルでエントロピーが上昇したが、その後低下している。
生成して学習のサイクルを回していないため、学習したデータ自体に偏りがあるため、自己対局のサイクルを回した場合も検証してみる予定。
このデータからは何が原因がよくわからない。

ノードの再利用が影響している可能性も高い。
ノードの再利用なしで、バッチサイズを2048にした条件でも検証してみる必要がありそう。

エントロピー正則化

強化学習でpolicyが特定の戦略に偏らないようにするには、エントロピー正則化という手法が使われるらしい。

www.slideshare.net
スライド85

エントロピー正則化を行うことでpolicyの損失の上昇を抑えられるか検証してみた。

エントロピー正則化の実装

エントロピー正則化は、policyの損失に負のエントロピーを加えることで実現する。
そうすることで、エントロピーが高くなるように学習される。
つまり、特定の手に偏らなくなる。

policyの出力を{\bf p}とすると、エントロピーH({\bf p})は、
H({\bf p}) = -\sum_i p_i \log p_i
で与えられる。
p_iが小さい場合、\log p_iが-infになるため、注意が必要である。
policyの出力{\bf y}がlogitsの場合、-infになることを回避できる。
logitsを使うと、エントロピーは、Softmaxの定義から、\log p=y - Cとなるため、
H({\bf p}) = -\sum_i p_i (y_i-C)
で計算できる。Cは定数のため損失から削除しても問題ない。
※Cは定数にならないので間違っています。こちらの記事で、書き直しました。

負のエントロピーに、小さな係数\betaを掛けて損失に加えると、損失は、
Loss(\theta)=Loss_{policy}(\theta)+\beta \sum_i p_i y_i
となる。

Chainerでは、次のように実装できる(合っているかあまり自信なし)。

loss = F.softmax_cross_entropy(y, t) + args.beta * F.mean(F.sum(F.softmax(y) * y, axis=1))
エントロピー正則化の効果測定

係数\betaを0.01として、上記と同じ局面を学習してみた。
エントロピーは以下のようになった。
f:id:TadaoYamaoka:20190510233727p:plain
エントロピーが上昇していることが確認できた。
しかし、損失は以下のようになり、policy、valueともに上昇している。
f:id:TadaoYamaoka:20190510233807p:plain

係数が大きすぎた可能性があるため、小さな係数で追試を行う予定。

まとめ

ノード再利用もしくは、バッチサイズを大きくしたことにより、policyが偏る現象が起きた。
エントロピーを測定することで、policyの偏りを測定することができる。
エントロピー正則化によりpolicyの偏りを抑制できる。

ノード再利用、バッチサイズのどちらの影響かは今回の実験ではわからなかったため、追試を行う予定。

2019/5/12 追記

エントロピー正則化の係数を小さく(\beta=0.0001、バッチサイズ1024)して実験してみた。
エントロピーは以下のようになった。
f:id:TadaoYamaoka:20190512000815p:plain
エントロピーなしの場合とあまり変わっていない。
損失は以下のようになった。
f:id:TadaoYamaoka:20190512001853p:plain

2019/5/13 追記

\beta=0.001として実験してみた。
f:id:TadaoYamaoka:20190513000819p:plain
損失は以下のようになった。
f:id:TadaoYamaoka:20190513001135p:plain