ホーム›Part 3 ディープラーニングとAI›3.2

Part 3 · ディープラーニングとAI

3.2 誤差逆伝播法

間違いを後ろから配る

読了目安 10分前提:3.1 ニューラルネットワーク、2.3 勾配降下法▶ 動画(約5分)

この回で分かること

  • 誤差逆伝播法 が「出力の誤差を、後ろの層から順に各重みへ配る」計算方法であることを説明できる
  • 連鎖律(傾きの掛け算)を使って、小さなネットワークの勾配を計算できる
  • なぜ速く計算できるのかと、勾配消失・勾配爆発などの問題を説明できる

直感で理解する

3.1 のニューラルネットワークの重みは、2.3 の勾配降下法で学びます。そのためには、重み1つひとつについて「少し動かすと損失がどれだけ変わるか」(傾き)が必要です。ところが重みは数百万〜数十億個あります。1つずつ少し動かして、そのたびにネットワーク全体を計算し直していたら、1歩進むだけで何百万回もの計算が必要になります。

そこで、出力の側から逆向きにたどります。まず出力がどれだけ間違っていたか(誤差)を計算し、それを1つ手前の層へ、「この層のこの値がこれだけ悪かった」と配っていきます。各層は受け取った誤差をさらに手前へ配り、その途中で自分の重みの傾きも求めます。こうすると、1回の後ろ向きの計算で、すべての重みの傾きがそろいます。これが 誤差逆伝播法(バックプロパゲーション)です。

しくみは歯車に似ています。歯車Aが1回転すると歯車Bが2回転し、Bが1回転するとCが3回転するなら、Aを1回転させるとCは 2 × 3 = 6回転します。途中の「伝わり方の割合」を掛け合わせれば、端から端への伝わり方が分かります。

→ 順伝播:入力から出力へ計算する w₁ = 0.5 w₂ = 2 正解 y = 2 入力 x = 1 h = ReLU(w₁x) = 0.5 ŷ = w₂h = 1.0 L = (ŷ − y)² = 1.0 ∂L/∂ŷ = 2(ŷ − y) = −2 ∂L/∂w₂ = −2 × h = −1 ∂L/∂h = −2 × w₂ = −4 ∂L/∂w₁ = −4 × x = −4 ← 逆伝播:誤差の傾きを後ろから配る
重み w₁、w₂ の2つだけの小さなネットワーク。上の段(順伝播)で入力から損失までを計算し、下の段(逆伝播)で損失の傾きを右から左へ掛け算で伝えて、すべての重みの傾きを求める。

数式で確かめる

① 連鎖律:傾きは掛け算で伝わる

損失 L が予測 ŷ で決まり、ŷ が h で決まり、h が重み \(w_1\) で決まるとき、\(w_1\) を少し動かしたときの L の変化の割合は、途中の割合の掛け算になります。これを 連鎖律 と呼びます(歯車の回転比の掛け算と同じ)。

$$\frac{\partial L}{\partial w_1} = \frac{\partial L}{\partial \hat{y}} \cdot \frac{\partial \hat{y}}{\partial h} \cdot \frac{\partial h}{\partial w_1}$$

② 図の例で計算する

順伝播:入力 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です。最初の層の重みはほとんど動かず、学習が進みません(勾配消失)。

もっと知りたい人へ