教科書 › 第0部 数学の土台
CHAPTER 0-2

どちらへ動かせば良くなるか ── 微分

無料20分

第0部の第1章では「並べると計算になる」を置きました。この章は動かすと何が起きるかです。学習の式はどれも「いまより良くなる向きを1つ決める」式で、その向きを決めているのは微分です。覚える記号は3つだけ——偏微分・勾配・ヤコビアン。連鎖律はその3つのつなぎ方で、規則は2つしかありません。つながっている所はかけ算、分かれている所はたし算。

その前に、形の話をする言葉を置きます。

1. 集合と写像 ── 「形が合わない」の意味

実数を nn 個並べたものの全体を Rn\mathbb{R}^n と書きます。x∈R784x \in \mathbb{R}^{784} は「xx は784個の実数の並び」という意味です。

定義. 集合 AA の各要素に BB の要素を1つ対応させる規則を写像 f:A→Bf: A \to B という。AA を定義域、BB を行き先という。

深層学習の1層は写像です。x↦Wx+bx \mapsto Wx + b(W∈R128×784W \in \mathbb{R}^{128 \times 784})は R784→R128\mathbb{R}^{784} \to \mathbb{R}^{128} の写像で、784個の並びを受け取って128個の並びを返します。

2つの写像をつなぐ合成 g∘fg \circ f(ff を通してから gg を通す)が書けるのは、ff の行き先が gg の定義域と一致するときだけです。f:R784→R128f: \mathbb{R}^{784} \to \mathbb{R}^{128} の後ろに g:R64→R10g: \mathbb{R}^{64} \to \mathbb{R}^{10} は置けません。

実装で毎日見る shape mismatch は、このことを機械が言っているだけです。形が合わないのは計算の失敗ではなく、合成が定義されていないという意味です。第0部の第1章の式(3)で見た「内側の次元が一致」は、この条件を行列の言葉に直したものでした。

2. 上限と下限 ── 最小値が存在しないことがある

微分に入る前に、1つだけ用語を足します。これが無いと、第4章の「いつ止めるか」が宙に浮きます。

定義. 集合 S⊂RS \subset \mathbb{R} のすべての要素以上である数を SS の上界という。上界のうち最小のものを上限 sup⁡S\sup S という。同様に、下界のうち最大のものを下限 inf⁡S\inf S という。

最大値 max⁡S\max S は「SS に属していて、かつ上界であるもの」です。上限は SS に属さなくてよい——ここが違います。

例. S={ 1−1n:n=1,2,3,… }={0, 0.5, 0.6667, 0.75, 0.8, … }S = \{\, 1 - \tfrac{1}{n} : n = 1, 2, 3, \dots \,\} = \{0,\ 0.5,\ 0.6667,\ 0.75,\ 0.8,\ \dots\}。どの要素も1より小さく、1に好きなだけ近づけます。よって sup⁡S=1\sup S = 1。しかし 1∈S1 \in S ではないので、SS に最大値はありません。

これが損失関数の話に直結します。点が2つだけの例で測ります。x1=+1x_1 = +1(正解 y1=1y_1 = 1)、x2=−1x_2 = -1(正解 y2=0y_2 = 0)とし、p=σ(wx)p = \sigma(wx)(σ(z)=1/(1+e−z)\sigma(z) = 1/(1+e^{-z}))で当てます。平均の対数損失は L(w)=−log⁡σ(w)L(w) = -\log \sigma(w) になります。

ww L(w)L(w)
0.5 0.4741
1 0.3133
2 0.1269
5 6.72×10−36.72\times10^{-3}
10 4.54×10−54.54\times10^{-5}
20 2.06×10−92.06\times10^{-9}

下がり続けます。 inf⁡L=0\inf L = 0 ですが、σ(w)<1\sigma(w) < 1 が常に成り立つので0には到達しません。つまりこの問題に最小値は存在せず、重みは際限なく伸びていきます。第1章(第III部)で測った「同じ境界のまま倍率を上げると損失だけ下がる」は、この現象の一部でした。

