2つの人気のある再帰型ニューラルネットワークモデルのうち、1つをを紹介します。本記事では、Long Short-Term Memory(LSTM)ニューラルネットワークについて、次の記事ではGrated Recurrent Units(GRU)ニューラルネットワークについて紹介します。これらのニューラルネットワークは、基本的には単純なRNNと同じ関数によって実行できますが、メモリ管理の仕組みが改善されています。
LSTMの特徴
LSTMニューラルネットワークは、1997年に初めて提案され、2000年に改善案が提案されました。LSTMニューラルネットワークの最も重要な特徴は、長期間に渡って安定的に内部状態ベクトルを転移(transference)出来ることです。
もし下図のような単純なRNNの計算をすると、データソース\(x_t\)を入力とする活性化関数\(σ\)によって、古い内部状態ベクトル\(h_{t-1}\)が\(h_t\)へ転移されます、これは、ニューロンの第1階層に対する非常に一般的な式によって計算されますが、長期間のステップ数に対しては、RNNの内部状態の情報を効率的に保持することが出来ていません。\(W_h\)と[\(h_{t-1},x_t\)]による重み付けの合計(加重和)は、新しい内部状態モデル\(h_t\)に非常に大きな差分を生むため、このことがRNNのメモリを不安定にします。重みパラメータ\(W_h\)を学習するために多くのステップ数を経過すると、Σ関数には勾配消失問題と呼ばれる副作用が生じます。
最も単純な再帰型ニューラルネットワークの計算
・ニューラルネットワークの計算
LSTMニューラルネットワークは、改善されたメモリ管理アーキテクチャを採用することで、単純なRNNの問題を解決します。LSTMの内部状態ベクトル\(h\)は、より単純な計算方法を使って転移されます、具体的には、要素ごとの積(element-wise multiplication)と要素ごとの和(element-wise addition)を用います。この積と和の計算は、長期間のステップ数を経過しても、非常に安定するように、\(h\)の転移が設計されています。このLSTMニューラルネットワークの計算は、下図のように表されます。
LSTMニューラルネットワークの計算
LSTMニューラルネットワークは、要素ごとの積\(t_t✕h_{t-1}\)が、選択的に\(h_{t-1}\)を0に設定することで、古い情報として忘れるか、そのまま触れずに残します。\(f_z\)をバイナリベクトルとして具体的には、0または1の値を取る2値のデータで、その長さは\(h_{t-1}\)と同じとします。このとき、0の値が掛け合わされると\(f_z\)の結果は0となり、1が掛け合わされると\(f_z\)の結果は\(h_{t-1}\)となります。\(f_z\)の計算は次のようになります。
\(\begin{eqnarray}
f_t
=
σ(W_f✕[y_{t-1},x_t]) \tag{1}
\end{eqnarray}
\)
\(W_f\)は全結合層の重みパラメータで、\(y_{t-1}\)は前のステップの出力ベクトル、\(x_t\)は現在のステップの入力ベクトルです。\(σ\)はシグモイド関数で、その出力は0か1のどちらかに近い値となります。\(f_z\)は忘却ゲート(Forget Gate)と呼ばれ、\(f_z\)を計算する階層のことは忘却ゲート層(Forget Gate Layer)と呼ばれています。
\(i_t✕h_t\)と\(h_{t-1}\)の要素ごとの和に基づいて、LSTMニューラルネットワークのメモリに新しい情報が追加されます。新しい情報は、バイナリベクトル\(i_t\)との要素ごとの積によって、ベクトル\(h_t\)が追加されるか否かが決まります。\(i_t\)と\(h_t\)の間の詳しい計算方法は、以下のように\(f_t\)と似た方法です。
\(\begin{eqnarray}
i_t=
σ(W_i ✕ [h_{t-1},x_t] ) \tag2
\end{eqnarray}
\) \(
\begin{eqnarray}
\overrightarrow{ h_t}=
σ(W_h ✕ [y_{t-1},x_t] ) \tag3
\end{eqnarray}
\)
ここで\(W_i\)と\(W_h\)はそれぞれ2つに分割された全結合層の重みベクトルです。\(i_t\)は入力ゲートと呼ばれていて、\(i_t\)を計算する階層のことは入力ゲート層と呼ばれています。
新しい内部状態\(h_t\)は、
\(\begin{eqnarray}
h_t=
f_t✕h_t + i_t✕ \overrightarrow{ h_t} \tag4
\end{eqnarray}
\)
のようにして、古い情報を忘れながら、新しい情報を追加していきます。
LSMTは、単純なRNNと同様に、内部状態\(h_t\)を全結合層経与え、シグモイド活性化関数\(σ\)の出力値を経て、この値のいくつかを出力ゲート\(ο_t\)で要素ごとの積で削除し、出力\(y_t\)を生成します。このとき\(ο_t\)は次式のような忘却ゲート\(f_t\)と入力ゲート\(i_t\)によく似たバイナリベクトルです。
\(\begin{eqnarray}
ο_t=
σ(W_ο ✕ [y_{t-1},x_t] ) \tag5
\end{eqnarray}
\)
このとき\(W_ο\)は全結合層の重みパラメータで出力ゲート層と呼ばれます。
また、出力\(y_t\)は次式で計算されます。
\(\begin{eqnarray}
y_t=
ο_t✕σ(h_t) \tag6
\end{eqnarray}
\)
LSTMニューラルネットワークは、長期間のステップ数に渡る内部状態ベクトル\(h_t\)を更新するための、新しく洗練され手法です。忘却あるいは追加する情報は、忘却ゲート\(f_t\)と入力ゲート\(i_t\)によって決定されます。このとき、忘却ゲート\(f_t\)は情報の一部を記憶しておくことを決定し、入力ゲート\(i_t\)はここに繰り返し情報を追加します。そしてLSTMニューラルネットワークは、しばらくの間情報の一部を保持するのです。