RNN(再帰型ニューラルネットワーク)
学習目標: RNN/LSTMの構造と時系列データへの適用方法を理解する
RNNとは
RNN(Recurrent Neural Network)は、時系列データや可変長のシーケンスを扱うためのニューラルネットワークです。 前の時刻の情報(隠れ状態)を次の時刻に渡すことで、文脈を記憶します。
PyTorchでのRNN
import torch
import torch.nn as nn
# 基本的なRNN
rnn = nn.RNN(
input_size=10, # 入力の特徴量数
hidden_size=20, # 隠れ状態の次元
num_layers=2, # RNN層の数
batch_first=True # 入力形状を(batch, seq, feature)に
)
# 入力: (batch, seq_len, input_size)
x = torch.randn(32, 100, 10) # バッチ32、系列長100、特徴10
output, hidden = rnn(x)
print(output.shape) # (32, 100, 20) - 全時刻の出力
print(hidden.shape) # (2, 32, 20) - 最終隠れ状態
LSTM(Long Short-Term Memory)
LSTMはRNNの勾配消失問題を解決し、長期依存性を学習できます。
# LSTM
lstm = nn.LSTM(
input_size=10,
hidden_size=20,
num_layers=2,
batch_first=True,
dropout=0.2, # 層間のドロップアウト
bidirectional=True # 双方向LSTM
)
x = torch.randn(32, 100, 10)
output, (hidden, cell) = lstm(x)
# 双方向の場合、hidden_sizeは2倍
print(output.shape) # (32, 100, 40)
文章分類の例
class TextClassifier(nn.Module):
def __init__(self, vocab_size, embed_dim, hidden_dim, num_classes):
super().__init__()
self.embedding = nn.Embedding(vocab_size, embed_dim)
self.lstm = nn.LSTM(embed_dim, hidden_dim, batch_first=True)
self.fc = nn.Linear(hidden_dim, num_classes)
def forward(self, x):
# x: (batch, seq_len) - 単語インデックス
embedded = self.embedding(x) # (batch, seq_len, embed_dim)
_, (hidden, _) = self.lstm(embedded) # hidden: (1, batch, hidden_dim)
out = self.fc(hidden.squeeze(0)) # (batch, num_classes)
return out
model = TextClassifier(vocab_size=10000, embed_dim=128, hidden_dim=256, num_classes=2)
理解度チェック
Q. LSTMがRNNより優れている点は?