矛盾する点を1つ足すと話が変わります。x3=−1x_3 = -1 に正解 y3=1y_3 = 1 を置くと、ww を伸ばすほどこの点が罰されるので、どこかで釣り合います。実際 ∂L/∂w=0\partial L/\partial w = 0 は σ(w)=2/3\sigma(w) = 2/3 と同値で、w=log⁡2=0.6931…w = \log 2 = 0.6931\ldots、L=0.6365L = 0.6365。有限の場所に最小があります。

下限があることと、最小値があることは別です。分けられてしまうデータでは対数損失の最小値が存在しないので、「損失が最小になるまで回す」は手順として成立しません。だから止める規則を人が足します(第4章)。
画面の 0.0 を下限に達した証拠と読まないこと。float64 では $z \ge 36.7368$ で $\sigma(z)$ が丸めで厳密に 1.0 になり、$-\log\sigma(z)$ は 0.0 と表示されます。数学上の値は正で、$z = 36.7368$ の一つ下では $2.2 \times 10^{-16}$ です。

3. 偏微分 ── 1本だけ動かす

定義. f:Rn→Rf: \mathbb{R}^n \to \mathbb{R} の第 ii 変数についての偏微分を

∂f∂xi(x)  =  lim⁡t→0f(x1,…,xi+t,…,xn)−f(x)t\frac{\partial f}{\partial x_i}(x) \;=\; \lim_{t \to 0} \frac{f(x_1, \dots, x_i + t, \dots, x_n) - f(x)}{t}
(1)

で定める。

式(1)がしていることは1つです。他の変数を止めて、1本だけ動かす。 動かした分に対して出力が何倍動いたか、それが偏微分です。

数値例. f(x,y)=x2y+3yf(x,y) = x^2 y + 3y のとき ∂f/∂x=2xy\partial f/\partial x = 2xy、∂f/∂y=x2+3\partial f/\partial y = x^2 + 3。(x,y)=(2,3)(x,y) = (2,3) では f=21f = 21 で、∂f/∂x=12\partial f/\partial x = 12、∂f/∂y=7\partial f/\partial y = 7。

手で出した式は、動かして測れば確かめられます。

∂f∂xi(x)  ≈  f(x+hei)−f(x−hei)2h\frac{\partial f}{\partial x_i}(x) \;\approx\; \frac{f(x + h e_i) - f(x - h e_i)}{2h}
(2)

eie_i は第 ii 成分だけが1の単位ベクトル、hh は小さな数です。式(2)を中心差分といいます。上の例を h=10−5h = 10^{-5} で測ると 12.000000000112.0000000001 と 7.00000000007.0000000000——解析の値との差は最大 9.0×10−119.0 \times 10^{-11} でした。

この検算は現場の道具です。自分で書いた逆伝播を疑うときは、まず式(2)と突き合わせます。学習には使いません——パラメータ1つにつき前向き計算が2回必要で、785個なら1,570回かかります。確かめるためだけの道具です。

4. 勾配 ── 偏微分を並べると「最も急な向き」になる

定義. f:Rn→Rf: \mathbb{R}^n \to \mathbb{R} の勾配を、偏微分を縦に並べたベクトル

∇f(x)  =  (∂f∂x1, …, ∂f∂xn)⊤∈Rn\nabla f(x) \;=\; \left( \frac{\partial f}{\partial x_1}, \ \dots, \ \frac{\partial f}{\partial x_n} \right)^{\top} \in \mathbb{R}^n
(3)

で定める。

勾配が特別なのは、並べただけで「最も急な向き」になっていることです。これは導けます。

∥u∥=1\|u\| = 1 の向き uu に沿って ff がどれだけ動くかは、1変数の関数 φ(t)=f(x+tu)\varphi(t) = f(x + tu) の t=0t = 0 での微分です。各成分に連鎖律を当てると

Duf(x)  =  φ′(0)  =  ∑i=1n∂f∂xiui  =  ∇f(x)⊤uD_u f(x) \;=\; \varphi'(0) \;=\; \sum_{i=1}^{n} \frac{\partial f}{\partial x_i} u_i \;=\; \nabla f(x)^{\top} u
(4)

