言語AIの進化史⑮LSTM(Long Short-Term Memory)
前回は、再帰型ニューラルネットワーク(RNN)の誤差逆伝播法(BPTT、Backpropagation Through Time)の解説をしました。
その中で、単純なRNNの仕組みにおいて、2つの問題点が浮き彫りとなりました。
長期の依存関係の学習が困難
勾配消失と勾配爆発
これらの問題に対処するために、LSTM(Long Short-Term Memory)が開発されました。
RNNとLSTMの構造上の違い
RNNの構造
以下は、RNNのあるステップ$${t}$$における再帰処理を簡略的に表現したものです。

$${\boldsymbol{x}_t}$$:入力ベクトル
$${\boldsymbol{h}_{t-1}}$$:ステップ$${t-1}$$からの隠れ状態
$${\boldsymbol{h}_t}$$:次のステップ$${t+1}$$へ渡す隠れ状態
黄色い箱はニューラルネットワークです。この中には、線形変換のための重み$${W}$$とバイアス$${\boldsymbol{b}}$$、そして非線形変換のための活性化関数$${\tanh}$$(双曲線正接関数)が入っています。
LSTMの構造
下図は、LSTMの構造です。

まず、RNNとの大きな違いとして、LSTMではセル状態(Cell State)が追加されています。日本語ではしばしば「細胞状態」と訳されますが、これはニューロンの構造を模した概念的な名称です。
セル状態は、過去の情報を保持するための長期的なメモリとしての役割を果たします。これによって時系列データの文脈を長く伝えることができため長期依存関係の学習が可能になります。

LSTMでは、隠れ状態よりもセル状態が中心的な役割を持ちます。むしろ、隠れ状態はセル状態の内容から計算されると考えるとわかりやすいでしょう。つまり、セル状態が主な情報の管理を担い、隠れ状態はその時点で重要な情報をセル状態から抽出して追加し、次の層やステップへと渡します。
言い換えると、セル状態は「長期的な情報の幹」のようなもので、隠れ状態はその場で必要な情報を枝葉として取り出して活用する役割を果たします。
では、このセル状態がどのように情報を保持したり忘却したりするのでしょうか?
3つのゲート機構
もう一度、LSTMの図を見てください。上部に3つの「ゲート」があります。

LSTMでは、これら3つのゲート機構のそれぞれがセル状態の制御に関わっています。
忘却ゲート(Forget Gate)
忘却ゲートは、不要な情報をセル状態から取り除きます。過去の情報のうち、現在の文脈で不要と判断されるものを忘れる役割を果たします。

黄色い箱で表現されている忘却ゲートはニューラルネットワークです。独自の重み$${W_f}$$とバイアス$${\boldsymbol{b}_f}$$があります。また、活性化には、シグモイド関数$${\sigma}$$を使っています。
この忘却ゲートへの入力は、以前の隠れ状態$${\boldsymbol{h}_{t-1}}$$と現在の入力$${\boldsymbol{x}_t}$$です。この2つの情報は一つのベクトル$${\left[\boldsymbol{h}_{t-1}, \boldsymbol{x}_t\right]}$$として縦に連結され、忘却ゲートへ渡されます。
図で、$${\boldsymbol{x}_t}$$からの矢印が$${\boldsymbol{h}_{t-1}}$$からの線に交わっているところが「ベクトルの連結」を意味します。
また、重みも$${W_x}$$と$${W_h}$$などに分けないで、一つの重み(例:忘却ゲートの$${W_f}$$)として表記しています。行列を横に連結しているだけで計算は同じです。
忘却ゲートでは、以下の処理が行われます。
線形変換
ベクトル$${\left[\boldsymbol{h}_{t-1}, \boldsymbol{x}_t\right]}$$に重み$${W_f}$$とバイアス $${\boldsymbol{b}_f}$$を用いて線形変換を行います。この変換によって、ベクトルのサイズは、セル状態のサイズと一致します。活性化関数
シグモイド関数$${\sigma}$$を適用し、各要素を0から1の値に変換します。重要な情報は1に近い値を取り、不要な情報は0に近い値を取ります。この値は、セル状態の各要素をどれほど忘却するか(または保持するか)を決定します。セル状態の更新
忘却ゲートの出力$${\boldsymbol{f}_t}$$と以前のセル状態$${\boldsymbol{c}_{t-1}}$$の要素ごとの積(⨂)を計算し、新しいセル状態を形成します。この処理により、不要な情報は0に近づき削除され、重要な情報だけが保持されます。
忘却ゲートの動作を数式で表すと以下の通りです。
$$
\boldsymbol{f}_t = \sigma\left(W_f \cdot \left[\boldsymbol{h}_{t-1}, \boldsymbol{x}_t\right] + \boldsymbol{b}_f\right)
$$
このベクトル$${\boldsymbol{f}_t}$$と以前のセル状態$${\boldsymbol{c}_{t-1}}$$の要素ごとの積(⨂)を計算することで、新しいセル状態を形成します。
なお、忘却ゲートが適切に機能するために、誤差逆伝播による学習を通じて、重み$${W_f}$$とバイアス$${\boldsymbol{b}_f}$$が最適化されます。これにより、過去の隠れ状態$${\boldsymbol{h}_{t-1}}$$と現在の入力$${\boldsymbol{x}_t}$$から適切な情報を忘れる(または保持する)能力が最適化されます。
よって、長期記憶が必要なタスクを通じて学習を進めることで、モデルは長期記憶をより効果的に活用できるようになります。
まとめると、忘却ゲートは過去の情報から不要な部分を取り除き、重要な要素を保持する役割を担います。これがLSTMにおける長期記憶を保持する原理です。
入力ゲート(Input Gate)
入力ゲートは、新しい情報の中から重要な部分を選び出し、セル状態に取り込む役割を担います。

