Skip to content

神經網路:反向傳播怎麼算梯度|台大林軒田 機器學習技法 第 12 堂

2026年9月30日1 分鐘
TL;DR感知器的線性組合做得出 AND、OR,做不出 XOR;再疊一層就可以,這就是多層感知器。這堂課把中間的 sign 換成 tanh、輸出層接線性迴歸,再用連鎖律推出反向傳播:先正向算出每一層的輸出 x,再從輸出層往回算 δ,每個權重的梯度就是前一層的 x 乘上這一層的 δ。最後處理訓練的兩個麻煩:E_in 非凸,初始權重要小而且隨機;d_VC 大約是 O(VD),要靠 weight elimination 與提早停止防過擬合。

查詞與收藏

正在載入查詞工具…

🌏 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(1)d^{(1)}-⋯\cdots-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 頁從已經學過的東西出發。感知器是把輸入乘上一組權重、算出分數、再取正負號。拿 TT 個感知器 gt(x)=sign(wt⊤x)g_t(\mathbf{x}) = \text{sign}(\mathbf{w}_t^\top\mathbf{x}) 做技法第 7 堂的線性 aggregation,每個 gtg_t 有 αt\alpha_t 票:

G(x)=sign(∑t=1Tαt sign(wt⊤x)⏟gt(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)

投影片把這個式子畫成一張圖:最左邊一排是輸入 x0=1,x1,…,xdx_0 = 1, x_1, \dots, x_d,每個輸入都連到中間一排的 TT 個圓圈,連線上是 wt\mathbf{w}_t;中間的圓圈再各用一條標著 αt\alpha_t 的線連到最右邊的 GG。每個圓圈裡畫了一個階梯形的函數,代表算出分數之後取 sign。課堂上把圓圈叫作節點(node)。

講義指出這張圖有兩層權重(wt\mathbf{w}_t 與 α\boldsymbol{\alpha})、兩層 sign 函數(gtg_t 裡面的與 GG 裡面的)。這一節要回答的問題寫在頁尾:這樣的 GG 能做出(implement)什麼樣的邊界?

用第二層的權重做邏輯運算

第 3 頁先看兩個感知器。g1g_1 與 g2g_2 各是平面上一條線,線的一側是 +1+1(圖上塗藍色)、另一側是 −1-1(塗紅色)。把 +1+1 當成 TRUE、−1-1 當成 FALSE,目標是 AND(g1,g2)\text{AND}(g_1, g_2):兩個都是 TRUE 的區域才是藍色。

做法是加一個永遠輸出 +1+1 的 g0g_0,三者的票數設成 α0=−1\alpha_0 = -1、α1=+1\alpha_1 = +1、α2=+1\alpha_2 = +1:

G(x)=sign(−1+g1(x)+g2(x))G(\mathbf{x}) = \text{sign}\big(-1 + g_1(\mathbf{x}) + g_2(\mathbf{x})\big)

把四種情形全部列出來:

g1g_1g2g_2−1+g1+g2-1 + g_1 + g_2GGAND(g1,g2)\text{AND}(g_1, g_2)
+1+1+1+1+1+1+1+1TRUE
+1+1−1-1−1-1−1-1FALSE
−1-1+1+1−1-1−1-1FALSE
−1-1−1-1−3-3−1-1FALSE

課堂上的講法是兩票減掉一票:兩個都是 +1+1 時還剩 +1+1;只要有一個是 −1-1,g1+g2g_1 + g_2 最多是 0,再減 1 一定是負的。所以 G≡AND(g1,g2)G \equiv \text{AND}(g_1, g_2)。課堂上接著指出,這時候 GG 的邊界是由兩條直線拼成的折線,已經不是單一條直線了。

講義說 OR 與 NOT 可以用類似的方式做出來。課堂上補了 NOT 的做法:把輸出乘上 −1-1 反過來就好,也就是 NOT(g1)=sign(−g1)\text{NOT}(g_1) = \text{sign}(-g_1);OR 留給這一節的 Fun Time。

能力:感知器夠多,就能逼近平滑的邊界

第 4 頁上半的圖有三格。最右邊是目標:一個圓,圓內是 +1+1、圓外是 −1-1。單一個感知器做不到。左邊兩格分別用 8 個與 16 個感知器,每個感知器是一條直線,合起來圍出一個多邊形,多邊形裡面是 +1+1。16 條線圍出來的形狀比 8 條更接近圓。課堂上說這是用剛才 AND 的方式把這些感知器合起來。

本文補充合起來的寫法。TT 個感知器的 AND 是

G(x)=sign(−(T−1)+∑t=1Tgt(x))G(\mathbf{x}) = \text{sign}\Big(-(T-1) + \sum_{t=1}^{T} g_t(\mathbf{x})\Big)

TT 個都是 +1+1 時括號裡是 T−(T−1)=+1T - (T-1) = +1;有一個是 −1-1 時總和掉到 T−2T - 2,括號裡是 −1-1;−1-1 愈多就愈負。T=2T = 2 時就是上面的式子。至於「更接近」有多接近,以下是本文自擬的算法,不在講義上:假設目標是半徑 1 的圓(面積 π≈3.1416\pi \approx 3.1416),用外切的正 TT 邊形去圍,正 TT 邊形的面積是 Ttan⁡(π/T)T\tan(\pi/T)。T=8T = 8 時是 3.3137,比圓多 5.5%;T=16T = 16 時是 3.1826,只多 1.3%。

講義對這張圖下了兩個註解。第一,這樣的 GG 做得出任何凸多邊形,也就是基石第 5 堂的凸集合(convex set)假說;它的 VC 維度是無限大。第二,感知器夠多就大致能做出平滑的邊界。課堂上說無限大的 VC 維度可能是好消息,代表很多感知器合起來能力很強;也可能是壞消息,模型太複雜就有過擬合的危險。課堂上還提到之前看過類似的現象:技法第 10 堂隨機森林的圖裡,一堆不規則的邊界合起來之後看起來平滑得多。

限制:XOR 在新的空間裡仍然線性不可分

同一頁的下半是做不到的事。XOR(g1,g2)\text{XOR}(g_1, g_2) 是「恰好一個是 TRUE 才是 TRUE」。圖上兩條線把平面切成四塊,相對的兩塊是藍色、另外相對的兩塊是紅色;課堂上形容藍色像集中在雙曲線的兩側,紅色在另外兩側。

講義的說法是:把 ϕ(x)=(g1(x),g2(x))\boldsymbol{\phi}(\mathbf{x}) = (g_1(\mathbf{x}), g_2(\mathbf{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。假設存在 (α0,α1,α2)(\alpha_0, \alpha_1, \alpha_2) 讓 sign(α0+α1g1+α2g2)\text{sign}(\alpha_0 + \alpha_1 g_1 + \alpha_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}

第一列兩式相加得到 2α0<02\alpha_0 < 0,第二列兩式相加得到 2α0>02\alpha_0 > 0,互相矛盾。所以不存在這樣的 α\boldsymbol{\alpha}。課堂上說的類似之處在這裡:基石第 5 堂數過,平面上排成四邊形的四個點,直線做不出每一種標法,對角的兩點同號、相鄰的兩點異號的那一種就做不出來。XOR 要的正是這一種標法,只是現在發生在 (g1,g2)(g_1, g_2) 的平面上。

再疊一層轉換,就得到多層感知器

資料在轉換後的空間還是分不開,以前遇到這種情況怎麼辦?課堂上的回答是:那就再轉換一次,轉到一個比較適合的空間,也許就能用一條線分開了。第 5 頁寫出需要的那一層:

XOR(g1,g2)=OR(AND(−g1,g2), AND(g1,−g2))\text{XOR}(g_1, g_2) = \text{OR}\big(\text{AND}(-g_1, g_2),\ \text{AND}(g_1, -g_2)\big)

先做兩個 AND,再把兩個 AND 的結果做 OR。投影片的網路圖從左到右是:輸入、g1g_1 與 g2g_2、兩個 AND 節點、一個 OR 節點、輸出 GG;g1g_1 連到第一個 AND 的線與 g2g_2 連到第二個 AND 的線上各標了 −1-1,代表先把那個 gg 反過來。

講義沒有把每條線的權重寫出來,以下的權重是本文依 AND 與 OR 的做法填的。令 a1=sign(−1−g1+g2)a_1 = \text{sign}(-1 - g_1 + g_2)、a2=sign(−1+g1−g2)a_2 = \text{sign}(-1 + g_1 - g_2)、G=sign(+1+a1+a2)G = \text{sign}(+1 + a_1 + a_2):

g1g_1g2g_2−1−g1+g2-1 - g_1 + g_2a1a_1−1+g1−g2-1 + g_1 - g_2a2a_21+a1+a21 + a_1 + a_2GG
+1+1+1+1−1-1−1-1−1-1−1-1−1-1−1-1
+1+1−1-1−3-3−1-1+1+1+1+1+1+1+1+1
−1-1+1+1+1+1+1+1−3-3−1-1+1+1+1+1
−1-1−1-1−1-1−1-1−1-1−1-1−1-1−1-1

最後一欄正是 XOR。套到一個具體的情境(本文自擬):取 g1(x)=sign(x1)g_1(\mathbf{x}) = \text{sign}(x_1)、g2(x)=sign(x2)g_2(\mathbf{x}) = \text{sign}(x_2),兩條線就是兩個座標軸。點 (2,−1)(2, -1) 的 (g1,g2)=(+1,−1)(g_1, g_2) = (+1, -1),查表得 G=+1G = +1;點 (1,2)(1, 2) 的 (g1,g2)=(+1,+1)(g_1, g_2) = (+1, +1),G=−1G = -1。這個網路在第二、第四象限輸出 +1+1,在第一、第三象限輸出 −1-1,任何單一條直線都畫不出這種邊界。

為什麼多一層就可以?在 (a1,a2)(a_1, a_2) 的空間裡,四種輸入只落在三個點上:(−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 頁): 令 g0(x)=+1g_0(\mathbf{x}) = +1。下列哪一組 (α0,α1,α2)(\alpha_0, \alpha_1, \alpha_2) 可以讓 G(x)=sign(∑t=02αtgt(x))G(\mathbf{x}) = \text{sign}\big(\sum_{t=0}^{2}\alpha_t g_t(\mathbf{x})\big) 做出 OR(g1,g2)\text{OR}(g_1, g_2)?

  1. (−3,+1,+1)(-3, +1, +1)
  2. (−1,+1,+1)(-1, +1, +1)
  3. (+1,+1,+1)(+1, +1, +1)
  4. (+3,+1,+1)(+3, +1, +1)

答案:3。 講義只說把 (g1,g2)(g_1, g_2) 的四種可能代進去就能驗證。四個選項的 α1=α2=+1\alpha_1 = \alpha_2 = +1 都一樣,差別只在 α0\alpha_0。g1+g2g_1 + g_2 在四種情形下分別是 +2,0,0,−2+2, 0, 0, -2,加上 α0\alpha_0 再取 sign:

α0\alpha_0(+,+)(+,+)(+,−)(+,-)(−,+)(-,+)(−,−)(-,-)做出的函數
−3-3−1-1−1-1−1-1−1-1永遠 FALSE
−1-1+1+1−1-1−1-1−1-1AND
+1+1+1+1+1+1+1+1−1-1OR
+3+3+1+1+1+1+1+1+1+1永遠 TRUE

OR 只有兩個都是 FALSE 時才輸出 FALSE,對應 α0=+1\alpha_0 = +1 那一列。選項 2 是剛才的 AND。α0\alpha_0 的作用是決定「要幾票才過關」:−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)

所以輸出節點做的只是一個線性模型,對象是轉換了好幾次的特徵。講義說基石學過的任何一個線性模型都能放在這裡,並且把三個並排:

輸出層輸出誤差
線性分類h(x)=sign(s)h(\mathbf{x}) = \text{sign}(s)0/1
線性迴歸h(x)=sh(\mathbf{x}) = s平方誤差
邏輯迴歸h(x)=θ(s)h(\mathbf{x}) = \theta(s)cross-entropy

講義選中間那一個:之後都討論用平方誤差的迴歸,輸出層直接把分數送出去。課堂上說這是為了方便講解,分類與軟性分類的版本可以自己照樣延伸。

中間的節點要用哪一種轉換函數

中間節點裡畫的階梯,第 9 頁給它一個名字:轉換函數(transformation function),把進來的分數 ss 轉成節點的輸出。階梯代表中間都是感知器。能不能換別的?講義先排除兩個選擇:

  • 線性函數。 每個節點都是線性運算,整個網路合起來還是線性運算,講義說這樣比較沒用(less useful)。課堂上問得更直接:那何必用這麼多節點,直接做一個線性模型就好。
  • 階梯函數(sign)。 輸出只有 ±1\pm 1,是離散的,講義說對 w\mathbf{w} 很難最佳化。課堂上拿基石第 2 堂的 pocket 當例子:線性分類的最佳化本來就不容易,只能用比較經驗法則式的方法。

常見的選擇是雙曲正切 tanh⁡\tanh:

tanh⁡(s)=exp⁡(s)−exp⁡(−s)exp⁡(s)+exp⁡(−s)\tanh(s) = \frac{\exp(s) - \exp(-s)}{\exp(s) + \exp(-s)}

投影片把三條曲線畫在一起:sign 是階梯,linear 是斜直線,tanh⁡\tanh 是夾在中間的 S 形。課堂上的描述是,ss 離 0 很遠時 tanh⁡\tanh 和階梯函數很接近,ss 在 0 附近時它和線性函數接近。講義列了選它的三個理由:

  • 它是 sign 的類比(analog)近似,比較容易最佳化。課堂上的說法是 sign 像數位的版本,tanh⁡\tanh 是它的類比版;式子裡全是指數函數,是平滑的,可以微分。
  • 它比較接近生物神經元。課堂上解釋,生物體內的運作大體上是連續的,不是離散的。
  • 它沒有那麼新(not that new)。這句指的是下面這個等式。
tanh⁡(s)=2θ(2s)−1\tanh(s) = 2\theta(2s) - 1

θ(s)=11+exp⁡(−s)\theta(s) = \frac{1}{1 + \exp(-s)} 是基石第 10 堂的 logistic 函數。講義只寫了結果,驗算如下:

2θ(2s)−1=21+exp⁡(−2s)−1=1−exp⁡(−2s)1+exp⁡(−2s)=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)}

最後一步是分子分母同乘 exp⁡(s)\exp(s)。所以 tanh⁡\tanh 就是把 logistic 函數的輸入放大兩倍、輸出從 (0,1)(0, 1) 拉伸並平移到 (−1,1)(-1, 1)。後面會用到它的兩個性質:tanh⁡(0)=0\tanh(0) = 0,以及輸出永遠在 −1-1 與 +1+1 之間。

講義說接下來都用 tanh⁡\tanh 當轉換函數。課堂上補充,想用別的函數是你的選擇,只是推導與意義會跟著不同。

記號:層、分數與輸出

第 10 頁把記號定下來。網路圖上三組權重分別標成 wij(1)w_{ij}^{(1)}、wjk(2)w_{jk}^{(2)}、wkq(3)w_{kq}^{(3)},並且在第二層的第三個節點旁邊標出 s3(2)s_3^{(2)}(進入 tanh⁡\tanh 之前)與 x3(2)x_3^{(2)}(tanh⁡\tanh 之後)。

記號意思
ℓ\ell第幾層,1≤ℓ≤L1 \le \ell \le L。輸入算第 0 層,LL 是輸出層
d(ℓ)d^{(\ell)}第 ℓ\ell 層有幾個節點(不含常數節點)。d(0)=dd^{(0)} = d
wij(ℓ)w_{ij}^{(\ell)}從第 ℓ−1\ell - 1 層的第 ii 個節點連到第 ℓ\ell 層第 jj 個節點的權重,0≤i≤d(ℓ−1)0 \le i \le d^{(\ell-1)},1≤j≤d(ℓ)1 \le j \le d^{(\ell)}
sj(ℓ)s_j^{(\ell)}第 ℓ\ell 層第 jj 個節點的分數(score),進入轉換函數之前的值
xj(ℓ)x_j^{(\ell)}第 ℓ\ell 層第 jj 個節點的輸出,也是下一層的輸入

ii 從 0 開始,是因為每一層都多一個常數節點 x0(ℓ−1)=1x_0^{(\ell-1)} = 1,課堂上說它就像以前的 bias 項。jj 從 1 開始,因為常數節點不需要有人算給它。兩條計算式是

sj(ℓ)=∑i=0d(ℓ−1)wij(ℓ) xi(ℓ−1),xj(ℓ)={tanh⁡(sj(ℓ))if ℓ<Lsj(ℓ)if ℓ=Ls_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}

課堂上交代了一個記號上的選擇:轉換後的東西照以前的習慣應該叫 z\mathbf{z},這裡為了能用整數的層號來區分,還是叫 x\mathbf{x}。

一個網路的形狀用每層的節點數來稱呼,寫成 d(0)d^{(0)}-d(1)d^{(1)}-d(2)d^{(2)}-⋯\cdots-d(L)d^{(L)} 的 NNet。形狀固定之後,每一組權重就是一個假說,所有可能的權重合起來是假說集合。做預測的流程寫在頁尾:把 x\mathbf{x} 當成輸入層 x(0)\mathbf{x}^{(0)},經過隱藏層(hidden layers)一層一層算出 x(ℓ)\mathbf{x}^{(\ell)},在輸出層用 x1(L)x_1^{(L)} 當預測值。

權重的總數可以直接從形狀算出來。第 ℓ\ell 層有 d(ℓ)d^{(\ell)} 個節點,每個節點接前一層的 d(ℓ−1)+1d^{(\ell-1)} + 1 個輸出(多的 1 是常數節點),所以總數是 ∑ℓ=1L(d(ℓ−1)+1) d(ℓ)\sum_{\ell=1}^{L}\big(d^{(\ell-1)} + 1\big)\,d^{(\ell)}。這一節的 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連到節點 2
ℓ=1\ell = 1w01(1)=0.2w_{01}^{(1)} = 0.2,w11(1)=0.4w_{11}^{(1)} = 0.4w02(1)=−0.3w_{02}^{(1)} = -0.3,w12(1)=0.8w_{12}^{(1)} = 0.8
ℓ=2\ell = 2w01(2)=0.1w_{01}^{(2)} = 0.1,w11(2)=1.0w_{11}^{(2)} = 1.0,w21(2)=−1.0w_{21}^{(2)} = -1.0w02(2)=−0.2w_{02}^{(2)} = -0.2,w12(2)=0.5w_{12}^{(2)} = 0.5,w22(2)=0.5w_{22}^{(2)} = 0.5
ℓ=3\ell = 3w01(3)=0.3w_{01}^{(3)} = 0.3,w11(3)=1.0w_{11}^{(3)} = 1.0,w21(3)=−2.0w_{21}^{(3)} = -2.0(只有一個輸出節點)

輸入是 x1=1x_1 = 1,所以 x(0)=(1,1)\mathbf{x}^{(0)} = (1, 1),第一個 1 是常數節點。

第 1 層。 s1(1)=0.2×1+0.4×1=0.6s_1^{(1)} = 0.2 \times 1 + 0.4 \times 1 = 0.6,s2(1)=−0.3+0.8=0.5s_2^{(1)} = -0.3 + 0.8 = 0.5。取 tanh⁡\tanh:x1(1)=tanh⁡(0.6)=0.5370x_1^{(1)} = \tanh(0.6) = 0.5370,x2(1)=tanh⁡(0.5)=0.4621x_2^{(1)} = \tanh(0.5) = 0.4621。

第 2 層。 s1(2)=0.1+1.0×0.5370−1.0×0.4621=0.1749s_1^{(2)} = 0.1 + 1.0 \times 0.5370 - 1.0 \times 0.4621 = 0.1749,s2(2)=−0.2+0.5×0.5370+0.5×0.4621=0.2996s_2^{(2)} = -0.2 + 0.5 \times 0.5370 + 0.5 \times 0.4621 = 0.2996。取 tanh⁡\tanh:x1(2)=0.1732x_1^{(2)} = 0.1732,x2(2)=0.2909x_2^{(2)} = 0.2909。

第 3 層(輸出層)。 s1(3)=0.3+1.0×0.1732−2.0×0.2909=−0.1087s_1^{(3)} = 0.3 + 1.0 \times 0.1732 - 2.0 \times 0.2909 = -0.1087。輸出層不取 tanh⁡\tanh,預測值就是 x1(3)=−0.1087x_1^{(3)} = -0.1087。

如果這筆資料的標籤是 y=1y = 1,平方誤差是 (1−(−0.1087))2=1.2292(1 - (-0.1087))^2 = 1.2292。這個網路現在預測得很差,學習要做的就是調那 13 個權重讓誤差變小。

每一層在做什麼:比對輸入和權重像不像

第 11 頁給這些計算一個解讀。每一層是一次轉換,而且轉換是要從資料學出來的:

ϕ(ℓ)(x)=tanh⁡([∑i=0d(ℓ−1)wi1(ℓ) xi(ℓ−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)

每個節點都是拿前一層的輸出向量和自己的權重向量做內積,再取 tanh⁡\tanh。課堂上的說明是:兩個向量愈接近平行,內積愈大,輸出就愈接近 +1+1;所以每個節點在檢查前一層給它的 x\mathbf{x} 和自己的權重向量合不合,合的話就等於確認了某種模式(pattern)。講義的說法是 whether x\mathbf{x} 'matches' weight vectors in pattern。

本文舉一組數字。某個節點的權重是 (w0,w1,w2)=(0,3,4)(w_0, w_1, w_2) = (0, 3, 4)。輸入 (x1,x2)=(0.6,0.8)(x_1, x_2) = (0.6, 0.8) 和權重同方向,分數是 3×0.6+4×0.8=53 \times 0.6 + 4 \times 0.8 = 5,tanh⁡(5)=0.9999\tanh(5) = 0.9999。輸入 (−0.6,−0.8)(-0.6, -0.8) 方向相反,分數是 −5-5,輸出 −0.9999-0.9999。輸入 (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 有幾個權重 wij(ℓ)w_{ij}^{(\ell)}?

  1. 9
  2. 15
  3. 20
  4. 26

答案:4。 講義的解答是第 1 層有 (3+1)×5=20(3+1) \times 5 = 20 個,第 2 層有 (5+1)×1=6(5+1) \times 1 = 6 個,合計 26 個。每一層的「加 1」是常數節點連出去的權重。

其他選項各漏了一些東西:9 是把三層的節點數加起來(3+5+13 + 5 + 1),數的是節點;15 是 3×53 \times 5,只算第 1 層而且沒算常數節點;20 是只算第 1 層,或是兩層都算卻都漏了常數節點(3×5+5×13 \times 5 + 5 \times 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 頁的目標是學出所有的 wij(ℓ)w_{ij}^{(\ell)},讓 EinE_{\text{in}} 最小。講義先分兩種情形:

  • 只有一層隱藏層。 它就是感知器的 aggregation,講義說可以用 gradient boosting 一個一個決定隱藏層的神經元。課堂上的描述是每次加一個神經元進來,加到覺得夠好為止;另外提醒這裡的感知器是用 tanh⁡\tanh 的軟性版本,概念類似。
  • 多層隱藏層。 講義只寫了 not easy;課堂上說剛才那種一次加一個的做法可能就行不通了。

換一條路。定義單一筆資料上的誤差

en=(yn−NNet(xn))2e_n = \big(y_n - \text{NNet}(\mathbf{x}_n)\big)^2

只要算得出 ∂en∂wij(ℓ)\frac{\partial e_n}{\partial w_{ij}^{(\ell)}},就能用基石第 10、11 堂的梯度下降或隨機梯度下降(SGD)。課堂上的區分是:梯度下降把所有資料點上的變化量加起來,SGD 每次隨機挑一個點、只看這個點。所以剩下的關鍵只有一個:怎麼有效率地算出這個偏微分。課堂上先替學生把困難說出來:權重的足標又有 ii、又有 jj、又有 ℓ\ell,一下子分不清哪個是哪個。所以先挑軟的吃,從最後一層做起。

輸出層的梯度

第 14 頁先看輸出層(ℓ=L\ell = L)。輸出層只有一個神經元,而且不做轉換,所以網路的輸出就是它的分數 s1(L)s_1^{(L)}:

en=(yn−s1(L))2=(yn−∑i=0d(L−1)wi1(L) xi(L−1))2e_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

從權重到誤差的關係是一條鏈:wi1(L)w_{i1}^{(L)} 決定 s1(L)s_1^{(L)},s1(L)s_1^{(L)} 決定 ene_n。課堂上說微分不會算的時候就找中間人、用連鎖律,這裡的中間人是 s1(L)s_1^{(L)}:

∂en∂wi1(L)=∂en∂s1(L)⋅∂s1(L)∂wi1(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)}}

兩項分開算。第一項是 (yn−s)2(y_n - s)^2 對 ss 微分,平方的 2 掉下來,括號裡 ss 的係數是 −1-1,得到 −2(yn−s1(L))-2\big(y_n - s_1^{(L)}\big)。第二項,s1(L)s_1^{(L)} 是一串 wi1(L)xi(L−1)w_{i1}^{(L)} x_i^{(L-1)} 的總和,裡面只有一項含我們要的那個 wi1(L)w_{i1}^{(L)},微分之後剩下它的係數 xi(L−1)x_i^{(L-1)}。所以

∂en∂wi1(L)=−2(yn−s1(L))⋅xi(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)}

一般層的梯度:把不會算的那一項取名叫 δ

同一頁的右半是一般的層(1≤ℓ<L1 \le \ell < L,0≤i≤d(ℓ−1)0 \le i \le d^{(\ell-1)},1≤j≤d(ℓ)1 \le j \le d^{(\ell)})。照同樣的做法,中間人選直接和 wij(ℓ)w_{ij}^{(\ell)} 有關的那個分數 sj(ℓ)s_j^{(\ell)}:

∂en∂wij(ℓ)=∂en∂sj(ℓ)⋅∂sj(ℓ)∂wij(ℓ)\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)}}