これを方向微分といいます。式(4)は内積なので、第0部の第1章の式(1)と同じ形です。内積は ∇f⊤u=∥∇f∥ ∥u∥cos⁡θ=∥∇f∥cos⁡θ\nabla f^{\top} u = \|\nabla f\|\,\|u\|\cos\theta = \|\nabla f\|\cos\theta と書けるので

−∥∇f(x)∥  ≤  Duf(x)  ≤  ∥∇f(x)∥-\|\nabla f(x)\| \;\le\; D_u f(x) \;\le\; \|\nabla f(x)\|
(5)

で、右の等号が成り立つのは cos⁡θ=1\cos\theta = 1、つまり u=∇f/∥∇f∥u = \nabla f/\|\nabla f\| のときだけです。勾配の向きが最も急に増える向きで、その逆向きが最も急に減る向き。 増える量の上限は ∥∇f∥\|\nabla f\| そのものです。

数値例. 上の ff の (2,3)(2,3) では ∇f=(12,7)⊤\nabla f = (12, 7)^{\top}、∥∇f∥=193=13.8924\|\nabla f\| = \sqrt{193} = 13.8924。向きをずらして方向微分を測ると、

勾配からのずれ 方向微分 ∥∇f∥cos⁡θ\lVert\nabla f\rVert\cos\theta
0° 13.8924 13.8924
30° 12.0312 12.0312
60° 6.9462 6.9462
90° 0.0000 0.0000

∥∇f∥cos⁡θ\|\nabla f\|\cos\theta と小数4桁まで一致します。90°のとき0になるのは、その向きが等高線に沿う向きだからです。

5. ヤコビアン ── 写像の微分は行列になる

出力が1つなら勾配で済みますが、層の出力は128個あります。

定義. f:Rn→Rmf: \mathbb{R}^n \to \mathbb{R}^m のヤコビ行列を

Jf(x)  =  (∂fi∂xj)i=1,…,mj=1,…,n∈Rm×nJ_f(x) \;=\; \left( \frac{\partial f_i}{\partial x_j} \right)_{\substack{i = 1,\dots,m \\ j = 1,\dots,n}} \in \mathbb{R}^{m \times n}
(6)

で定める。

形は覚えなくても出せます。行が出力の数、列が入力の数。m=1m = 1 なら (1,n)(1,n) で、これは勾配を横に寝かせたものです。

深層学習で出てくるヤコビアンは、ほとんど次の2つです。

(a)線形層. z=Wxz = Wx(W∈R128×784W \in \mathbb{R}^{128 \times 784})なら ∂zi/∂xj=Wij\partial z_i/\partial x_j = W_{ij} なので J=WJ = W。重みそのものがヤコビアンです。

(b)要素ごとの活性化. a=φ(z)a = \varphi(z) を成分ごとに ai=φ(zi)a_i = \varphi(z_i) と適用するなら、i≠ji \neq j では ∂ai/∂zj=0\partial a_i/\partial z_j = 0。つまり

J=diag(φ′(z1),…,φ′(z128))J = \mathrm{diag}\big(\varphi'(z_1), \dots, \varphi'(z_{128})\big)

対角行列です。ここが実装の形を決めています。対角行列をかけることは要素ごとにかけることと同じなので、第3章の式には行列積ではなくアダマール積 ∘\circ(第0部の第1章の式(4))が出てきます。持つ数も違います。(128,128)(128,128) の行列として持てば 16,38416{,}384 個ですが、対角だけなら 128128 個——128分の1です。

(c)一般の例. g(x,y)=(x2, x+y)g(x,y) = (x^2,\ x+y) なら

Jg=(2x011),Jg(2,3)=(4011)J_g = \begin{pmatrix} 2x & 0 \\ 1 & 1 \end{pmatrix}, \qquad J_g(2,3) = \begin{pmatrix} 4 & 0 \\ 1 & 1 \end{pmatrix}

