G検定(ジェネラリスト検定)
びーぴーてぃーてぃー
BPTT
BPTT
Backpropagation Through Time
BPTT(Back-Propagation Through Time)は、リカレントニューラルネットワークを時刻ごとに展開した計算グラフへ、通常の誤差逆伝播法をそのまま適用して勾配を求める方法です。勾配は系列の最後の時刻から最初の時刻へさかのぼって伝わり、すべての時刻で共有している重みの勾配は、時刻ごとの寄与を足し合わせて求めます。計算時間とメモリはどちらも系列の長さに比例し、順伝播が1時刻ずつしか進められないため、計算時間は並列化で短くできません。
詳しい説明
BPTTとは何か
BPTTは Back-Propagation Through Time の略で、「時間をさかのぼる誤差逆伝播」という意味の名前です。リカレントニューラルネットワーク(RNN)の重みを学習するときに、勾配を計算する方法を指します。勾配とは、損失を小さくするために各重みをどちらへどれだけ動かせばよいかを表す値です。
RNNは、系列を1要素ずつ読み込み、前の時刻に計算した隠れ状態を次の時刻の計算に渡すネットワークです。系列とは、文章の単語の並びや時刻ごとの測定値の並びのように、順番に意味があるデータのことです。
イアン・グッドフェロー(Ian Goodfellow)、ヨシュア・ベンジオ(Yoshua Bengio)、アーロン・クールヴィル(Aaron Courville)による教科書『Deep Learning』(2016年)の第10章は、RNNを時刻ごとに展開した計算グラフへ誤差逆伝播法を適用したものをBPTTと呼んでいます。同書は、RNNの勾配の計算は素直なもので、展開した計算グラフに一般的な誤差逆伝播法を当てはめるだけでよく、特別なアルゴリズムは要らないと述べています。つまりBPTTは、誤差逆伝播法とは別の新しい学習則ではありません。求めた勾配は、勾配を使う一般的な最適化手法にそのまま渡して、重みの更新に使えます。
誰が最初にこの方法を提案したかは、この記事の根拠にした教科書の該当箇所には書かれていません。
ループを時刻ごとに並べ直した計算グラフ
RNNを図に描くと、隠れ層から自分自身へ戻るループを持った形になります。このままでは、どの計算がどの計算の結果を使っているかが時刻をまたいで見えにくくなります。そこで、時刻1から系列の最後の時刻 (タウ)までの計算を時刻ごとに横へ並べ直します。これを展開(unfold)と呼び、並べ直した結果を展開した計算グラフと呼びます。展開した計算グラフでは、1つ1つの節点がどれか1つの時刻に対応します。
同書が例に使うRNNは、時刻 で次の計算をします。
は時刻 の入力、 は隠れ状態、 は出力です。 は入力から隠れ層への重み行列、 は1つ前の時刻の隠れ層から今の時刻の隠れ層への重み行列、 は隠れ層から出力への重み行列で、 と はバイアスです。計算は初期状態 を決めるところから始まります。
、、、、 は、すべての時刻で同じものを使います。展開した計算グラフには同じ が時刻の数だけ繰り返し現れますが、別々の重みが 個あるわけではありません。この点が、あとで重みの勾配を求めるときに効いてきます。
系列全体の損失は、各時刻の損失 の和です。
最後の時刻から勾配をさかのぼらせる
BPTTの計算は2つの段階からなります。まず順伝播で、展開した計算グラフを時刻1から時刻 へ向かって計算し、各時刻の隠れ状態・出力・損失を求めます。次に逆伝播で、同じグラフを時刻 から時刻1へ向かってたどり、勾配を求めます。
逆伝播は系列の最後から始めます。最後の時刻の隠れ状態 は、その時刻の出力 にしか影響しないので、勾配を出力の側からだけ受け取ります。それより前の時刻の隠れ状態 は、同じ時刻の出力 と、次の時刻の隠れ状態 の両方に影響します。そのため の勾配は、次の時刻から戻ってくる分と、同じ時刻の出力から戻ってくる分の和になります。同書はこれを次の式で書いています。
は、損失 を の各要素で微分した値を並べたもので、 についての勾配です。 は、 を対角に並べた行列で、活性化関数 tanh の微分に当たります。右辺の第1項が1つ後の時刻から戻ってくる分、第2項が同じ時刻の出力から戻ってくる分です。この式を から まで順に当てはめることで、勾配が時刻をさかのぼって伝わります。
第1項には が掛かっています。時刻を1つさかのぼるたびにこの項を通るので、遠い過去の隠れ状態に届く勾配には、 と tanh の微分の行列が、さかのぼった時刻の数だけ繰り返し掛かることになります。
共有した重みの勾配は時刻ごとの寄与の合計になる
各時刻の隠れ状態の勾配がそろったら、重みの勾配を求めます。同じ がすべての時刻で使われているので、 が損失に与える影響も全時刻に散らばっています。同書は、時刻 だけで使う の写し を考え、時刻ごとの寄与を求めてから全時刻について足し合わせる形で、次の式を示しています。
の勾配も同じ形で、 の代わりにその時刻の入力 が入ります。
この「時刻ごとの寄与を足す」を数値で確かめるために、式を小さくした例を使います。値はすべて説明のために決めた架空のものです。計算を簡単にするため活性化関数を省き(tanh の代わりに入力をそのまま返す関数を使い)、隠れ状態も重みも1つの数にします。
重みを 、、初期状態を 、入力を 、、 とし、損失を最後の隠れ状態そのもの とします。
| 時刻 | 入力 | 順伝播で求める | 逆伝播で求める |
|---|---|---|---|
| 1 | 1 | ||
| 2 | 2 | ||
| 3 | 3 |
順伝播は時刻1から順に進みます。逆伝播は時刻3から始まり、 なので です。 なので、時刻を1つさかのぼるたびに が掛かり、時刻2では 、時刻1では になります。
の勾配は、各時刻で が掛かった相手 に、その時刻の を掛けて、3つの時刻の分を足し合わせたものです。
確かめとして、 を だけの式に書き直すと です。これを で微分した に を入れると になり、上の結果と一致します。同じように の勾配は です。どれか1つの時刻の寄与だけでは正しい勾配にならず、全時刻の分を足して初めて正しくなります。
計算時間とメモリはどちらも系列の長さに比例する
同書は、BPTTの計算時間を としています。 は、系列の長さ が2倍になれば計算量もおよそ2倍になる、という増え方を表す記法です。さらに同書は、この計算時間は並列化で短くできないと述べています。理由は、順伝播がもともと逐次的だからです。時刻 の隠れ状態は、時刻 の隠れ状態が決まるまで計算できません。上の例でも、 を求めるには先に が、 を求めるには先に が必要でした。
メモリについても同書は としています。逆伝播の式は、順伝播で求めた隠れ状態を使います。そのため順伝播で計算した状態は、逆伝播で使い終わるまで保存しておく必要があります。上の例でも、 を求めるのに から までをすべて使いました。
同書はここまでの説明のまとめとして、隠れ層どうしに再帰を持つネットワークはとても強力だが、学習の費用も大きいと述べています。
教師強制でBPTTを避けられる場合と避けられない場合
同書は、この費用を避ける方法として教師強制(teacher forcing)を取り上げています。教師強制は、ある時刻の出力から次の時刻の隠れ層へつながる接続を持つRNNで使える学習方法です。学習のときに、モデル自身の出力の代わりに訓練データにある正解 を時刻 への入力として与えます。
再帰が出力から次の時刻の隠れ層への接続だけで、隠れ層どうしの再帰を持たないネットワークでは、前の時刻の出力を先に計算する必要がありません。その値の正解が訓練データに書かれているからです。したがって各時刻の勾配を他の時刻から切り離して計算でき、学習を並列化できます。ただし同書は、この形のネットワークは隠れ層どうしの再帰を持つものより表現できる関数の範囲が狭いとも述べています。
| ネットワークの形 | 学習での勾配の計算 | 同書が挙げる表現力 |
|---|---|---|
| 再帰が、出力から次の時刻の隠れ層への接続だけ | 教師強制を使えば時刻ごとに切り離して計算でき、並列化できる | 隠れ層どうしの再帰を持つものより狭い |
| 隠れ層どうしの再帰を持つ | 隠れ状態が過去の時刻の関数になるので、BPTTが必要 | とても強力 |
隠れ層どうしの再帰を持つモデルでも、出力から次の時刻への接続があれば教師強制を適用できます。しかし同書によれば、隠れ層が過去の時刻の関数になった時点でBPTTが必要になります。このため、教師強制とBPTTの両方を使って学習するモデルもあります。教師強制はどんなRNNでもBPTTの代わりになるわけではなく、隠れ層どうしの再帰があるかどうかで、BPTTが要るかどうかが決まります。
試験で問われること
G検定
- BPTTは、RNNを時刻ごとに展開した計算グラフへ一般の誤差逆伝播法を適用したものです。RNNのために作られた別の学習則ではありません。
- 逆伝播は系列の最後の時刻から最初の時刻へ向かって進みます。各時刻の隠れ状態の勾配は、同じ時刻の出力から戻る分と、1つ後の時刻の隠れ状態から戻る分の和になります。
- 重みはすべての時刻で共有しているので、重みの勾配は時刻ごとの寄与を合計して求めます。
- 計算時間とメモリはどちらも系列の長さ に比例する です。順伝播が1時刻ずつしか進められないため計算時間は並列化で短くできず、順伝播の状態を逆伝播まで保存するためにメモリも要ります。
- 教師強制は、隠れ層どうしの再帰を持たないモデルでBPTTを避ける手段になります。隠れ層が過去の時刻の関数になるモデルではBPTTが必要で、教師強制とBPTTを併用することもあります。
最終更新日: 2026/09/23