吳恩達深度學習課程一:神經網絡和深度學習 第三周:淺層神經網絡(二)激活函數和反向傳播
此分類用于記錄吳恩達深度學習課程的學習筆記。
課程相關信息鏈接如下:
- 原課程視頻鏈接:
- github課程資料,含課件與筆記:
- 課程配套練習(中英)與答案:
本篇為第一課第三周,到部分的筆記內容。
經過第二周的基礎補充,本周內容的理解難度可以說有了很大的降低,主要是從邏輯回歸擴展到淺層神經網絡,講解相關內容,我們按部就班梳理課程內容即可,當然,依舊會盡可能地創造一個較為絲滑的理解過程。
我們繼續上一篇的內容,來展開一下激活函數對淺層神經網絡擬合效果的影響,并完成淺層神經網絡的反向傳播部分,這樣,我們就大致了解了淺層神經網絡相比邏輯回歸,是如何提高算法性能的。
1. 淺層神經網絡里的激活函數
1.1 隱藏層激活函數的作用
在邏輯回歸中,我們知道,最后使用sigmoid激活函數是為了讓加權和映射為概率從而實現分類效果。
而現在,如果我們仍要進行二分類,而淺層神經網絡輸出層的sigmoid函數已經實現了分類效果,那隱藏層再使用激活函數的作用是什么?
我們看一看如果不設隱藏層神經元的激活函數,正向傳播的輸出是什么形式:
- 首先,隱藏層只有線性組合,那么隱藏層的輸出就是加權和本身:
- 現在,隱藏層的加權和就是輸出層的輸入,即:
- 我們觀察一下就會發現,\(\mathbf{Z^{[2]}}\) 的實際形式沒有發生任何變化,我們換一個示例看一下:
可以發現,其形式依舊是“權重 × 輸入 + 偏置”的線性表達式。
也就是說,無論我們堆疊多少層這樣的“線性層”,最后得到的結果仍然等價于一個沒有任何非線性能力的線性模型。這與邏輯回歸本質上并沒有區別。
在這種情況下,多層和一層的區別就相當于:
這便是激活函數的核心作用:引入非線性
1.2 激活函數如何引入非線性?
我們已經知道, 在沒有激活函數的情況下,神經元的輸出是:
而當我們加入激活函數 \(g(x)\) 后,輸出就變成:
因為此時,下一層的輸入就變成了一個經過非線性映射的結果:
這意味著:
如果 \(g(x)\) 是線性的(例如恒等函數 \(g(z)=z\)),網絡整體依舊是線性關系;
而只要 \(g(x)\) 是非線性函數(如 Sigmoid、ReLU、tanh 等),網絡整體的映射關系就無法再化簡為一個單一的線性變換。
我們繼續剛剛那個例子:
現在我們只改一點,把激活函數換成ReLU,即:
隱藏層的傳播過程即為:
再輸入輸出層:
這個時候,整體的輸出函數變成:
這就是一個分段線性函數,可以拐彎、有“折點”,不再是單一直線。
那如果再換成更復雜的激活函數呢?
這也意味著網絡具備了擬合非線性關系的能力。
最后看一張圖:

我們想通過圖中的幾個數據點進行擬合,沒有激活函數,我們就只能像左側一樣畫一條直線,而只有使用了激活函數,我們才能讓這條直線彎曲,來實現更好擬合效果。
1.3 常見的激活函數
在了解了激活函數的作用——為神經網絡引入非線性能力之后,我們來看看幾種常見的激活函數及其特性。不同的激活函數,會對神經元的輸出特征、梯度傳播和訓練效果產生顯著影響。
(1)Sigmoid 函數
Sigmoid 的表達式為:
其輸出范圍在 \((0, 1)\) 之間,形狀如“S”型曲線。
Sigmoid 的優點在于它可以將任意實數映射為 \((0,1)\),非常適合二分類任務的輸出層,例如預測概率。
缺點是當輸入較大或較小時,梯度接近 0,容易出現梯度消失問題,導致網絡難以訓練。

(2)Tanh函數
Tanh 是 Sigmoid 的改進版本,其表達式為:
輸出范圍在 \((-1, 1)\) 之間,同樣是“S”型曲線。
Tanh 的優點在于輸出均值為 0,有助于加快梯度下降的收斂,并在一定程度上緩解了梯度消失問題。
缺點在于,當輸入過大或過小時,依然會出現梯度趨于 0 的飽和現象。
如果把 Sigmoid 看作“擠壓到 [0,1]”,那么 Tanh 就是“擠壓到 [-1,1]”,更加對稱,有利于后續層學習,因此,Tanh比sigmoid更適合作為隱藏層的激活函數。

(3)ReLU函數
ReLU 是目前最常用的激活函數之一,定義為:
當輸入為正時,輸出等于自身;當輸入為負時,輸出為 0。
ReLU 的優點在于計算簡單,梯度傳播效率高,并且在正區間保持線性,減少了梯度消失問題,從而加快訓練速度。
缺點在于對于負輸入,梯度恒為 0,容易出現“神經元死亡”現象,即某些神經元永遠輸出 0,無法更新。

(4)Leaky ReLU(帶泄漏的 ReLU)
為了緩解 ReLU 的“神經元死亡”問題,便出現了 Leaky ReLU:
其中 \(\alpha\) 是一個很小的常數(通常取 0.01)。Leaky ReLU 的優點在于對負區間保留一個微小的斜率,避免梯度完全為 0,從而訓練更加穩定,減少“死神經元”的出現。
缺點是其輸出仍然不是嚴格的零中心,且 \(\alpha\) 的選取需要進行調試。