式(2)の中心差分で4成分すべて測ると、差は最大 3.8×10−113.8 \times 10^{-11} でした。

6. 連鎖律 ── つなぐ所はかけ算、分かれる所はたし算

1変数なら (h∘g)′(x)=h′(g(x)) g′(x)(h \circ g)'(x) = h'(g(x))\, g'(x)。局所の傾きの積です。写像でも形は同じで、積が行列積になります。

Jf∘g(x)  =  Jf(g(x))  Jg(x)J_{f \circ g}(x) \;=\; J_f\big(g(x)\big)\; J_g(x)
(7)

式(7)の形を確かめます。g:Rn→Rkg: \mathbb{R}^n \to \mathbb{R}^k、f:Rk→Rmf: \mathbb{R}^k \to \mathbb{R}^m なら、右辺は (m,k)×(k,n)→(m,n)(m,k) \times (k,n) \to (m,n)。左辺は Rn→Rm\mathbb{R}^n \to \mathbb{R}^m の写像の微分なので (m,n)(m,n)。合う。 合成が書ける条件(第1節)と、行列積が書ける条件(第0部の第1章の式(3))が同じものだったからです。

成分で書くと、たし算がどこから来るのかが見えます。

∂(f∘g)i∂xj  =  ∑p=1k∂fi∂up⋅∂gp∂xj\frac{\partial (f \circ g)_i}{\partial x_j} \;=\; \sum_{p=1}^{k} \frac{\partial f_i}{\partial u_p} \cdot \frac{\partial g_p}{\partial x_j}
(8)

式(8)の和は経路の数だけの和です。xjx_j から (f∘g)i(f\circ g)_i へ行く道は、途中の upu_p をどれ経由するかで kk 本あります。各経路で局所の傾きをかけ、全経路を足す。つながっている所はかけ算、分かれている所はたし算——連鎖律はこれだけです。

FIG 1「つなぐ」面では g と h の接線(局所の傾き)をかけ、合成の接線と比べる——どの組・どの x でも積と実測が一致する。「分かれる」面では x から y への2本の経路を足す。経路を1本落とすと合計が実測から外れる=実装で分岐を1本忘れたときに起きること

数値検算. g(x,y)=(x2, x+y)g(x,y) = (x^2,\ x+y) の後ろに f(u,v)=uvf(u,v) = uv を置くと、合成は h(x,y)=x2(x+y)h(x,y) = x^2(x+y) です。(2,3)(2,3) で

Jf=(v, u)=(5, 4),JfJg=(5, 4)(4011)=(24, 4)J_f = (v,\ u) = (5,\ 4), \qquad J_f J_g = (5,\ 4)\begin{pmatrix} 4 & 0 \\ 1 & 1 \end{pmatrix} = (24,\ 4)

直接微分すると ∂h/∂x=3x2+2xy=24\partial h/\partial x = 3x^2 + 2xy = 24、∂h/∂y=x2=4\partial h/\partial y = x^2 = 4。一致します。 中心差分との差も 1.5×10−101.5\times10^{-10} でした。

掛ける順番が計算量を決める

式(7)を層の数だけつなげると、行列の積が並びます。ここで掛ける順番は自由です(行列積は結合的)。そして順番で計算量が10倍違います。

損失(出力1つ)から入力へ向かう3段を、J1∈R1×10J_1 \in \mathbb{R}^{1 \times 10}、J2∈R10×128J_2 \in \mathbb{R}^{10 \times 128}、J3∈R128×784J_3 \in \mathbb{R}^{128 \times 784} とします。

順番 乗算の回数
左から ((J1J2)J3)((J_1 J_2) J_3) 1,280+100,352=101,6321{,}280 + 100{,}352 = 101{,}632
右から (J1(J2J3))(J_1 (J_2 J_3)) 1,003,520+7,840=1,011,3601{,}003{,}520 + 7{,}840 = 1{,}011{,}360

9.95倍です。左から掛けると途中に残るのは常に行ベクトルで、(128,784)(128,784) のような行列を一度も作りません。右から掛けると作ってしまいます。

