LSTMとは?仕組み・数式・RNN/GRUとの違いをPython実装で解説
LSTM(Long Short-Term Memory、長短期記憶)は、時系列や文章のように順序を持つデータを扱うために設計されたニューラルネットワークです。従来のRNNが苦手だった「離れた過去の情報を覚えておく」処理を、セルステートと3つのゲートで実現します。この記事では定義から、ゲートの数式、RNN・GRUとの違い、KerasとPyTorchでの実装、そして1997年の原型から2024年のxLSTMまでの最新動向を、実データの検索意図に沿って整理します。
まとめ:LSTMの要点
- 正体:RNNの一種で、長期依存関係を学習できるよう改良したモデル。1997年に Hochreiter と Schmidhuber が提案。
- 仕組み:情報を保持する「セルステート」と、忘却・入力・出力の3つのゲートで、覚える情報と捨てる情報を制御する。
- 強み:RNNの弱点だった勾配消失問題を緩和し、数十〜数百ステップ離れた文脈を保持できる。
- 使い分け:計算が軽い場面はGRU、長文・大規模文脈はTransformerが主流。LSTMはデータが少なく逐次処理が向くタスクで今も現役。
以下で、名前の由来から数式・実装・最新動向まで順に見ていきます。
LSTMの定義とRNNが抱えた勾配消失問題
「長短期記憶」という名前が指すもの
RNNは、前の時刻の出力を次の入力に回すループ構造で時系列を処理します。しかしこの「記憶」は各ステップで上書きされ、少し前の情報しか残らない短期記憶にとどまります。LSTMは、この短期記憶の流れとは別に、情報を長く保持する専用の経路(セルステート)を設けました。短期の隠れ状態と長期のセルステートを両立させることが、Long Short-Term Memory(長い短期記憶)という名称の由来です。
勾配消失問題:RNNが長期依存を学べない理由
RNNは誤差を時間方向にさかのぼって伝える通時的誤差逆伝播(BPTT)で学習します。このとき、時刻をさかのぼるたびに勾配へ重みが繰り返し掛かるため、値が1未満だと指数的に小さくなり、遠い過去まで届く頃にはほぼ0になります。これが勾配消失問題で、「10単語前の主語」のような長い依存を学習できない原因でした。LSTMはセルステートに沿って勾配がほぼそのまま流れる経路(定誤差カルーセル)を用意し、この減衰を抑えます。
LSTMの仕組み:セルステートと3つのゲート
忘却ゲート・入力ゲート・出力ゲートの役割
セルステートは、時刻をまたいで情報を運ぶベルトコンベアのような経路です。このベルトへの出し入れを、シグモイド関数で0〜1の開度を出す3つのゲートが制御します。忘却ゲートは古い情報をどれだけ残すか、入力ゲートは新しい情報をどれだけ書き込むか、出力ゲートはセルステートのどこを今回の出力に使うかを決めます。0なら完全遮断、1なら全通しで、この連続的な開閉が「覚える・忘れる」の学習を可能にします。
数式で見るLSTMの1ステップ
時刻tでの計算は、前時刻の隠れ状態 h(t-1) と入力 x(t) から次のように進みます(σはシグモイド、⊙は要素ごとの積)。
f_t = σ(W_f·[h_{t-1}, x_t] + b_f) # 忘却ゲート
i_t = σ(W_i·[h_{t-1}, x_t] + b_i) # 入力ゲート
g_t = tanh(W_g·[h_{t-1}, x_t] + b_g) # セル候補(書き込む中身)
C_t = f_t ⊙ C_{t-1} + i_t ⊙ g_t # セルステートの更新
o_t = σ(W_o·[h_{t-1}, x_t] + b_o) # 出力ゲート
h_t = o_t ⊙ tanh(C_t) # 隠れ状態(この時刻の出力)
核心は C_t の式です。前のセルステート C(t-1) に忘却ゲート f_t を掛けて取捨選択し、新しい候補 g_t を入力ゲート i_t で絞って足すだけの加算構造になっています。この足し算主体の更新が、勾配が消えにくい理由です。
LSTMの歴史:1997年の原型と忘却ゲートの追加
意外に見落とされがちですが、上の6式は最初から揃っていたわけではありません。1997年に Sepp Hochreiter と Jürgen Schmidhuber が Neural Computation 誌で発表した原型LSTMには、忘却ゲートがありませんでした。入力ゲートと出力ゲート、そして定誤差カルーセルだけで勾配消失を回避する設計です。ただしセルステートを一度も忘れないため、長い連続データでは値が際限なく蓄積して破綻する弱点がありました。
これを解決したのが、Felix Gers・Schmidhuber・Fred Cummins による1999〜2000年の論文「Learning to Forget」で、ここで初めて忘却ゲートが導入されます。同時期にゲートがセルステートを直接参照する「のぞき穴(peephole)接続」も提案されました。今日「LSTM」と呼ばれ標準的に使われるのは、この忘却ゲート付きの構成(Vanilla LSTM)です。原型と改良版の区別を押さえておくと、論文や実装の差異を読み解きやすくなります。
RNN・LSTM・GRUの違い(比較表)
LSTMの位置づけは、単純なRNNと、後発の軽量版GRU(Gated Recurrent Unit、Cho らが2014年に提案)と並べると明確になります。
| 項目 | RNN | LSTM | GRU |
|---|---|---|---|
| ゲート数 | 0 | 3(忘却・入力・出力) | 2(リセット・更新) |
| セルステート | なし | あり | なし(隠れ状態のみ) |
| 長期依存の学習 | 弱い | 強い | 強い |
| パラメータ数・計算コスト | 小 | 大 | 中 |
| 提案年 | 1980年代 | 1997年 | 2014年 |
GRUは忘却ゲートと入力ゲートを1つの更新ゲートに統合し、セルステートを廃して隠れ状態1本にまとめた簡略版です。パラメータが少なく学習が速い一方、非常に長い依存や複雑なタスクではLSTMがわずかに上回る報告が多く、データ量と計算資源のバランスで選び分けます。単純なRNNは実務での新規採用はほぼなく、勾配消失を理解するための基礎として位置づけられます。
PythonでのLSTM実装:KerasとPyTorch
Keras(TensorFlow)での実装
Kerasでは LSTM レイヤーを重ねるだけで多層モデルを構築できます。return_sequences=True は各時刻の出力を次の層へ渡す指定で、LSTMを積む場合に必要です。
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import LSTM, Dense
model = Sequential()
model.add(LSTM(50, return_sequences=True, input_shape=(timesteps, features)))
model.add(LSTM(50))
model.add(Dense(1))
model.compile(optimizer='adam', loss='mse')
model.fit(X_train, y_train, epochs=100, batch_size=64)
PyTorch(nn.LSTM)での実装
PyTorchでは nn.LSTM を使います。batch_first=True で入力の形を(バッチ, 時刻, 特徴量)に統一でき、戻り値として全時刻の出力と、最終時刻の隠れ状態 h_n・セルステート c_n が得られます。
import torch.nn as nn
lstm = nn.LSTM(input_size=10, hidden_size=50, num_layers=2, batch_first=True)
output, (h_n, c_n) = lstm(x) # x: (batch, timesteps, 10)
どちらも hidden_size(隠れ状態の次元)と層数がモデル容量を決めます。系列が長いほど過学習しやすいため、実務ではドロップアウト(PyTorchなら nn.LSTM の dropout 引数)や早期停止と組み合わせます。文全体を見てから判断したい翻訳や固有表現抽出では、系列を前後両方向から処理する双方向LSTM(Kerasなら Bidirectional(LSTM(...))、PyTorchなら nn.LSTM の bidirectional=True)が精度を高めます。
LSTMの主な応用事例
LSTMは、順序が意味を持つデータで力を発揮します。時系列予測では株価・需要・気象など過去の値から将来を推定する用途で使われ、指標や前処理の考え方は時系列分析の手法(ARIMAからPython実装まで)と共通します。自然言語処理では機械翻訳や感情分析で文脈を保持する役割を担い、音声認識では連続する音声フレームを逐次処理します。画像に対しては、CNNで抽出した特徴をLSTMへ渡す構成(CNN-LSTM)で、画像キャプション生成や動画のフレーム系列解析に応用されます。いずれも、LSTMがニューラルネットワークの一手法である点を踏まえると全体像がつかみやすく、位置づけはAI・機械学習・深層学習の違いで整理しています。
Transformer時代のLSTMと2024年のxLSTM
2017年に登場したTransformer(論文「Attention is All You Need」)は、再帰を使わず注意機構だけで系列を処理し、長文の並列学習で圧倒的な速度と精度を実現しました。この結果、大規模言語モデルの主役はTransformerに移り、LSTMの適用範囲は狭まっています。ここは事実を正確に押さえたい点で、同論文は「LSTMとAttentionを統合した」のではなく、再帰そのものを置き換えた提案です。
それでもLSTMを選ぶ理由は残ります。データ量が少なく系列が短いタスク、逐次処理でメモリを一定に保ちたい組み込み・ストリーミング用途では、Transformerより軽量なLSTM/GRUが実務的です。さらに2024年には、LSTM原案者のHochreiterらがxLSTM(Beck et al., arXiv:2405.04517, NeurIPS 2024)を発表しました。指数関数的ゲートとメモリミキシングを導入したsLSTM、行列型メモリで並列学習を可能にしたmLSTMを組み合わせ、Transformerに対抗しうる系列モデルとして再び注目されています。「LSTMは時代遅れ」と一括りにせず、タスクの規模とデータ量で選ぶのが現実的な判断です。
よくある質問
LSTMを開発したのは誰ですか?
1997年に Sepp Hochreiter と Jürgen Schmidhuber が提案しました。今日標準の忘却ゲートは、その後 Felix Gers・Schmidhuber・Fred Cummins が1999〜2000年に追加したものです。
RNNとLSTMの違いは何ですか?
RNNは隠れ状態1本で情報を上書きしていくため長期依存に弱く、勾配消失が起きます。LSTMはセルステートと3つのゲートを加え、覚える情報と捨てる情報を制御して長期依存を学習できます。
LSTMとGRUはどちらを使うべきですか?
計算資源が限られる、あるいは学習を速くしたい場合はパラメータの少ないGRU、非常に長い依存や複雑なタスクで精度を優先する場合はLSTMが目安です。まずGRUで試し、精度が足りなければLSTMへ切り替える進め方が実務的です。
LSTMのメリットとデメリットは何ですか?
メリットは長期依存を学習でき、可変長の系列を扱える点です。デメリットは、逐次計算のため並列化しにくく学習が遅いこと、パラメータが多く計算コストが高いことで、大規模・長文ではTransformerに置き換わっています。
LSTMの数式(公式)はどう表されますか?
忘却・入力・出力の各ゲートをシグモイドで計算し、セルステートを C_t = f_t⊙C_{t-1} + i_t⊙g_t で更新、出力を h_t = o_t⊙tanh(C_t) で得ます。詳細は本文「数式で見るLSTMの1ステップ」を参照してください。