読者です 読者をやめる 読者になる 読者になる

いものやま。

雑多な知識の寄せ集め

強化学習とニューラルネットワークを組合せてみた。(その11)

前回はドロップアウトを実装したニューラルネットワークを強化学習の関数近似に使う実験をした。

けど、結果としてはうまくいかなかった。

そこで、次はHMEを強化学習の関数近似に使うのを試してみる。

HMEについては、以下を参照:

HMEの出力の重みに関する勾配計算

HMEを強化学習の関数近似に使うためには、誤差関数の重みに関する勾配ではなく、出力の重みに関する勾配を求める必要がある。

以下では、下のような1階層のHMEについて考えていく:

f:id:yamaimo0625:20160229193413p:plain

HMEの重み(パラメータ)には、以下のものがある:

  • エキスパートネットワークのパラメータ  \boldsymbol{\theta}_i
  • ゲートネットワークのパラメータ  \boldsymbol{w}_i

これらを使って、次のように出力が計算される:

  1. エキスパートネットワーク iの出力  y_i を次のように求める:
     y_i = y_i(\boldsymbol{x}; \boldsymbol{\theta}_i)
  2. ゲートネットワークの出力  g_i を、次のように求める:
    1.  s_i = \boldsymbol{w}_i {}^{\mathrm{T}} \boldsymbol{x}
    2.  g_i = \frac{ \mathrm{exp}( s_i ) }{ \sum_j \mathrm{exp}( s_j ) }
  3. プロパゲートノードの出力  y を、次のように求める:
     y = \sum_i g_i y_i

このとき、勾配  \frac{\partial y}{\partial \boldsymbol{\theta}_i} \frac{\partial y}{\boldsymbol{w}_i} がどうなるのかをそれぞれ計算していく。

まず、 \frac{\partial y}{\partial \boldsymbol{\theta}_i} から。

パラメータ  \boldsymbol{\theta}_i が影響を与えるのは、エキスパートネットワーク iの出力  y_i とHMEの出力  y
したがって、次のようになる:


\begin{align}
\frac{\partial y}{\partial \boldsymbol{\theta}_i} &= \frac{ \partial y }{ \partial y_i } \cdot \frac{ \partial y_i }{ \partial \boldsymbol{\theta}_i } \\
&= g_i \cdot \frac{ \partial y_i }{ \partial \boldsymbol{\theta}_i }
\end{align}

ここで、 \frac{ \partial y_i }{ \partial \boldsymbol{\theta}_i } はエキスパートネットワークの出力の重みに関する勾配なので、エキスパートネットワークに(関数近似のための)ニューラルネットワークを使っていれば、誤差逆伝播法で計算できるし、エキスパートネットワークが下の階層のHMEであれば、今やっている方法で(再帰的に)計算できる。

次に、 \frac{\partial y}{\boldsymbol{w}_i}

パラメータ  \boldsymbol{w}_i が影響を与えるのは、 s_i、ゲートネットワークのすべての出力  g_j、それとHMEの出力  y
したがって、次のようになる:


\begin{align}
\frac{\partial y}{\partial \boldsymbol{w}_i} &= \sum_j \frac{ \partial y }{ \partial g_j } \cdot \frac{ \partial g_j }{ \partial s_i } \cdot \frac{ s_i }{ \partial \boldsymbol{w}_i } \\
&= \sum_j y_j \cdot \frac{ \partial g_j }{ \partial s_i } \cdot \boldsymbol{x}
\end{align}

ここで、 \frac{ \partial g_j }{ \partial s_i }は、以下のように計算できる:

 \displaystyle
\frac{ \partial g_j }{ \partial s_i } = \left\{ \begin{array}{ll}
g_j ( 1 - g_j ) & (i = j) \\
- g_j^2 & (\mbox{otherwise})
\end{array} \right.

これで全部計算できるようになった。

ただし、ゲートネットワークの重みに関する勾配を求めるときには、エキスパートネットワークの出力が必要になっていることに注意。
なので、

  1. エキスパートネットワークの出力  y_i と勾配  \frac{ \partial y_i }{ \partial \boldsymbol{\theta}_i } を計算する。
  2. ゲートネットワークの出力  g_i と勾配  \frac{\partial y}{\boldsymbol{w}_i} を計算する。(勾配の計算にはエキスパートネットワークの出力  y_i を使う)
  3. 勾配  \frac{\partial y}{\partial \boldsymbol{\theta}_i} を計算する。(勾配の計算にはゲートネットワークの出力  g_i を使う)
  4. HMEの出力  y を計算する。

という手順で、HMEの出力と勾配を計算することになる。

今日はここまで!