昨日は強化学習用のニューラルネットワークの実装を行った。
今日はHMEの実装を行うために、同様にHMEの計算を行列で表現していく。
強化学習用のHMEの計算
ここでは、HMEへの入力を 、出力を とする。
また、エキスパートネットワーク の出力を 、パラメータを とし、それに対応するゲートネットワークの出力を ]、重みを とする。
行列で表現しない計算
ニューラルネットワークのときと同様に、まずは行列で表現しない計算から。
- エキスパートネットワークの出力 とその出力のパラメータに関する勾配 を求める。
- ゲートネットワークの出力 とHMEの出力の重みに関する勾配 を求める:
ただし、 ならば 、 ならば 。
- HMEの出力 を求める:
- HMEの出力のエキスパートネットワークのパラメータに関する勾配 を求める:
行列で表現した計算
まず、エキスパートネットワークの各出力をまとめて、ベクトル (ただし、 はエキスパートネットワークの数)で表現することにする。
そして、ゲートネットワークの重みを で次のように表すことにする:
さらに、次のような行列 を考える:
ただし、 は単位行列、 はすべての要素が1のベクトル、 はベクトルの直積(外積)、 はアダマール積(要素ごとの積)。
すると、上の計算は次のように書き直すことが出来る:
- エキスパートネットワークの出力 とその出力のパラメータに関する勾配 を求める。
- ゲートネットワークの出力 とHMEの出力の重みに関する勾配 を求める:
- (※L1ノルムで正規化)
- HMEの出力 を求める:
- HMEの出力のエキスパートネットワークのパラメータに関する勾配 を求める:
かなりトリッキーな感じもするけど、地道に追えば、元の計算と同等になっていることが分かると思う。
なお、途中、 をL1ノルムで正規化しているけど、これは指数関数の値域が であることから、 となることを利用している。
あと、実際に実装する場合には、 の一番大きい値を見つけて、その値を のすべての要素から一律に引く必要がある。
というのも、指数関数は急激に大きくなるので、下手するとNaN
になってしまって計算が破綻することがあるから。
ソフトマックス関数は各要素から定数を引いても値は変わらないという性質があるので、一番大きい値を一律に引いておくことで、指数関数の値が ] に収まるようになる。
(強化学習とニューラルネットワークを組合せてみた。(その12) - いものやま。も参照)
今日はここまで!