深層学習:Recurrent Neural NetworkとBackpropagation Through Time

RNNの目的は、入力データが特定の順序に並んでいることが特徴な系列データをモデル化することにある。時刻$${t}$$での入力層からのシグナルは、一つ前の時刻の$${t-1}$$での隠れ層からの出力と一緒に隠れ層で扱われ、これによってネットワークが過去の事象に関する記憶を持っていることになる。この再帰構造を持つ隠れ層が一つあるRNNを単層RNNと呼び、単層RNNからの出力をさらに別のRNNに入力として渡す多層RNNと呼ぶ。
簡単化のため、単層RNNでRNNによる活性化を実際に計算してみると以下のようになる。
$${{\bm W}_{xh}}$$:入力$${{\bm x}}$$に隠れ層でかかる重み
$${{\bm W}_{hh}}$$:前の時刻$${t-1}$$からの再入力が同じ隠れ層でかかる重み
$${{\bm W}_{ho}}$$:隠れ層から出力層へ渡る時にかかる重み
$${{\bm b}_h}$$:隠れ層のバイアス項
$${{\bm b}_o}$$:出力層のバイアス項
とすれば、隠れ層からの時刻$${t}$$での出力は、
$${{\bm Z}^{(t)}_h={\bm W}_{xh}{\bm x}^{(t)} + {\bm W}_{hh}{\bm h}^{(t-1)} + {\bm b}_h }$$
より、出力層へは活性化関数を経て、
$${{\bm h}^{(t)}=\phi_h({\bm Z}^{(t)}_h)}$$
が渡され、出力層は、
$${{\bm o}^{(t)}=\phi_o({\bm W}_{ho}{\bm h}^{(t)}+{\bm b}_o)}$$
を出力する。
これによる損失関数は、$${{\bm l}({\bm o}^{(t)})}$$で与えられる。
最終的な損失関数は、最終時間$${T}$$までの各時間での損失関数を足し上げたものと定義される。
$${L=\displaystyle{\frac{1}{T}\sum^{T}_{t=1}l({\bm o}^{(t)})}}$$

BTT

表記と議論を簡単にするため、バイアス項を無視し、活性化関数を恒等写像$${\phi({\bm x})={\bm x}}$$とすると、
$${{\bm h}^{(t)}={\bm W}_{xh}{\bm x}^{(t)} + {\bm W}_{hh}{\bm h}^{(t-1)}}$$
$${{\bm o}^{(t)}={\bm W}_{ho}{\bm h}^{(t)}}$$
となり、損失関数$${L}$$の$${{\bm W}_{xh}}$$、$${{\bm W}_{hh}}$$、$${{\bm W}_{ho}}$$による三つの勾配によって、学習モデルが訓練されることになる。
$${\displaystyle{\frac{\partial L}{\partial {\bm o}^{(t)}}=\frac{1}{T}\frac{\partial l({\bm o}^{(t)})}{\partial {\bm o}^{(t)}}}}$$
$${\displaystyle{\frac{\partial L}{\partial {\bm W}_{ho}}=\sum^{T}_{t=1}\frac{\partial L({\bm o}^{(t)})}{\partial {\bm o}^{(t)}} \frac{\partial {\bm o}^{(t)}}{\partial {\bm W}_{ho}} =\sum^{T}_{t=1}\frac{\partial L({\bm o}^{(t)})}{\partial {\bm o}^{(t)}} ({\bm h}^{(t)})^{T} }}$$
最後の時間ステップでの$${{\bm h}^{(T)}}$$には、その後に続く入力シグナルがないので、一回しか出力には現れない。
よって、
$${\displaystyle{\frac{\partial L}{\partial {\bm h}^{(T)}}=\frac{\partial L}{\partial {\bm o}^{(T)}} \frac{\partial {\bm o}^{(T)}}{\partial {\bm h}^{(T)}}={\bm W}_{ho}^T \frac{\partial L}{\partial {\bm o}^{(T)}} }}$$
$${t<T}$$では、$${{\bm h}^{(t)}}$$は、$${{\bm h}^{(t)}}$$自身と$${{\bm h}^{(t+1)}}$$を通じて、$${L}$$に寄与することから、
$${\displaystyle{\frac{\partial L}{\partial {\bm h}^{(t)}}=\frac{\partial L}{\partial {\bm h}^{(t+1)}} \frac{\partial {\bm h}^{(t+1)}}{\partial {\bm h}^{(t)}}+\frac{\partial L}{\partial {\bm o}^{(t)}} \frac{\partial {\bm o}^{(t)}}{\partial {\bm h}^{(t)}}={\bm W}_{hh}^T \frac{\partial L}{\partial {\bm h}^{(t+1)}} + {\bm W}_{ho}^T \frac{\partial L}{\partial {\bm o}^{(t)}} }}$$
ここで、部分微分の$${x=f(t),y=g(t), z=F(x,y)}$$から、$${\displaystyle{\frac{\partial z}{\partial t}=\frac{\partial F}{\partial x}\frac{\partial x}{\partial t} + \frac{\partial F}{\partial y}\frac{\partial y}{\partial t}}}$$を用いている。
同様に、
$${\displaystyle{\frac{\partial L}{\partial {\bm h}^{(t+1)}}={\bm W}_{hh}^T \frac{\partial L}{\partial {\bm h}^{(t+2)}} + {\bm W}_{ho}^T \frac{\partial L}{\partial {\bm o}^{(t+1)}} }}$$から、

$${\displaystyle{\frac{\partial L}{\partial {\bm h}^{(t)}}={\bm W}_{hh}^T {\bm W}_{hh}^T \frac{\partial L}{\partial {\bm h}^{(t+2)}} + {\bm W}_{hh}^T {\bm W}_{ho}^T \frac{\partial L}{\partial {\bm o}^{(t+1)}}+ {\bm W}_{ho}^T \frac{\partial L}{\partial {\bm o}^{(t)}} =\sum^{T}_{i=1}({\bm W_{hh}^T})^{T-i} {\bm W}_{ho}^T \frac{\partial L}{\partial {\bm o}^{(T+t-i)}}}}$$
これより、簡単化しているにも関わらず、$${{\bm W}_{hh}^T}$$の長い積が含まれる。よって、$${{\bm W}_{hh}^T}$$の固有値のうち、1より小さいものは消滅し、1より大きいものは発散し、これが数値計算を不安定にさせてします。これを避ける手法の一つは、時間ステップを切り捨てることである。

また、他の勾配も、
$${\displaystyle{\frac{\partial L}{\partial {\bm W}_{xh}} = \sum^{T}_{t=1}\frac{\partial L }{\partial {\bm h}^{(t)}} \frac{\partial {\bm h}^{(t)}}{\partial {\bm W}_{xh}}=\sum^{T}_{t=1}\frac{\partial L }{\partial {\bm h}^{(t)}} ({\bm x}^{(t)})^{T}}}$$

$${\displaystyle{\frac{\partial L}{\partial {\bm W}_{hh}} = \sum^{T}_{t=1}\frac{\partial L }{\partial {\bm h}^{(t)}} \frac{\partial {\bm h}^{(t)}}{\partial {\bm W}_{hh}}=\sum^{T}_{t=1}\frac{\partial L }{\partial {\bm h}^{(t)}} ({\bm h}^{(t-1)})^{T}}}$$

RNNのトレーニングは、順伝播と逆伝播を交互に行い進めていく。実際の計算では、三つの勾配を各タイムステップで計算し保存して、次の計算に使う。

この記事が気に入ったらサポートをしてみませんか?