🌏 English version
影片狀態:已附影片。 這篇依官方 MOOC 講義 212_handout.pdf 與四支官方影片的機器轉錄逐字稿寫成,公式以講義為準;逐字稿未經人工校對。每一節開頭附該節的官方影片與大致的時間區段。文中的頁碼指投影片右下角的編號(0/23 到 23/23),寫「課堂上」的地方是轉述影片裡的說法。
這是台大林軒田 機器學習基石與技法 導讀 裡的技法第 12 堂。講義第 1 頁的 Roadmap 把技法分成三種處理特徵的技巧,前兩種是用 kernel 嵌入大量特徵(Embedding Numerous Features)與用 aggregation 組合有預測力的特徵(Combining Predictive Features)。這堂開始第三種 Distilling Implicit Features: Extraction Models,讓模型自己從資料裡萃取出隱藏的特徵。上一堂技法第 11 堂:梯度提升決策樹 在同一頁上只留一行:用 functional gradient 找出一棵一棵的樹,再用 steepest descent 決定每棵樹的權重,可以配任何誤差函數。
先備有四樣:基石第 2 堂 的感知器(perceptron);基石第 9 堂 到第 11 堂 的三個線性模型與(隨機)梯度下降;技法第 7 堂 的線性 aggregation;微積分的連鎖律。讀完之後,你應該能自己用感知器拼出 AND、OR 與 XOR,寫出一個 d ( 0 ) d^{(0)} d ( 0 ) -d ( 1 ) d^{(1)} d ( 1 ) -⋯ \cdots ⋯ -d ( L ) d^{(L)} d ( L ) 網路的正向計算,從頭推出 δ \delta δ 的遞迴式,並且對一個小網路手算出每個權重的梯度。
為什麼要疊第二層:感知器的線性組合做得出 AND,做不出 XOR
YouTube:Neural Network :: Motivation @ Machine Learning Techniques (機器學習技法)
(影片 00:17–04:17 複習上一堂並把感知器的線性組合畫成圖,04:17–09:02 做 AND,09:02–13:08 談能力與限制,13:08–16:21 疊出多層感知器,16:21–19:56 談生物神經元,之後是 Fun Time。)
把感知器的線性組合畫成一張網路
講義第 2 頁從已經學過的東西出發。感知器是把輸入乘上一組權重、算出分數、再取正負號。拿 T T T 個感知器 g t ( x ) = sign ( w t ⊤ x ) g_t(\mathbf{x}) = \text{sign}(\mathbf{w}_t^\top\mathbf{x}) g t ( x ) = sign ( w t ⊤ x ) 做技法第 7 堂的線性 aggregation,每個 g t g_t g t 有 α t \alpha_t α t 票:
G ( x ) = sign ( ∑ t = 1 T α t sign ( w t ⊤ x ) ⏟ g t ( x ) ) G(\mathbf{x}) = \text{sign}\Big(\sum_{t=1}^{T}\alpha_t\,\underbrace{\text{sign}\big(\mathbf{w}_t^\top\mathbf{x}\big)}_{g_t(\mathbf{x})}\Big) G ( x ) = sign ( t = 1 ∑ T α t g t ( x ) sign ( w t ⊤ x ) )
投影片把這個式子畫成一張圖:最左邊一排是輸入 x 0 = 1 , x 1 , … , x d x_0 = 1, x_1, \dots, x_d x 0 = 1 , x 1 , … , x d ,每個輸入都連到中間一排的 T T T 個圓圈,連線上是 w t \mathbf{w}_t w t ;中間的圓圈再各用一條標著 α t \alpha_t α t 的線連到最右邊的 G G G 。每個圓圈裡畫了一個階梯形的函數,代表算出分數之後取 sign。課堂上把圓圈叫作節點(node)。
講義指出這張圖有兩層權重(w t \mathbf{w}_t w t 與 α \boldsymbol{\alpha} α )、兩層 sign 函數(g t g_t g t 裡面的與 G G G 裡面的)。這一節要回答的問題寫在頁尾:這樣的 G G G 能做出(implement)什麼樣的邊界?
用第二層的權重做邏輯運算
第 3 頁先看兩個感知器。g 1 g_1 g 1 與 g 2 g_2 g 2 各是平面上一條線,線的一側是 + 1 +1 + 1 (圖上塗藍色)、另一側是 − 1 -1 − 1 (塗紅色)。把 + 1 +1 + 1 當成 TRUE、− 1 -1 − 1 當成 FALSE,目標是 AND ( g 1 , g 2 ) \text{AND}(g_1, g_2) AND ( g 1 , g 2 ) :兩個都是 TRUE 的區域才是藍色。
做法是加一個永遠輸出 + 1 +1 + 1 的 g 0 g_0 g 0 ,三者的票數設成 α 0 = − 1 \alpha_0 = -1 α 0 = − 1 、α 1 = + 1 \alpha_1 = +1 α 1 = + 1 、α 2 = + 1 \alpha_2 = +1 α 2 = + 1 :
G ( x ) = sign ( − 1 + g 1 ( x ) + g 2 ( x ) ) G(\mathbf{x}) = \text{sign}\big(-1 + g_1(\mathbf{x}) + g_2(\mathbf{x})\big) G ( x ) = sign ( − 1 + g 1 ( x ) + g 2 ( x ) )
把四種情形全部列出來:
g 1 g_1 g 1 g 2 g_2 g 2 − 1 + g 1 + g 2 -1 + g_1 + g_2 − 1 + g 1 + g 2 G G G AND ( g 1 , g 2 ) \text{AND}(g_1, g_2) AND ( g 1 , g 2 ) + 1 +1 + 1 + 1 +1 + 1 + 1 +1 + 1 + 1 +1 + 1 TRUE + 1 +1 + 1 − 1 -1 − 1 − 1 -1 − 1 − 1 -1 − 1 FALSE − 1 -1 − 1 + 1 +1 + 1 − 1 -1 − 1 − 1 -1 − 1 FALSE − 1 -1 − 1 − 1 -1 − 1 − 3 -3 − 3 − 1 -1 − 1 FALSE
課堂上的講法是兩票減掉一票:兩個都是 + 1 +1 + 1 時還剩 + 1 +1 + 1 ;只要有一個是 − 1 -1 − 1 ,g 1 + g 2 g_1 + g_2 g 1 + g 2 最多是 0,再減 1 一定是負的。所以 G ≡ AND ( g 1 , g 2 ) G \equiv \text{AND}(g_1, g_2) G ≡ AND ( g 1 , g 2 ) 。課堂上接著指出,這時候 G G G 的邊界是由兩條直線拼成的折線,已經不是單一條直線了。
講義說 OR 與 NOT 可以用類似的方式做出來。課堂上補了 NOT 的做法:把輸出乘上 − 1 -1 − 1 反過來就好,也就是 NOT ( g 1 ) = sign ( − g 1 ) \text{NOT}(g_1) = \text{sign}(-g_1) NOT ( g 1 ) = sign ( − g 1 ) ;OR 留給這一節的 Fun Time。
能力:感知器夠多,就能逼近平滑的邊界
第 4 頁上半的圖有三格。最右邊是目標:一個圓,圓內是 + 1 +1 + 1 、圓外是 − 1 -1 − 1 。單一個感知器做不到。左邊兩格分別用 8 個與 16 個感知器,每個感知器是一條直線,合起來圍出一個多邊形,多邊形裡面是 + 1 +1 + 1 。16 條線圍出來的形狀比 8 條更接近圓。課堂上說這是用剛才 AND 的方式把這些感知器合起來。
本文補充合起來的寫法。T T T 個感知器的 AND 是
G ( x ) = sign ( − ( T − 1 ) + ∑ t = 1 T g t ( x ) ) G(\mathbf{x}) = \text{sign}\Big(-(T-1) + \sum_{t=1}^{T} g_t(\mathbf{x})\Big) G ( x ) = sign ( − ( T − 1 ) + t = 1 ∑ T g t ( x ) )
T T T 個都是 + 1 +1 + 1 時括號裡是 T − ( T − 1 ) = + 1 T - (T-1) = +1 T − ( T − 1 ) = + 1 ;有一個是 − 1 -1 − 1 時總和掉到 T − 2 T - 2 T − 2 ,括號裡是 − 1 -1 − 1 ;− 1 -1 − 1 愈多就愈負。T = 2 T = 2 T = 2 時就是上面的式子。至於「更接近」有多接近,以下是本文自擬的算法,不在講義上:假設目標是半徑 1 的圓(面積 π ≈ 3.1416 \pi \approx 3.1416 π ≈ 3.1416 ),用外切的正 T T T 邊形去圍,正 T T T 邊形的面積是 T tan ( π / T ) T\tan(\pi/T) T tan ( π / T ) 。T = 8 T = 8 T = 8 時是 3.3137,比圓多 5.5%;T = 16 T = 16 T = 16 時是 3.1826,只多 1.3%。
講義對這張圖下了兩個註解。第一,這樣的 G G G 做得出任何凸多邊形,也就是基石第 5 堂 的凸集合(convex set)假說;它的 VC 維度是無限大。第二,感知器夠多就大致能做出平滑的邊界。課堂上說無限大的 VC 維度可能是好消息,代表很多感知器合起來能力很強;也可能是壞消息,模型太複雜就有過擬合的危險。課堂上還提到之前看過類似的現象:技法第 10 堂 隨機森林的圖裡,一堆不規則的邊界合起來之後看起來平滑得多。
限制:XOR 在新的空間裡仍然線性不可分
同一頁的下半是做不到的事。XOR ( g 1 , g 2 ) \text{XOR}(g_1, g_2) XOR ( g 1 , g 2 ) 是「恰好一個是 TRUE 才是 TRUE」。圖上兩條線把平面切成四塊,相對的兩塊是藍色、另外相對的兩塊是紅色;課堂上形容藍色像集中在雙曲線的兩側,紅色在另外兩側。
講義的說法是:把 ϕ ( x ) = ( g 1 ( x ) , g 2 ( x ) ) \boldsymbol{\phi}(\mathbf{x}) = (g_1(\mathbf{x}), g_2(\mathbf{x})) ϕ ( x ) = ( g 1 ( x ) , g 2 ( x )) 看成一個特徵轉換,XOR 在轉換後的空間裡不是線性可分(linear separable)的。第二層的 α \boldsymbol{\alpha} α 只是在這個空間裡畫一條線,所以怎麼設都做不出來。課堂上只說經過一番推導會發現做不到,並提到這番推導和基石裡討論感知器本身有多複雜時做的事很類似,推導本身沒有展開。本文把它補上。
轉換後只有四個點。XOR 要求 ( + 1 , + 1 ) (+1,+1) ( + 1 , + 1 ) 與 ( − 1 , − 1 ) (-1,-1) ( − 1 , − 1 ) 輸出 − 1 -1 − 1 ,( + 1 , − 1 ) (+1,-1) ( + 1 , − 1 ) 與 ( − 1 , + 1 ) (-1,+1) ( − 1 , + 1 ) 輸出 + 1 +1 + 1 。假設存在 ( α 0 , α 1 , α 2 ) (\alpha_0, \alpha_1, \alpha_2) ( α 0 , α 1 , α 2 ) 讓 sign ( α 0 + α 1 g 1 + α 2 g 2 ) \text{sign}(\alpha_0 + \alpha_1 g_1 + \alpha_2 g_2) sign ( α 0 + α 1 g 1 + α 2 g 2 ) 做得到,四個點各給一條不等式:
α 0 + α 1 + α 2 < 0 , α 0 − α 1 − α 2 < 0 , α 0 + α 1 − α 2 > 0 , α 0 − α 1 + α 2 > 0. \begin{aligned}
\alpha_0 + \alpha_1 + \alpha_2 &< 0, & \alpha_0 - \alpha_1 - \alpha_2 &< 0, \\
\alpha_0 + \alpha_1 - \alpha_2 &> 0, & \alpha_0 - \alpha_1 + \alpha_2 &> 0.
\end{aligned} α 0 + α 1 + α 2 α 0 + α 1 − α 2 < 0 , > 0 , α 0 − α 1 − α 2 α 0 − α 1 + α 2 < 0 , > 0.
第一列兩式相加得到 2 α 0 < 0 2\alpha_0 < 0 2 α 0 < 0 ,第二列兩式相加得到 2 α 0 > 0 2\alpha_0 > 0 2 α 0 > 0 ,互相矛盾。所以不存在這樣的 α \boldsymbol{\alpha} α 。課堂上說的類似之處在這裡:基石第 5 堂 數過,平面上排成四邊形的四個點,直線做不出每一種標法,對角的兩點同號、相鄰的兩點異號的那一種就做不出來。XOR 要的正是這一種標法,只是現在發生在 ( g 1 , g 2 ) (g_1, g_2) ( g 1 , g 2 ) 的平面上。
再疊一層轉換,就得到多層感知器
資料在轉換後的空間還是分不開,以前遇到這種情況怎麼辦?課堂上的回答是:那就再轉換一次,轉到一個比較適合的空間,也許就能用一條線分開了。第 5 頁寫出需要的那一層:
XOR ( g 1 , g 2 ) = OR ( AND ( − g 1 , g 2 ) , AND ( g 1 , − g 2 ) ) \text{XOR}(g_1, g_2) = \text{OR}\big(\text{AND}(-g_1, g_2),\ \text{AND}(g_1, -g_2)\big) XOR ( g 1 , g 2 ) = OR ( AND ( − g 1 , g 2 ) , AND ( g 1 , − g 2 ) )
先做兩個 AND,再把兩個 AND 的結果做 OR。投影片的網路圖從左到右是:輸入、g 1 g_1 g 1 與 g 2 g_2 g 2 、兩個 AND 節點、一個 OR 節點、輸出 G G G ;g 1 g_1 g 1 連到第一個 AND 的線與 g 2 g_2 g 2 連到第二個 AND 的線上各標了 − 1 -1 − 1 ,代表先把那個 g g g 反過來。
講義沒有把每條線的權重寫出來,以下的權重是本文依 AND 與 OR 的做法填的。令 a 1 = sign ( − 1 − g 1 + g 2 ) a_1 = \text{sign}(-1 - g_1 + g_2) a 1 = sign ( − 1 − g 1 + g 2 ) 、a 2 = sign ( − 1 + g 1 − g 2 ) a_2 = \text{sign}(-1 + g_1 - g_2) a 2 = sign ( − 1 + g 1 − g 2 ) 、G = sign ( + 1 + a 1 + a 2 ) G = \text{sign}(+1 + a_1 + a_2) G = sign ( + 1 + a 1 + a 2 ) :
g 1 g_1 g 1 g 2 g_2 g 2 − 1 − g 1 + g 2 -1 - g_1 + g_2 − 1 − g 1 + g 2 a 1 a_1 a 1 − 1 + g 1 − g 2 -1 + g_1 - g_2 − 1 + g 1 − g 2 a 2 a_2 a 2 1 + a 1 + a 2 1 + a_1 + a_2 1 + a 1 + a 2 G G G + 1 +1 + 1 + 1 +1 + 1 − 1 -1 − 1 − 1 -1 − 1 − 1 -1 − 1 − 1 -1 − 1 − 1 -1 − 1 − 1 -1 − 1 + 1 +1 + 1 − 1 -1 − 1 − 3 -3 − 3 − 1 -1 − 1 + 1 +1 + 1 + 1 +1 + 1 + 1 +1 + 1 + 1 +1 + 1 − 1 -1 − 1 + 1 +1 + 1 + 1 +1 + 1 + 1 +1 + 1 − 3 -3 − 3 − 1 -1 − 1 + 1 +1 + 1 + 1 +1 + 1 − 1 -1 − 1 − 1 -1 − 1 − 1 -1 − 1 − 1 -1 − 1 − 1 -1 − 1 − 1 -1 − 1 − 1 -1 − 1 − 1 -1 − 1
最後一欄正是 XOR。套到一個具體的情境(本文自擬):取 g 1 ( x ) = sign ( x 1 ) g_1(\mathbf{x}) = \text{sign}(x_1) g 1 ( x ) = sign ( x 1 ) 、g 2 ( x ) = sign ( x 2 ) g_2(\mathbf{x}) = \text{sign}(x_2) g 2 ( x ) = sign ( x 2 ) ,兩條線就是兩個座標軸。點 ( 2 , − 1 ) (2, -1) ( 2 , − 1 ) 的 ( g 1 , g 2 ) = ( + 1 , − 1 ) (g_1, g_2) = (+1, -1) ( g 1 , g 2 ) = ( + 1 , − 1 ) ,查表得 G = + 1 G = +1 G = + 1 ;點 ( 1 , 2 ) (1, 2) ( 1 , 2 ) 的 ( g 1 , g 2 ) = ( + 1 , + 1 ) (g_1, g_2) = (+1, +1) ( g 1 , g 2 ) = ( + 1 , + 1 ) ,G = − 1 G = -1 G = − 1 。這個網路在第二、第四象限輸出 + 1 +1 + 1 ,在第一、第三象限輸出 − 1 -1 − 1 ,任何單一條直線都畫不出這種邊界。
為什麼多一層就可以?在 ( a 1 , a 2 ) (a_1, a_2) ( a 1 , a 2 ) 的空間裡,四種輸入只落在三個點上:( − 1 , − 1 ) (-1,-1) ( − 1 , − 1 ) 出現兩次(兩種該輸出 − 1 -1 − 1 的情形被疊在一起),另外是 ( − 1 , + 1 ) (-1,+1) ( − 1 , + 1 ) 與 ( + 1 , − 1 ) (+1,-1) ( + 1 , − 1 ) 。這三個點用一條線就分得開,OR 就是那條線。
講義把這個模型叫作多層感知器(multi-layer perceptrons),是最基本的神經網路,並且把三個階段排成一行:單一個感知器(簡單)、感知器的 aggregation(強)、多層感知器(更強)。
跟生物神經元的關係只是啟發
第 6 頁有四張圖:一張神經元的顯微照片、剛才的網路圖、一隻海鷗、一架客機。講義的結論是 neural network 是受生物啟發(bio-inspired)的模型。
課堂上的對應是這樣的:網路圖裡每個圓圈對應一個神經元,圓圈之間的連線對應神經元之間的聯繫,權重的大小代表聯繫的強弱。但生物體內的神經元未必一層一層地連接,彼此之間可能有更多交互的連結,所以這張圖是簡化過的近似。
鳥和飛機是用來說明「模仿」到什麼程度。人看到鳥會飛,造出了飛機;飛機的外形確實借了鳥的形狀,但翅膀不會像鳥一樣拍動,是靠別的方式飛起來的。課堂上強調神經網路也一樣:它受到生物的啟發,但從工程的角度看,我們處理的是一個數學模型,不必和生物體內的神經網路表現得一模一樣。
Fun Time:OR 要用哪組權重
題目(第 7 頁): 令 g 0 ( x ) = + 1 g_0(\mathbf{x}) = +1 g 0 ( x ) = + 1 。下列哪一組 ( α 0 , α 1 , α 2 ) (\alpha_0, \alpha_1, \alpha_2) ( α 0 , α 1 , α 2 ) 可以讓 G ( x ) = sign ( ∑ t = 0 2 α t g t ( x ) ) G(\mathbf{x}) = \text{sign}\big(\sum_{t=0}^{2}\alpha_t g_t(\mathbf{x})\big) G ( x ) = sign ( ∑ t = 0 2 α t g t ( x ) ) 做出 OR ( g 1 , g 2 ) \text{OR}(g_1, g_2) OR ( g 1 , g 2 ) ?
( − 3 , + 1 , + 1 ) (-3, +1, +1) ( − 3 , + 1 , + 1 )
( − 1 , + 1 , + 1 ) (-1, +1, +1) ( − 1 , + 1 , + 1 )
( + 1 , + 1 , + 1 ) (+1, +1, +1) ( + 1 , + 1 , + 1 )
( + 3 , + 1 , + 1 ) (+3, +1, +1) ( + 3 , + 1 , + 1 )
答案:3。 講義只說把 ( g 1 , g 2 ) (g_1, g_2) ( g 1 , g 2 ) 的四種可能代進去就能驗證。四個選項的 α 1 = α 2 = + 1 \alpha_1 = \alpha_2 = +1 α 1 = α 2 = + 1 都一樣,差別只在 α 0 \alpha_0 α 0 。g 1 + g 2 g_1 + g_2 g 1 + g 2 在四種情形下分別是 + 2 , 0 , 0 , − 2 +2, 0, 0, -2 + 2 , 0 , 0 , − 2 ,加上 α 0 \alpha_0 α 0 再取 sign:
α 0 \alpha_0 α 0 ( + , + ) (+,+) ( + , + ) ( + , − ) (+,-) ( + , − ) ( − , + ) (-,+) ( − , + ) ( − , − ) (-,-) ( − , − ) 做出的函數 − 3 -3 − 3 − 1 -1 − 1 − 1 -1 − 1 − 1 -1 − 1 − 1 -1 − 1 永遠 FALSE − 1 -1 − 1 + 1 +1 + 1 − 1 -1 − 1 − 1 -1 − 1 − 1 -1 − 1 AND + 1 +1 + 1 + 1 +1 + 1 + 1 +1 + 1 + 1 +1 + 1 − 1 -1 − 1 OR + 3 +3 + 3 + 1 +1 + 1 + 1 +1 + 1 + 1 +1 + 1 + 1 +1 + 1 永遠 TRUE
OR 只有兩個都是 FALSE 時才輸出 FALSE,對應 α 0 = + 1 \alpha_0 = +1 α 0 = + 1 那一列。選項 2 是剛才的 AND。α 0 \alpha_0 α 0 的作用是決定「要幾票才過關」:− 1 -1 − 1 是兩票都要,+ 1 +1 + 1 是有一票就夠。
神經網路假說長什麼樣子:輸出層是線性模型,中間每一層用 tanh 轉換
YouTube:Neural Network :: Neural Network Hypothesis @ Machine Learning Techniques (機器學習技法)
(影片 00:01–02:19 講輸出層,02:19–08:04 講中間的轉換函數,08:04–14:45 定記號,14:45–17:18 講每一層的物理意義,之後是 Fun Time。)
輸出層可以接任何一個線性模型
把網路從左看到右,輸入被轉換一次、再轉換一次,最後一個節點拿轉換後的結果乘上權重、算出一個分數。第 8 頁把這個分數寫成
s = w ⊤ ϕ ( 2 ) ( ϕ ( 1 ) ( x ) ) s = \mathbf{w}^\top\boldsymbol{\phi}^{(2)}\big(\boldsymbol{\phi}^{(1)}(\mathbf{x})\big) s = w ⊤ ϕ ( 2 ) ( ϕ ( 1 ) ( x ) )
所以輸出節點做的只是一個線性模型,對象是轉換了好幾次的特徵。講義說基石學過的任何一個線性模型都能放在這裡,並且把三個並排:
輸出層 輸出 誤差 線性分類 h ( x ) = sign ( s ) h(\mathbf{x}) = \text{sign}(s) h ( x ) = sign ( s ) 0/1 線性迴歸 h ( x ) = s h(\mathbf{x}) = s h ( x ) = s 平方誤差 邏輯迴歸 h ( x ) = θ ( s ) h(\mathbf{x}) = \theta(s) h ( x ) = θ ( s ) cross-entropy
講義選中間那一個:之後都討論用平方誤差的迴歸,輸出層直接把分數送出去。課堂上說這是為了方便講解,分類與軟性分類的版本可以自己照樣延伸。
中間的節點要用哪一種轉換函數
中間節點裡畫的階梯,第 9 頁給它一個名字:轉換函數(transformation function),把進來的分數 s s s 轉成節點的輸出。階梯代表中間都是感知器。能不能換別的?講義先排除兩個選擇:
線性函數。 每個節點都是線性運算,整個網路合起來還是線性運算,講義說這樣比較沒用(less useful)。課堂上問得更直接:那何必用這麼多節點,直接做一個線性模型就好。
階梯函數(sign)。 輸出只有 ± 1 \pm 1 ± 1 ,是離散的,講義說對 w \mathbf{w} w 很難最佳化。課堂上拿基石第 2 堂的 pocket 當例子:線性分類的最佳化本來就不容易,只能用比較經驗法則式的方法。
常見的選擇是雙曲正切 tanh \tanh tanh :
tanh ( s ) = exp ( s ) − exp ( − s ) exp ( s ) + exp ( − s ) \tanh(s) = \frac{\exp(s) - \exp(-s)}{\exp(s) + \exp(-s)} tanh ( s ) = exp ( s ) + exp ( − s ) exp ( s ) − exp ( − s )
投影片把三條曲線畫在一起:sign 是階梯,linear 是斜直線,tanh \tanh tanh 是夾在中間的 S 形。課堂上的描述是,s s s 離 0 很遠時 tanh \tanh tanh 和階梯函數很接近,s s s 在 0 附近時它和線性函數接近。講義列了選它的三個理由:
它是 sign 的類比(analog)近似,比較容易最佳化。課堂上的說法是 sign 像數位的版本,tanh \tanh tanh 是它的類比版;式子裡全是指數函數,是平滑的,可以微分。
它比較接近生物神經元。課堂上解釋,生物體內的運作大體上是連續的,不是離散的。
它沒有那麼新(not that new)。這句指的是下面這個等式。
tanh ( s ) = 2 θ ( 2 s ) − 1 \tanh(s) = 2\theta(2s) - 1 tanh ( s ) = 2 θ ( 2 s ) − 1
θ ( s ) = 1 1 + exp ( − s ) \theta(s) = \frac{1}{1 + \exp(-s)} θ ( s ) = 1 + e x p ( − s ) 1 是基石第 10 堂 的 logistic 函數。講義只寫了結果,驗算如下:
2 θ ( 2 s ) − 1 = 2 1 + exp ( − 2 s ) − 1 = 1 − exp ( − 2 s ) 1 + exp ( − 2 s ) = exp ( s ) − exp ( − s ) exp ( s ) + exp ( − s ) 2\theta(2s) - 1 = \frac{2}{1 + \exp(-2s)} - 1 = \frac{1 - \exp(-2s)}{1 + \exp(-2s)} = \frac{\exp(s) - \exp(-s)}{\exp(s) + \exp(-s)} 2 θ ( 2 s ) − 1 = 1 + exp ( − 2 s ) 2 − 1 = 1 + exp ( − 2 s ) 1 − exp ( − 2 s ) = exp ( s ) + exp ( − s ) exp ( s ) − exp ( − s )
最後一步是分子分母同乘 exp ( s ) \exp(s) exp ( s ) 。所以 tanh \tanh tanh 就是把 logistic 函數的輸入放大兩倍、輸出從 ( 0 , 1 ) (0, 1) ( 0 , 1 ) 拉伸並平移到 ( − 1 , 1 ) (-1, 1) ( − 1 , 1 ) 。後面會用到它的兩個性質:tanh ( 0 ) = 0 \tanh(0) = 0 tanh ( 0 ) = 0 ,以及輸出永遠在 − 1 -1 − 1 與 + 1 +1 + 1 之間。
講義說接下來都用 tanh \tanh tanh 當轉換函數。課堂上補充,想用別的函數是你的選擇,只是推導與意義會跟著不同。
記號:層、分數與輸出
第 10 頁把記號定下來。網路圖上三組權重分別標成 w i j ( 1 ) w_{ij}^{(1)} w ij ( 1 ) 、w j k ( 2 ) w_{jk}^{(2)} w j k ( 2 ) 、w k q ( 3 ) w_{kq}^{(3)} w k q ( 3 ) ,並且在第二層的第三個節點旁邊標出 s 3 ( 2 ) s_3^{(2)} s 3 ( 2 ) (進入 tanh \tanh tanh 之前)與 x 3 ( 2 ) x_3^{(2)} x 3 ( 2 ) (tanh \tanh tanh 之後)。
記號 意思 ℓ \ell ℓ 第幾層,1 ≤ ℓ ≤ L 1 \le \ell \le L 1 ≤ ℓ ≤ L 。輸入算第 0 層,L L L 是輸出層 d ( ℓ ) d^{(\ell)} d ( ℓ ) 第 ℓ \ell ℓ 層有幾個節點(不含常數節點)。d ( 0 ) = d d^{(0)} = d d ( 0 ) = d w i j ( ℓ ) w_{ij}^{(\ell)} w ij ( ℓ ) 從第 ℓ − 1 \ell - 1 ℓ − 1 層的第 i i i 個節點連到第 ℓ \ell ℓ 層第 j j j 個節點的權重,0 ≤ i ≤ d ( ℓ − 1 ) 0 \le i \le d^{(\ell-1)} 0 ≤ i ≤ d ( ℓ − 1 ) ,1 ≤ j ≤ d ( ℓ ) 1 \le j \le d^{(\ell)} 1 ≤ j ≤ d ( ℓ ) s j ( ℓ ) s_j^{(\ell)} s j ( ℓ ) 第 ℓ \ell ℓ 層第 j j j 個節點的分數(score),進入轉換函數之前的值 x j ( ℓ ) x_j^{(\ell)} x j ( ℓ ) 第 ℓ \ell ℓ 層第 j j j 個節點的輸出,也是下一層的輸入
i i i 從 0 開始,是因為每一層都多一個常數節點 x 0 ( ℓ − 1 ) = 1 x_0^{(\ell-1)} = 1 x 0 ( ℓ − 1 ) = 1 ,課堂上說它就像以前的 bias 項。j j j 從 1 開始,因為常數節點不需要有人算給它。兩條計算式是
s j ( ℓ ) = ∑ i = 0 d ( ℓ − 1 ) w i j ( ℓ ) x i ( ℓ − 1 ) , x j ( ℓ ) = { tanh ( s j ( ℓ ) ) if ℓ < L s j ( ℓ ) if ℓ = L s_j^{(\ell)} = \sum_{i=0}^{d^{(\ell-1)}} w_{ij}^{(\ell)}\,x_i^{(\ell-1)}, \qquad
x_j^{(\ell)} = \begin{cases} \tanh\big(s_j^{(\ell)}\big) & \text{if } \ell < L \\ s_j^{(\ell)} & \text{if } \ell = L \end{cases} s j ( ℓ ) = i = 0 ∑ d ( ℓ − 1 ) w ij ( ℓ ) x i ( ℓ − 1 ) , x j ( ℓ ) = { tanh ( s j ( ℓ ) ) s j ( ℓ ) if ℓ < L if ℓ = L
課堂上交代了一個記號上的選擇:轉換後的東西照以前的習慣應該叫 z \mathbf{z} z ,這裡為了能用整數的層號來區分,還是叫 x \mathbf{x} x 。
一個網路的形狀用每層的節點數來稱呼,寫成 d ( 0 ) d^{(0)} d ( 0 ) -d ( 1 ) d^{(1)} d ( 1 ) -d ( 2 ) d^{(2)} d ( 2 ) -⋯ \cdots ⋯ -d ( L ) d^{(L)} d ( L ) 的 NNet。形狀固定之後,每一組權重就是一個假說,所有可能的權重合起來是假說集合。做預測的流程寫在頁尾:把 x \mathbf{x} x 當成輸入層 x ( 0 ) \mathbf{x}^{(0)} x ( 0 ) ,經過隱藏層(hidden layers)一層一層算出 x ( ℓ ) \mathbf{x}^{(\ell)} x ( ℓ ) ,在輸出層用 x 1 ( L ) x_1^{(L)} x 1 ( L ) 當預測值。
權重的總數可以直接從形狀算出來。第 ℓ \ell ℓ 層有 d ( ℓ ) d^{(\ell)} d ( ℓ ) 個節點,每個節點接前一層的 d ( ℓ − 1 ) + 1 d^{(\ell-1)} + 1 d ( ℓ − 1 ) + 1 個輸出(多的 1 是常數節點),所以總數是 ∑ ℓ = 1 L ( d ( ℓ − 1 ) + 1 ) d ( ℓ ) \sum_{\ell=1}^{L}\big(d^{(\ell-1)} + 1\big)\,d^{(\ell)} ∑ ℓ = 1 L ( d ( ℓ − 1 ) + 1 ) d ( ℓ ) 。這一節的 Fun Time 會用到。
數值例子:一個 1-2-2-1 網路的正向計算
以下是本文自擬的例子,不在講義上,數字都用 Python 另外算過。這個網路在講反向傳播時會再用一次。形狀是 1-2-2-1:一個輸入、兩層隱藏層各兩個節點、一個輸出,共 ( 1 + 1 ) × 2 + ( 2 + 1 ) × 2 + ( 2 + 1 ) × 1 = 13 (1+1)\times 2 + (2+1)\times 2 + (2+1)\times 1 = 13 ( 1 + 1 ) × 2 + ( 2 + 1 ) × 2 + ( 2 + 1 ) × 1 = 13 個權重:
層 連到節點 1 連到節點 2 ℓ = 1 \ell = 1 ℓ = 1 w 01 ( 1 ) = 0.2 w_{01}^{(1)} = 0.2 w 01 ( 1 ) = 0.2 ,w 11 ( 1 ) = 0.4 w_{11}^{(1)} = 0.4 w 11 ( 1 ) = 0.4 w 02 ( 1 ) = − 0.3 w_{02}^{(1)} = -0.3 w 02 ( 1 ) = − 0.3 ,w 12 ( 1 ) = 0.8 w_{12}^{(1)} = 0.8 w 12 ( 1 ) = 0.8 ℓ = 2 \ell = 2 ℓ = 2 w 01 ( 2 ) = 0.1 w_{01}^{(2)} = 0.1 w 01 ( 2 ) = 0.1 ,w 11 ( 2 ) = 1.0 w_{11}^{(2)} = 1.0 w 11 ( 2 ) = 1.0 ,w 21 ( 2 ) = − 1.0 w_{21}^{(2)} = -1.0 w 21 ( 2 ) = − 1.0 w 02 ( 2 ) = − 0.2 w_{02}^{(2)} = -0.2 w 02 ( 2 ) = − 0.2 ,w 12 ( 2 ) = 0.5 w_{12}^{(2)} = 0.5 w 12 ( 2 ) = 0.5 ,w 22 ( 2 ) = 0.5 w_{22}^{(2)} = 0.5 w 22 ( 2 ) = 0.5 ℓ = 3 \ell = 3 ℓ = 3 w 01 ( 3 ) = 0.3 w_{01}^{(3)} = 0.3 w 01 ( 3 ) = 0.3 ,w 11 ( 3 ) = 1.0 w_{11}^{(3)} = 1.0 w 11 ( 3 ) = 1.0 ,w 21 ( 3 ) = − 2.0 w_{21}^{(3)} = -2.0 w 21 ( 3 ) = − 2.0 (只有一個輸出節點)
輸入是 x 1 = 1 x_1 = 1 x 1 = 1 ,所以 x ( 0 ) = ( 1 , 1 ) \mathbf{x}^{(0)} = (1, 1) x ( 0 ) = ( 1 , 1 ) ,第一個 1 是常數節點。
第 1 層。 s 1 ( 1 ) = 0.2 × 1 + 0.4 × 1 = 0.6 s_1^{(1)} = 0.2 \times 1 + 0.4 \times 1 = 0.6 s 1 ( 1 ) = 0.2 × 1 + 0.4 × 1 = 0.6 ,s 2 ( 1 ) = − 0.3 + 0.8 = 0.5 s_2^{(1)} = -0.3 + 0.8 = 0.5 s 2 ( 1 ) = − 0.3 + 0.8 = 0.5 。取 tanh \tanh tanh :x 1 ( 1 ) = tanh ( 0.6 ) = 0.5370 x_1^{(1)} = \tanh(0.6) = 0.5370 x 1 ( 1 ) = tanh ( 0.6 ) = 0.5370 ,x 2 ( 1 ) = tanh ( 0.5 ) = 0.4621 x_2^{(1)} = \tanh(0.5) = 0.4621 x 2 ( 1 ) = tanh ( 0.5 ) = 0.4621 。
第 2 層。 s 1 ( 2 ) = 0.1 + 1.0 × 0.5370 − 1.0 × 0.4621 = 0.1749 s_1^{(2)} = 0.1 + 1.0 \times 0.5370 - 1.0 \times 0.4621 = 0.1749 s 1 ( 2 ) = 0.1 + 1.0 × 0.5370 − 1.0 × 0.4621 = 0.1749 ,s 2 ( 2 ) = − 0.2 + 0.5 × 0.5370 + 0.5 × 0.4621 = 0.2996 s_2^{(2)} = -0.2 + 0.5 \times 0.5370 + 0.5 \times 0.4621 = 0.2996 s 2 ( 2 ) = − 0.2 + 0.5 × 0.5370 + 0.5 × 0.4621 = 0.2996 。取 tanh \tanh tanh :x 1 ( 2 ) = 0.1732 x_1^{(2)} = 0.1732 x 1 ( 2 ) = 0.1732 ,x 2 ( 2 ) = 0.2909 x_2^{(2)} = 0.2909 x 2 ( 2 ) = 0.2909 。
第 3 層(輸出層)。 s 1 ( 3 ) = 0.3 + 1.0 × 0.1732 − 2.0 × 0.2909 = − 0.1087 s_1^{(3)} = 0.3 + 1.0 \times 0.1732 - 2.0 \times 0.2909 = -0.1087 s 1 ( 3 ) = 0.3 + 1.0 × 0.1732 − 2.0 × 0.2909 = − 0.1087 。輸出層不取 tanh \tanh tanh ,預測值就是 x 1 ( 3 ) = − 0.1087 x_1^{(3)} = -0.1087 x 1 ( 3 ) = − 0.1087 。
如果這筆資料的標籤是 y = 1 y = 1 y = 1 ,平方誤差是 ( 1 − ( − 0.1087 ) ) 2 = 1.2292 (1 - (-0.1087))^2 = 1.2292 ( 1 − ( − 0.1087 ) ) 2 = 1.2292 。這個網路現在預測得很差,學習要做的就是調那 13 個權重讓誤差變小。
每一層在做什麼:比對輸入和權重像不像
第 11 頁給這些計算一個解讀。每一層是一次轉換,而且轉換是要從資料學出來的:
ϕ ( ℓ ) ( x ) = tanh ( [ ∑ i = 0 d ( ℓ − 1 ) w i 1 ( ℓ ) x i ( ℓ − 1 ) ⋮ ] ) \boldsymbol{\phi}^{(\ell)}(\mathbf{x}) = \tanh\left(\begin{bmatrix} \sum_{i=0}^{d^{(\ell-1)}} w_{i1}^{(\ell)}\,x_i^{(\ell-1)} \\ \vdots \end{bmatrix}\right) ϕ ( ℓ ) ( x ) = tanh ∑ i = 0 d ( ℓ − 1 ) w i 1 ( ℓ ) x i ( ℓ − 1 ) ⋮
每個節點都是拿前一層的輸出向量和自己的權重向量做內積,再取 tanh \tanh tanh 。課堂上的說明是:兩個向量愈接近平行,內積愈大,輸出就愈接近 + 1 +1 + 1 ;所以每個節點在檢查前一層給它的 x \mathbf{x} x 和自己的權重向量合不合,合的話就等於確認了某種模式(pattern)。講義的說法是 whether x \mathbf{x} x 'matches' weight vectors in pattern。
本文舉一組數字。某個節點的權重是 ( w 0 , w 1 , w 2 ) = ( 0 , 3 , 4 ) (w_0, w_1, w_2) = (0, 3, 4) ( w 0 , w 1 , w 2 ) = ( 0 , 3 , 4 ) 。輸入 ( x 1 , x 2 ) = ( 0.6 , 0.8 ) (x_1, x_2) = (0.6, 0.8) ( x 1 , x 2 ) = ( 0.6 , 0.8 ) 和權重同方向,分數是 3 × 0.6 + 4 × 0.8 = 5 3 \times 0.6 + 4 \times 0.8 = 5 3 × 0.6 + 4 × 0.8 = 5 ,tanh ( 5 ) = 0.9999 \tanh(5) = 0.9999 tanh ( 5 ) = 0.9999 。輸入 ( − 0.6 , − 0.8 ) (-0.6, -0.8) ( − 0.6 , − 0.8 ) 方向相反,分數是 − 5 -5 − 5 ,輸出 − 0.9999 -0.9999 − 0.9999 。輸入 ( 0.8 , − 0.6 ) (0.8, -0.6) ( 0.8 , − 0.6 ) 和權重垂直,分數是 0,輸出 0。同樣長度的三個輸入,節點的反應只看方向合不合。
講義的總結是:神經網路是用一層一層的連接權重做模式萃取(pattern extraction)。課堂上補了後半句:一層一層把資料裡潛藏的模式轉換出來,直到最後一層要做決定為止。這也是 Roadmap 上 Extraction Models 這個名字的意思。
Fun Time:3-5-1 網路有幾個權重
題目(第 12 頁): 一個 3-5-1 的 NNet 有幾個權重 w i j ( ℓ ) w_{ij}^{(\ell)} w ij ( ℓ ) ?
9
15
20
26
答案:4。 講義的解答是第 1 層有 ( 3 + 1 ) × 5 = 20 (3+1) \times 5 = 20 ( 3 + 1 ) × 5 = 20 個,第 2 層有 ( 5 + 1 ) × 1 = 6 (5+1) \times 1 = 6 ( 5 + 1 ) × 1 = 6 個,合計 26 個。每一層的「加 1」是常數節點連出去的權重。
其他選項各漏了一些東西:9 是把三層的節點數加起來(3 + 5 + 1 3 + 5 + 1 3 + 5 + 1 ),數的是節點;15 是 3 × 5 3 \times 5 3 × 5 ,只算第 1 層而且沒算常數節點;20 是只算第 1 層,或是兩層都算卻都漏了常數節點(3 × 5 + 5 × 1 3 \times 5 + 5 \times 1 3 × 5 + 5 × 1 )。
權重怎麼學:反向傳播把每個權重的梯度算出來
YouTube:Neural Network :: Neural Network Learning @ Machine Learning Techniques (機器學習技法)
(影片 00:00–03:43 定目標,03:43–11:18 推輸出層與一般層的梯度,11:18–16:45 推 δ 的遞迴式,16:45–21:19 是反向傳播演算法與 mini-batch,之後是 Fun Time。)
目標:每個權重對誤差的偏微分
第 13 頁的目標是學出所有的 w i j ( ℓ ) w_{ij}^{(\ell)} w ij ( ℓ ) ,讓 E in E_{\text{in}} E in 最小。講義先分兩種情形:
只有一層隱藏層。 它就是感知器的 aggregation,講義說可以用 gradient boosting 一個一個決定隱藏層的神經元。課堂上的描述是每次加一個神經元進來,加到覺得夠好為止;另外提醒這裡的感知器是用 tanh \tanh tanh 的軟性版本,概念類似。
多層隱藏層。 講義只寫了 not easy;課堂上說剛才那種一次加一個的做法可能就行不通了。
換一條路。定義單一筆資料上的誤差
e n = ( y n − NNet ( x n ) ) 2 e_n = \big(y_n - \text{NNet}(\mathbf{x}_n)\big)^2 e n = ( y n − NNet ( x n ) ) 2
只要算得出 ∂ e n ∂ w i j ( ℓ ) \frac{\partial e_n}{\partial w_{ij}^{(\ell)}} ∂ w ij ( ℓ ) ∂ e n ,就能用基石第 10、11 堂的梯度下降或隨機梯度下降(SGD)。課堂上的區分是:梯度下降把所有資料點上的變化量加起來,SGD 每次隨機挑一個點、只看這個點。所以剩下的關鍵只有一個:怎麼有效率地算出這個偏微分。課堂上先替學生把困難說出來:權重的足標又有 i i i 、又有 j j j 、又有 ℓ \ell ℓ ,一下子分不清哪個是哪個。所以先挑軟的吃,從最後一層做起。
輸出層的梯度
第 14 頁先看輸出層(ℓ = L \ell = L ℓ = L )。輸出層只有一個神經元,而且不做轉換,所以網路的輸出就是它的分數 s 1 ( L ) s_1^{(L)} s 1 ( L ) :
e n = ( y n − s 1 ( L ) ) 2 = ( y n − ∑ i = 0 d ( L − 1 ) w i 1 ( L ) x i ( L − 1 ) ) 2 e_n = \big(y_n - s_1^{(L)}\big)^2 = \Big(y_n - \sum_{i=0}^{d^{(L-1)}} w_{i1}^{(L)}\,x_i^{(L-1)}\Big)^2 e n = ( y n − s 1 ( L ) ) 2 = ( y n − i = 0 ∑ d ( L − 1 ) w i 1 ( L ) x i ( L − 1 ) ) 2
從權重到誤差的關係是一條鏈:w i 1 ( L ) w_{i1}^{(L)} w i 1 ( L ) 決定 s 1 ( L ) s_1^{(L)} s 1 ( L ) ,s 1 ( L ) s_1^{(L)} s 1 ( L ) 決定 e n e_n e n 。課堂上說微分不會算的時候就找中間人、用連鎖律,這裡的中間人是 s 1 ( L ) s_1^{(L)} s 1 ( L ) :
∂ e n ∂ w i 1 ( L ) = ∂ e n ∂ s 1 ( L ) ⋅ ∂ s 1 ( L ) ∂ w i 1 ( L ) \frac{\partial e_n}{\partial w_{i1}^{(L)}} = \frac{\partial e_n}{\partial s_1^{(L)}} \cdot \frac{\partial s_1^{(L)}}{\partial w_{i1}^{(L)}} ∂ w i 1 ( L ) ∂ e n = ∂ s 1 ( L ) ∂ e n ⋅ ∂ w i 1 ( L ) ∂ s 1 ( L )
兩項分開算。第一項是 ( y n − s ) 2 (y_n - s)^2 ( y n − s ) 2 對 s s s 微分,平方的 2 掉下來,括號裡 s s s 的係數是 − 1 -1 − 1 ,得到 − 2 ( y n − s 1 ( L ) ) -2\big(y_n - s_1^{(L)}\big) − 2 ( y n − s 1 ( L ) ) 。第二項,s 1 ( L ) s_1^{(L)} s 1 ( L ) 是一串 w i 1 ( L ) x i ( L − 1 ) w_{i1}^{(L)} x_i^{(L-1)} w i 1 ( L ) x i ( L − 1 ) 的總和,裡面只有一項含我們要的那個 w i 1 ( L ) w_{i1}^{(L)} w i 1 ( L ) ,微分之後剩下它的係數 x i ( L − 1 ) x_i^{(L-1)} x i ( L − 1 ) 。所以
∂ e n ∂ w i 1 ( L ) = − 2 ( y n − s 1 ( L ) ) ⋅ x i ( L − 1 ) , 0 ≤ i ≤ d ( L − 1 ) \frac{\partial e_n}{\partial w_{i1}^{(L)}} = -2\big(y_n - s_1^{(L)}\big) \cdot x_i^{(L-1)}, \qquad 0 \le i \le d^{(L-1)} ∂ w i 1 ( L ) ∂ e n = − 2 ( y n − s 1 ( L ) ) ⋅ x i ( L − 1 ) , 0 ≤ i ≤ d ( L − 1 )
一般層的梯度:把不會算的那一項取名叫 δ
同一頁的右半是一般的層(1 ≤ ℓ < L 1 \le \ell < L 1 ≤ ℓ < L ,0 ≤ i ≤ d ( ℓ − 1 ) 0 \le i \le d^{(\ell-1)} 0 ≤ i ≤ d ( ℓ − 1 ) ,1 ≤ j ≤ d ( ℓ ) 1 \le j \le d^{(\ell)} 1 ≤ j ≤ d ( ℓ ) )。照同樣的做法,中間人選直接和 w i j ( ℓ ) w_{ij}^{(\ell)} w ij ( ℓ ) 有關的那個分數 s j ( ℓ ) s_j^{(\ell)} s j ( ℓ ) :
∂ e n ∂ w i j ( ℓ ) = ∂ e n ∂ s j ( ℓ ) ⋅ ∂ s j ( ℓ ) ∂ w i j ( ℓ ) \frac{\partial e_n}{\partial w_{ij}^{(\ell)}} = \frac{\partial e_n}{\partial s_j^{(\ell)}} \cdot \frac{\partial s_j^{(\ell)}}{\partial w_{ij}^{(\ell)}} ∂ w ij ( ℓ ) ∂ e n = ∂ s j ( ℓ ) ∂ e n ⋅ ∂ w ij ( ℓ ) ∂ s j ( ℓ )
第二項和輸出層一樣容易:s j ( ℓ ) = ∑ i w i j ( ℓ ) x i ( ℓ − 1 ) s_j^{(\ell)} = \sum_i w_{ij}^{(\ell)} x_i^{(\ell-1)} s j ( ℓ ) = ∑ i w ij ( ℓ ) x i ( ℓ − 1 ) ,對 w i j ( ℓ ) w_{ij}^{(\ell)} w ij ( ℓ ) 微分得到 x i ( ℓ − 1 ) x_i^{(\ell-1)} x i ( ℓ − 1 ) 。第一項是誤差對中間某一層分數的偏微分,中間隔了好幾層,沒辦法直接寫出來。課堂上的處理是先擱著,給它一個名字:
δ j ( ℓ ) = ∂ e n ∂ s j ( ℓ ) \delta_j^{(\ell)} = \frac{\partial e_n}{\partial s_j^{(\ell)}} δ j ( ℓ ) = ∂ s j ( ℓ ) ∂ e n
於是每一層的梯度都是同一個形狀:
∂ e n ∂ w i j ( ℓ ) = δ j ( ℓ ) ⋅ x i ( ℓ − 1 ) \frac{\partial e_n}{\partial w_{ij}^{(\ell)}} = \delta_j^{(\ell)} \cdot x_i^{(\ell-1)} ∂ w ij ( ℓ ) ∂ e n = δ j ( ℓ ) ⋅ x i ( ℓ − 1 )
輸出層是它的特例,那裡的 δ \delta δ 已經算出來了:
δ 1 ( L ) = − 2 ( y n − s 1 ( L ) ) \delta_1^{(L)} = -2\big(y_n - s_1^{(L)}\big) δ 1 ( L ) = − 2 ( y n − s 1 ( L ) )
講義在頁尾問:其他的 δ \delta δ 怎麼辦?
δ 可以從後一層往回算
第 15 頁先畫出 s j ( ℓ ) s_j^{(\ell)} s j ( ℓ ) 影響 e n e_n e n 的路徑:
s j ( ℓ ) s_j^{(\ell)} s j ( ℓ ) 經過 tanh \tanh tanh 變成 x j ( ℓ ) x_j^{(\ell)} x j ( ℓ ) 。
x j ( ℓ ) x_j^{(\ell)} x j ( ℓ ) 乘上 w j k ( ℓ + 1 ) w_{jk}^{(\ell+1)} w j k ( ℓ + 1 ) ,進到下一層每一個 神經元的分數 s 1 ( ℓ + 1 ) , … , s k ( ℓ + 1 ) , … s_1^{(\ell+1)}, \dots, s_k^{(\ell+1)}, \dots s 1 ( ℓ + 1 ) , … , s k ( ℓ + 1 ) , … 。
這些分數再一路往後,最後到 e n e_n e n 。
課堂上說這次中間人變多了:除了 x j ( ℓ ) x_j^{(\ell)} x j ( ℓ ) 一個,還有下一層的一整排分數,每一個都是中間人。s j ( ℓ ) s_j^{(\ell)} s j ( ℓ ) 的變動沿著每一條路各自傳到 e n e_n e n ,多變數的連鎖律要把每條路的貢獻加起來:
δ j ( ℓ ) = ∂ e n ∂ s j ( ℓ ) = ∑ k = 1 d ( ℓ + 1 ) ∂ e n ∂ s k ( ℓ + 1 ) ⋅ ∂ s k ( ℓ + 1 ) ∂ x j ( ℓ ) ⋅ ∂ x j ( ℓ ) ∂ s j ( ℓ ) \delta_j^{(\ell)} = \frac{\partial e_n}{\partial s_j^{(\ell)}} = \sum_{k=1}^{d^{(\ell+1)}} \frac{\partial e_n}{\partial s_k^{(\ell+1)}} \cdot \frac{\partial s_k^{(\ell+1)}}{\partial x_j^{(\ell)}} \cdot \frac{\partial x_j^{(\ell)}}{\partial s_j^{(\ell)}} δ j ( ℓ ) = ∂ s j ( ℓ ) ∂ e n = k = 1 ∑ d ( ℓ + 1 ) ∂ s k ( ℓ + 1 ) ∂ e n ⋅ ∂ x j ( ℓ ) ∂ s k ( ℓ + 1 ) ⋅ ∂ s j ( ℓ ) ∂ x j ( ℓ )
三項各自是什麼:
∂ e n ∂ s k ( ℓ + 1 ) \frac{\partial e_n}{\partial s_k^{(\ell+1)}} ∂ s k ( ℓ + 1 ) ∂ e n 照定義就是下一層的 δ k ( ℓ + 1 ) \delta_k^{(\ell+1)} δ k ( ℓ + 1 ) 。課堂上強調這一項不用算,剛剛才定義過。
∂ s k ( ℓ + 1 ) ∂ x j ( ℓ ) \frac{\partial s_k^{(\ell+1)}}{\partial x_j^{(\ell)}} ∂ x j ( ℓ ) ∂ s k ( ℓ + 1 ) :s k ( ℓ + 1 ) = ∑ j w j k ( ℓ + 1 ) x j ( ℓ ) s_k^{(\ell+1)} = \sum_j w_{jk}^{(\ell+1)} x_j^{(\ell)} s k ( ℓ + 1 ) = ∑ j w j k ( ℓ + 1 ) x j ( ℓ ) 是 x x x 的線性組合,對 x j ( ℓ ) x_j^{(\ell)} x j ( ℓ ) 微分得到係數 w j k ( ℓ + 1 ) w_{jk}^{(\ell+1)} w j k ( ℓ + 1 ) 。
∂ x j ( ℓ ) ∂ s j ( ℓ ) \frac{\partial x_j^{(\ell)}}{\partial s_j^{(\ell)}} ∂ s j ( ℓ ) ∂ x j ( ℓ ) :x j ( ℓ ) = tanh ( s j ( ℓ ) ) x_j^{(\ell)} = \tanh\big(s_j^{(\ell)}\big) x j ( ℓ ) = tanh ( s j ( ℓ ) ) ,所以是 tanh ′ ( s j ( ℓ ) ) \tanh'\big(s_j^{(\ell)}\big) tanh ′ ( s j ( ℓ ) ) 。
代進去,最後一項和 k k k 無關,可以提到加總外面:
δ j ( ℓ ) = ∑ k ( δ k ( ℓ + 1 ) ) ( w j k ( ℓ + 1 ) ) ( tanh ′ ( s j ( ℓ ) ) ) \delta_j^{(\ell)} = \sum_{k}\Big(\delta_k^{(\ell+1)}\Big)\Big(w_{jk}^{(\ell+1)}\Big)\Big(\tanh'\big(s_j^{(\ell)}\big)\Big) δ j ( ℓ ) = k ∑ ( δ k ( ℓ + 1 ) ) ( w j k ( ℓ + 1 ) ) ( tanh ′ ( s j ( ℓ ) ) )
這就是講義頁尾那句話:δ j ( ℓ ) \delta_j^{(\ell)} δ j ( ℓ ) 可以從 δ k ( ℓ + 1 ) \delta_k^{(\ell+1)} δ k ( ℓ + 1 ) 往回(backwards)算。已知的是最後一層的 δ 1 ( L ) \delta_1^{(L)} δ 1 ( L ) ,由它算出第 L − 1 L-1 L − 1 層的每個 δ \delta δ ,再算第 L − 2 L-2 L − 2 層,一路推到第 1 層。這裡的 j j j 從 1 開始:常數節點沒有分數,也就沒有 δ \delta δ 。
講義沒有寫 tanh ′ \tanh' tanh ′ 是什麼,課堂上說式子給過了,可以自己推。本文推一次。令 u = exp ( s ) − exp ( − s ) u = \exp(s) - \exp(-s) u = exp ( s ) − exp ( − s ) 、v = exp ( s ) + exp ( − s ) v = \exp(s) + \exp(-s) v = exp ( s ) + exp ( − s ) ,則 u ′ = v u' = v u ′ = v 、v ′ = u v' = u v ′ = u ,用除法的微分公式:
tanh ′ ( s ) = u ′ v − u v ′ v 2 = v 2 − u 2 v 2 = 1 − tanh 2 ( s ) \tanh'(s) = \frac{u'v - uv'}{v^2} = \frac{v^2 - u^2}{v^2} = 1 - \tanh^2(s) tanh ′ ( s ) = v 2 u ′ v − u v ′ = v 2 v 2 − u 2 = 1 − tanh 2 ( s )
所以 tanh ′ ( s j ( ℓ ) ) = 1 − ( x j ( ℓ ) ) 2 \tanh'\big(s_j^{(\ell)}\big) = 1 - \big(x_j^{(\ell)}\big)^2 tanh ′ ( s j ( ℓ ) ) = 1 − ( x j ( ℓ ) ) 2 ,只要有正向計算留下來的 x j ( ℓ ) x_j^{(\ell)} x j ( ℓ ) 就能算,不必再算一次指數函數。
反向傳播演算法
梯度需要兩樣東西:x x x 與 δ \delta δ 。x x x 是把資料餵進去、一層一層往前算出來的;δ \delta δ 是從最後一層一層往回算出來的。第 16 頁把它們組成演算法,名字叫 backpropagation,簡稱 backprop,課堂上說這個名字描述的就是 δ \delta δ 可以往回算這件事:
先設定所有權重 w i j ( ℓ ) w_{ij}^{(\ell)} w ij ( ℓ ) 的初始值,然後對 t = 0 , 1 , … , T t = 0, 1, \dots, T t = 0 , 1 , … , T 重複:
隨機(stochastic): 從 { 1 , 2 , … , N } \{1, 2, \dots, N\} { 1 , 2 , … , N } 隨機挑一個 n n n 。
正向(forward): 令 x ( 0 ) = x n \mathbf{x}^{(0)} = \mathbf{x}_n x ( 0 ) = x n ,算出所有的 x i ( ℓ ) x_i^{(\ell)} x i ( ℓ ) 。
反向(backward): 在同一個 x ( 0 ) = x n \mathbf{x}^{(0)} = \mathbf{x}_n x ( 0 ) = x n 之下,算出所有的 δ j ( ℓ ) \delta_j^{(\ell)} δ j ( ℓ ) 。
梯度下降: w i j ( ℓ ) ← w i j ( ℓ ) − η x i ( ℓ − 1 ) δ j ( ℓ ) w_{ij}^{(\ell)} \leftarrow w_{ij}^{(\ell)} - \eta\,x_i^{(\ell-1)}\delta_j^{(\ell)} w ij ( ℓ ) ← w ij ( ℓ ) − η x i ( ℓ − 1 ) δ j ( ℓ ) 。
最後回傳 g NNET ( x ) = ( ⋯ tanh ( ∑ j w j k ( 2 ) ⋅ tanh ( ∑ i w i j ( 1 ) x i ) ) ) g_{\text{NNET}}(\mathbf{x}) = \Big(\cdots\tanh\Big(\sum_j w_{jk}^{(2)} \cdot \tanh\Big(\sum_i w_{ij}^{(1)} x_i\Big)\Big)\Big) g NNET ( x ) = ( ⋯ tanh ( ∑ j w j k ( 2 ) ⋅ tanh ( ∑ i w ij ( 1 ) x i ) ) ) 。
講義補充一個實務上的變化:有時候第 1 到第 3 步會(平行地)做很多次,第 4 步用這些 x i ( ℓ − 1 ) δ j ( ℓ ) x_i^{(\ell-1)}\delta_j^{(\ell)} x i ( ℓ − 1 ) δ j ( ℓ ) 的平均來更新,叫作 mini-batch。課堂上解釋動機:只看一個點就要做完整的正向與反向,做完才移動一小步,而且單一個點給的方向不太穩定。所以改成一次隨機取一批,課堂上舉的數字是 20 個點,每個點各自算出 x x x 與 δ \delta δ ,再用平均出來的梯度更新。它介於用全部資料的梯度下降和只用一個點的 SGD 之間,課堂上說實務上效果通常比較好。
講義對這一頁的總結是:basic NNet algorithm: backprop to compute the gradient efficiently。「有效率」體現在哪裡,講義沒有展開,本文補一個粗略的算法。反向那一步,每個 w j k ( ℓ + 1 ) w_{jk}^{(\ell+1)} w j k ( ℓ + 1 ) 在 δ \delta δ 的遞迴式裡只被乘一次;組出梯度時每個權重再做一次乘法。所以一次正向加一次反向的計算量和權重個數 D D D 成正比,就拿到全部 D D D 個偏微分。如果改用數值微分,每個權重都要各動一點點、各重跑一次正向,總共是 D D D 次正向,計算量和 D 2 D^2 D 2 成正比。
課堂上最後說,把輸出層換成分類或邏輯迴歸、或把 tanh \tanh tanh 換成別的函數,演算法會有一些變動,但大同小異;只要能這樣算出梯度,梯度下降、SGD、mini-batch 都可以套。
數值例子:把同一個網路的反向計算做完
接著用「數值例子:一個 1-2-2-1 網路的正向計算」那個網路(本文自擬),資料是 x 1 = 1 x_1 = 1 x 1 = 1 、y = 1 y = 1 y = 1 。正向已經算出:
層 s 1 ( ℓ ) s_1^{(\ell)} s 1 ( ℓ ) s 2 ( ℓ ) s_2^{(\ell)} s 2 ( ℓ ) x 1 ( ℓ ) x_1^{(\ell)} x 1 ( ℓ ) x 2 ( ℓ ) x_2^{(\ell)} x 2 ( ℓ ) 0 1 1 1 1 0.6 0.6 0.6 0.5 0.5 0.5 0.5370 0.5370 0.5370 0.4621 0.4621 0.4621 2 0.1749 0.1749 0.1749 0.2996 0.2996 0.2996 0.1732 0.1732 0.1732 0.2909 0.2909 0.2909 3 − 0.1087 -0.1087 − 0.1087 − 0.1087 -0.1087 − 0.1087
第 3 層。 δ 1 ( 3 ) = − 2 ( y − s 1 ( 3 ) ) = − 2 × ( 1 + 0.1087 ) = − 2.2174 \delta_1^{(3)} = -2\big(y - s_1^{(3)}\big) = -2 \times (1 + 0.1087) = -2.2174 δ 1 ( 3 ) = − 2 ( y − s 1 ( 3 ) ) = − 2 × ( 1 + 0.1087 ) = − 2.2174 。
第 2 層。 下一層只有一個神經元,加總只有 k = 1 k = 1 k = 1 一項。
δ 1 ( 2 ) = δ 1 ( 3 ) w 11 ( 3 ) ( 1 − ( x 1 ( 2 ) ) 2 ) = ( − 2.2174 ) ( 1.0 ) ( 1 − 0.1732 2 ) = ( − 2.2174 ) ( 0.9700 ) = − 2.1509 \delta_1^{(2)} = \delta_1^{(3)}\,w_{11}^{(3)}\,\big(1 - (x_1^{(2)})^2\big) = (-2.2174)(1.0)(1 - 0.1732^2) = (-2.2174)(0.9700) = -2.1509 δ 1 ( 2 ) = δ 1 ( 3 ) w 11 ( 3 ) ( 1 − ( x 1 ( 2 ) ) 2 ) = ( − 2.2174 ) ( 1.0 ) ( 1 − 0.173 2 2 ) = ( − 2.2174 ) ( 0.9700 ) = − 2.1509
δ 2 ( 2 ) = δ 1 ( 3 ) w 21 ( 3 ) ( 1 − ( x 2 ( 2 ) ) 2 ) = ( − 2.2174 ) ( − 2.0 ) ( 1 − 0.2909 2 ) = ( 4.4348 ) ( 0.9154 ) = 4.0594 \delta_2^{(2)} = \delta_1^{(3)}\,w_{21}^{(3)}\,\big(1 - (x_2^{(2)})^2\big) = (-2.2174)(-2.0)(1 - 0.2909^2) = (4.4348)(0.9154) = 4.0594 δ 2 ( 2 ) = δ 1 ( 3 ) w 21 ( 3 ) ( 1 − ( x 2 ( 2 ) ) 2 ) = ( − 2.2174 ) ( − 2.0 ) ( 1 − 0.290 9 2 ) = ( 4.4348 ) ( 0.9154 ) = 4.0594
第 1 層。 下一層有兩個神經元,加總有兩項,這是遞迴式裡 ∑ k \sum_k ∑ k 真正起作用的地方。
δ 1 ( 1 ) = ( δ 1 ( 2 ) w 11 ( 2 ) + δ 2 ( 2 ) w 12 ( 2 ) ) ( 1 − ( x 1 ( 1 ) ) 2 ) = ( ( − 2.1509 ) ( 1.0 ) + ( 4.0594 ) ( 0.5 ) ) ( 0.7116 ) = ( − 0.1212 ) ( 0.7116 ) = − 0.0862 \delta_1^{(1)} = \big(\delta_1^{(2)} w_{11}^{(2)} + \delta_2^{(2)} w_{12}^{(2)}\big)\big(1 - (x_1^{(1)})^2\big) = \big((-2.1509)(1.0) + (4.0594)(0.5)\big)(0.7116) = (-0.1212)(0.7116) = -0.0862 δ 1 ( 1 ) = ( δ 1 ( 2 ) w 11 ( 2 ) + δ 2 ( 2 ) w 12 ( 2 ) ) ( 1 − ( x 1 ( 1 ) ) 2 ) = ( ( − 2.1509 ) ( 1.0 ) + ( 4.0594 ) ( 0.5 ) ) ( 0.7116 ) = ( − 0.1212 ) ( 0.7116 ) = − 0.0862
δ 2 ( 1 ) = ( δ 1 ( 2 ) w 21 ( 2 ) + δ 2 ( 2 ) w 22 ( 2 ) ) ( 1 − ( x 2 ( 1 ) ) 2 ) = ( ( − 2.1509 ) ( − 1.0 ) + ( 4.0594 ) ( 0.5 ) ) ( 0.7864 ) = ( 4.1806 ) ( 0.7864 ) = 3.2878 \delta_2^{(1)} = \big(\delta_1^{(2)} w_{21}^{(2)} + \delta_2^{(2)} w_{22}^{(2)}\big)\big(1 - (x_2^{(1)})^2\big) = \big((-2.1509)(-1.0) + (4.0594)(0.5)\big)(0.7864) = (4.1806)(0.7864) = 3.2878 δ 2 ( 1 ) = ( δ 1 ( 2 ) w 21 ( 2 ) + δ 2 ( 2 ) w 22 ( 2 ) ) ( 1 − ( x 2 ( 1 ) ) 2 ) = ( ( − 2.1509 ) ( − 1.0 ) + ( 4.0594 ) ( 0.5 ) ) ( 0.7864 ) = ( 4.1806 ) ( 0.7864 ) = 3.2878
組出梯度並更新。 每個權重的梯度是 x i ( ℓ − 1 ) δ j ( ℓ ) x_i^{(\ell-1)}\delta_j^{(\ell)} x i ( ℓ − 1 ) δ j ( ℓ ) 。取 η = 0.01 \eta = 0.01 η = 0.01 做一步更新:
權重 目前的值 x i ( ℓ − 1 ) x_i^{(\ell-1)} x i ( ℓ − 1 ) δ j ( ℓ ) \delta_j^{(\ell)} δ j ( ℓ ) 梯度 更新後 w 01 ( 1 ) w_{01}^{(1)} w 01 ( 1 ) 0.2 0.2 0.2 1 1 1 − 0.0862 -0.0862 − 0.0862 − 0.0862 -0.0862 − 0.0862 0.2009 0.2009 0.2009 w 11 ( 1 ) w_{11}^{(1)} w 11 ( 1 ) 0.4 0.4 0.4 1 1 1 − 0.0862 -0.0862 − 0.0862 − 0.0862 -0.0862 − 0.0862 0.4009 0.4009 0.4009 w 02 ( 1 ) w_{02}^{(1)} w 02 ( 1 ) − 0.3 -0.3 − 0.3 1 1 1 3.2878 3.2878 3.2878 3.2878 3.2878 3.2878 − 0.3329 -0.3329 − 0.3329 w 12 ( 1 ) w_{12}^{(1)} w 12 ( 1 ) 0.8 0.8 0.8 1 1 1 3.2878 3.2878 3.2878 3.2878 3.2878 3.2878 0.7671 0.7671 0.7671 w 01 ( 2 ) w_{01}^{(2)} w 01 ( 2 ) 0.1 0.1 0.1 1 1 1 − 2.1509 -2.1509 − 2.1509 − 2.1509 -2.1509 − 2.1509 0.1215 0.1215 0.1215 w 11 ( 2 ) w_{11}^{(2)} w 11 ( 2 ) 1.0 1.0 1.0 0.5370 0.5370 0.5370 − 2.1509 -2.1509 − 2.1509 − 1.1551 -1.1551 − 1.1551 1.0116 1.0116 1.0116 w 21 ( 2 ) w_{21}^{(2)} w 21 ( 2 ) − 1.0 -1.0 − 1.0 0.4621 0.4621 0.4621 − 2.1509 -2.1509 − 2.1509 − 0.9940 -0.9940 − 0.9940 − 0.9901 -0.9901 − 0.9901 w 02 ( 2 ) w_{02}^{(2)} w 02 ( 2 ) − 0.2 -0.2 − 0.2 1 1 1 4.0594 4.0594 4.0594 4.0594 4.0594 4.0594 − 0.2406 -0.2406 − 0.2406 w 12 ( 2 ) w_{12}^{(2)} w 12 ( 2 ) 0.5 0.5 0.5 0.5370 0.5370 0.5370 4.0594 4.0594 4.0594 2.1801 2.1801 2.1801 0.4782 0.4782 0.4782 w 22 ( 2 ) w_{22}^{(2)} w 22 ( 2 ) 0.5 0.5 0.5 0.4621 0.4621 0.4621 4.0594 4.0594 4.0594 1.8759 1.8759 1.8759 0.4812 0.4812 0.4812 w 01 ( 3 ) w_{01}^{(3)} w 01 ( 3 ) 0.3 0.3 0.3 1 1 1 − 2.2174 -2.2174 − 2.2174 − 2.2174 -2.2174 − 2.2174 0.3222 0.3222 0.3222 w 11 ( 3 ) w_{11}^{(3)} w 11 ( 3 ) 1.0 1.0 1.0 0.1732 0.1732 0.1732 − 2.2174 -2.2174 − 2.2174 − 0.3840 -0.3840 − 0.3840 1.0038 1.0038 1.0038 w 21 ( 3 ) w_{21}^{(3)} w 21 ( 3 ) − 2.0 -2.0 − 2.0 0.2909 0.2909 0.2909 − 2.2174 -2.2174 − 2.2174 − 0.6451 -0.6451 − 0.6451 − 1.9935 -1.9935 − 1.9935
表中與上面各式的數字都是用未四捨五入的值算完再取四位小數;拿印出來的四位小數手算,最後一位可能差 1 到 2(例如 4.4348 × 0.9154 4.4348 \times 0.9154 4.4348 × 0.9154 手算是 4.0596 4.0596 4.0596 ,未四捨五入的值算出來是 4.0594 4.0594 4.0594 )。
驗算。 梯度有沒有算對,可以用數值微分檢查:把某一個權重加上與減去 10 − 6 10^{-6} 1 0 − 6 ,各跑一次正向,兩個 e n e_n e n 相減再除以 2 × 10 − 6 2 \times 10^{-6} 2 × 1 0 − 6 。13 個權重這樣算出來的值和上表到小數第六位都一致,例如 w 12 ( 1 ) w_{12}^{(1)} w 12 ( 1 ) 兩種算法都是 3.287820 3.287820 3.287820 。
這個結果代表什麼。 用更新後的 13 個權重再做一次正向,輸出從 − 0.1087 -0.1087 − 0.1087 變成 0.1592 0.1592 0.1592 ,往 y = 1 y = 1 y = 1 靠近;e n e_n e n 從 1.2292 1.2292 1.2292 降到 0.7070 0.7070 0.7070 。梯度的正負號告訴每個權重該往哪邊動:w 02 ( 1 ) w_{02}^{(1)} w 02 ( 1 ) 的梯度是正的,所以它被調小;w 01 ( 3 ) w_{01}^{(3)} w 01 ( 3 ) 的梯度是負的,所以它被調大。
步長不能亂取。同一組梯度改用 η = 0.05 \eta = 0.05 η = 0.05 ,輸出變成 1.2116 1.2116 1.2116 、e n = 0.0448 e_n = 0.0448 e n = 0.0448 ;改用 η = 0.1 \eta = 0.1 η = 0.1 ,輸出衝到 2.2352 2.2352 2.2352 ,e n e_n e n 反而升到 1.5257 1.5257 1.5257 ,比更新前還差。梯度只說明在目前位置附近往哪個方向會下降,步子太大就會越過谷底,這和基石第 10 堂討論 η \eta η 時的結論一樣。
Fun Time:輸出層的梯度什麼時候是 0
題目(第 17 頁): 根據 ∂ e n ∂ w i 1 ( L ) = − 2 ( y n − s 1 ( L ) ) ⋅ ( x i ( L − 1 ) ) \frac{\partial e_n}{\partial w_{i1}^{(L)}} = -2\big(y_n - s_1^{(L)}\big) \cdot \big(x_i^{(L-1)}\big) ∂ w i 1 ( L ) ∂ e n = − 2 ( y n − s 1 ( L ) ) ⋅ ( x i ( L − 1 ) ) ,什麼時候 ∂ e n ∂ w i 1 ( L ) = 0 \frac{\partial e_n}{\partial w_{i1}^{(L)}} = 0 ∂ w i 1 ( L ) ∂ e n = 0 ?
y n = s 1 ( L ) y_n = s_1^{(L)} y n = s 1 ( L )
x i ( L − 1 ) = 0 x_i^{(L-1)} = 0 x i ( L − 1 ) = 0
s i ( L − 1 ) = 0 s_i^{(L-1)} = 0 s i ( L − 1 ) = 0
以上皆是
答案:4。 梯度是兩個因子相乘,任何一個是 0 就是 0。選項 1 讓第一個因子是 0:網路在這筆資料上的輸出剛好等於 y n y_n y n ,沒有誤差,不需要調。選項 2 讓第二個因子是 0:這條線傳進來的值是 0,這個權重改成多少都不影響分數。選項 3 是講義解答特別說明的一個:x i ( L − 1 ) = tanh ( s i ( L − 1 ) ) x_i^{(L-1)} = \tanh\big(s_i^{(L-1)}\big) x i ( L − 1 ) = tanh ( s i ( L − 1 ) ) ,而 tanh \tanh tanh 只在 0 的地方是 0,所以 s i ( L − 1 ) = 0 s_i^{(L-1)} = 0 s i ( L − 1 ) = 0 和 x i ( L − 1 ) = 0 x_i^{(L-1)} = 0 x i ( L − 1 ) = 0 是同一件事(當且僅當)。課堂上說選項 1 與 2 應該很簡單,要想的是選項 3;梯度是 0 的時候,代進 SGD 的更新式,這個權重就不會動。
本文補充兩點。第一,選項 2 與 3 說的是 i ≥ 1 i \ge 1 i ≥ 1 的節點;i = 0 i = 0 i = 0 的常數節點 x 0 ( L − 1 ) = 1 x_0^{(L-1)} = 1 x 0 ( L − 1 ) = 1 永遠不是 0,也沒有分數。第二,梯度是 0 只代表這個權重這一步不動,不代表網路已經學好:選項 2、3 成立時誤差可以還很大。後面談初始值時會看到,把所有權重都設成 0 正好會踩進這個情形。
學得動也要學得好:初始值、VC 維度、正則化與提早停止
YouTube:Neural Network :: Optimization and Regularization @ Machine Learning Techniques (機器學習技法)
(影片 00:01–05:12 談最佳化與初始值,05:12–06:56 是 VC 維度,06:56–11:08 是正則化項,11:08–15:16 是提早停止,之後是 Fun Time 與整堂的總結。)
誤差函數不是單一個山谷
第 18 頁把要最小化的東西完整寫出來:
E in ( w ) = 1 N ∑ n = 1 N err ( ( ⋯ tanh ( ∑ j w j k ( 2 ) ⋅ tanh ( ∑ i w i j ( 1 ) x n , i ) ) ) , y n ) E_{\text{in}}(\mathbf{w}) = \frac{1}{N}\sum_{n=1}^{N}\text{err}\Bigg(\bigg(\cdots\tanh\Big(\sum_j w_{jk}^{(2)} \cdot \tanh\Big(\sum_i w_{ij}^{(1)}x_{n,i}\Big)\Big)\bigg),\ y_n\Bigg) E in ( w ) = N 1 n = 1 ∑ N err ( ( ⋯ tanh ( j ∑ w j k ( 2 ) ⋅ tanh ( i ∑ w ij ( 1 ) x n , i ) ) ) , y n )
講義的判斷是:有多層隱藏層時,這個函數通常是非凸(non-convex)的。課堂上說重點不在用哪一種誤差,而在中間經過了這麼多層 tanh \tanh tanh 。以前的 E in E_{\text{in}} E in 像一個山谷,球滾一滾就到最低點;現在可能是山峰綿延到天邊,有很多個山谷,球只會滾進離它比較近的那一個,而且就算身在某個山谷裡,也不知道它是不是全域最低的。講義列出兩個後果:
不容易到達全域最小值(global minimum)。梯度下降或 SGD 配上 backprop,只能給出局部最小值(local minimum)。
不同的初始權重會走到不同的局部最小值,結果對初始值有點敏感(sensitive)。
那初始值該怎麼選?課堂上很坦白:不知道,因為我們不知道好的山谷在哪裡。但有要避開的地方。講義寫的是 large weights ⟹ saturate (small gradient)。課堂上的解釋是:權重很大,分數就很大(或負得很多),落在 tanh \tanh tanh 兩端平平的區域,這叫飽和(saturate),課堂上拿放大器已經放到最大、增益很有限的區域來比喻。平的地方微分很小,梯度很小,每一步只能走一點點,像困在平原上動彈不得。
飽和有多嚴重,可以從 tanh ′ ( s ) = 1 − tanh 2 ( s ) \tanh'(s) = 1 - \tanh^2(s) tanh ′ ( s ) = 1 − tanh 2 ( s ) 直接看(本文計算):
s s s tanh ( s ) \tanh(s) tanh ( s ) tanh ′ ( s ) \tanh'(s) tanh ′ ( s ) 0 0 0 0 0 0 1 1 1 0.5 0.5 0.5 0.4621 0.4621 0.4621 0.7864 0.7864 0.7864 2 2 2 0.9640 0.9640 0.9640 0.0707 0.0707 0.0707 5 5 5 0.99991 0.99991 0.99991 0.00018 0.00018 0.00018 10 10 10 0.999999996 0.999999996 0.999999996 0.000000008 0.000000008 0.000000008
δ \delta δ 的遞迴式每往回一層就乘一次 tanh ′ \tanh' tanh ′ 。分數是 5 的神經元會把傳回來的 δ \delta δ 縮成原來的萬分之二左右,它前面那些權重的梯度也跟著縮小。
講義的建議是:try some random & small ones,試幾組隨機而且小的初始權重。課堂上各給了理由:小,才不會一開始就卡在平原上;隨機,每次才有機會走到不同的山谷,總有一些山谷好一些。
本文再補一個「隨機」的理由,可以用前面的 1-2-2-1 網路驗證。如果把 13 個權重全部設成 0.5,同一層的兩個神經元算出一模一樣的東西:x 1 ( 1 ) = x 2 ( 1 ) = 0.7616 x_1^{(1)} = x_2^{(1)} = 0.7616 x 1 ( 1 ) = x 2 ( 1 ) = 0.7616 、δ 1 ( 1 ) = δ 2 ( 1 ) = 0.0406 \delta_1^{(1)} = \delta_2^{(1)} = 0.0406 δ 1 ( 1 ) = δ 2 ( 1 ) = 0.0406 、δ 1 ( 2 ) = δ 2 ( 2 ) = 0.0966 \delta_1^{(2)} = \delta_2^{(2)} = 0.0966 δ 1 ( 2 ) = δ 2 ( 2 ) = 0.0966 ,梯度也一樣,更新之後兩個神經元還是一樣,之後每一步都如此。兩個神經元永遠在做同一件事,等於只有一個。如果全部設成 0,情況更糟:tanh ( 0 ) = 0 \tanh(0) = 0 tanh ( 0 ) = 0 ,每個隱藏神經元的輸出都是 0;輸出層連到它們的權重梯度是 0(這正是「Fun Time:輸出層的梯度什麼時候是 0」的選項 3),而輸出層的權重是 0 又讓前面每一層的 δ \delta δ 都是 0。唯一梯度不是 0 的是 w 01 ( 3 ) w_{01}^{(3)} w 01 ( 3 ) ,本文讓它跑 200 步,其他 12 個權重一步都沒動,網路只學到一個常數。「練習與對應閱讀」列的 Fall 2024 HW7 第 9 題,要證明的是和第一種同一類的現象(那一題的網路只有一層隱藏層,輸出也取 tanh \tanh tanh )。
講義對這一頁的結論是:NNet 很難最佳化,但實務上可行(difficult to optimize, but practically works)。課堂上的說法是,雖然它最佳化的性質不好,認真把該做的事做好,表現還不算太差。
VC 維度:能力和神經元數、權重數一起長大
第 19 頁給了一個不附證明的結果:用 tanh \tanh tanh 這一類的轉換函數時,大致上
d VC = O ( V D ) d_{\text{VC}} = O(VD) d VC = O ( V D )
V V V 是神經元的個數,D D D 是權重的個數。課堂上說這裡不講詳細的證明,只給大概的結果;並且提醒神經元多了,連線也跟著多,V V V 大的時候 D D D 也大。以 Fun Time 的 3-5-1 網路為例,D = 26 D = 26 D = 26 ;神經元若算 5 個隱藏的加 1 個輸出,V = 6 V = 6 V = 6 ,V D = 156 VD = 156 V D = 156 。O ( ⋅ ) O(\cdot) O ( ⋅ ) 藏著常數,這個數字只能當量級看,本文拿它來感受一件事:把隱藏層加寬一倍,V V V 與 D D D 都大約變兩倍,乘積變四倍。
講義把它的意思分成兩面。好的一面:神經元夠多(V V V 夠大)就能逼近「任何東西」。壞的一面:神經元太多就會過擬合。課堂上說得很生動:節點太多、權重太多,模型就有足夠的能力鑽牛角尖,只在看過的資料上做得很好。講義的提醒是 watch out for overfitting。
正則化:讓一部分權重變成 0
第 20 頁處理過擬合。課堂上的說法是要踩煞車,其中一種踩法是正則化。最基本的選擇是基石第 14 堂 的老朋友,weight-decay(L2)正則化項:
Ω ( w ) = ∑ ( w i j ( ℓ ) ) 2 \Omega(\mathbf{w}) = \sum\big(w_{ij}^{(\ell)}\big)^2 Ω ( w ) = ∑ ( w ij ( ℓ ) ) 2
講義形容它的效果是把權重縮小(shrink):大的權重縮得多,小的權重縮得少。課堂上舉的數字是原本 10 的縮成 8、原本 5 的縮成 4,大致是等比例地縮。從梯度看得出來:w 2 w^2 w 2 對 w w w 微分是 2 w 2w 2 w ,推回去的力道和權重本身成正比。問題在於等比例地縮,大的小的都變小一點,卻永遠不會到 0。
我們希望有些權重真的是 0(稀疏,sparse)。課堂上給了兩個理由:計算上,是 0 的權重不用算;複雜度上,d VC = O ( V D ) d_{\text{VC}} = O(VD) d VC = O ( V D ) 裡有權重的個數,權重變成 0 等於 D D D 變小。講義的寫法是 to effectively decrease d VC d_{\text{VC}} d VC 。
怎麼做到?講義列了兩個選擇:
L1 正則化項 ∑ ∣ w i j ( ℓ ) ∣ \sum\big\lvert w_{ij}^{(\ell)}\big\rvert ∑ w ij ( ℓ ) 。它會把權重推到 0,但絕對值函數在 0 的地方不可微分。課堂上解釋這為什麼麻煩:backprop 本質上是以微分為基礎的方法,加一個不可微分的函數進來,原來的架構就被破壞了。
weight-elimination 正則化項 ,講義稱它為縮放過的(scaled)L2:
∑ ( w i j ( ℓ ) ) 2 1 + ( w i j ( ℓ ) ) 2 \sum\frac{\big(w_{ij}^{(\ell)}\big)^2}{1 + \big(w_{ij}^{(\ell)}\big)^2} ∑ 1 + ( w ij ( ℓ ) ) 2 ( w ij ( ℓ ) ) 2
講義對它的描述是:大的權重縮一個中等的量,小的權重也縮一個中等的量(large weight → median shrink; small weight → median shrink)。課堂上的推論是:原本就小的權重再被縮掉一個中等的量,就會消失不見;做法是把 L2 的每一項除以 1 + w 2 1 + w^2 1 + w 2 當放縮的係數。課堂上說這裡不講細節,請大家自己想為什麼。
本文把它算出來。這一節的 Fun Time 會求出單一項對 w w w 的偏微分是 2 w ( 1 + w 2 ) 2 \frac{2w}{(1+w^2)^2} ( 1 + w 2 ) 2 2 w 。和 L2 的 2 w 2w 2 w 並排:
w w w w 2 1 + w 2 \frac{w^2}{1+w^2} 1 + w 2 w 2 L2 的梯度 2 w 2w 2 w weight elimination 的梯度 0.1 0.1 0.1 0.0099 0.0099 0.0099 0.2 0.2 0.2 0.1961 0.1961 0.1961 0.5 0.5 0.5 0.2 0.2 0.2 1 1 1 0.64 0.64 0.64 1 1 1 0.5 0.5 0.5 2 2 2 0.5 0.5 0.5 3 3 3 0.9 0.9 0.9 6 6 6 0.06 0.06 0.06 10 10 10 0.9901 0.9901 0.9901 20 20 20 0.0020 0.0020 0.0020
從表上讀得出三件事。第一,w w w 很小時 1 + w 2 ≈ 1 1 + w^2 \approx 1 1 + w 2 ≈ 1 ,weight elimination 和 L2 幾乎一樣,小權重照樣被往 0 推。第二,L2 推大權重的力道隨 w w w 一直變大,weight elimination 的力道有上限:對 2 w ( 1 + w 2 ) 2 \frac{2w}{(1+w^2)^2} ( 1 + w 2 ) 2 2 w 再微分一次可以求出它在 w = 1 / 3 ≈ 0.577 w = 1/\sqrt{3} \approx 0.577 w = 1/ 3 ≈ 0.577 時最大,最大值約 0.65。第三,過了這個點之後力道反而變小,w = 10 w = 10 w = 10 時只剩 0.002。
把講義的話和這張表並排。講義寫的是大權重、小權重都縮一個中等的量(median shrink);照這條式子算出來的是:小權重受到的力道和 L2 相當,大權重受到的力道不會跟著權重變大,權重很大時趨近 0。這兩種說法怎麼對起來,講義與課堂都沒有展開。式子給出的效果和這一頁的目的是一致的:和 L2 相比,大的權重幾乎不受影響地留下來,小的權重照樣被推向 0。上面的表與這一段的解讀是本文依公式算的,不是講義的內容。
還有一個讀法(本文補充):表的第二欄顯示每一項 w 2 1 + w 2 \frac{w^2}{1+w^2} 1 + w 2 w 2 都在 0 與 1 之間,小權重接近 0、大權重接近 1。整個正則化項加起來,大約是在數「有幾個權重夠大」,把它壓小就是在減少有作用的權重個數,正好對到 O ( V D ) O(VD) O ( V D ) 裡的 D D D 。
提早停止:少走幾步也是一種正則化
第 21 頁介紹另一種機制,課堂上說它在神經網路的歷史裡非常常用。出發點是梯度下降的走法:從某個點出發走一小步,可以看成在目前位置周圍一小圈的權重裡做選擇;到了新的點,再在新的一小圈裡選。投影片左邊的圖畫了 w 0 , w 1 , w 2 , w 3 \mathbf{w}_0, \mathbf{w}_1, \mathbf{w}_2, \mathbf{w}_3 w 0 , w 1 , w 2 , w 3 四個點,每個點外面一個圓,幾個圓合起來的區域標成 H 3 \mathcal{H}_3 H 3 。講義的說法是:t t t 愈大,GD/SGD 走訪過的權重組合愈多。
走得少,考慮過的假說就少。課堂上用「有效的 VC 維度」來說:拿實際看過的那些權重來算複雜度,最佳化的時間愈長,有效的 VC 維度愈大。講義寫成 smaller t t t effectively decrease d VC d_{\text{VC}} d VC 。
右上的圖是基石第 7 堂 那張:橫軸是 d VC d_{\text{VC}} d VC ,in-sample error 一路下降,model complexity 一路上升,out-of-sample error 先降後升,最好的 d VC ∗ d_{\text{VC}}^* d VC ∗ 在中間。既然步數控制了有效的 d VC d_{\text{VC}} d VC ,把橫軸換成步數 t t t 應該看到同樣的形狀。右下的圖就是這樣一次實際的結果:橫軸是迭代次數 t t t (對數刻度,從 10 2 10^2 1 0 2 到 10 4 10^4 1 0 4 ),縱軸是 log 10 ( error ) \log_{10}(\text{error}) log 10 ( error ) ;E in E_{\text{in}} E in 隨 t t t 一直下降,E test E_{\text{test}} E test 先降後升,最低點 t ∗ t^* t ∗ 落在 10 2 10^2 1 0 2 與 10 3 10^3 1 0 3 之間。
所以比較好的做法是在中間停下來,叫作提早停止(early stopping)。課堂上的例子是:預定要跑兩萬步,跑到兩百步覺得夠了就停。課堂上還說,所有和梯度有關的演算法大概都能套這個機制來做某種正則化。
停在哪一步?講義的答案是 validation,課堂上說把「什麼時候停」當成一個要選的參數,用基石第 15 堂 的驗證來選。講義沒有寫操作步驟。以下三步不在講義上,是本文整理的一種常見做法,用的是基石第 15 堂留一部分資料當驗證集的想法:
訓練前先留一部分資料當驗證集,不拿來算梯度。
用剩下的資料跑 backprop,每隔固定的步數算一次驗證集上的誤差 E val E_{\text{val}} E val ,並且把當下的權重存下來。
跑完預定的步數後,回頭取 E val E_{\text{val}} E val 最低那一次存下來的權重當作結果。
E in E_{\text{in}} E in 不能拿來做這個決定:從講義右下那張圖看,它隨步數一路往下走,照它選只會叫你跑到最後一步。
Fun Time:weight elimination 的偏微分
題目(第 22 頁): 對 weight elimination 正則化項 ∑ ( w i j ( ℓ ) ) 2 1 + ( w i j ( ℓ ) ) 2 \sum\frac{(w_{ij}^{(\ell)})^2}{1 + (w_{ij}^{(\ell)})^2} ∑ 1 + ( w ij ( ℓ ) ) 2 ( w ij ( ℓ ) ) 2 ,∂ regularizer ∂ w i j ( ℓ ) \frac{\partial\,\text{regularizer}}{\partial w_{ij}^{(\ell)}} ∂ w ij ( ℓ ) ∂ regularizer 是什麼?
2 w i j ( ℓ ) / ( 1 + ( w i j ( ℓ ) ) 2 ) 1 2w_{ij}^{(\ell)} \Big/ \Big(1 + \big(w_{ij}^{(\ell)}\big)^2\Big)^1 2 w ij ( ℓ ) / ( 1 + ( w ij ( ℓ ) ) 2 ) 1
2 w i j ( ℓ ) / ( 1 + ( w i j ( ℓ ) ) 2 ) 2 2w_{ij}^{(\ell)} \Big/ \Big(1 + \big(w_{ij}^{(\ell)}\big)^2\Big)^2 2 w ij ( ℓ ) / ( 1 + ( w ij ( ℓ ) ) 2 ) 2
2 w i j ( ℓ ) / ( 1 + ( w i j ( ℓ ) ) 2 ) 3 2w_{ij}^{(\ell)} \Big/ \Big(1 + \big(w_{ij}^{(\ell)}\big)^2\Big)^3 2 w ij ( ℓ ) / ( 1 + ( w ij ( ℓ ) ) 2 ) 3
2 w i j ( ℓ ) / ( 1 + ( w i j ( ℓ ) ) 2 ) 4 2w_{ij}^{(\ell)} \Big/ \Big(1 + \big(w_{ij}^{(\ell)}\big)^2\Big)^4 2 w ij ( ℓ ) / ( 1 + ( w ij ( ℓ ) ) 2 ) 4
答案:2。 講義的解答只有一句玩笑話:這堂課的微積分太多了吧。推導如下。加總裡只有一項含這個權重,把它簡記成 w w w ,用除法的微分公式,分子 w 2 w^2 w 2 的微分是 2 w 2w 2 w ,分母 1 + w 2 1 + w^2 1 + w 2 的微分也是 2 w 2w 2 w :
∂ ∂ w w 2 1 + w 2 = 2 w ( 1 + w 2 ) − w 2 ⋅ 2 w ( 1 + w 2 ) 2 = 2 w + 2 w 3 − 2 w 3 ( 1 + w 2 ) 2 = 2 w ( 1 + w 2 ) 2 \frac{\partial}{\partial w}\,\frac{w^2}{1 + w^2} = \frac{2w(1 + w^2) - w^2 \cdot 2w}{(1 + w^2)^2} = \frac{2w + 2w^3 - 2w^3}{(1 + w^2)^2} = \frac{2w}{(1 + w^2)^2} ∂ w ∂ 1 + w 2 w 2 = ( 1 + w 2 ) 2 2 w ( 1 + w 2 ) − w 2 ⋅ 2 w = ( 1 + w 2 ) 2 2 w + 2 w 3 − 2 w 3 = ( 1 + w 2 ) 2 2 w
四個選項只差分母的次方。除法的微分公式分母一定是原分母的平方,所以是 2 次方。選項 1 是忘了分子裡要減掉的那一項,選項 3、4 沒有對應的算法。本文用數值微分驗算過:w = 0.5 w = 0.5 w = 0.5 時公式給 1 1.5625 = 0.64 \frac{1}{1.5625} = 0.64 1.5625 1 = 0.64 ,數值微分也是 0.64 0.64 0.64 ;w = 3 w = 3 w = 3 時兩者都是 0.06 0.06 0.06 。
課堂上說明這題的用意:要把 weight elimination 放進 backprop,就得知道它對每個權重的偏微分。本文補一句怎麼用:更新時把這一項乘上正則化的強度,加到原本的梯度 x i ( ℓ − 1 ) δ j ( ℓ ) x_i^{(\ell-1)}\delta_j^{(\ell)} x i ( ℓ − 1 ) δ j ( ℓ ) 上。
第 23 頁的總結把四節各收成一句:多層是為了能力,並且有生物上的啟發;一層一層萃取模式,直到最後接上線性的假說;用 backprop 有效率地算梯度;初始化、正則化項與提早停止是訓練時的技巧。下一堂的預告是 making neural network 'deeper'。
自我檢查
1. 一個 2-4-3-1 的網路有幾個權重?對一筆資料做一次 backprop,要算幾個 δ?
答案:( 2 + 1 ) × 4 + ( 4 + 1 ) × 3 + ( 3 + 1 ) × 1 = 12 + 15 + 4 = 31 (2+1)\times 4 + (4+1)\times 3 + (3+1)\times 1 = 12 + 15 + 4 = 31 ( 2 + 1 ) × 4 + ( 4 + 1 ) × 3 + ( 3 + 1 ) × 1 = 12 + 15 + 4 = 31 個權重。δ \delta δ 是每個有分數的神經元一個,常數節點沒有,共 4 + 3 + 1 = 8 4 + 3 + 1 = 8 4 + 3 + 1 = 8 個。
2. 令 g 0 = + 1 g_0 = +1 g 0 = + 1 。寫出一組 ( α 0 , α 1 , α 2 ) (\alpha_0, \alpha_1, \alpha_2) ( α 0 , α 1 , α 2 ) ,讓 sign ( α 0 + α 1 g 1 + α 2 g 2 ) \text{sign}(\alpha_0 + \alpha_1 g_1 + \alpha_2 g_2) sign ( α 0 + α 1 g 1 + α 2 g 2 ) 做出 NAND(兩個都是 TRUE 時輸出 FALSE,其他情形輸出 TRUE),並列表驗證。
答案:把 AND 的三個權重全部變號,( + 1 , − 1 , − 1 ) (+1, -1, -1) ( + 1 , − 1 , − 1 ) 。四種情形的 1 − g 1 − g 2 1 - g_1 - g_2 1 − g 1 − g 2 分別是 − 1 -1 − 1 (兩個都是 + 1 +1 + 1 )、+ 1 +1 + 1 、+ 1 +1 + 1 、+ 3 +3 + 3 ,取 sign 得到 − 1 , + 1 , + 1 , + 1 -1, +1, +1, +1 − 1 , + 1 , + 1 , + 1 。這也說明 NOT 接在 AND 後面不必多用一層:sign ( − s ) \text{sign}(-s) sign ( − s ) 就是把整組權重變號。
3. 一個 1-1-1 的網路:w 01 ( 1 ) = 0 w_{01}^{(1)} = 0 w 01 ( 1 ) = 0 、w 11 ( 1 ) = 0.5 w_{11}^{(1)} = 0.5 w 11 ( 1 ) = 0.5 、w 01 ( 2 ) = 0.5 w_{01}^{(2)} = 0.5 w 01 ( 2 ) = 0.5 、w 11 ( 2 ) = 2 w_{11}^{(2)} = 2 w 11 ( 2 ) = 2 。資料是 x 1 = 2 x_1 = 2 x 1 = 2 、y = 1 y = 1 y = 1 。算出輸出、e n e_n e n 、兩個 δ 與四個權重的梯度。
答案:正向,s 1 ( 1 ) = 0.5 × 2 = 1 s_1^{(1)} = 0.5 \times 2 = 1 s 1 ( 1 ) = 0.5 × 2 = 1 ,x 1 ( 1 ) = tanh ( 1 ) = 0.7616 x_1^{(1)} = \tanh(1) = 0.7616 x 1 ( 1 ) = tanh ( 1 ) = 0.7616 ;s 1 ( 2 ) = 0.5 + 2 × 0.7616 = 2.0232 s_1^{(2)} = 0.5 + 2 \times 0.7616 = 2.0232 s 1 ( 2 ) = 0.5 + 2 × 0.7616 = 2.0232 ,這就是輸出;e n = ( 1 − 2.0232 ) 2 = 1.0469 e_n = (1 - 2.0232)^2 = 1.0469 e n = ( 1 − 2.0232 ) 2 = 1.0469 。反向,δ 1 ( 2 ) = − 2 ( 1 − 2.0232 ) = 2.0464 \delta_1^{(2)} = -2(1 - 2.0232) = 2.0464 δ 1 ( 2 ) = − 2 ( 1 − 2.0232 ) = 2.0464 ;δ 1 ( 1 ) = δ 1 ( 2 ) × w 11 ( 2 ) × ( 1 − 0.7616 2 ) = 2.0464 × 2 × 0.4200 = 1.7189 \delta_1^{(1)} = \delta_1^{(2)} \times w_{11}^{(2)} \times (1 - 0.7616^2) = 2.0464 \times 2 \times 0.4200 = 1.7189 δ 1 ( 1 ) = δ 1 ( 2 ) × w 11 ( 2 ) × ( 1 − 0.761 6 2 ) = 2.0464 × 2 × 0.4200 = 1.7189 。梯度:w 01 ( 2 ) w_{01}^{(2)} w 01 ( 2 ) 是 1 × 2.0464 = 2.0464 1 \times 2.0464 = 2.0464 1 × 2.0464 = 2.0464 ;w 11 ( 2 ) w_{11}^{(2)} w 11 ( 2 ) 是 0.7616 × 2.0464 = 1.5585 0.7616 \times 2.0464 = 1.5585 0.7616 × 2.0464 = 1.5585 ;w 01 ( 1 ) w_{01}^{(1)} w 01 ( 1 ) 是 1 × 1.7189 = 1.7189 1 \times 1.7189 = 1.7189 1 × 1.7189 = 1.7189 ;w 11 ( 1 ) w_{11}^{(1)} w 11 ( 1 ) 是 2 × 1.7189 = 3.4377 2 \times 1.7189 = 3.4377 2 × 1.7189 = 3.4377 。四個梯度都是正的,四個權重都該調小,這和「輸出 2.02 比目標 1 大」一致。(本文用數值微分驗算過這四個值。)
4. 有人把所有初始權重都設成 10,另一個人把所有初始權重都設成 0.01。各會遇到什麼問題?
判準:第一個人的答案要提到分數很大、tanh \tanh tanh 飽和、tanh ′ \tanh' tanh ′ 接近 0,所以梯度很小、幾乎走不動。第二個人權重是小的,沒有飽和的問題,但所有權重相同,同一層的神經元算出相同的輸出與相同的 δ \delta δ ,更新後仍然相同,等於每層只有一個神經元;要改成小而且隨機。兩個人都只答「會卡在局部最小值」不算對。
5. w = 0.1 w = 0.1 w = 0.1 與 w = 3 w = 3 w = 3 兩個權重,L2 與 weight elimination 給它們的梯度各是多少?哪一種正則化項比較會把大的留下、把小的消掉?
答案:L2 是 2 w 2w 2 w ,分別是 0.2 0.2 0.2 與 6 6 6 ,大權重被推的力道是小權重的 30 倍。weight elimination 是 2 w ( 1 + w 2 ) 2 \frac{2w}{(1+w^2)^2} ( 1 + w 2 ) 2 2 w ,分別是 0.2 1.0201 = 0.196 \frac{0.2}{1.0201} = 0.196 1.0201 0.2 = 0.196 與 6 100 = 0.06 \frac{6}{100} = 0.06 100 6 = 0.06 ,小權重受到的力道反而比較大。所以 weight elimination 比較會留下大權重、消掉小權重。
練習與對應閱讀
兩個學期的對應週次。
版本 週次 投影片 LFD(課程頁標示) MOOC 技法第 12 堂 212 未標 Fall 2024 W13(11/25),和技法第 13 堂同一週 212u e-7.1、e-7.2、e-7.3、e-7.4(selected parts) Fall 2026 W15(12/16),排在 W14 期末考之後 212u 在 2026-09-30 還是 404,尚未公開 同上
教科書。 Learning from Data (LFD)的 e-Chapter 7 是教科書的線上章節,不在紙本書裡,取得方式見 amlbook.com。
作業。 Fall 2024 HW7 (2024-12-02 發布、12-16 截止)有三題和這堂直接相關,沒有官方解答:
題 類型 練什麼 Q4 自動批改 20 個輸入單元、3 個輸出單元、50 個隱藏單元(x 0 x_0 x 0 也算),隱藏層可以任意分層、相鄰層全連接,權重數最多是多少 Q9 人工批改 一層隱藏層、所有神經元(含輸出)都用 tanh \tanh tanh ,所有初始權重都設為 0.5 時,證明 backprop(mini-batch GD)之後第一層的 w i j ( 1 ) = w i , j + 1 ( 1 ) w_{ij}^{(1)} = w_{i,j+1}^{(1)} w ij ( 1 ) = w i , j + 1 ( 1 ) Q13(bonus) 人工批改 題目附了一段 chatGPT 的回答,主張 d d d -( d − 1 ) (d-1) ( d − 1 ) -1、以 sign 為轉換函數的前饋網路能實作 d d d 維 XOR;要你指出它和 2023 秋季 bonus 作業的結論哪裡分歧,並用數學證明這不可能
Q4 是 Fun Time「3-5-1 網路有幾個權重」的放大版,可以先寫一個小程式列舉所有分層方式來驗算。Q9 和「試幾組隨機而且小的初始值」的建議要放在一起想,本文在 1-2-2-1 網路上看到的對稱是同一類現象,但網路的形狀和那一題不同(那一題只有一層隱藏層,輸出也取 tanh \tanh tanh ),而且只是一組數字,不是證明。Q13 要你自己判斷那段論證哪一步出錯,可以從這篇「XOR 在新的空間裡仍然線性不可分」的證法出發。整份作業的導讀在技法作業與期末專題 。
自己動手。 把 δ 的遞迴式自己推一次,再用 numpy 寫一個 d d d -3-1 的 tanh \tanh tanh 網路,拿數值微分比對 backprop 算出的梯度。這篇的 1-2-2-1 例子可以當作對答案用的測資。
這堂之後的發展。 這堂的錄影在 2016 年上傳,用的是 tanh \tanh tanh 與基本的 SGD。林軒田在 Fall 2024 另外補了 302u、303u 兩份 modern deep learning 投影片,本系列放在技法第 16 堂 那一篇。
延伸閱讀。 以下站內文章和這堂有重疊,可以對照另一種講法:
下一堂。 技法第 13 堂:深度學習 把這堂的網路疊得更深,處理層數變多之後初始值與正則化更難做好的問題。
課程影片來源
原始影片:Motivation 、Neural Network Hypothesis 、Neural Network Learning 、Optimization and Regularization
查核日期:2026-10-13。影片 ID、標題與長度於當天從官方播放清單取得;YouTube 上沒有字幕軌,本文的課堂說法來自自行轉錄的逐字稿。
更新紀錄
2026-10-10:標註影片狀態,核對錄影來源與取得方式。
2026-10-10:重查影片狀態。嵌入影片與官方播放清單的講次相符。
2026-10-13:原本與第 13 堂合為一篇,改為一堂一篇,依講義與影片逐字稿重寫。
參考資料