LSTM

RNN の再帰路を持つ隠れ層が LSTM Block というものに置き換えたネットワークです。



LSTM Block は以下のような構造をしています。

Gate

LSTM Block の中心にある c というマークがついているのは、セルと呼ばれるもので RNN 同様、内部の状態を記憶する役割を持ちます。
そのセルに対する入力には入力ゲート (input gate)、出力には出力ゲート (output gate)、再帰路には忘却ゲート (forget gate)という機構が追加されています。
このゲートは門のようにそこを通る値を取捨選択します。

図で青くマークした部分がゲートになります。

このゲートを通る値を取捨選択するという仕組みは以下のように実現されます。
まずゲートは現時点の入力と1つ前の時刻の出力を受け取ります。
+マークでそれらは足し合わせ、要素ごとにシグモイド関数を適用するので、出力は各値が 0.0 ~ 1.0 になります。
そして、✕マークの部分でこれとゲートを通ろうとする値の要素ごとの積が計算されます。
ゲートの値が0に近ければ、その値はほとんど通さず、1に近ければほぼ全部通すことになります。



順伝播

記号の準備

セルの状態 (state)を \(s_j^t\) で表します。
添字は \(j\) 番目のニューロンの時刻 \(t\) の状態であることを示しています。
同様に、
前の層から LSTM Block への入力値を \(u_j^t\)、
入力ゲートの入力値を \(u_j^{I,t}\)、出力値を \(g_j^{I,t}\)
出力ゲートの入力値を \(u_j^{O,t}\)、出力値を \(g_j^{O,t}\)、
忘却ゲートの入力値を \(u_j^{F,t}\)、出力値を \(g_j^{F,t}\)
で表します。添字は In, Out, Forget の頭文字をとりました。

LSTM Block 内には重みは8種類あります。
1つ前の層とセルとの結合の重みを \(w_{ji}^{in}\)、
1つ前の層と入力ゲート、出力ゲート、忘却ゲートとの結合の重みをそれぞれ \(w_{ji}^{I,in}\)、 \(w_{ji}^{O,in}\)、 \(w_{ji}^{F,in}\)、
LSTM の出力からの帰還路と入力ゲート、出力ゲート、忘却ゲートとの結合の重みをそれぞれ \(w_{ji}^{I,out}\)、 \(w_{ji}^{O,out}\)、 \(w_{ji}^{F,out}\)、
セルの出力からの帰還路の重みを \(W_F\) とします。



セルへの入力

では、セルへの入力をまず計算します。
\[
s_j^t = g_j^{F,t} s_j^{t – 1} + g_j^{I,t} \tanh (u_j^t)
\]

\(u_j^t\) は前の層からの入力 \(x_j^t\) 及び1つ前の時刻の出力 \(y_j^{t-1}\) を足し合わせたものになるので、
\[
u_j^t = \sum\limits_i {w_{ji}^Ix_i^t} + \sum\limits_j {w_{jj’}^Iy_{j’}^{t – 1}}
\]

忘却ゲートの出力値 \(g_j^{F,t}\) 及び入力ゲートの出力値 \(g_j^{I,t}\) は
\[\begin{gathered}
g_j^{F,t} = \sigma (u_j^{F,t}) = \sigma (\sum\limits_i {w_{ji}^{F,in}x_i^t} + \sum\limits_{j’} {w_{jj’}^{F,out}y_{j’}^{t – 1}} ) \hfill \\
g_j^{I,t} = \sigma (u_j^{I,t}) = \sigma (\sum\limits_i {w_{ji}^{I,in}x_i^t} + \sum\limits_{j’} {w_{jj’}^{I,out}y_{j’}^{t – 1}} ) \hfill \\
\end{gathered} \]

セルからの出力

セルからの出力は次のように計算されます。
\[y_j^t = g_j^{O,t}\tanh (s_j^t)\]

出力ゲートの出力値 \(g_j^{O,t}\) は
\[g_j^{O,t} = \sigma (\sum\limits_i {w_{ji}^{O,in}x_i^t} + \sum\limits_{j’} {w_{jj’}^{O,out}y_{j’}^{t – 1}} )\]

プーリング層も畳み込み層同様、フィルタを適用して出力を計算する処理は同じです。
ただし、プーリング層のフィルタは重みを持たず、位置の情報を荒くする役割を持ちます。

マックスプーリング

フィルタに対応する入力のセルの値のうち、最も大きい値を出力とします。

\[{u_{ijk}} = \mathop {\max }\limits_{s,t} y_{stk}^{(l – 1)},(s = 1,2, \cdots ,H_f^{(l)}{\text{,}}t = 1,2, \cdots ,W_f^{(l)})\]

平均プーリング

フィルタに対応する入力のセルの値の平均値を出力とします。

\[{u_{ijk}} = \frac{1}{{H_f^{(l)} \times W_f^{(l)}}}\sum\limits_{s,t} {y_{stk}^{(l – 1)}} ,(s = 1,2, \cdots ,H_f^{(l)}{\text{,}}t = 1,2, \cdots ,W_f^{(l)})\]

畳み込みとニューラルネットワークの関係

画像に対してフィルタを適用し、特徴マップを計算する式をもう一度見てみましょう。

\[{u_{ij}} = \sum\limits_{p = 0}^{{H_f} – 1} {\sum\limits_{q = 0}^{{W_f} – 1} {{x_{i + p,j + q}}\;{w_{pq}}} } \]