第二項和輸出層一樣容易:sj(ℓ)=∑iwij(ℓ)xi(ℓ−1)s_j^{(\ell)} = \sum_i w_{ij}^{(\ell)} x_i^{(\ell-1)},對 wij(ℓ)w_{ij}^{(\ell)} 微分得到 xi(ℓ−1)x_i^{(\ell-1)}。第一項是誤差對中間某一層分數的偏微分,中間隔了好幾層,沒辦法直接寫出來。課堂上的處理是先擱著,給它一個名字:

δj(ℓ)=∂en∂sj(ℓ)\delta_j^{(\ell)} = \frac{\partial e_n}{\partial s_j^{(\ell)}}

於是每一層的梯度都是同一個形狀:

∂en∂wij(ℓ)=δj(ℓ)⋅xi(ℓ−1)\frac{\partial e_n}{\partial w_{ij}^{(\ell)}} = \delta_j^{(\ell)} \cdot x_i^{(\ell-1)}

輸出層是它的特例,那裡的 δ\delta 已經算出來了:

δ1(L)=−2(yn−s1(L))\delta_1^{(L)} = -2\big(y_n - s_1^{(L)}\big)

講義在頁尾問:其他的 δ\delta 怎麼辦?

δ 可以從後一層往回算

第 15 頁先畫出 sj(ℓ)s_j^{(\ell)} 影響 ene_n 的路徑:

  1. sj(ℓ)s_j^{(\ell)} 經過 tanh⁡\tanh 變成 xj(ℓ)x_j^{(\ell)}。
  2. xj(ℓ)x_j^{(\ell)} 乘上 wjk(ℓ+1)w_{jk}^{(\ell+1)},進到下一層每一個神經元的分數 s1(ℓ+1),…,sk(ℓ+1),…s_1^{(\ell+1)}, \dots, s_k^{(\ell+1)}, \dots。
  3. 這些分數再一路往後,最後到 ene_n。

