Recurrent Neural Network (RNN)
リカレントニューラルネットワーク(RNN)がメモリを使用して順序データを処理する仕組みを解説します。RNNアーキテクチャ、NLPアプリケーション、およびPyTorchの実装について学びましょう。
RNN (Recurrent Neural Network) は、テキスト、ゲノム、手書き文字、音声などのデータシーケンス内のパターンを認識するように特別に設計された 人工ニューラルネットワーク の一種です。すべての入力(および出力)が互いに独立していると仮定する従来のフィードフォワードネットワークとは異なり、RNNは一種のメモリを保持します。この内部メモリにより、過去の情報を理解した上で入力を処理できるため、文脈や時間順序が重要なタスクに最適です。このアーキテクチャは人間が情報を処理する方法を模倣しており、たとえば文章を読む際には、現在の単語を理解するために前の単語を記憶する必要があります。
RNNの仕組み#
RNNの核となるイノベーションはそのループ構造です。標準的な フィードフォワードネットワーク では、情報は一方向、すなわち入力から出力へと流れます。対照的に、RNNには情報を永続化させるフィードバックループがあります。ネットワークがシーケンスを処理する際、ネットワークの短期記憶として機能するベクトルである「隠れ状態」を維持します。各タイムステップで、RNNは現在の入力と前の隠れ状態を受け取り、出力を生成して次のステップのための隠れ状態を更新します。
このシーケンシャルな処理能力は NLP (Natural Language Processing) および 時系列分析 において不可欠です。しかし、標準的なRNNは、シーケンスが長くなるにつれてネットワークが以前の入力を忘れてしまう 勾配消失 の問題により、長いシーケンスの処理に苦労することがよくあります。この制限により、より長期間にわたる情報の流れをより適切に調整するメカニズムを導入した、LSTM (Long Short-Term Memory) ネットワークや GRU (Gated Recurrent Unit) などのより高度なバリアントが開発されることになりました。
実社会での応用#
リカレントニューラルネットワークは、機械が系列データを理解できるようにすることで多くの業界を変革しました。以下に2つの顕著な例を挙げます。
-
機械翻訳: Google翻訳などのサービスは、ある言語から別の言語にテキストを変換するために、もともとRNNベースのアーキテクチャ(具体的には シークエンス・トゥ・シークエンスモデル)に大きく依存していました。ネットワークは入力文全体(例:英語)を読み取ってコンテキストベクトルを構築し、それを使用して翻訳された出力(例:フランス語)を単語ごとに生成し、文法の一貫性を確保します。
-
予測入力とオートコレクト: スマートフォンで入力する際、キーボードは次に来そうな単語を提案します。これは多くの場合、RNNでトレーニングされた言語モデルによって駆動されます。このモデルは、すでに入力した単語のシーケンスを分析して最も確率の高い次の単語を予測し、ユーザーの速度と精度を向上させます。同様のロジックが、音声オーディオをテキストに書き起こす 音声認識 システムにも適用されます。
RNN対CNNおよびTransformer#
RNNを他の主要なアーキテクチャと区別すると便利です。CNN (Convolutional Neural Network) は主に、画像などの空間データ用に設計されており、ピクセルグリッドを処理して形状やオブジェクトを識別します。たとえば、Ultralytics YOLO26 は、リアルタイムの オブジェクト検出 のために強力なCNNバックボーンを使用します。CNNが「この画像には何が映っているか?」に優れているのに対し、RNNは「このビデオの次には何が起こるか?」に優れています。
より最近では、Transformer アーキテクチャが多くの複雑なNLPタスクでRNNにほぼ取って代わりました。Transformerは、シーケンシャルではなく並列にシーケンス全体を処理するために アテンションメカニズム を使用します。しかし、RNNは、特定の低レイテンシでリソース制約のあるストリーミングアプリケーションにおいて依然として非常に効率的であり、単純な時系列予測のためにエッジデバイスにデプロイするのがより簡単です。
PyTorch 実装の例#
現代のコンピュータビジョンタスクはCNNに依存することが多いですが、ハイブリッドモデルではRNNを使用して、ビデオフレームから抽出された時間的特徴を分析する場合があります。以下は、データのシーケンスを処理する基本的なRNN層を作成するための PyTorch を使用したシンプルで実行可能な例です。
import torch
import torch.nn as nn
# Define a basic RNN layer
# input_size: number of features in the input (e.g., 10 features per time step)
# hidden_size: number of features in the hidden state (memory)
# batch_first: input shape will be (batch, seq, feature)
rnn = nn.RNN(input_size=10, hidden_size=20, num_layers=1, batch_first=True)
# Create a dummy input: Batch size 1, Sequence length 5, Features 10
input_seq = torch.randn(1, 5, 10)
# Forward pass through the RNN
# output contains the hidden state for every time step
# hn contains the final hidden state
output, hn = rnn(input_seq)
print(f"Output shape: {output.shape}") # Expected: torch.Size([1, 5, 20])
print(f"Final hidden state shape: {hn.shape}") # Expected: torch.Size([1, 1, 20])課題と将来の展望#
有用性にもかかわらず、RNNには計算上のハードルがあります。シーケンシャルな処理は並列化を阻害するため、GPU 上でのTransformerと比較してトレーニングが遅くなります。さらに、勾配爆発 の問題を管理するには、慎重な ハイパーパラメータチューニング と勾配クリッピングなどの手法が必要です。
それにもかかわらず、RNNは ディープラーニング (DL) における基本概念であり続けます。これらは AI (Artificial Intelligence) の進化を理解する上で不可欠であり、IoTセンサー用の単純な 異常検知 システムでも広く使用されています。ビジョンモデルとシーケンス予測器の組み合わせなど、複雑なパイプラインを構築する開発者にとって、データセットとトレーニングワークフローの管理は極めて重要です。Ultralytics プラットフォーム はこのプロセスを簡素化し、データを管理してさまざまな環境にモデルを効率的にデプロイするためのツールを提供します。






