再帰型ニューラルネットワーク(RNN, LSTM)

再帰型ニューラルネットワーク(Recurrent Neural Network, RNN)およびその拡張であるLSTM(Long Short-Term Memory)は、時系列データや系列データ(自然言語、音声、株価など)を扱うために設計されたニューラルネットワークの一種です。PyTorchを用いることで、これらのネットワークを柔軟に構築・訓練・評価することが可能です。


1. RNNの概要

特徴

  • RNNは「現在の入力と過去の出力(隠れ状態)を入力として次の出力を決定する構造」を持ちます。

  • これにより、**時系列のような「順番に意味があるデータ」**をモデル化できます。

数式表現(基本RNNセル)

cpp
h_t = tanh(W_hh * h_{t-1} + W_xh * x_t + b) y_t = W_hy * h_t + c
  • h_t:現在の隠れ状態

  • x_t:時刻tの入力

  • y_t:出力

  • W_*:重み行列

問題点

  • 長期依存関係(long-term dependencies)の学習が難しい(勾配消失/爆発)


2. LSTMの概要

LSTMはRNNの構造を改良し、**「長期依存の情報を保持する能力」**を持たせたモデルです。

LSTMセルの構成要素

LSTMは3つのゲートとセル状態を用います:

  • 入力ゲート i_t: 現在の入力をどれだけ記憶セルに加えるか

  • 忘却ゲート f_t: 以前のセル状態をどれだけ忘れるか

  • 出力ゲート o_t: セル状態からどれだけ出力するか

  • セル状態 C_t: 長期記憶を保持するベクトル

数式(簡略)

cpp
f_t = sigmoid(W_f * [h_{t-1}, x_t] + b_f) i_t = sigmoid(W_i * [h_{t-1}, x_t] + b_i) o_t = sigmoid(W_o * [h_{t-1}, x_t] + b_o) g_t = tanh(W_g * [h_{t-1}, x_t] + b_g) C_t = f_t * C_{t-1} + i_t * g_t h_t = o_t * tanh(C_t)

3. PyTorchでの実装例(LSTMによる時系列予測)

python
import torch import torch.nn as nn class LSTMModel(nn.Module): def __init__(self, input_size, hidden_size, output_size, num_layers=1): super(LSTMModel, self).__init__() self.lstm = nn.LSTM(input_size, hidden_size, num_layers, batch_first=True) self.fc = nn.Linear(hidden_size, output_size) def forward(self, x): out, _ = self.lstm(x) # 出力と隠れ状態 out = self.fc(out[:, -1, :]) # 最後のタイムステップの出力を全結合層へ return out

使用例

python
model = LSTMModel(input_size=1, hidden_size=64, output_size=1) x = torch.randn(32, 10, 1) # バッチサイズ32、時系列長10、特徴量1 output = model(x)

4. 応用例

  • 自然言語処理(文生成、感情分析)

  • 音声認識

  • 株価予測、電力需要予測

  • 時系列分類・回帰


5. LSTMの改良モデル

  • GRU(Gated Recurrent Unit):LSTMの簡略版で、計算量が少なく学習が速い

  • BiLSTM(双方向LSTM):系列の前後を同時に考慮

  • Stacked LSTM:LSTMを複数階層に積み重ねて表現力を向上


6. まとめ

特性 RNN LSTM
長期依存 学習困難 学習可能(セル構造による)
構造 単純 ゲート構造が複雑
使用頻度 現在は少ない 主流(特に系列データ)

生成日:2025/05/22