課堂上說這次中間人變多了:除了 xj(ℓ)x_j^{(\ell)} 一個,還有下一層的一整排分數,每一個都是中間人。sj(ℓ)s_j^{(\ell)} 的變動沿著每一條路各自傳到 ene_n,多變數的連鎖律要把每條路的貢獻加起來:

δj(ℓ)=∂en∂sj(ℓ)=∑k=1d(ℓ+1)∂en∂sk(ℓ+1)⋅∂sk(ℓ+1)∂xj(ℓ)⋅∂xj(ℓ)∂sj(ℓ)\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)}}

三項各自是什麼:

  • ∂en∂sk(ℓ+1)\frac{\partial e_n}{\partial s_k^{(\ell+1)}} 照定義就是下一層的 δk(ℓ+1)\delta_k^{(\ell+1)}。課堂上強調這一項不用算,剛剛才定義過。
  • ∂sk(ℓ+1)∂xj(ℓ)\frac{\partial s_k^{(\ell+1)}}{\partial x_j^{(\ell)}}:sk(ℓ+1)=∑jwjk(ℓ+1)xj(ℓ)s_k^{(\ell+1)} = \sum_j w_{jk}^{(\ell+1)} x_j^{(\ell)} 是 xx 的線性組合,對 xj(ℓ)x_j^{(\ell)} 微分得到係數 wjk(ℓ+1)w_{jk}^{(\ell+1)}。
  • ∂xj(ℓ)∂sj(ℓ)\frac{\partial x_j^{(\ell)}}{\partial s_j^{(\ell)}}:xj(ℓ)=tanh⁡(sj(ℓ))x_j^{(\ell)} = \tanh\big(s_j^{(\ell)}\big),所以是 tanh⁡′(sj(ℓ))\tanh'\big(s_j^{(\ell)}\big)。

