双方向RNN そうほうこうあーるえぬえぬ
双方向RNNBidirectional RNNBiLSTMBiGRU文脈理解自然言語処理
双方向RNNについて教えて
簡単に言うとこんな感じ!
通常のRNNは「左から右」に読むけど、双方向RNNは「左から右」と「右から左」の2方向から読んで両方の情報を合わせるよ!「銀行(bank)」の意味が「川岸か金融機関か」を文脈から判断するには、前後の単語が必要——まさに双方向で解決できるんだ!
双方向RNNとは
双方向RNN(Bidirectional RNN) は、前向き(過去→現在)と後ろ向き(未来→現在)の2つのRNNを並列で実行し、各時刻の出力を2つの隠れ状態の連結として表現するアーキテクチャです。
通常のRNN(および LSTM・GRU)は左から右への一方向処理のため、各時刻での予測に「それまでの文脈」しか使えません。双方向RNNは「前の単語も後ろの単語も見てから判断できる」ため、文全体の文脈を理解する必要があるタスクで特に効果的です。
代表的な実装はBiLSTM(双方向LSTM) とBiGRU(双方向GRU) です。BERTはTransformerベースですが、「双方向で文脈を理解する」という思想はBiRNNと共通しています(論文名の「B」がBidirectionalを意味)。
双方向RNNの仕組み
入力系列: 「猫 が 魚 を 食べた」
前向きRNN: 猫→が→魚→を→食べた → h_forward[各位置]
後向きRNN: 食べた→を→魚→が→猫 → h_backward[各位置]
各位置の出力: concat(h_forward, h_backward)
「魚」の表現 = [前:「猫が魚」の文脈] + [後:「魚を食べた」の文脈]
import torch.nn as nn
# PyTorchでの双方向LSTM(BiLSTM)
bilstm = nn.LSTM(
input_size=128,
hidden_size=256,
num_layers=2,
batch_first=True,
bidirectional=True # これで双方向になる
)
# 出力次元: hidden_size × 2 = 512(前向き256 + 後ろ向き256)
output, (h_n, c_n) = bilstm(x)
print(output.shape) # → (batch, seq_len, 512)
歴史と背景
- 1997年:Schusterらが双方向RNNを提案
- 2005〜2015年:音声認識・固有表現認識でBiLSTMが標準的な手法に
- 2018年:BERTがTransformerを使った双方向文脈理解で革命を起こす
- 現在:NLPの主流はTransformerだが、BiLSTMは軽量なシーケンスタスクで現役
双方向RNNが有効なタスク
| タスク | なぜ双方向が有効か |
|---|---|
| 感情分析 | 文末の表現が全体のトーンを変える場合がある |
| 固有表現認識(NER) | 「Apple社の製品」か「果物のリンゴ」か後続語で判断 |
| 品詞タグ付け | 文法的な前後の関係から品詞が決まる |
| 機械翻訳(エンコーダ) | 全体の文脈を把握してからデコードする |
単方向 vs 双方向の使い分け
| 用途 | 推奨 |
|---|---|
| テキスト分類・感情分析 | 双方向(全文脈が必要) |
| 系列ラベリング(NER等) | 双方向 |
| テキスト生成(次単語予測) | 単方向(未来の情報は使えない) |
| リアルタイム音声認識 | 単方向(遅延なく処理が必要) |
関連用語
- LSTM — 双方向に使われることの多い代表的なRNNモデル
- GRU — BiGRUとして双方向に使われる軽量モデル
- RNN(再帰型ニューラルネットワーク) — 双方向RNNの基本となるモデル
- Seq2Seq — 双方向RNNをエンコーダとして使うアーキテクチャ