第0部の第1章では「並べると計算になる」を置きました。この章は動かすと何が起きるかです。学習の式はどれも「いまより良くなる向きを1つ決める」式で、その向きを決めているのは微分です。覚える記号は3つだけ——偏微分・勾配・ヤコビアン。連鎖律はその3つのつなぎ方で、規則は2つしかありません。つながっている所はかけ算、分かれている所はたし算。
その前に、形の話をする言葉を置きます。
1. 集合と写像 ── 「形が合わない」の意味
実数を n 個並べたものの全体を Rn と書きます。x∈R784 は「x は784個の実数の並び」という意味です。
定義. 集合 A の各要素に B の要素を1つ対応させる規則を写像 f:A→B という。A を定義域、B を行き先という。
深層学習の1層は写像です。x↦Wx+b(W∈R128×784)は R784→R128 の写像で、784個の並びを受け取って128個の並びを返します。
2つの写像をつなぐ合成 g∘f(f を通してから g を通す)が書けるのは、f の行き先が g の定義域と一致するときだけです。f:R784→R128 の後ろに g:R64→R10 は置けません。
実装で毎日見る shape mismatch は、このことを機械が言っているだけです。形が合わないのは計算の失敗ではなく、合成が定義されていないという意味です。第0部の第1章の式(3)で見た「内側の次元が一致」は、この条件を行列の言葉に直したものでした。
2. 上限と下限 ── 最小値が存在しないことがある
微分に入る前に、1つだけ用語を足します。これが無いと、第4章の「いつ止めるか」が宙に浮きます。
定義. 集合 S⊂R のすべての要素以上である数を S の上界という。上界のうち最小のものを上限 supS という。同様に、下界のうち最大のものを下限 infS という。
最大値 maxS は「S に属していて、かつ上界であるもの」です。上限は S に属さなくてよい——ここが違います。
例. S={1−n1:n=1,2,3,…}={0, 0.5, 0.6667, 0.75, 0.8, …}。どの要素も1より小さく、1に好きなだけ近づけます。よって supS=1。しかし 1∈S ではないので、S に最大値はありません。
これが損失関数の話に直結します。点が2つだけの例で測ります。x1=+1(正解 y1=1)、x2=−1(正解 y2=0)とし、p=σ(wx)(σ(z)=1/(1+e−z))で当てます。平均の対数損失は L(w)=−logσ(w) になります。
| w |
L(w) |
| 0.5 |
0.4741 |
| 1 |
0.3133 |
| 2 |
0.1269 |
| 5 |
6.72×10−3 |
| 10 |
4.54×10−5 |
| 20 |
2.06×10−9 |
下がり続けます。 infL=0 ですが、σ(w)<1 が常に成り立つので0には到達しません。つまりこの問題に最小値は存在せず、重みは際限なく伸びていきます。第1章(第III部)で測った「同じ境界のまま倍率を上げると損失だけ下がる」は、この現象の一部でした。
矛盾する点を1つ足すと話が変わります。x3=−1 に正解 y3=1 を置くと、w を伸ばすほどこの点が罰されるので、どこかで釣り合います。実際 ∂L/∂w=0 は σ(w)=2/3 と同値で、w=log2=0.6931…、L=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→R の第 i 変数についての偏微分を
∂xi∂f(x)=t→0limtf(x1,…,xi+t,…,xn)−f(x) (1)
で定める。
式(1)がしていることは1つです。他の変数を止めて、1本だけ動かす。 動かした分に対して出力が何倍動いたか、それが偏微分です。
数値例. f(x,y)=x2y+3y のとき ∂f/∂x=2xy、∂f/∂y=x2+3。(x,y)=(2,3) では f=21 で、∂f/∂x=12、∂f/∂y=7。
手で出した式は、動かして測れば確かめられます。
∂xi∂f(x)≈2hf(x+hei)−f(x−hei) (2)
ei は第 i 成分だけが1の単位ベクトル、h は小さな数です。式(2)を中心差分といいます。上の例を h=10−5 で測ると 12.0000000001 と 7.0000000000——解析の値との差は最大 9.0×10−11 でした。
この検算は現場の道具です。自分で書いた逆伝播を疑うときは、まず式(2)と突き合わせます。学習には使いません——パラメータ1つにつき前向き計算が2回必要で、785個なら1,570回かかります。確かめるためだけの道具です。
4. 勾配 ── 偏微分を並べると「最も急な向き」になる
定義. f:Rn→R の勾配を、偏微分を縦に並べたベクトル
∇f(x)=(∂x1∂f, …, ∂xn∂f)⊤∈Rn (3)
で定める。
勾配が特別なのは、並べただけで「最も急な向き」になっていることです。これは導けます。
∥u∥=1 の向き u に沿って f がどれだけ動くかは、1変数の関数 φ(t)=f(x+tu) の t=0 での微分です。各成分に連鎖律を当てると
Duf(x)=φ′(0)=i=1∑n∂xi∂fui=∇f(x)⊤u (4)
これを方向微分といいます。式(4)は内積なので、第0部の第1章の式(1)と同じ形です。内積は ∇f⊤u=∥∇f∥∥u∥cosθ=∥∇f∥cosθ と書けるので
−∥∇f(x)∥≤Duf(x)≤∥∇f(x)∥ (5)
で、右の等号が成り立つのは cosθ=1、つまり u=∇f/∥∇f∥ のときだけです。勾配の向きが最も急に増える向きで、その逆向きが最も急に減る向き。 増える量の上限は ∥∇f∥ そのものです。
数値例. 上の f の (2,3) では ∇f=(12,7)⊤、∥∇f∥=193=13.8924。向きをずらして方向微分を測ると、
| 勾配からのずれ |
方向微分 |
∥∇f∥cosθ |
| 0° |
13.8924 |
13.8924 |
| 30° |
12.0312 |
12.0312 |
| 60° |
6.9462 |
6.9462 |
| 90° |
0.0000 |
0.0000 |
∥∇f∥cosθ と小数4桁まで一致します。90°のとき0になるのは、その向きが等高線に沿う向きだからです。
5. ヤコビアン ── 写像の微分は行列になる
出力が1つなら勾配で済みますが、層の出力は128個あります。
定義. f:Rn→Rm のヤコビ行列を
Jf(x)=(∂xj∂fi)i=1,…,mj=1,…,n∈Rm×n (6)
で定める。
形は覚えなくても出せます。行が出力の数、列が入力の数。m=1 なら (1,n) で、これは勾配を横に寝かせたものです。
深層学習で出てくるヤコビアンは、ほとんど次の2つです。
(a)線形層. z=Wx(W∈R128×784)なら ∂zi/∂xj=Wij なので J=W。重みそのものがヤコビアンです。
(b)要素ごとの活性化. a=φ(z) を成分ごとに ai=φ(zi) と適用するなら、i=j では ∂ai/∂zj=0。つまり
J=diag(φ′(z1),…,φ′(z128))
対角行列です。ここが実装の形を決めています。対角行列をかけることは要素ごとにかけることと同じなので、第3章の式には行列積ではなくアダマール積 ∘(第0部の第1章の式(4))が出てきます。持つ数も違います。(128,128) の行列として持てば 16,384 個ですが、対角だけなら 128 個——128分の1です。
(c)一般の例. g(x,y)=(x2, x+y) なら
Jg=(2x101),Jg(2,3)=(4101)
式(2)の中心差分で4成分すべて測ると、差は最大 3.8×10−11 でした。
6. 連鎖律 ── つなぐ所はかけ算、分かれる所はたし算
1変数なら (h∘g)′(x)=h′(g(x))g′(x)。局所の傾きの積です。写像でも形は同じで、積が行列積になります。
Jf∘g(x)=Jf(g(x))Jg(x) (7)
式(7)の形を確かめます。g:Rn→Rk、f:Rk→Rm なら、右辺は (m,k)×(k,n)→(m,n)。左辺は Rn→Rm の写像の微分なので (m,n)。合う。 合成が書ける条件(第1節)と、行列積が書ける条件(第0部の第1章の式(3))が同じものだったからです。
成分で書くと、たし算がどこから来るのかが見えます。
∂xj∂(f∘g)i=p=1∑k∂up∂fi⋅∂xj∂gp (8)
式(8)の和は経路の数だけの和です。xj から (f∘g)i へ行く道は、途中の up をどれ経由するかで k 本あります。各経路で局所の傾きをかけ、全経路を足す。つながっている所はかけ算、分かれている所はたし算——連鎖律はこれだけです。
FIG 1「つなぐ」面では g と h の接線(局所の傾き)をかけ、合成の接線と比べる——どの組・どの x でも積と実測が一致する。「分かれる」面では x から y への2本の経路を足す。経路を1本落とすと合計が実測から外れる=実装で分岐を1本忘れたときに起きること
数値検算. g(x,y)=(x2, x+y) の後ろに f(u,v)=uv を置くと、合成は h(x,y)=x2(x+y) です。(2,3) で
Jf=(v, u)=(5, 4),JfJg=(5, 4)(4101)=(24, 4)
直接微分すると ∂h/∂x=3x2+2xy=24、∂h/∂y=x2=4。一致します。 中心差分との差も 1.5×10−10 でした。
掛ける順番が計算量を決める
式(7)を層の数だけつなげると、行列の積が並びます。ここで掛ける順番は自由です(行列積は結合的)。そして順番で計算量が10倍違います。
損失(出力1つ)から入力へ向かう3段を、J1∈R1×10、J2∈R10×128、J3∈R128×784 とします。
| 順番 |
乗算の回数 |
| 左から ((J1J2)J3) |
1,280+100,352=101,632 |
| 右から (J1(J2J3)) |
1,003,520+7,840=1,011,360 |
9.95倍です。左から掛けると途中に残るのは常に行ベクトルで、(128,784) のような行列を一度も作りません。右から掛けると作ってしまいます。
誤差逆伝播は新しい規則ではありません。式(7)を左から掛けるだけです。出力が1つ(損失)で入力が何百万個あるとき、左から掛けるのが安い——それだけの理由で「逆向き」に進みます。中身は第3章で開きます。
よくある誤解: 「勾配の向きに進めば最短で谷に着く」
第4節で導いたのは「その点で最も急な向き」です。道のりが最短という話は、どこにもありません。測ると、はっきりずれます。
f(x,y)=(x2+10y2)/2 を使います。谷底は原点。(10,1) から η=0.18 で降ります。
|
値 |
| 原点までの直線距離 |
10.0499 |
| 実際に通った道のりの長さ |
13.4655(1.34倍) |
| 最初の一歩の向きと、谷底への向きの角度差 |
39.29° |
| 原点の近く(半径0.01)に入るまでの歩数 |
35 |
通った道のりが1.34倍になった理由は、y 成分の符号です。最初の6歩を並べると −0.8000, +0.6400, −0.5120, +0.4096, −0.3277, +0.2621——毎歩またいでいます。y 方向は曲がりが10倍きついので、x 方向に合わせた歩幅では必ず行き過ぎる。横断しながら少しずつ中心に寄っていく、いわゆるジグザグです。
曲がり方が軸でそろっていれば、この差は消えます。 同じ開始点で f(x,y)=(x2+y2)/2 にすると道のりは 10.0402 で、直線距離 10.0499 から止めた半径 0.01 を引いた値です。歩数は同じ35歩。ずれを作っていたのは勾配ではなく、軸ごとの曲がり方の違いでした。
勾配が指しているのは向きだけで、距離は指していません。歩幅(学習率)は別に決める必要があり、軸ごとに曲がり方が違う場所では1つの歩幅がどの軸にも合いません。モーメンタムや Adam がやっているのはこの手当てです(第4章)。
演習
答えは閉じてあります。手を動かしてから開いてください。
演習1. W∈R128×784 として z=Wx、a=tanh(z)(成分ごと)とします。(a) x↦z のヤコビアンの形と中身。(b) z↦a のヤコビアンの形と中身。(c) x↦a のヤコビアンの形。(d) 実装で (b) を行列として持たない理由。
答えを見る
(a) (128,784) で、中身は W そのもの。 ∂zi/∂xj=Wij です。
(b) (128,128) の対角行列。 i=j なら ai は zj を含まないので0。対角成分は 1−tanh2(zi)。
(c) (128,784)。 式(7)より J=diag(1−tanh2z)W で、(128,128)×(128,784)→(128,784)。
(d) 0 を 16,256 個持つことになるから。 1282=16,384 個のうち意味があるのは対角の128個だけです。対角行列をかけるのは要素ごとにかけるのと同じなので、実装は (128,) のベクトルを1本持ってアダマール積で済ませます。第3章の式に ∘ が出てくるのは、この対角性の言い換えです。
演習2. S={−logσ(z):z∈R} について。(a) infS はいくつで、S に属しますか。(b) S は上に有界ですか。(c) float64 で計算すると (a) の答えはどう見えますか。
答えを見る
(a) infS=0。属しません。 σ(z)∈(0,1) が全実数 z で成り立つので −logσ(z)>0。いっぽう z→∞ で σ(z)→1 なので値は0に好きなだけ近づきます。下限はあるが最小値は無い——本文の {1−1/n} と同じ形です。
(b) 上に有界ではありません。 z→−∞ で σ(z)→0、−logσ(z)→+∞。supS=+∞ です。1点を自信たっぷりに外すと損失が際限なく増えるのはこれで、第1章(第III部)の演習3で −log0.05=2.9957 を払ったのと同じ話です。
(c) 0.0 と表示されます。 z≥36.7368 で σ(z) が丸めで厳密に 1.0 になるため。数学上は正の値で、一つ下の z では 2.2×10−16。「損失が0になった」という画面は、下限に到達した証拠ではありません。
演習3. y=(x+1)x2 を、u=x+1 と v=x2 の2経路に分けて考えます。x=2 で (a) 各経路の積と和。(b) 直接微分した値。(c) 上の経路だけを数えたらいくつになり、何が起きますか。
答えを見る
(a) u=3、v=4。∂y/∂u=v=4、du/dx=1 なので上の経路は 4×1=4。∂y/∂v=u=3、dv/dx=2x=4 なので下の経路は 3×4=12。和は 16。
(b) y=x3+x2 なので dy/dx=3x2+2x=12+4=16。一致します(中心差分でも 16.000000001)。
(c) 4 になり、正しい値の4分の1になります。 x が u と v の両方に入っているので、x を動かすと2つが同時に動きます。片方だけ数えるのは「v は動かない」と言っているのと同じで、仮定そのものが違います。
この形は実装でそのまま出ます。残差接続 y=x+F(x) では x から y への経路が2本あり、dy/dx=1+F′(x) です。F(x)=tanh(0.8x)、x=0.6 なら F′(x)=0.6407 で dy/dx=1.6407。F の側だけを数えると 0.6407——1より小さいので重ねるほど細ります。恒等の経路が足す「1」が、細らせない役をしています。
この章で言っていないこと
- 微分できない点を扱っていません。 ReLU は z=0 で傾きが定まりません。実装は劣勾配から1つ選んで(多くは0)進めますが、その正当化はしていません。
- 2階微分(ヘッセ行列)を使っていません。 曲がり方の違いが学習を難しくすることは測りましたが、曲がり方そのものを行列で扱う話(2次法)は第4章で触るだけです。
- 極限・連続の厳密な定義(ε-δ)は置いていません。上限・下限を入れたのは「最小値が無いことがある」という1点を言うためだけです。
- 自動微分の実装(計算グラフをどう保ち、どれだけメモリを食うか)は第3章です。この章は規則だけです。
- 本文の数値はすべて実際に計算して確かめています(偏微分・ヤコビアンの中心差分照合、方向微分と ∥∇f∥cosθ の一致、JfJg と直接微分の一致、w=log2 の最小、降下経路の長さと歩数、float64 の丸めの境目)。
もっと詳しく
コメント
コメントにはログインが必要です