代進去,最後一項和 kk 無關,可以提到加總外面:

δj(ℓ)=∑k(δk(ℓ+1))(wjk(ℓ+1))(tanh⁡′(sj(ℓ)))\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(ℓ)\delta_j^{(\ell)} 可以從 δk(ℓ+1)\delta_k^{(\ell+1)} 往回(backwards)算。已知的是最後一層的 δ1(L)\delta_1^{(L)},由它算出第 L−1L-1 層的每個 δ\delta,再算第 L−2L-2 層,一路推到第 1 層。這裡的 jj 從 1 開始:常數節點沒有分數,也就沒有 δ\delta。

講義沒有寫 tanh⁡′\tanh' 是什麼,課堂上說式子給過了,可以自己推。本文推一次。令 u=exp⁡(s)−exp⁡(−s)u = \exp(s) - \exp(-s)、v=exp⁡(s)+exp⁡(−s)v = \exp(s) + \exp(-s),則 u′=vu' = v、v′=uv' = u,用除法的微分公式:

tanh⁡′(s)=u′v−uv′v2=v2−u2v2=1−tanh⁡2(s)\tanh'(s) = \frac{u'v - uv'}{v^2} = \frac{v^2 - u^2}{v^2} = 1 - \tanh^2(s)

所以 tanh⁡′(sj(ℓ))=1−(xj(ℓ))2\tanh'\big(s_j^{(\ell)}\big) = 1 - \big(x_j^{(\ell)}\big)^2,只要有正向計算留下來的 xj(ℓ)x_j^{(\ell)} 就能算,不必再算一次指數函數。