誤差逆伝播は新しい規則ではありません。式(7)を左から掛けるだけです。出力が1つ(損失)で入力が何百万個あるとき、左から掛けるのが安い——それだけの理由で「逆向き」に進みます。中身は第3章で開きます。

よくある誤解: 「勾配の向きに進めば最短で谷に着く」

第4節で導いたのは「その点で最も急な向き」です。道のりが最短という話は、どこにもありません。測ると、はっきりずれます。

f(x,y)=(x2+10y2)/2f(x,y) = (x^2 + 10y^2)/2 を使います。谷底は原点。(10,1)(10, 1) から η=0.18\eta = 0.18 で降ります。

値
原点までの直線距離 10.0499
実際に通った道のりの長さ 13.4655(1.34倍)
最初の一歩の向きと、谷底への向きの角度差 39.29°
原点の近く(半径0.01)に入るまでの歩数 35

通った道のりが1.34倍になった理由は、yy 成分の符号です。最初の6歩を並べると −0.8000-0.8000, +0.6400+0.6400, −0.5120-0.5120, +0.4096+0.4096, −0.3277-0.3277, +0.2621+0.2621——毎歩またいでいます。yy 方向は曲がりが10倍きついので、xx 方向に合わせた歩幅では必ず行き過ぎる。横断しながら少しずつ中心に寄っていく、いわゆるジグザグです。

曲がり方が軸でそろっていれば、この差は消えます。 同じ開始点で f(x,y)=(x2+y2)/2f(x,y) = (x^2+y^2)/2 にすると道のりは 10.0402 で、直線距離 10.0499 から止めた半径 0.01 を引いた値です。歩数は同じ35歩。ずれを作っていたのは勾配ではなく、軸ごとの曲がり方の違いでした。

勾配が指しているのは向きだけで、距離は指していません。歩幅(学習率)は別に決める必要があり、軸ごとに曲がり方が違う場所では1つの歩幅がどの軸にも合いません。モーメンタムや Adam がやっているのはこの手当てです(第4章)。

演習

答えは閉じてあります。手を動かしてから開いてください。

演習1. W∈R128×784W \in \mathbb{R}^{128 \times 784} として z=Wxz = Wx、a=tanh⁡(z)a = \tanh(z)(成分ごと)とします。(a) x↦zx \mapsto z のヤコビアンの形と中身。(b) z↦az \mapsto a のヤコビアンの形と中身。(c) x↦ax \mapsto a のヤコビアンの形。(d) 実装で (b) を行列として持たない理由。

答えを見る

(a) (128,784)(128, 784) で、中身は WW そのもの。 ∂zi/∂xj=Wij\partial z_i/\partial x_j = W_{ij} です。

(b) (128,128)(128,128) の対角行列。 i≠ji \neq j なら aia_i は zjz_j を含まないので0。対角成分は 1−tanh⁡2(zi)1 - \tanh^2(z_i)。

(c) (128,784)(128, 784)。 式(7)より J=diag(1−tanh⁡2z) WJ = \mathrm{diag}(1-\tanh^2 z)\, W で、(128,128)×(128,784)→(128,784)(128,128) \times (128,784) \to (128,784)。

(d) 0 を 16,25616{,}256 個持つことになるから。 1282=16,384128^2 = 16{,}384 個のうち意味があるのは対角の128個だけです。対角行列をかけるのは要素ごとにかけるのと同じなので、実装は (128,)(128,) のベクトルを1本持ってアダマール積で済ませます。第3章の式に ∘\circ が出てくるのは、この対角性の言い換えです。

演習2. S={ −log⁡σ(z):z∈R }S = \{\, -\log\sigma(z) : z \in \mathbb{R} \,\} について。(a) inf⁡S\inf S はいくつで、SS に属しますか。(b) SS は上に有界ですか。(c) float64 で計算すると (a) の答えはどう見えますか。

答えを見る