入力ゲートの説明の前に、まずは$${\tanh}$$と書いてある黄色い箱に注目してください。これはそれ自体がニューラルネットワークです。独自の重み$${W_c}$$とバイアス$${\boldsymbol{b}_c}$$を持ちます。なお、活性化は$${\tanh}$$になっています。
これをRNNの構造と比べます。

RNNでは、$${\tanh}$$を含むニューラルネットワークが$${\left[\boldsymbol{h}_{t-1}, \boldsymbol{x}_t\right]}$$を、次の隠れ状態$${\boldsymbol{h}_t}$$へと変換しています。
$$
\boldsymbol{h}_t = \tanh\left(W_h \cdot\left[\boldsymbol{h}_{t-1}, \boldsymbol{x}_t\right] + \boldsymbol{b}_h\right)
$$
図を比較すると、LSTMから3つのゲートを除いたらRNNの構造に近いのがわかります。ただし、LSTMは$${\tanh}$$ネットワークからの出力をセル状態へ取り込みます。つまり、$${\tanh}$$ネットワークは、セル状態に取り込む前の中間状態$${\tilde{\boldsymbol{c}}_t}$$を計算しています。
$$
\tilde{\boldsymbol{c}}_t = \tanh\left(W_c \cdot \left[\boldsymbol{h}_{t-1}, \boldsymbol{x}_t\right] + \boldsymbol{b}_c\right)
$$
そして、中間状態$${\tilde{\boldsymbol{c}}_t}$$の情報をどうセル状態へ取り込むのかを決めるのが黄色い箱と$${\sigma}$$で表現されている入力ゲートです。

入力ゲートもニューラルネットワークであり、独自の重み$${W_i}$$とバイアス$${\boldsymbol{b}_i}$$があります。また、活性化には、シグモイド関数$${\sigma}$$を使っています。この入力ゲートへの入力は、$${\left[\boldsymbol{h}_{t-1}, \boldsymbol{x}_t\right]}$$であり、忘却ゲートと同じように各要素に対して0から1の値を出力し、入力情報を調節します。
$$
\boldsymbol{i}_t = \sigma\left(W_i \cdot \left[\boldsymbol{h}_{t-1}, \boldsymbol{x}_t\right] + \boldsymbol{b}_i\right)
$$
計算式自体は忘却ゲートと同じですが、もちろんパラメータは異なります。入力ゲートとしての役割は、新しい情報の中からどの情報をセル状態に追加するべきかを決めることであり、そのように誤差逆伝播による学習を通じて最適化されます。
忘却ゲートと入力ゲートをまとめると、セル状態は以下のように更新されます。
$$
\boldsymbol{c}_t = \boldsymbol{f}_t \otimes \boldsymbol{c}_{t-1} + \boldsymbol{i}_t \otimes \tilde{\boldsymbol{c}}_t
$$
ここに再帰の構造が見られます。つまり、以前のセル状態$${\boldsymbol{c}_{t-1}}$$と新しい入力$${\tilde{\boldsymbol{c}}_t}$$が新しいセル状態$${\boldsymbol{c}_t}$$へ貢献しています。その際に、忘却ゲートが不要な情報を捨て、入力ゲートが重要な情報を取り込んでいるわけです。
RNNでは、計算された情報がそのまま次のステップに渡されます。これはRNNの仕組み上避けられません。そのため、一旦重要でないと判断された情報を後から取り戻すことができず、ステップを重ねるにつれ古い重要な情報が失われ、後で必要となる情報を長期に渡って保持できないという問題が生じました。
一方で、LSTMはセル状態と隠れ状態を分けることでこの問題を克服します。LSTMでは入力ゲートを通じて情報を選別し、重要な情報だけをセル状態に取り込む仕組みになっています。このプロセスも誤差逆伝播によって学習され、最適化されます。
そして、忘却ゲートによって葬り去られない限り、セル状態の情報は保持され続けます。つまり、LSTMは情報に優劣をつけて保存し、それを長期にわたって活用することが可能です。
そして、更新されたセル状態から、現在の出力に必要な情報を選び取るのが出力ゲートの役割です。
出力ゲート(Output Gate)
忘却ゲートと入力ゲート同様に、出力ゲートの入力は以前の隠れ状態$${\boldsymbol{h}_{t-1}}$$と現在の入力$${\boldsymbol{x}_t}$$です。この情報に基づき、出力ゲートはどの情報を次の隠れ状態$${\boldsymbol{h}_t}$$として取り出すべきかを決定します。
数式で表すと、出力ゲートの動作は以下の通りです。
$$
\boldsymbol{o}_t = \sigma\left(W_o \cdot \left[\boldsymbol{h}_{t-1}, \boldsymbol{x}_t\right] + \boldsymbol{b}_o \right)
$$
ここで、$${\boldsymbol{o}_t}$$は出力ゲートの出力で、各要素が0から1の範囲になっています。この値が、セル状態からどの程度の情報を取り出すかの優劣を決めます。
これも数式的には他のゲートと全く同じ形です。もちろんパラメータが異なるので出力ゲートとしての役割を果たすように最適化されます。