フィルタが覆っている部分の画像の値 \(x_{i + p, j + q}\) を前の層のニューロンから受け取る入力、フィルタの各マス目の重み \({w_{pq}}\) をニューロン間の結合の重みと解釈します。
すると、フィルタの処理はニューラルネットワークにおいて、あるニューロンが受け取る入力を計算する式と見なすことができます。



なので、特徴マップ全体を生成するには、以下のニューラルネットワークで表せるでしょう。



このような処理を行う層を畳み込み層 (convolution layer) といいます。
畳み込み層が受け取るのは入力画像だけでなく、畳み込み層によって生成された特徴マップを入力として、さらに畳み込みを行うこともあります。以下で畳み込み層の入力といった場合は画像または特徴マップを指すものとします。

多チャンネルのフィルタ

今まで1チャンネルの入力に対する畳み込みを考えてきましたが、多チャンネルの入力である場合にも拡張できます。

入力がサイズ \(H_x \times W_x \times C_x\) の \(C_x\) チャンネルの場合、フィルタのサイズは \(H_f \times W_f \times C_f\) で \(C_f = C_x\) とした、チャンネル数と同じチャンネル数を持ったフィルタになります。

特徴マップの計算は、\(H_f * W_f * C_f\) のフィルタの重みと対応する入力の値を乗算して足し合わせて行うため、特徴マップは1チャンネルになります。

\[{u_{ij}} = \sum\limits_{p = 0}^{{H_f} – 1} {\sum\limits_{q = 0}^{{W_f} – 1} {\sum\limits_{r = 0}^{{C_f} – 1} {{x_{i + p,j + q,r}}\;{w_{pqr}}} } } \]



複数のフィルタ

フィルタを構成する重みによって、得られる特徴マップが異なります。
そのため、フィルタの個数を増やせば、1つの入力からいろいろな特徴が得られるようになります。

入力のチャンネル数にかかわらず、1枚のフィルタによる畳み込みの結果は1チャンネルの特徴マップになるので、\(M\) 個のフィルタをそれぞれ適用すれば、\(M\) 個の異なる特徴マップが得られます。
フィルタ数を \(M\) とした場合、\(m\) 個目の特徴マップの値は次のように計算できます。

\[{u_{ijm}} = \sum\limits_{p = 0}^{{H_f} – 1} {\sum\limits_{q = 0}^{{W_f} – 1} {\sum\limits_{r = 0}^{{C_f} – 1} {{x_{i + p,j + q,r}}\;{w_{pqrm}}} } } \]

畳み込み層の出力

入力にフィルタごとに異なるバイアスを加えます。

\[{u_{ijm}} = \sum\limits_{p = 0}^{{H_f} – 1} {\sum\limits_{q = 0}^{{W_f} – 1} {\sum\limits_{r = 0}^{{C_f} – 1} {{x_{i + p,j + q,r}}\;{w_{pqrm}} + {b_{ijm}}} } } \]

さらにその層の活性化関数を適用した値を畳み込み層の出力とします。

\[{z_{ijm}} = f({u_{ijm}})\]

畳み込み層の数式表現

第 \(l-1\) 層の出力を形状が \(H_z^{(l – 1)} \times W_z^{(l – 1)} \times C_z^{(l – 1)}\) である \({Z^{(l – 1)}}\) とします。この各要素は \(z_{ijk}^{(l – 1)}\) と参照します。



第 \(l\) 層の畳み込み層は、形状が \(H_f^{(l)} \times W_f^{(l)} \times C_f^{(l)}\) である \(M\) 個のフィルタを持つとします。



\(m\) 個目のフィルタの重みを \(W_m^{(l)}\) とし、各要素は \({w_{ijkm}}\) と参照します。
\(m\) 個目のフィルタのバイアスを \(b_m^{(l)}\) とし、各要素は \({{b_{ijm}}}\) と参照します。
以上より、畳み込み層に対する入力を次のように計算できます。

\[{u_{ijm}} = \sum\limits_{p = 0}^{{H_f} – 1} {\sum\limits_{q = 0}^{{W_f} – 1} {\sum\limits_{r = 0}^{{C_f} – 1} {{x_{i + p,j + q,r}}\;{w_{pqrm}} + {b_{ijm}}} } } \]

入力に対して、第 \(l\) 層の活性化関数 \({f^{(l)}}\) を適用します。

\(z_{ijm}^{(l)} = {f^{(l)}}(u_{ijm}^{(l)})\)

こうして、形状が \(H_z^{(l)} \times W_z^{(l)} \times C_z^{(l)}\) である出力 \({Z^{(l)}}\) が得られます。チャンネル数はフィルタの個数なので \(C_z^{(l)}=M\) となります。



処理全体は次のようになります。



全結合ニューラルネットワークとの違い

全結合のニューラルネットワークではある層のニューロンは前の層のすべてのニューロンと結合していました。
今回のニューラルネットワークは、前の層のニューロンの一部とのみ結合しています。
全結合に対して、これを疎結合という場合があります。

重み共有

全結合のニューラルネットワークではある層と前の層のニューロン同士の結合はすべて独立した重みを持っていました。
今回のネットワークでは、あるフィルタが計算する過程ですべて同じ重みが使用されます。