RNN(リカレントニューラルネットワーク)は「ループを持つ」特殊な構造ですが、学習にはおなじみの誤差逆伝播法を使います。その橋渡しをするのがBPTTです。「時間方向に展開する」という発想と、そこから生まれる課題までを解説します。

📖 ひと言でいうと

BPTT(Backpropagation Through Time、時間方向の誤差逆伝播法)とは、RNNのループ構造を時間軸に沿って展開し、各時刻の層を並べた通常のディープニューラルネットワークとみなして誤差逆伝播法を適用する学習手法です。

例えるなら、毎日同じノートに追記していく日記(ループするRNN)を、後から「1日目のページ、2日目のページ…」と1枚ずつ広げて机に並べるイメージです。並べてしまえば、ふつうの多層ネットワークと同じように、最後のページから最初のページへ順番に誤差をさかのぼらせて学習できます。

🖼 1枚でわかるBPTT

BPTT — RNNを時間軸に展開して誤差逆伝播
  • 何をする — RNNのループを展開し、各時刻を層とみなして誤差逆伝播
  • 手順 — 順伝播で全時刻の出力を計算→最終時刻から逆伝播
  • 課題1 — 各時刻の中間データ保持でメモリ使用量が増える
  • 課題2 — 長い系列で勾配消失・勾配爆発が起きやすい
  • 対策 — 展開を適当な長さで切るTruncated BPTT、LSTM/GRUの採用
つくもち屋「G検定対策」SUMMARY

📘 公式テキストの説明

リカレントニューラルネットワーク(RNN)は、時系列データや自然言語処理など、順序や時間的依存関係を持つデータの解析に適している。RNNの学習では、誤差逆伝播法(Backpropagation)を時間方向に適用する「時間方向の誤差逆伝播法(Backpropagation Through Time、BPTT)」が用いられる。BPTTは、RNNを時間軸上に展開し、各時間ステップでのネットワークを全結合型のディープニューラルネットワーク(DNN)と見なして誤差逆伝播を行う手法である。具体的には、RNNのループ構造を展開し、各時刻のRNNレイヤを通常のニューラルネットワークと同様に扱うことで、誤差逆伝播法を適用する。BPTTの手順として、まず順伝播により各時間ステップでの出力を計算し、次に最終時間ステップから逆伝播を開始して、各時間ステップの誤差を計算する。この際、各時間ステップの中間データを保持する必要があり、時系列データが長くなるとメモリ使用量が増加する。また、時間サイズが長くなると、逆伝播時の勾配が不安定になることも問題となる。BPTTの課題として、長い時系列データを学習する際、勾配消失や勾配爆発といった問題が生じやすい点が挙げられる。これは、時間ステップが進むごとに誤差が重みと勾配の乗算を繰り返すため、時間ステップが1に近いところまで誤差が伝搬されたときには、相当回数の重みと勾配が乗算されていることが原因である。これらの問題を軽減するため、Truncated BPTT(TBPTT)と呼ばれる手法が用いられることがある。TBPTTでは、ネットワークの逆伝播の繋がりを適当な長さで切り取り、その切り取られたネットワーク単位で学習を行う。これにより、長い時系列データを扱う際の計算リソースの消費や勾配の不安定性を抑えることができる。さらに、勾配消失や勾配爆発の問題を解決するために、LSTM(Long Short-Term Memory)やGRU(Gated Recurrent Unit)といった改良型のRNNアーキテクチャが提案されている。これらのモデルは、長期的な依存関係を効果的に学習できるよう設計されており、BPTTの課題を克服する手段として広く利用されている。

かみ砕くと、BPTTの発想は「ループは展開すればただの深いネットワーク」という一点にあります。RNNは同じ層を毎時刻使い回しているだけなので、10時刻分のデータを処理したRNNは「同じ重みを共有する10層のネットワーク」と等価です。等価なら、通常のディープラーニングと同じ誤差逆伝播法がそのまま使えます。

ただし展開した深さは系列の長さそのものです。1000語の文章なら1000層相当。ここから、メモリ消費と勾配の不安定さという2つの課題が必然的に生まれます。

🔍 しっかり理解する

学習の流れ

① ループ展開
RNNを時刻1〜Tの
層の並びとみなす
② 順伝播
各時刻の出力を計算し
中間データを保持
③ 逆伝播
最終時刻から過去へ
誤差をさかのぼる
④ 重み更新
全時刻の勾配を集約
(重みは全時刻共有)

注意したいのは、展開後も重みは全時刻で共有されている点です。展開図では層が並んでいますが、実体は同じ1組の重み。各時刻で計算された勾配を集約して、その1組の重みを更新します。