なお、ピンク色で示された$${\tanh}$$は、セル状態$${\boldsymbol{c}_t}$$に非線形変換を加える単純な活性化関数であり、ニューラルネットワークではありません。これによって、セル状態のスケールが整えられます。つまり、元来のRNNで通常使われる隠れ状態と同じ範囲(−1から+1)の値で情報が抽出されます。
こうしてみると、この部分は元来のRNNが隠れ状態を出力する部分に相当することがわかります。LSTMではセル状態と隠れ状態を分離していますが、この$${\tanh}$$による出力がRNNと形式上の一貫性を保っています。そのため、LSTMはRNNと比較しやすく、応用によっては両者を入れ替えることも比較的容易になっています。
隠れ状態$${\boldsymbol{h}_t}$$は、出力ゲートの出力$${\boldsymbol{o}_t}$$とセル状態の活性化結果$${\tanh(\boldsymbol{c}_t)}$$を要素ごとに掛け合わせて計算されます。
$$
\boldsymbol{h}_t = \boldsymbol{o}_t \otimes \tanh(\boldsymbol{c}_t)
$$
このように、出力ゲートは「以前の隠れ状態と現在の入力から判断」し、セル状態に蓄積された情報から「現在の出力に必要な要素を動的に選び出す」役割を果たしています。
問題は解決されたのか
長期の依存関係の学習が困難
3つのゲートの仕組みにより、LSTMは長期的な情報を効果的に保持しつつ、次の層やステップへの出力を文脈に応じて柔軟に生成することが可能になっています。
ただし、完全に問題が解決されたわけではありません。例えば、言語モデルとしてシーケンスを処理する際、離れたトークン同士の関係をより直接的に計算するには、トランスフォーマーのように再帰を使わず、自己アテンション機構を活用した構造がより適しています。
それでも、明確な時間的順序(時系列データや音声信号など)を持つデータでは、逐次的な構造を持つLSTMの方が直感的に使いやすいかもしれません。
また、短いシーケンスでは、トランスフォーマーのような自己注意機構が必要ない可能性もあります。
さらに、計算リソースが限られていたり、学習用のデータセットが少ない場合は、LSTMがより有効な可能性があります。
勾配消失と勾配爆発
LSTMはセル状態を線形的に伝播させる仕組みを持ちます。下図からもわかりますが、セル状態の更新は線形の計算(掛け算と足し算)だけになっています。

つまり、シグモイド関数や$${\tanh}$$関数といった非線形活性化がセル状態に直接積み重ならない設計により、勾配消失を軽減し、長期的な依存関係をより安定して学習できます。これが元来のRNNにおける活性化の積み重ねと大きく異なっています。

ただし、LSTMも再帰構造を持つため、非常に長いシーケンスや複雑な依存関係では限界があり、トランスフォーマーのように再帰を使わず直接的に依存関係を計算する仕組みの方が学習が効果的になる可能性があります。
おまけ
LSTMの図の書き方は色々とあります。こんな図を見たことがあるかもしれません。

興味がある方は、こちらの記事に解説を書いたので参考にしてください。
次回予告
次回は、LSTMに比べてゲート数が少なく構造がシンプルで計算効率が高いGRU(Gated Recurrent Unit)を紹介します。
お楽しみに!
