TadaoYamaokaの開発日記

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

dlshogiの学習則

dlshogiを改造して遊びたい方のために、dlshogiの学習則についてちゃんと書いてなかったので書いておく。

主に、学習部のソースtrain_rl_policy_with_value_using_hcpe_bootstrap.pyの解説になっている。

AlphaZeroの学習則

AlphaZeroの学習則は、
\displaystyle
l(\theta)=(z-v)^2 - \boldsymbol{\pi}^T \log \boldsymbol{p} + c \|\theta\|^2
となっている。
dlshogiではこれとは異なる学習則を使用している。

ルートノードの分布の使用有無

まず、AlphaZeroでは、MCTSのシミュレーション結果のルートの子ノードの訪問回数の分布(上式の\boldsymbol{\pi})を使用しているが、dlshogiでは分布ではなく指し手を使用している。
これは、学習に分布を使用すると学習データのサイズが大幅に増えてしまうので、データサイズを抑えたいという理由による。

Actor-Critic

dlshogiでは、方策をActor-Criticで学習している。

一般的な方策勾配法では、目的関数の勾配に報酬zを使用する。
\displaystyle
\nabla_\theta J(\theta) = \mathbb{E}[\nabla_\theta \log \pi_\theta(a|s)z_t^m]
Actor-Criticでは、分散を低下させる(過剰適合を避ける)ために、ベースラインとして価値関数の値を報酬zから引く。
\displaystyle
\nabla_\theta J(\theta) = \mathbb{E}[\nabla_\theta \log \pi_\theta(a|s)(z_t^m - V^\pi(s))]
ベースラインを追加しても、\nabla_\theta J(\theta)の期待値自体は変わらないが、推定分散を小さくする効果がある。
z_t^m - V^\pi(s)の項はアドバンテージと呼ばれる。


なお、期待値が変わらないというのは、期待値を行動aの積分で表すと、以下の式展開で確かめられる。
\displaystyle
\int \nabla_\theta \log \pi(a) \pi(a) da = \int \nabla_\theta \pi(a) da = \nabla_\theta \int \pi(a) da = 0
式展開では微分の連鎖則を利用している。
 \displaystyle
\begin{eqnarray}
\frac{\partial}{\partial x} \log f(x) &=& \frac{\partial \log f(x)}{\partial f(x)} \frac{\partial f(x)}{\partial x} \\
&=& \frac{1}{f(x)} \frac{\partial f(x)}{\partial x}
\end{eqnarray}


dlshogiでは、この式をそのまま適用してもうまく学習ができなかった。
そこで、ベースラインにさらに0.5を加えている。
\displaystyle
\nabla_\theta J(\theta) = \mathbb{E}[\nabla_\theta \log \pi_\theta(a|s)(z_t^m - V^\pi(s) + 0.5)]
この意味は、負けた対局でも探索した指し手はある程度信用できるので、半分は信用してあげようという気持ちである。
特に理論的な背景があるわけではない。


参考までに、OpenAIのbaselinesのPPOの実装では、アドバンテージの正規化を行っている。
 \displaystyle
\mathcal{A}_{normalized} = \frac{\mathcal{A} - \bar{\mathcal{A}}}{\sigma(\mathcal{A}) + \epsilon}
なぜ、正規化が必要かについて不思議だったので、ネットで検索したらいくつかの議論が見つかった。

引用されていた資料(4.1.2 Advantage Normalization)によると、推定量の分散を小さくすることにより、通常、経験的パフォーマンスを向上させることが知られているトリックだそうだ。
dlshogiの学習でも効果があるかもしれない。

エントロピー正則化

dlshogiの方策は指し手を学習しているため、方策が決定論的に偏りやすい。
そのため、A3Cでも行われているエントロピー正則化を行っている。

方策pエントロピーは以下の式で与えられる。
\displaystyle
H(p) = -\sum_j p_j \log p_j

エントロピーは、方策の分布が均一の場合に最大になり、どれか一つの行動の確率が1(決定論的)になったときに最小となる。
-\beta H(p)正則化項として損失に加えることで、決定論的になる方向にペナルティが加えられる。

価値関数の学習

AlphaZeroでは、価値の損失には平均二乗誤差(MSE)を使用している。
dlshogiでは、方策の損失が交差エントロピーなので、価値の損失もエントロピーの方が自然と考えて、シグモイド交差エントロピーを使用している。
価値関数の出力の範囲は、勝率を表す[0,1]となっている(AlphaZeroでは、勝ちを1、負けを-1として、出力範囲は[-1,1]となっている)。

価値の学習のブートストラップ

強化学習では、報酬そのものを学習する代わりに、Nステップ後の推定収益を学習することで、学習を加速するということが行われる。
この手法は、ブートストラップと呼ばれる。
なお、ブートストラップとは、OSのブートとかでも使われている語であるが、語源は靴のかかとについているタグのことだそうだ。タグをつまむと靴が履きやすくなることのアナロジーである。

コンピュータ将棋では、elmoが報酬のシグモイド交差エントロピーと、深さNの評価関数の出力とルートの評価関数の2つの確率変数の交差エントロピーの加重平均を損失にするという手法を導入して成功している。

dlshogiもこれに倣い、MCTSシミュレーションを行った結果のルートノードの指し手のQ値と、ルートノードの状態価値の2つの確率変数の交差エントロピーを価値の損失に加え、報酬の損失と按分している。
\displaystyle
l_{value}(\theta)= (1 - \lambda) H(v, z) + \lambda H(v, q)

正則化

AlphaZeroでは、損失にL2正則化c \|\theta\|^2を加えている。
dlshogiも同様にL2正則化を行っている(実装上はPyTorchのWeightDecayを使っている)。

SWA

SWA(Stochastic Weight Averaging)は、一定間隔での重みを平均化することで、ニューラルネットワークのテスト精度を改善するテクニックである。
一般的なアンサンブルの手法では予測の結果を平均化するが、SWAでは重みを平均化することで実現する。
Leela Chess ZeroでもSWAを導入している。
dlshogiでも効果があったため導入した。

学習則まとめ

以上の学習則を式で表すと以下のようになる。

\displaystyle
l(\theta)=- \boldsymbol{\pi}^T \log \boldsymbol{p} (z - v + 0.5) - \beta H(p) + (1 - \lambda) H(v, z) + \lambda H(v, q) + c \|\theta\|^2

\boldsymbol{\pi}は指し手のone-hotベクトルを表す。