なぜ勾配消失・勾配爆発が起きるのか

逆伝播では、誤差が1時刻さかのぼるたびに重みと活性化関数の勾配が掛け算されます。100時刻さかのぼれば掛け算が100回近く繰り返される計算です。掛けられる値が1より小さめなら、誤差は指数的に縮んでほぼゼロになり(勾配消失)、遠い過去の入力から学べなくなります。逆に1より大きめなら指数的に膨らんで発散します(勾配爆発)。

「0.9を100回掛けると約0.00003、1.1を100回掛けると約14000」と考えると、長い系列での掛け算の繰り返しがいかに危険かがイメージできます。これがRNNが長期依存を苦手とする根本原因であり、公式テキストの「相当回数の重みと勾配が乗算されている」という記述の意味です。

課題への2つのアプローチ

第一の対策はTruncated BPTT(TBPTT)です。逆伝播のつながりを適当な長さ(たとえば数十時刻)で切り取り、そのブロック単位で学習します。さかのぼる距離に上限ができるため、メモリ消費と勾配の不安定さを抑えられます。ただし切った範囲より遠い過去との依存関係は学習しにくくなるトレードオフがあります。

第二の対策は、ネットワーク構造そのものの改良です。LSTMやGRUはゲート機構によって情報の保持・忘却を制御し、長期的な依存関係を学習しやすく設計されています。「学習アルゴリズム側の工夫がTBPTT、モデル構造側の工夫がLSTM/GRU」という整理で覚えると、関連キーワードのつながりが明確になります。

💡 具体例で考える

株価の翌日値動きをRNNで予測する場面を考えます。過去250営業日(約1年)の系列を丸ごとBPTTで学習しようとすると、順伝播では250時刻分の中間状態をすべてメモリに保持し、逆伝播では250回分の掛け算の連鎖をたどることになります。メモリはかさみ、250回の乗算を経た勾配はほぼ確実に消失か爆発のどちらかに向かいます。そこで実務では、たとえば「25時刻ごとに逆伝播を打ち切る」TBPTTで学習を回す、あるいは最初からLSTMを使って長期の文脈を保持させる、といった選択をします。1つの課題(長系列の学習)に対して、アルゴリズムの工夫と構造の工夫が併存している好例です。

⚠️ よくある誤解・紛らわしい用語

💡 ポイント
  • 通常の誤差逆伝播法(BP)との関係 — BPTTは別種の魔法ではなく、「時間展開したRNNに通常のBPを適用したもの」です。空間方向(層の深さ)にさかのぼるのがBP、時間方向にもさかのぼるのがBPTT、と整理できます。
  • 「展開すると層ごとに別の重みになる」わけではない — 展開はあくまで見方の変換で、全時刻が同じ重みを共有します。ここが通常のDNNとの決定的な違いです。
  • TBPTTは勾配消失の「解決策」ではなく「緩和策」 — 切り取った範囲内の計算を安定させる手法で、遠い過去への依存はむしろ学べなくなります。長期依存を学ぶための本質的な対策はLSTM/GRUなどの構造側の改良です。
  • 勾配消失はBPTT固有の問題ではない — 深い順伝播型ネットワークでも起こります。ただし系列長ぶんだけ実効的な深さが伸びるRNNでは特に深刻になる、という関係です。

📝 試験でのポイント

💡 ポイント
  • 「RNNを時間軸上に展開し、誤差逆伝播法を適用する手法」という定義からBPTTを選ぶのが基本形です。
  • BPTTの課題2点(長系列でのメモリ増加、勾配消失・勾配爆発)は頻出です。原因が「重みと勾配の乗算の繰り返し」であることまで押さえましょう。
  • Truncated BPTT=「逆伝播のつながりを適当な長さで切り取って学習」という対応づけを問う問題が想定されます。
  • 「BPTTの課題を構造面から克服するモデルはどれか」でLSTM・GRUを選ばせる、という関連キーワードへの接続も出題ポイントです。

📚 まとめ

💡 ポイント
  • BPTTは、RNNのループを時間軸に展開し、通常のDNNとみなして誤差逆伝播法を適用する学習手法です。
  • 手順は「順伝播で全時刻の出力を計算→最終時刻から逆伝播」で、重みは全時刻で共有されます。
  • 長い系列ではメモリ使用量の増加と、乗算の繰り返しによる勾配消失・勾配爆発が課題になります。
  • 緩和策として展開を打ち切るTruncated BPTT、構造的な克服策としてLSTM・GRUがあります。