自然言語処理

双方向RNN そうほうこうあーるえぬえぬ

双方向RNNBidirectional RNNBiLSTMBiGRU文脈理解自然言語処理
双方向RNNについて教えて

簡単に言うとこんな感じ!

通常のRNNは「左から右」に読むけど、双方向RNNは「左から右」と「右から左」の2方向から読んで両方の情報を合わせるよ!「銀行(bank)」の意味が「川岸か金融機関か」を文脈から判断するには、前後の単語が必要——まさに双方向で解決できるんだ!


双方向RNNとは

双方向RNN(Bidirectional RNN) は、前向き(過去→現在)と後ろ向き(未来→現在)の2つのRNNを並列で実行し、各時刻の出力を2つの隠れ状態の連結として表現するアーキテクチャです。

通常のRNN(および LSTMGRU)は左から右への一方向処理のため、各時刻での予測に「それまでの文脈」しか使えません。双方向RNNは「前の単語も後ろの単語も見てから判断できる」ため、文全体の文脈を理解する必要があるタスクで特に効果的です。

代表的な実装BiLSTM(双方向LSTM)BiGRU(双方向GRU) です。BERTTransformerベースですが、「双方向で文脈を理解する」という思想は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等)双方向
テキスト生成(次単語予測)単方向(未来の情報は使えない)
リアルタイム音声認識単方向(遅延なく処理が必要)

関連用語