(a) inf⁡S=0\inf S = 0。属しません。 σ(z)∈(0,1)\sigma(z) \in (0,1) が全実数 zz で成り立つので −log⁡σ(z)>0-\log\sigma(z) > 0。いっぽう z→∞z \to \infty で σ(z)→1\sigma(z) \to 1 なので値は0に好きなだけ近づきます。下限はあるが最小値は無い——本文の {1−1/n}\{1-1/n\} と同じ形です。

(b) 上に有界ではありません。 z→−∞z \to -\infty で σ(z)→0\sigma(z) \to 0、−log⁡σ(z)→+∞-\log\sigma(z) \to +\infty。sup⁡S=+∞\sup S = +\infty です。1点を自信たっぷりに外すと損失が際限なく増えるのはこれで、第1章(第III部)の演習3で −log⁡0.05=2.9957-\log 0.05 = 2.9957 を払ったのと同じ話です。

(c) 0.0 と表示されます。 z≥36.7368z \ge 36.7368 で σ(z)\sigma(z) が丸めで厳密に 1.0 になるため。数学上は正の値で、一つ下の zz では 2.2×10−162.2\times10^{-16}。「損失が0になった」という画面は、下限に到達した証拠ではありません。

演習3. y=(x+1)x2y = (x+1)x^2 を、u=x+1u = x+1 と v=x2v = x^2 の2経路に分けて考えます。x=2x = 2 で (a) 各経路の積と和。(b) 直接微分した値。(c) 上の経路だけを数えたらいくつになり、何が起きますか。

答えを見る

(a) u=3u = 3、v=4v = 4。∂y/∂u=v=4\partial y/\partial u = v = 4、du/dx=1du/dx = 1 なので上の経路は 4×1=44 \times 1 = 4。∂y/∂v=u=3\partial y/\partial v = u = 3、dv/dx=2x=4dv/dx = 2x = 4 なので下の経路は 3×4=123 \times 4 = 12。和は 16。

(b) y=x3+x2y = x^3 + x^2 なので dy/dx=3x2+2x=12+4=16dy/dx = 3x^2 + 2x = 12 + 4 = 16。一致します(中心差分でも 16.00000000116.000000001)。

(c) 4 になり、正しい値の4分の1になります。 xx が uu と vv の両方に入っているので、xx を動かすと2つが同時に動きます。片方だけ数えるのは「vv は動かない」と言っているのと同じで、仮定そのものが違います。

この形は実装でそのまま出ます。残差接続 y=x+F(x)y = x + F(x) では xx から yy への経路が2本あり、dy/dx=1+F′(x)dy/dx = 1 + F'(x) です。F(x)=tanh⁡(0.8x)F(x) = \tanh(0.8x)、x=0.6x = 0.6 なら F′(x)=0.6407F'(x) = 0.6407 で dy/dx=1.6407dy/dx = 1.6407。FF の側だけを数えると 0.64070.6407——1より小さいので重ねるほど細ります。恒等の経路が足す「1」が、細らせない役をしています。

この章で言っていないこと

  • 微分できない点を扱っていません。 ReLU は z=0z=0 で傾きが定まりません。実装は劣勾配から1つ選んで(多くは0)進めますが、その正当化はしていません。
  • 2階微分(ヘッセ行列)を使っていません。 曲がり方の違いが学習を難しくすることは測りましたが、曲がり方そのものを行列で扱う話(2次法)は第4章で触るだけです。
  • 極限・連続の厳密な定義(ε\varepsilon-δ\delta)は置いていません。上限・下限を入れたのは「最小値が無いことがある」という1点を言うためだけです。
  • 自動微分の実装(計算グラフをどう保ち、どれだけメモリを食うか)は第3章です。この章は規則だけです。
  • 本文の数値はすべて実際に計算して確かめています(偏微分・ヤコビアンの中心差分照合、方向微分と ∥∇f∥cos⁡θ\|\nabla f\|\cos\theta の一致、JfJgJ_fJ_g と直接微分の一致、w=log⁡2w = \log 2 の最小、降下経路の長さと歩数、float64 の丸めの境目)。

もっと詳しく

コメント

コメントにはログインが必要です