2.淺層神經網絡的反向傳播
我們知道,在淺層神經網絡里,我們涉及到兩個層級各自的權重和偏置,因此,不同于邏輯回歸中的一次更新,我們這次需要在一次反向傳播過程中,更新兩個層級的參數。
參數的傳遞過程如下:
2.1 損失函數
我們知道二分類交叉熵成本函數格式如下:
向量化后即可表示為: $$ \mathcal{L}(\mathbf{A^{[2]}}, \mathbf{Y}) $$
我們依舊通過損失函數,使用鏈式法則來計算梯度。
2.2 輸出層梯度
輸出層激活函數為 \(sigmoid(x)\)
而輸出層誤差定義為:
在第二周的推導中,我們已經知道,對于二分類交叉熵 + sigmoid,損失對加權和的導數可簡化為:
繼續通過鏈式法則,我們得到輸出層權重和偏置的梯度(詳細過程可看第二周的推導):
3.3 隱藏層梯度
對于隱藏層,這里我們便不定義具體的激活函數,用通式來展示過程:
先梳理一下我們現在有的量:
- 損失對輸出層加權和的導數\(\mathbf{dZ^{[2]}}\)
- 隱藏層的加權和\(\mathbf{Z^{[1]}}\)
- 隱藏層的的加權和經過激活函數的輸出\(\mathbf{A^{[1]}}\)
- 隱藏層的激活函數\(g(\mathbf{Z^{[1]}})\) 和它的導數\(g'(\mathbf{Z^{[1]}})\)
- 隱藏層的參數\(\mathbf{W^{[1]}}\),\(\mathbf{b^{[1]}}\)
現在,我們要求隱藏層參數的梯度,首先要得到損失關于隱藏層輸出的導數,即:
再通過鏈式法則細化一下,我們得到:
再看一眼加權和公式:
所以,通過求導我們得到:
下一步,得到損失關于隱藏層加權和的輸出,即:
而隱藏層輸出對加權和求導,其實就是激活函數的導數:\(g'(\mathbf{Z^{[1]}})\)
因此,我們得到:
注意!這里的乘是Hadamard 乘。
Hadamard 乘激活導數 = 對每個神經元每個樣本的誤差單獨乘上對應的激活導數
到了這一步,我們就可以得到最后的梯度:
還沒完,這里還有一點要強調,注意看這個符號:\(\mathbf{dZ^{[1]}_{:,i}}\)
我們之前的邏輯回歸,以及本次傳播的輸出層偏置,使用的符號都是\(\mathbf{dZ^{(i)}}\),對這個符號求平均就代表對 \(m\) 個樣本在同一神經元上的誤差求平均。
而現在,我們的隱藏層有四個神經元,由此解釋一下\(\frac{1}{m} \sum_{i=1}^{m} \mathbf{dZ^{[1]}_{:,i}}\) 的含義:
- "\(:\)"代表所有行
- "\(:,i\)"代表第 \(i\) 列
- "\(\sum_{i=1}^{m} \mathbf{dZ^{[1]}_{:,i}}\)"代表對\(dZ^{[1]}\) 的每一列求和,得到的結果是所有樣本分別在四個隱藏神經元總誤差
- 最后求平均值,即為平均誤差,現在, 每個元素就對應一個隱藏神經元的偏置梯度。
我們也總結一下反向傳播過程中各個量和其維度:
| 量 | 維度 | 說明 |
|---|---|---|
| X | n × m | 輸入特征 |
| W[1] | 4 × n | 隱藏層權重 |
| b[1] | 4 × 1 → 4×m | 隱藏層偏置(廣播) |
| Z[1] | 4 × m | 隱藏層線性組合 |
| A[1] | 4 × m | 隱藏層激活輸出 |
| W[2] | 1 × 4 | 輸出層權重 |
| b[2] | 1 × 1 → 1×m | 輸出層偏置(廣播) |
| Z[2] | 1 × m | 輸出層線性組合 |
| A[2] | 1 × m | 輸出層激活輸出 |
| dZ[2] | 1 × m | 輸出層誤差 |
| dW[2] | 1 × 4 | 輸出層權重梯度 |
| db[2] | 1 × 1 | 輸出層偏置梯度 |
| dA[1] | 4 × m | 輸出層誤差傳回隱藏層 |
| dZ[1] | 4 × m | 隱藏層誤差(Hadamard乘激活導數) |
| dW[1] | 4 × n | 隱藏層權重梯度 |
| db[1] | 4 × 1 | 隱藏層偏置梯度 |
3.4 更新參數
在完成所有梯度計算后,我們就可以使用梯度下降法來更新網絡的權重和偏置,公式如下:
(1) 輸出層參數更新
(2) 隱藏層參數更新
這樣,我們就完成了淺層神經網絡的一個反向傳播過程的梳理。
相比邏輯回歸,淺層神經網絡在一次反向傳播中更新了兩層參數,而在之后的更復雜的神經網絡結構中,隱藏層數量也不只一層,這樣,在一次反向傳播中,就會更新更多的參數。
但其形式,也只是像現在這樣的通過鏈式法則的層層求導,更新即可。
所以,之后便會盡量少的出現這樣比較繁雜的求導,但前提是要了解神經網絡通過反向傳播更新參數的邏輯。
下一篇即為本周理論部分的最后一部分,是神經網絡的參數初始化,也是多個隱藏層神經元能發揮不同作用的原因。
