1 基本構造
再帰型ニューラルネットワーク(Recurrent Neural Network, RNN)は、時系列データやシーケンスデータの処理に特化した人工ニューラルネットワークの一種である。従来のフィードフォワード型ネットワークと異なり、内部にループ構造を持つことで過去の情報を保持し、時間的な依存関係を学習できる。自然言語処理、音声認識、金融予測など、順序が重要なタスクで広く応用されている。
1.1 フィードバックループ
RNNの核心は、隠れ層の出力を次のタイムステップの入力として再び自身に送り込むフィードバックループである。これによりネットワークは過去の情報を「記憶」し、現在の出力に影響を与える。ループは時系列に沿って展開(unroll)され、各タイムステップで同じ重みが共有されるため、系列長が可変でも同一のモデルで処理できる。
1.2 隠れ状態とセル
隠れ状態(hidden state)は、RNNが過去の入力から抽出した情報を保持するベクトルである。各タイムステップで、現在の入力と前ステップの隠れ状態から新しい隠れ状態が計算される。この状態ベクトルがネットワークの「メモリ」として機能し、系列全体にわたる文脈を捉える。単純なRNNでは一つの隠れ状態のみを持つが、後述のLSTMなどでは複数の状態ベクトル(セル状態と隠れ状態)を使い分ける。
1.3 数学的定式化
単純なRNNの動作は次の式で表される。時刻tにおける隠れ状態h_tは、入力x_tと前時刻の隠れ状態h_{t-1}から計算される。
\[ h_t = \tanh(W_{xh} x_t + W_{hh} h_{t-1} + b_h) \]
出力y_tは隠れ状態h_tに基づいて生成される。
\[ y_t = W_{hy} h_t + b_y \]
ここでW_{xh}、W_{hh}、W_{hy}は重み行列、b_h、b_yはバイアス項である。活性化関数には双曲線正接関数(tanh)がよく用いられる。
2 学習アルゴリズム
2.1 Backpropagation Through Time (BPTT)
RNNの学習にはBackpropagation Through Time(BPTT)が用いられる。これは、時系列に展開されたネットワークに対して誤差逆伝播法を適用する手法である。各タイムステップでの損失を計算し、その勾配を時間方向に遡って累積することで、共有された重みの更新量を求める。実装上は、系列を決められた長さに区切る「切り詰めBPTT(Truncated BPTT)」が一般的である。
2.2 勾配消失・爆発問題
BPTTでは、勾配が時間ステップを遡るにつれて指数関数的に減衰または増大する問題が発生する。活性化関数の微分値が1未満の場合、長期の依存関係を学習する際に勾配が消失し、ネットワークが遠い過去の情報を無視する。逆に、重みの初期値や活性化関数によっては勾配が爆発し、学習が安定しない。これは単純なRNNの最大の弱点の一つである。
2.3 クリッピング技法
勾配爆発を防ぐために、勾配クリッピング(gradient clipping)が用いられる。これは、計算された勾配のノルムが設定した閾値を超えた場合、そのノルムを閾値にスケーリングする手法である。これにより、極端に大きな更新を回避し、学習の安定性が向上する。勾配消失に対しては、後述のLSTMやGRUなどのゲート機構が効果的である。
3 主要なバリエーション
3.1 Long Short-Term Memory (LSTM)
Long Short-Term Memoryは、1997年にHochreiterとSchmidhuberによって提案されたRNNの一種であり、長期依存関係の学習に特化したゲート機構を持つ。LSTMはセル状態(cell state)と呼ばれる情報伝達経路を持ち、忘却ゲート、入力ゲート、出力ゲートの3つのゲートで情報の流れを制御する。
3.1.1 忘却ゲート
忘却ゲート(forget gate)は、前時刻のセル状態からどの情報を保持し、どの情報を破棄するかを決定する。シグモイド関数を用いて0から1の間の値を出力し、1に近いほど情報を保持し、0に近いほど破棄する。
3.1.2 入力ゲート
入力ゲート(input gate)は、現在の入力から新しい情報をセル状態に追加するかどうかを制御する。シグモイド層でどの値を更新するかを決め、tanh層で新たな候補値を生成し、それらを掛け合わせてセル状態に加える。
3.1.3 出力ゲート
出力ゲート(output gate)は、セル状態のどの部分を次の隠れ状態として出力するかを決定する。シグモイド層で出力する割合を決め、セル状態をtanhで-1から1に圧縮したものと掛け合わせて隠れ状態を生成する。
3.2 Gated Recurrent Unit (GRU)
Gated Recurrent Unitは、2014年にChoらによって提案されたLSTMの簡略化版であり、パラメータ数を削減しつつ同様の性能を達成する。GRUはセル状態を明示的に持たず、隠れ状態のみで動作する。リセットゲートと更新ゲートの2つのゲートを持つ。
3.2.1 リセットゲート
リセットゲート(reset gate)は、過去の隠れ状態をどの程度無視するかを決定する。このゲートが小さいほど、ネットワークは過去の情報をリセットし、現在の入力に強く依存するようになる。
3.2.2 更新ゲート
更新ゲート(update gate)は、過去の隠れ状態をどの程度新しい候補状態で置き換えるかを制御する。LSTMの忘却ゲートと入力ゲートを兼ねる役割を果たし、情報の保持と更新を同時に行う。
3.3 Bidirectional RNN
双方向RNN(Bidirectional RNN)は、系列を順方向と逆方向の2つのRNNで処理し、その出力を結合する構造である。これにより、各タイムステップで過去と未来の両方の文脈情報を利用できる。テキスト全体を考慮する必要があるタスク(例えば、固有表現認識や文書分類)で有効である。
3.4 深層RNN
深層RNN(Deep RNN)は、隠れ層を複数スタック(積層)した構造を持つ。各層の隠れ状態が次の層の入力となり、より抽象的な時系列特徴を抽出できる。層数を増やすことで表現力は向上するが、勾配消失や計算コストの問題が生じやすくなるため、LSTMやGRUと組み合わせて用いられることが多い。
4 応用分野
4.1 自然言語処理
自然言語処理(NLP)はRNNが最も成功を収めた応用分野の一つである。系列データであるテキストを扱うのに適しており、単語や文字の並びから意味を学習する。
4.1.1 言語モデリング
言語モデリングは、与えられた文脈から次の単語の確率を予測するタスクである。RNNはこれまでに出現した単語の履歴を隠れ状態に保持することで、文脈に応じた確率的な予測を生成する。これは生成タスクやスペルチェックの基礎技術である。
4.1.2 機械翻訳
機械翻訳では、入力文をエンコーダRNNで読み込み、その隠れ状態をデコーダRNNに渡して翻訳文を逐次生成する。初期のエンコーダ・デコーダモデルでは固定長ベクトルに情報を圧縮する必要があったが、後にアテンション機構を導入することで性能が大幅に向上した。
4.1.3 感情分析
感情分析(センチメント分析)では、文章全体の感情極性(ポジティブ・ネガティブなど)を分類する。RNNは各単語の順序を考慮して文脈を把握できるため、「とても良い」と「悪くない」のようなニュアンスの違いを捉えることができる。
4.2 時系列予測
4.2.1 株価予測
株価や為替レートなどの金融時系列データは、過去の値動きに依存する非線形な性質を持つ。RNNは過去の価格や出来高の系列を入力として、将来の値動きを予測するモデルとして用いられる。ただし、実際の市場はノイズが多く長期的な予測は困難である。
4.2.2 気象予測
気温、降水量、風速などの気象データは時間的依存性が強い。RNNは過去数日分の観測値から翌日の気象を予測するタスクに応用される。特に長期の季節変動を捉えるには、LSTMなどの長期記憶機構が有効である。
4.3 音声処理
4.3.1 音声認識
音声認識では、音響特徴量の時系列から音素や単語を推定する。RNNは音声信号の時間的構造をモデル化し、連続する音素の依存関係を学習する。近年ではConnectionist Temporal Classification(CTC)と組み合わせてエンドツーエンドの認識が行われている。
4.3.2 テキスト読み上げ
テキスト読み上げ(Text-to-Speech, TTS)では、テキスト系列から音声波形を生成する。RNNはテキストの韻律や発音の時間的変化を学習し、自然な発話を合成する。特にWaveNetのような深層モデルが登場する以前は、RNNベースのモデルが主流であった。
4.4 画像キャプショニング
画像キャプショニングは、入力画像の内容を説明する文を自動生成するタスクである。CNNで画像の特徴を抽出し、その特徴ベクトルをRNNの初期状態として与えることで、画像の内容に即した文を逐次生成する。RNNは生成した単語の文脈を保持しながら、次の単語を選択する。
5 限界と課題
5.1 長期依存関係の困難
単純なRNNは、勾配消失問題により数十ステップ以上離れた情報を学習することが難しい。LSTMやGRUの導入により大幅に改善されたが、非常に長い系列(例えば数百ステップ以上)では依然として情報の減衰や記憶容量の限界が課題となる。
5.2 並列処理の非効率性
RNNは本質的に逐次的な計算構造を持つため、各タイムステップの計算が前のステップの結果に依存する。このため、GPUなどの並列計算機でも系列全体を一度に処理することができず、Transformerなどと比較して学習時間が長くなる傾向がある。
5.3 メモリ消費の増大
BPTTでは展開されたネットワークのすべてのタイムステップの中間結果を保持する必要があるため、系列長が長くなるとメモリ消費が線形に増加する。Truncated BPTTや勾配チェックポイントなどの工夫が用いられるが、長大系列の学習には依然として大きなメモリリソースが必要である。
6 歴史と発展
6.1 初期の研究(1980年代)
RNNの初期のアイデアは、1980年代にJohn HopfieldやJordan、Elmanらによって提案された。Elmanネットワーク(1990年)は単純なリカレント結合を持つネットワークとして知られ、系列学習の可能性を示した。しかし当時は計算リソースや学習アルゴリズムの制約から大規模な応用は難しかった。
6.2 LSTMの登場(1997年)
1997年、Sepp HochreiterとJürgen SchmidhuberによってLong Short-Term Memory(LSTM)が提案された。LSTMはゲート機構により勾配消失問題を克服し、長期依存関係を効果的に学習できるようにした。その後の研究で多くの改良が加えられ、音声認識や翻訳で画期的な成果を上げる基盤となった。
6.3 深層学習時代の復活(2010年代)
2010年代に入り、GPUの普及と大規模データセットの利用可能により、RNNは深層学習の主要な構成要素として復活した。2014年にはGRUやアテンション機構が登場し、機械翻訳の性能が飛躍的に向上した。画像キャプショニングや音声認識でもRNNベースのシステムが主流となった。
6.4 Transformerとの比較
2017年にVaswaniらが提案したTransformerは、自己アテンション機構を用いて並列計算と長距離依存関係の学習を両立し、多くのNLPタスクでRNNを凌ぐ性能を示した。これにより、現在ではTransformerが自然言語処理の主流となりつつある。しかしRNNは計算資源が限られる環境や、逐次生成が必要なタスクでは依然として有用であり、Transformerとハイブリッドに用いられることもある。
7 実装とツール
7.1 主要フレームワーク(TensorFlow, PyTorch)
RNNの実装には、TensorFlowやPyTorchなどの深層学習フレームワークが広く利用される。これらのフレームワークはLSTMやGRUなどのモデルを高レベルAPIで提供し、BPTTや勾配クリッピングなどの学習アルゴリズムも自動で処理する。また、GPUによる高速計算や分散学習にも対応している。
7.2 簡単な実装例
PyTorchを用いた単純なRNNの実装例を示す。入力系列xが与えられたとき、nn.RNNモジュールを使って隠れ状態を更新し、最後の出力を全結合層で変換する。
```python import torch import torch.nn as nn
class SimpleRNN(nn.Module): def __init__(self, input_size, hidden_size, output_size): super().__init__() self.rnn = nn.RNN(input_size, hidden_size, batch_first=True) self.fc = nn.Linear(hidden_size, output_size)
def forward(self, x):
out, hn = self.rnn(x) # out: (batch, seq_len, hidden_size) out = self.fc(out[:, -1, :]) # 最後のタイムステップのみ使用 return out ```
7.3 ハイパーパラメータ調整
RNNの性能はハイパーパラメータの設定に大きく依存する。主な調整項目として、隠れ層のユニット数(hidden_size)、層数(num_layers)、学習率、系列長(seq_len)、ドロップアウト率などが挙げられる。勾配クリッピングの閾値や、LSTM/GRUの選択も重要である。一般的には、グリッドサーチやベイズ最適化を用いて最適なパラメータを探索する。