反向傳播演算法

梯度需要兩樣東西:xx 與 δ\delta。xx 是把資料餵進去、一層一層往前算出來的;δ\delta 是從最後一層一層往回算出來的。第 16 頁把它們組成演算法,名字叫 backpropagation,簡稱 backprop,課堂上說這個名字描述的就是 δ\delta 可以往回算這件事:

先設定所有權重 wij(ℓ)w_{ij}^{(\ell)} 的初始值,然後對 t=0,1,…,Tt = 0, 1, \dots, T 重複:

  1. 隨機(stochastic): 從 {1,2,…,N}\{1, 2, \dots, N\} 隨機挑一個 nn。
  2. 正向(forward): 令 x(0)=xn\mathbf{x}^{(0)} = \mathbf{x}_n,算出所有的 xi(ℓ)x_i^{(\ell)}。
  3. 反向(backward): 在同一個 x(0)=xn\mathbf{x}^{(0)} = \mathbf{x}_n 之下,算出所有的 δj(ℓ)\delta_j^{(\ell)}。
  4. 梯度下降: wij(ℓ)←wij(ℓ)−η xi(ℓ−1)δj(ℓ)w_{ij}^{(\ell)} \leftarrow w_{ij}^{(\ell)} - \eta\,x_i^{(\ell-1)}\delta_j^{(\ell)}。

最後回傳 gNNET(x)=(⋯tanh⁡(∑jwjk(2)⋅tanh⁡(∑iwij(1)xi)))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)。

講義補充一個實務上的變化:有時候第 1 到第 3 步會(平行地)做很多次,第 4 步用這些 xi(ℓ−1)δj(ℓ)x_i^{(\ell-1)}\delta_j^{(\ell)} 的平均來更新,叫作 mini-batch。課堂上解釋動機:只看一個點就要做完整的正向與反向,做完才移動一小步,而且單一個點給的方向不太穩定。所以改成一次隨機取一批,課堂上舉的數字是 20 個點,每個點各自算出 xx 與 δ\delta,再用平均出來的梯度更新。它介於用全部資料的梯度下降和只用一個點的 SGD 之間,課堂上說實務上效果通常比較好。

講義對這一頁的總結是:basic NNet algorithm: backprop to compute the gradient efficiently。「有效率」體現在哪裡,講義沒有展開,本文補一個粗略的算法。反向那一步,每個 wjk(ℓ+1)w_{jk}^{(\ell+1)} 在 δ\delta 的遞迴式裡只被乘一次;組出梯度時每個權重再做一次乘法。所以一次正向加一次反向的計算量和權重個數 DD 成正比,就拿到全部 DD 個偏微分。如果改用數值微分,每個權重都要各動一點點、各重跑一次正向,總共是 DD 次正向,計算量和 D2D^2 成正比。

課堂上最後說,把輸出層換成分類或邏輯迴歸、或把 tanh⁡\tanh 換成別的函數,演算法會有一些變動,但大同小異;只要能這樣算出梯度,梯度下降、SGD、mini-batch 都可以套。

數值例子:把同一個網路的反向計算做完

接著用「數值例子:一個 1-2-2-1 網路的正向計算」那個網路(本文自擬),資料是 x1=1x_1 = 1、y=1y = 1。正向已經算出:

層s1(ℓ)s_1^{(\ell)}s2(ℓ)s_2^{(\ell)}x1(ℓ)x_1^{(\ell)}x2(ℓ)x_2^{(\ell)}
011
10.60.60.50.50.53700.53700.46210.4621
20.17490.17490.29960.29960.17320.17320.29090.2909
3−0.1087-0.1087−0.1087-0.1087

第 3 層。 δ1(3)=−2(y−s1(3))=−2×(1+0.1087)=−2.2174\delta_1^{(3)} = -2\big(y - s_1^{(3)}\big) = -2 \times (1 + 0.1087) = -2.2174。

第 2 層。 下一層只有一個神經元,加總只有 k=1k = 1 一項。

