3.2 誤差逆伝播法
間違いを後ろから配る
この回で分かること
- 誤差逆伝播法 が「出力の誤差を、後ろの層から順に各重みへ配る」計算方法であることを説明できる
- 連鎖律(傾きの掛け算)を使って、小さなネットワークの勾配を計算できる
- なぜ速く計算できるのかと、勾配消失・勾配爆発などの問題を説明できる
直感で理解する
3.1 のニューラルネットワークの重みは、2.3 の勾配降下法で学びます。そのためには、重み1つひとつについて「少し動かすと損失がどれだけ変わるか」(傾き)が必要です。ところが重みは数百万〜数十億個あります。1つずつ少し動かして、そのたびにネットワーク全体を計算し直していたら、1歩進むだけで何百万回もの計算が必要になります。
そこで、出力の側から逆向きにたどります。まず出力がどれだけ間違っていたか(誤差)を計算し、それを1つ手前の層へ、「この層のこの値がこれだけ悪かった」と配っていきます。各層は受け取った誤差をさらに手前へ配り、その途中で自分の重みの傾きも求めます。こうすると、1回の後ろ向きの計算で、すべての重みの傾きがそろいます。これが 誤差逆伝播法(バックプロパゲーション)です。
しくみは歯車に似ています。歯車Aが1回転すると歯車Bが2回転し、Bが1回転するとCが3回転するなら、Aを1回転させるとCは 2 × 3 = 6回転します。途中の「伝わり方の割合」を掛け合わせれば、端から端への伝わり方が分かります。
数式で確かめる
① 連鎖律:傾きは掛け算で伝わる
損失 L が予測 ŷ で決まり、ŷ が h で決まり、h が重み \(w_1\) で決まるとき、\(w_1\) を少し動かしたときの L の変化の割合は、途中の割合の掛け算になります。これを 連鎖律 と呼びます(歯車の回転比の掛け算と同じ)。
② 図の例で計算する
順伝播:入力 x = 1、\(w_1 = 0.5\) から \(h = \mathrm{ReLU}(0.5) = 0.5\)、\(w_2 = 2\) から \(\hat{y} = 1.0\)。正解は y = 2 なので、損失(2乗誤差、2.2)は \(L = (1.0 - 2)^2 = 1.0\) です。
逆伝播:後ろから順に傾きを求めます。
- \(\partial L / \partial \hat{y} = 2(\hat{y} - y) = -2\)(予測が小さすぎる、という誤差)
- \(\hat{y} = w_2 h\) なので、\(\partial L / \partial w_2 = -2 \times h = -1\)、\(\partial L / \partial h = -2 \times w_2 = -4\)
- \(h = \mathrm{ReLU}(w_1 x)\) で、ReLU は z がプラスの所では傾きが1(3.1)なので、\(\partial L / \partial w_1 = -4 \times 1 \times x = -4\)
学習率 η = 0.1 で1歩更新すると(2.3)、\(w_1 \leftarrow 0.5 - 0.1 \times (-4) = 0.9\)、\(w_2 \leftarrow 2 - 0.1 \times (-1) = 2.1\)。もう一度計算すると h = 0.9、ŷ = 1.89 で、損失は 1.0 から \((1.89 - 2)^2 \approx 0.012\) まで下がりました。出力に近い \(w_2\) だけでなく、手前の \(w_1\) も「どれだけ責任があったか」に応じて動いています。
③ なぜ速いのか
重みを1つずつ少し動かして傾きを測る方法(数値微分)でも、同じ答えは得られます。たとえば \(w_1\) を 0.001 だけ増やすと損失は 1.000 から約 0.996 に減るので、傾きは約 −4 です。ただしこの方法では、重みが N 個あれば、1歩ごとに N 回ほどネットワークを計算し直す必要があります。誤差逆伝播法なら、重みがいくつあっても 順伝播1回と逆伝播1回(順伝播の2〜3回分ほどの計算)で、すべての傾きがそろいます。重みが1億個なら、1億回と数回分の差です。数値微分は、実装が正しいかを一部の重みで確かめるのに使われます。
④ 勾配消失と勾配爆発
層が深くなると、連鎖律の掛け算も長くなります。掛けていく数が1より小さいと、手前の層ほど傾きが小さくなります。たとえばシグモイド関数の傾きは最大でも 0.25 なので、10層分掛けると \(0.25^{10} \approx 0.000001\)(約100万分の1)。手前の層の重みがほとんど動かず、学習が進みません。これを 勾配消失 と呼びます。逆に1より大きい数を掛け続けると、\(1.5^{10} \approx 58\) のように傾きが大きくなりすぎ、学習が暴れます(勾配爆発)。
対策として、傾きが1の区間を持つ ReLU を使う、重みの初期値を工夫する、層の途中で値の大きさをそろえる(正規化)、層を飛び越える近道をつなぐ(残差接続)、大きすぎる傾きを切り詰める、などが使われます。深いネットワークが学習できるようになったのは、こうした工夫の積み重ねです。
自動運転との接点
- 傾きの計算は自動化されている:実際の開発では、ソフトウェアが傾きを自動で計算します(自動微分)。人が微分を書く必要はありませんが、数値が発散したり計算できない値(NaN)になったりしても、気づかないまま学習が進むことがあります。損失の推移を記録して確かめ、同じ条件で学習し直せるようにしておきます(2.3)。→ 5.9 AIコンポーネントの安全
- 傾きは「どこが効いたか」を探る道具にもなる:重みの代わりに入力の画素について傾きを求めると、どの画素が判断に効いたかが分かります。判断の根拠を示す手法の土台になる一方で、判断を狂わせる小さな変化を作るのにも使えます。→ 3.8 頑健性と敵対的サンプル、3.9 説明可能性(XAI)
- 少しの追加学習でも全体が動く:例のように、1回の更新で出力から遠い重みまで一斉に動きます。新しいデータで追加学習すると、改善したかった場面以外の振る舞いも変わりうるので、以前の場面も含めて試験し直します(1.7 の「悪くなっていないか」の確認)。
まとめ
- 誤差逆伝播法は、出力の誤差を後ろの層から順に配り、1回の後ろ向きの計算ですべての重みの傾きを求める方法
- しくみは連鎖律:傾き(変化の割合)は、途中の割合の掛け算で伝わる。求めた傾きで、勾配降下法が重みを更新する
- 深い層では掛け算が長くなり、勾配消失・勾配爆発が起きうる。ReLU・初期値・正規化・残差接続などで防ぐ
確認クイズ
Q1. 歯車Aが1回転すると歯車Bが3回転し、Bが1回転するとCが0.5回転します。Aを1回転させると、Cは何回転する?
3 × 0.5 = 1.5回転です。途中の割合を掛け合わせる、これが連鎖律の考え方です。
Q2. 図の例で、正解が y = 1 だったら(予測 ŷ = 1.0 のまま)、重みの傾きはどうなる?
損失は0で、\(\partial L / \partial \hat{y} = 2(1.0 - 1) = 0\) なので、すべての傾きが0になり、重みは動きません。予測が正解と合っていれば、直す必要がないということです。
Q3. 重みが1,000万個あるネットワークで、重みを1つずつ少し動かして傾きを測ると、1歩ごとにネットワークを何回計算する?誤差逆伝播法なら?
1つずつ測ると、約1,000万回の計算が必要です。誤差逆伝播法なら、順伝播1回と逆伝播1回ですべての傾きがそろいます。
Q4. 20層のネットワークで、1層ごとに傾きが0.5倍ずつ伝わるとします。最初の層に届く傾きは、出力の側の何倍?
\(0.5^{20} \approx 0.000001\)、つまり約100万分の1です。最初の層の重みはほとんど動かず、学習が進みません(勾配消失)。
もっと知りたい人へ
- 次の回:3.3 CNNと画像認識
- 関連:0.2 数式の読み方(微分・偏微分)、2.3 勾配降下法、3.1 ニューラルネットワーク
- 用語集:誤差逆伝播法・連鎖律、勾配消失・勾配爆発、自動微分、勾配降下法
- 解説動画:YouTube(約5分)(静止画のスライドと音声で要点を説明。英語版の記事には英語の動画があります)