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より優れている点は?