※ほぼ自分用の実験ノートです。
世界コンピュータ将棋選手権の少し前から、自己対局におけるノードの再利用とバッチサイズの変更(1024→2048)を行った。
250万局面の生成と学習を8サイクル行ったところ、技巧2に対して勝率が上がったため、大会には最新のモデルを使用した。
しかし、その後学習を続けたところ、valueの損失(floodgateの棋譜の勝敗に対する交差エントロピー)が一時的に下がったが、policyの損失が上がり続けるという結果になった。
valueの損失も上昇しだしたため、実験を中止した。
※173サイクルから変更
173サイクル以降、accuracyも徐々に低下した。
原因の考察
policyの損失が上昇し続けていることから、局所的な戦略を覚えてしまい新しい手を試さなくなってしまったと考えられる。
valueの損失が下がり続けているのは、わかりやすい局面での勝敗の予測精度が一時的に上昇したためと考えられる。
局所的な戦略を覚えてしまう状況では、policyの予測手が特定の一手に偏る傾向になると思われる。
そのことを確かめるために、floodgateの棋譜の局面をpolicyで予測した際のエントロピーを測定した。
エントロピーは、すべての手が均等に選ばれる場合に最大となり、特定の1手の確率が高くなる場合、低い値になる。
測定用コード
バッチサイズの影響
ノードの再利用とバッチサイズのどちらが影響しているかを確認するため、生成した同じ局面を使ってバッチサイズの1024で学習してみた。
エントロピーは、次のようになった。
174サイクルでエントロピーが上昇したが、その後低下している。
生成して学習のサイクルを回していないため、学習したデータ自体に偏りがあるため、自己対局のサイクルを回した場合も検証してみる予定。
このデータからは何が原因がよくわからない。
ノードの再利用が影響している可能性も高い。
ノードの再利用なしで、バッチサイズを2048にした条件でも検証してみる必要がありそう。
エントロピー正則化
強化学習でpolicyが特定の戦略に偏らないようにするには、エントロピー正則化という手法が使われるらしい。
スライド85
エントロピー正則化を行うことでpolicyの損失の上昇を抑えられるか検証してみた。
エントロピー正則化の実装
エントロピー正則化は、policyの損失に負のエントロピーを加えることで実現する。
そうすることで、エントロピーが高くなるように学習される。
つまり、特定の手に偏らなくなる。
policyの出力をとすると、エントロピーは、
で与えられる。
が小さい場合、が-infになるため、注意が必要である。
policyの出力がlogitsの場合、-infになることを回避できる。
logitsを使うと、エントロピーは、Softmaxの定義から、となるため、
で計算できる。は定数のため損失から削除しても問題ない。
※Cは定数にならないので間違っています。こちらの記事で、書き直しました。
負のエントロピーに、小さな係数を掛けて損失に加えると、損失は、
となる。
Chainerでは、次のように実装できる(合っているかあまり自信なし)。
loss = F.softmax_cross_entropy(y, t) + args.beta * F.mean(F.sum(F.softmax(y) * y, axis=1))
まとめ
ノード再利用もしくは、バッチサイズを大きくしたことにより、policyが偏る現象が起きた。
エントロピーを測定することで、policyの偏りを測定することができる。
エントロピー正則化によりpolicyの偏りを抑制できる。
ノード再利用、バッチサイズのどちらの影響かは今回の実験ではわからなかったため、追試を行う予定。
2019/5/12 追記
エントロピー正則化の係数を小さく(、バッチサイズ1024)して実験してみた。
エントロピーは以下のようになった。
エントロピーなしの場合とあまり変わっていない。
損失は以下のようになった。
2019/5/13 追記
として実験してみた。
損失は以下のようになった。