δ1(2)=δ1(3) w11(3) (1−(x1(2))2)=(−2.2174)(1.0)(1−0.17322)=(−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 δ2(2)=δ1(3) w21(3) (1−(x2(2))2)=(−2.2174)(−2.0)(1−0.29092)=(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

第 1 層。 下一層有兩個神經元,加總有兩項,這是遞迴式裡 ∑k\sum_k 真正起作用的地方。

δ1(1)=(δ1(2)w11(2)+δ2(2)w12(2))(1−(x1(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 δ2(1)=(δ1(2)w21(2)+δ2(2)w22(2))(1−(x2(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

組出梯度並更新。 每個權重的梯度是 xi(ℓ−1)δj(ℓ)x_i^{(\ell-1)}\delta_j^{(\ell)}。取 η=0.01\eta = 0.01 做一步更新:

權重目前的值xi(ℓ−1)x_i^{(\ell-1)}δj(ℓ)\delta_j^{(\ell)}梯度更新後
w01(1)w_{01}^{(1)}0.20.211−0.0862-0.0862−0.0862-0.08620.20090.2009
w11(1)w_{11}^{(1)}0.40.411−0.0862-0.0862−0.0862-0.08620.40090.4009
w02(1)w_{02}^{(1)}−0.3-0.3113.28783.28783.28783.2878−0.3329-0.3329
w12(1)w_{12}^{(1)}0.80.8113.28783.28783.28783.28780.76710.7671
w01(2)w_{01}^{(2)}0.10.111−2.1509-2.1509−2.1509-2.15090.12150.1215
w11(2)w_{11}^{(2)}1.01.00.53700.5370−2.1509-2.1509−1.1551-1.15511.01161.0116
w21(2)w_{21}^{(2)}−1.0-1.00.46210.4621−2.1509-2.1509−0.9940-0.9940−0.9901-0.9901
w02(2)w_{02}^{(2)}−0.2-0.2114.05944.05944.05944.0594−0.2406-0.2406
w12(2)w_{12}^{(2)}0.50.50.53700.53704.05944.05942.18012.18010.47820.4782
w22(2)w_{22}^{(2)}0.50.50.46210.46214.05944.05941.87591.87590.48120.4812
w01(3)w_{01}^{(3)}0.30.311−2.2174-2.2174−2.2174-2.21740.32220.3222
w11(3)w_{11}^{(3)}1.01.00.17320.1732−2.2174-2.2174−0.3840-0.38401.00381.0038
w21(3)w_{21}^{(3)}−2.0-2.00.29090.2909−2.2174-2.2174−0.6451-0.6451−1.9935-1.9935

表中與上面各式的數字都是用未四捨五入的值算完再取四位小數;拿印出來的四位小數手算,最後一位可能差 1 到 2(例如 4.4348×0.91544.4348 \times 0.9154 手算是 4.05964.0596,未四捨五入的值算出來是 4.05944.0594)。

驗算。 梯度有沒有算對,可以用數值微分檢查:把某一個權重加上與減去 10−610^{-6},各跑一次正向,兩個 ene_n 相減再除以 2×10−62 \times 10^{-6}。13 個權重這樣算出來的值和上表到小數第六位都一致,例如 w12(1)w_{12}^{(1)} 兩種算法都是 3.2878203.287820。

這個結果代表什麼。 用更新後的 13 個權重再做一次正向,輸出從 −0.1087-0.1087 變成 0.15920.1592,往 y=1y = 1 靠近;ene_n 從 1.22921.2292 降到 0.70700.7070。梯度的正負號告訴每個權重該往哪邊動:w02(1)w_{02}^{(1)} 的梯度是正的,所以它被調小;w01(3)w_{01}^{(3)} 的梯度是負的,所以它被調大。

步長不能亂取。同一組梯度改用 η=0.05\eta = 0.05,輸出變成 1.21161.2116、en=0.0448e_n = 0.0448;改用 η=0.1\eta = 0.1,輸出衝到 2.23522.2352,ene_n 反而升到 1.52571.5257,比更新前還差。梯度只說明在目前位置附近往哪個方向會下降,步子太大就會越過谷底,這和基石第 10 堂討論 η\eta 時的結論一樣。

Fun Time:輸出層的梯度什麼時候是 0

題目(第 17 頁): 根據 ∂en∂wi1(L)=−2(yn−s1(L))⋅(xi(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),什麼時候 ∂en∂wi1(L)=0\frac{\partial e_n}{\partial w_{i1}^{(L)}} = 0?

  1. yn=s1(L)y_n = s_1^{(L)}
  2. xi(L−1)=0x_i^{(L-1)} = 0
  3. si(L−1)=0s_i^{(L-1)} = 0
  4. 以上皆是

答案:4。 梯度是兩個因子相乘,任何一個是 0 就是 0。選項 1 讓第一個因子是 0:網路在這筆資料上的輸出剛好等於 yny_n,沒有誤差,不需要調。選項 2 讓第二個因子是 0:這條線傳進來的值是 0,這個權重改成多少都不影響分數。選項 3 是講義解答特別說明的一個:xi(L−1)=tanh⁡(si(L−1))x_i^{(L-1)} = \tanh\big(s_i^{(L-1)}\big),而 tanh⁡\tanh 只在 0 的地方是 0,所以 si(L−1)=0s_i^{(L-1)} = 0 和 xi(L−1)=0x_i^{(L-1)} = 0 是同一件事(當且僅當)。課堂上說選項 1 與 2 應該很簡單,要想的是選項 3;梯度是 0 的時候,代進 SGD 的更新式,這個權重就不會動。

本文補充兩點。第一,選項 2 與 3 說的是 i≥1i \ge 1 的節點;i=0i = 0 的常數節點 x0(L−1)=1x_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 頁把要最小化的東西完整寫出來:

Ein(w)=1N∑n=1Nerr((⋯tanh⁡(∑jwjk(2)⋅tanh⁡(∑iwij(1)xn,i))), yn)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)

講義的判斷是:有多層隱藏層時,這個函數通常是非凸(non-convex)的。課堂上說重點不在用哪一種誤差,而在中間經過了這麼多層 tanh⁡\tanh。以前的 EinE_{\text{in}} 像一個山谷,球滾一滾就到最低點;現在可能是山峰綿延到天邊,有很多個山谷,球只會滾進離它比較近的那一個,而且就算身在某個山谷裡,也不知道它是不是全域最低的。講義列出兩個後果:

  • 不容易到達全域最小值(global minimum)。梯度下降或 SGD 配上 backprop,只能給出局部最小值(local minimum)。
  • 不同的初始權重會走到不同的局部最小值,結果對初始值有點敏感(sensitive)。

那初始值該怎麼選?課堂上很坦白:不知道,因為我們不知道好的山谷在哪裡。但有要避開的地方。講義寫的是 large weights ⟹ saturate (small gradient)。課堂上的解釋是:權重很大,分數就很大(或負得很多),落在 tanh⁡\tanh 兩端平平的區域,這叫飽和(saturate),課堂上拿放大器已經放到最大、增益很有限的區域來比喻。平的地方微分很小,梯度很小,每一步只能走一點點,像困在平原上動彈不得。

飽和有多嚴重,可以從 tanh⁡′(s)=1−tanh⁡2(s)\tanh'(s) = 1 - \tanh^2(s) 直接看(本文計算):

sstanh⁡(s)\tanh(s)tanh⁡′(s)\tanh'(s)
000011
0.50.50.46210.46210.78640.7864
220.96400.96400.07070.0707
550.999910.999910.000180.00018
10100.9999999960.9999999960.0000000080.000000008

δ\delta 的遞迴式每往回一層就乘一次 tanh⁡′\tanh'。分數是 5 的神經元會把傳回來的 δ\delta 縮成原來的萬分之二左右,它前面那些權重的梯度也跟著縮小。

講義的建議是:try some random & small ones,試幾組隨機而且小的初始權重。課堂上各給了理由:小,才不會一開始就卡在平原上;隨機,每次才有機會走到不同的山谷,總有一些山谷好一些。

本文再補一個「隨機」的理由,可以用前面的 1-2-2-1 網路驗證。如果把 13 個權重全部設成 0.5,同一層的兩個神經元算出一模一樣的東西:x1(1)=x2(1)=0.7616x_1^{(1)} = x_2^{(1)} = 0.7616、δ1(1)=δ2(1)=0.0406\delta_1^{(1)} = \delta_2^{(1)} = 0.0406、δ1(2)=δ2(2)=0.0966\delta_1^{(2)} = \delta_2^{(2)} = 0.0966,梯度也一樣,更新之後兩個神經元還是一樣,之後每一步都如此。兩個神經元永遠在做同一件事,等於只有一個。如果全部設成 0,情況更糟:tanh⁡(0)=0\tanh(0) = 0,每個隱藏神經元的輸出都是 0;輸出層連到它們的權重梯度是 0(這正是「Fun Time:輸出層的梯度什麼時候是 0」的選項 3),而輸出層的權重是 0 又讓前面每一層的 δ\delta 都是 0。唯一梯度不是 0 的是 w01(3)w_{01}^{(3)},本文讓它跑 200 步,其他 12 個權重一步都沒動,網路只學到一個常數。「練習與對應閱讀」列的 Fall 2024 HW7 第 9 題,要證明的是和第一種同一類的現象(那一題的網路只有一層隱藏層,輸出也取 tanh⁡\tanh)。

講義對這一頁的結論是:NNet 很難最佳化,但實務上可行(difficult to optimize, but practically works)。課堂上的說法是,雖然它最佳化的性質不好,認真把該做的事做好,表現還不算太差。

VC 維度:能力和神經元數、權重數一起長大

第 19 頁給了一個不附證明的結果:用 tanh⁡\tanh 這一類的轉換函數時,大致上

dVC=O(VD)d_{\text{VC}} = O(VD)

VV 是神經元的個數,DD 是權重的個數。課堂上說這裡不講詳細的證明,只給大概的結果;並且提醒神經元多了,連線也跟著多,VV 大的時候 DD 也大。以 Fun Time 的 3-5-1 網路為例,D=26D = 26;神經元若算 5 個隱藏的加 1 個輸出,V=6V = 6,VD=156VD = 156。O(⋅)O(\cdot) 藏著常數,這個數字只能當量級看,本文拿它來感受一件事:把隱藏層加寬一倍,VV 與 DD 都大約變兩倍,乘積變四倍。

講義把它的意思分成兩面。好的一面:神經元夠多(VV 夠大)就能逼近「任何東西」。壞的一面:神經元太多就會過擬合。課堂上說得很生動:節點太多、權重太多,模型就有足夠的能力鑽牛角尖,只在看過的資料上做得很好。講義的提醒是 watch out for overfitting。

正則化:讓一部分權重變成 0

第 20 頁處理過擬合。課堂上的說法是要踩煞車,其中一種踩法是正則化。最基本的選擇是基石第 14 堂的老朋友,weight-decay(L2)正則化項:

Ω(w)=∑(wij(ℓ))2\Omega(\mathbf{w}) = \sum\big(w_{ij}^{(\ell)}\big)^2

講義形容它的效果是把權重縮小(shrink):大的權重縮得多,小的權重縮得少。課堂上舉的數字是原本 10 的縮成 8、原本 5 的縮成 4,大致是等比例地縮。從梯度看得出來:w2w^2 對 ww 微分是 2w2w,推回去的力道和權重本身成正比。問題在於等比例地縮,大的小的都變小一點,卻永遠不會到 0。

我們希望有些權重真的是 0(稀疏,sparse)。課堂上給了兩個理由:計算上,是 0 的權重不用算;複雜度上,dVC=O(VD)d_{\text{VC}} = O(VD) 裡有權重的個數,權重變成 0 等於 DD 變小。講義的寫法是 to effectively decrease dVCd_{\text{VC}}。

怎麼做到?講義列了兩個選擇:

  • L1 正則化項 ∑∣wij(ℓ)∣\sum\big\lvert w_{ij}^{(\ell)}\big\rvert。它會把權重推到 0,但絕對值函數在 0 的地方不可微分。課堂上解釋這為什麼麻煩:backprop 本質上是以微分為基礎的方法,加一個不可微分的函數進來,原來的架構就被破壞了。
  • weight-elimination 正則化項,講義稱它為縮放過的(scaled)L2:
∑(wij(ℓ))21+(wij(ℓ))2\sum\frac{\big(w_{ij}^{(\ell)}\big)^2}{1 + \big(w_{ij}^{(\ell)}\big)^2}

講義對它的描述是:大的權重縮一個中等的量,小的權重也縮一個中等的量(large weight → median shrink; small weight → median shrink)。課堂上的推論是:原本就小的權重再被縮掉一個中等的量,就會消失不見;做法是把 L2 的每一項除以 1+w21 + w^2 當放縮的係數。課堂上說這裡不講細節,請大家自己想為什麼。

本文把它算出來。這一節的 Fun Time 會求出單一項對 ww 的偏微分是 2w(1+w2)2\frac{2w}{(1+w^2)^2}。和 L2 的 2w2w 並排:

www21+w2\frac{w^2}{1+w^2}L2 的梯度 2w2wweight elimination 的梯度
0.10.10.00990.00990.20.20.19610.1961
0.50.50.20.2110.640.64
110.50.5220.50.5
330.90.9660.060.06
10100.99010.990120200.00200.0020

從表上讀得出三件事。第一,ww 很小時 1+w2≈11 + w^2 \approx 1,weight elimination 和 L2 幾乎一樣,小權重照樣被往 0 推。第二,L2 推大權重的力道隨 ww 一直變大,weight elimination 的力道有上限:對 2w(1+w2)2\frac{2w}{(1+w^2)^2} 再微分一次可以求出它在 w=1/3≈0.577w = 1/\sqrt{3} \approx 0.577 時最大,最大值約 0.65。第三,過了這個點之後力道反而變小,w=10w = 10 時只剩 0.002。

把講義的話和這張表並排。講義寫的是大權重、小權重都縮一個中等的量(median shrink);照這條式子算出來的是:小權重受到的力道和 L2 相當,大權重受到的力道不會跟著權重變大,權重很大時趨近 0。這兩種說法怎麼對起來,講義與課堂都沒有展開。式子給出的效果和這一頁的目的是一致的:和 L2 相比,大的權重幾乎不受影響地留下來,小的權重照樣被推向 0。上面的表與這一段的解讀是本文依公式算的,不是講義的內容。

還有一個讀法(本文補充):表的第二欄顯示每一項 w21+w2\frac{w^2}{1+w^2} 都在 0 與 1 之間,小權重接近 0、大權重接近 1。整個正則化項加起來,大約是在數「有幾個權重夠大」,把它壓小就是在減少有作用的權重個數,正好對到 O(VD)O(VD) 裡的 DD。

提早停止:少走幾步也是一種正則化

第 21 頁介紹另一種機制,課堂上說它在神經網路的歷史裡非常常用。出發點是梯度下降的走法:從某個點出發走一小步,可以看成在目前位置周圍一小圈的權重裡做選擇;到了新的點,再在新的一小圈裡選。投影片左邊的圖畫了 w0,w1,w2,w3\mathbf{w}_0, \mathbf{w}_1, \mathbf{w}_2, \mathbf{w}_3 四個點,每個點外面一個圓,幾個圓合起來的區域標成 H3\mathcal{H}_3。講義的說法是:tt 愈大,GD/SGD 走訪過的權重組合愈多。

走得少,考慮過的假說就少。課堂上用「有效的 VC 維度」來說:拿實際看過的那些權重來算複雜度,最佳化的時間愈長,有效的 VC 維度愈大。講義寫成 smaller tt effectively decrease dVCd_{\text{VC}}。

右上的圖是基石第 7 堂那張:橫軸是 dVCd_{\text{VC}},in-sample error 一路下降,model complexity 一路上升,out-of-sample error 先降後升,最好的 dVC∗d_{\text{VC}}^* 在中間。既然步數控制了有效的 dVCd_{\text{VC}},把橫軸換成步數 tt 應該看到同樣的形狀。右下的圖就是這樣一次實際的結果:橫軸是迭代次數 tt(對數刻度,從 10210^2 到 10410^4),縱軸是 log⁡10(error)\log_{10}(\text{error});EinE_{\text{in}} 隨 tt 一直下降,EtestE_{\text{test}} 先降後升,最低點 t∗t^* 落在 10210^2 與 10310^3 之間。

所以比較好的做法是在中間停下來,叫作提早停止(early stopping)。課堂上的例子是:預定要跑兩萬步,跑到兩百步覺得夠了就停。課堂上還說,所有和梯度有關的演算法大概都能套這個機制來做某種正則化。

停在哪一步?講義的答案是 validation,課堂上說把「什麼時候停」當成一個要選的參數,用基石第 15 堂的驗證來選。講義沒有寫操作步驟。以下三步不在講義上,是本文整理的一種常見做法,用的是基石第 15 堂留一部分資料當驗證集的想法:

  1. 訓練前先留一部分資料當驗證集,不拿來算梯度。
  2. 用剩下的資料跑 backprop,每隔固定的步數算一次驗證集上的誤差 EvalE_{\text{val}},並且把當下的權重存下來。
  3. 跑完預定的步數後,回頭取 EvalE_{\text{val}} 最低那一次存下來的權重當作結果。

EinE_{\text{in}} 不能拿來做這個決定:從講義右下那張圖看,它隨步數一路往下走,照它選只會叫你跑到最後一步。

Fun Time:weight elimination 的偏微分

題目(第 22 頁): 對 weight elimination 正則化項 ∑(wij(ℓ))21+(wij(ℓ))2\sum\frac{(w_{ij}^{(\ell)})^2}{1 + (w_{ij}^{(\ell)})^2},∂ regularizer∂wij(ℓ)\frac{\partial\,\text{regularizer}}{\partial w_{ij}^{(\ell)}} 是什麼?

  1. 2wij(ℓ)/(1+(wij(ℓ))2)12w_{ij}^{(\ell)} \Big/ \Big(1 + \big(w_{ij}^{(\ell)}\big)^2\Big)^1
  2. 2wij(ℓ)/(1+(wij(ℓ))2)22w_{ij}^{(\ell)} \Big/ \Big(1 + \big(w_{ij}^{(\ell)}\big)^2\Big)^2
  3. 2wij(ℓ)/(1+(wij(ℓ))2)32w_{ij}^{(\ell)} \Big/ \Big(1 + \big(w_{ij}^{(\ell)}\big)^2\Big)^3
  4. 2wij(ℓ)/(1+(wij(ℓ))2)42w_{ij}^{(\ell)} \Big/ \Big(1 + \big(w_{ij}^{(\ell)}\big)^2\Big)^4

答案:2。 講義的解答只有一句玩笑話:這堂課的微積分太多了吧。推導如下。加總裡只有一項含這個權重,把它簡記成 ww,用除法的微分公式,分子 w2w^2 的微分是 2w2w,分母 1+w21 + w^2 的微分也是 2w2w:

∂∂w w21+w2=2w(1+w2)−w2⋅2w(1+w2)2=2w+2w3−2w3(1+w2)2=2w(1+w2)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}

四個選項只差分母的次方。除法的微分公式分母一定是原分母的平方,所以是 2 次方。選項 1 是忘了分子裡要減掉的那一項,選項 3、4 沒有對應的算法。本文用數值微分驗算過:w=0.5w = 0.5 時公式給 11.5625=0.64\frac{1}{1.5625} = 0.64,數值微分也是 0.640.64;w=3w = 3 時兩者都是 0.060.06。

課堂上說明這題的用意:要把 weight elimination 放進 backprop,就得知道它對每個權重的偏微分。本文補一句怎麼用:更新時把這一項乘上正則化的強度,加到原本的梯度 xi(ℓ−1)δj(ℓ)x_i^{(\ell-1)}\delta_j^{(\ell)} 上。

第 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 個權重。δ\delta 是每個有分數的神經元一個,常數節點沒有,共 4+3+1=84 + 3 + 1 = 8 個。

2. 令 g0=+1g_0 = +1。寫出一組 (α0,α1,α2)(\alpha_0, \alpha_1, \alpha_2),讓 sign(α0+α1g1+α2g2)\text{sign}(\alpha_0 + \alpha_1 g_1 + \alpha_2 g_2) 做出 NAND(兩個都是 TRUE 時輸出 FALSE,其他情形輸出 TRUE),並列表驗證。

答案:把 AND 的三個權重全部變號,(+1,−1,−1)(+1, -1, -1)。四種情形的 1−g1−g21 - g_1 - g_2 分別是 −1-1(兩個都是 +1+1)、+1+1、+1+1、+3+3,取 sign 得到 −1,+1,+1,+1-1, +1, +1, +1。這也說明 NOT 接在 AND 後面不必多用一層:sign(−s)\text{sign}(-s) 就是把整組權重變號。

3. 一個 1-1-1 的網路:w01(1)=0w_{01}^{(1)} = 0、w11(1)=0.5w_{11}^{(1)} = 0.5、w01(2)=0.5w_{01}^{(2)} = 0.5、w11(2)=2w_{11}^{(2)} = 2。資料是 x1=2x_1 = 2、y=1y = 1。算出輸出、ene_n、兩個 δ 與四個權重的梯度。

答案:正向,s1(1)=0.5×2=1s_1^{(1)} = 0.5 \times 2 = 1,x1(1)=tanh⁡(1)=0.7616x_1^{(1)} = \tanh(1) = 0.7616;s1(2)=0.5+2×0.7616=2.0232s_1^{(2)} = 0.5 + 2 \times 0.7616 = 2.0232,這就是輸出;en=(1−2.0232)2=1.0469e_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(1)=δ1(2)×w11(2)×(1−0.76162)=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。梯度:w01(2)w_{01}^{(2)} 是 1×2.0464=2.04641 \times 2.0464 = 2.0464;w11(2)w_{11}^{(2)} 是 0.7616×2.0464=1.55850.7616 \times 2.0464 = 1.5585;w01(1)w_{01}^{(1)} 是 1×1.7189=1.71891 \times 1.7189 = 1.7189;w11(1)w_{11}^{(1)} 是 2×1.7189=3.43772 \times 1.7189 = 3.4377。四個梯度都是正的,四個權重都該調小,這和「輸出 2.02 比目標 1 大」一致。(本文用數值微分驗算過這四個值。)

4. 有人把所有初始權重都設成 10,另一個人把所有初始權重都設成 0.01。各會遇到什麼問題?

判準:第一個人的答案要提到分數很大、tanh⁡\tanh 飽和、tanh⁡′\tanh' 接近 0,所以梯度很小、幾乎走不動。第二個人權重是小的,沒有飽和的問題,但所有權重相同,同一層的神經元算出相同的輸出與相同的 δ\delta,更新後仍然相同,等於每層只有一個神經元;要改成小而且隨機。兩個人都只答「會卡在局部最小值」不算對。

5. w=0.1w = 0.1 與 w=3w = 3 兩個權重,L2 與 weight elimination 給它們的梯度各是多少?哪一種正則化項比較會把大的留下、把小的消掉?

答案:L2 是 2w2w,分別是 0.20.2 與 66,大權重被推的力道是小權重的 30 倍。weight elimination 是 2w(1+w2)2\frac{2w}{(1+w^2)^2},分別是 0.21.0201=0.196\frac{0.2}{1.0201} = 0.196 與 6100=0.06\frac{6}{100} = 0.06,小權重受到的力道反而比較大。所以 weight elimination 比較會留下大權重、消掉小權重。

練習與對應閱讀

兩個學期的對應週次。

版本週次投影片LFD(課程頁標示)
MOOC技法第 12 堂212未標
Fall 2024W13(11/25),和技法第 13 堂同一週212ue-7.1、e-7.2、e-7.3、e-7.4(selected parts)
Fall 2026W15(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 個隱藏單元(x0x_0 也算),隱藏層可以任意分層、相鄰層全連接,權重數最多是多少
Q9人工批改一層隱藏層、所有神經元(含輸出)都用 tanh⁡\tanh,所有初始權重都設為 0.5 時,證明 backprop(mini-batch GD)之後第一層的 wij(1)=wi,j+1(1)w_{ij}^{(1)} = w_{i,j+1}^{(1)}
Q13(bonus)人工批改題目附了一段 chatGPT 的回答,主張 dd-(d−1)(d-1)-1、以 sign 為轉換函數的前饋網路能實作 dd 維 XOR;要你指出它和 2023 秋季 bonus 作業的結論哪裡分歧,並用數學證明這不可能

Q4 是 Fun Time「3-5-1 網路有幾個權重」的放大版,可以先寫一個小程式列舉所有分層方式來驗算。Q9 和「試幾組隨機而且小的初始值」的建議要放在一起想,本文在 1-2-2-1 網路上看到的對稱是同一類現象,但網路的形狀和那一題不同(那一題只有一層隱藏層,輸出也取 tanh⁡\tanh),而且只是一組數字,不是證明。Q13 要你自己判斷那段論證哪一步出錯,可以從這篇「XOR 在新的空間裡仍然線性不可分」的證法出發。整份作業的導讀在技法作業與期末專題。

自己動手。 把 δ 的遞迴式自己推一次,再用 numpy 寫一個 dd-3-1 的 tanh⁡\tanh 網路,拿數值微分比對 backprop 算出的梯度。這篇的 1-2-2-1 例子可以當作對答案用的測資。

這堂之後的發展。 這堂的錄影在 2016 年上傳,用的是 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 堂合為一篇,改為一堂一篇,依講義與影片逐字稿重寫。

參考資料