吳(wu)恩達(da)深(shen)度(du)學(xue)習(xi)課程二: 改善深(shen)層神經(jing)網絡 第一周(zhou):深(shen)度(du)學(xue)習(xi)的實踐(六(liu))梯度(du)現象(xiang)和梯度(du)檢驗
此分類用于記錄吳恩達深度學習課程的學習筆記。
課程相關信息鏈接如(ru)下:
- 原課程視頻鏈接:
- github課程資料,含課件與筆記:
- 課程配套練習(中英)與答案:
本(ben)篇為第二課第一(yi)周的內容,到(dao)的內容,也(ye)是本(ben)周理(li)論(lun)部分(fen)的最后一(yi)篇。
本周(zhou)(zhou)為(wei)第二課(ke)(ke)(ke)的(de)第一(yi)周(zhou)(zhou)內容,就像課(ke)(ke)(ke)題名稱一(yi)樣,本周(zhou)(zhou)更偏向于深度學習實(shi)踐中出現的(de)問題和概念(nian),在(zai)有了第一(yi)課(ke)(ke)(ke)的(de)機器學習和數學基礎(chu)后,可(ke)以說,在(zai)理解上對本周(zhou)(zhou)的(de)內容不會(hui)存(cun)在(zai)什么難(nan)度。
當然,我也會對一些新出現的概念補充一些基礎內容來幫助理解,在有之前基礎的情況下,按部就班即可對本周內容有較好的掌握。
在(zai)了(le)解了(le)歸一化后(hou)(hou),本周課程最后(hou)(hou)一部(bu)分內容介紹了(le)一些(xie)實際運行中(zhong)的梯度現象(xiang)和相應的一些(xie)處理方法。
要提前說明的是,這部分內容涉及較多的數學基礎。而涉及到的核心概念:梯度檢驗,又因為現在技術的成熟而幾乎不再使用,即使使用,現有的流行框架也都有相應封裝好的方法。
因此,相比課程里的推公式,我會更偏向減少公式的出現,用實例和比喻來解釋概念,當然,仍會對核心的公式和原理進行解釋。
同樣,如果你希望只了解概念及其作用,我會在最后,用一版“人話版總結”來做這部分內容。
1.梯度現象
1.1 梯度爆炸和梯度消失
假設我們有一個 4 層的簡單神經網絡,不設激活函數(或者設為原值)每層權重的平均值是 0.9。
梯度反向(xiang)傳播時,每經(jing)過一層(ceng)都會乘上(shang)該層(ceng)的導(dao)數(shu),大約為 0.9:
梯度稍微變小了一點,這沒問題。
但如果層(ceng)數(shu)再(zai)多,比如 20 層(ceng):
這時梯度幾乎消失了。
如果再更多層呢?這樣下來,每次參數的更新就會小的幾乎沒有,就像一個步履蹣跚的老人下山,讓模型的學習永無盡頭,這就是梯度消失(vanishing gradient)。
反過(guo)來,如(ru)果每(mei)層平(ping)均(jun)值是 1.2:
這時梯度變得極大,出現“爆炸”,這樣次次迭代后參數就會像一個超人一樣次次進化,最后飛在天上在整個山谷亂竄,更別說“找谷底”了,這就是梯度爆炸(Exploding Gradient)。

再用一個例子來說明二者在實際運行中的效果:
- 梯度消失:像一連串傳話游戲,傳到最后只剩耳語,網絡“聽不見”誤差信號。
- 梯度爆炸:像一連串擴音器,每層都加倍音量,最后系統崩潰。
再來看一個實例:
假(jia)設(she)現在(zai)我(wo)們使用 Sigmoid 激活函(han)數(shu):

其導數最大值為 \(0.25\)。
如果網(wang)絡有 10 層,那(nei)么誤差信(xin)號傳回(hui)輸(shu)入(ru)層的幅度最多為:
幾乎為零。
這就是為什么深層網絡用 Sigmoid 會難以訓練,我(wo)們通常在二分類的輸出層使(shi)用它(ta)而不是隱藏層的原因(yin)之一。
最后總結一下判斷二者的實驗現象:
- 梯度消失:loss 幾乎不下降,權重幾乎不變。
- 梯度爆炸:loss 一直 NaN (not a number) 或突然發散(突然急劇增加)。
而如何避免這種情況產生?很明顯,在數據合理的前提下,我們就要給參數一個合理的初值,讓它在后續更新中既不會太大,也不會太小。
也就是初始化問題,之前在簡單的神經網絡里,我們學習了隨機初始化,而現在深層神經網絡中(zhong),我(wo)們也有相應(ying)的(de)初(chu)始化(hua)方法。
1.2 應對二者的權重初始化
梯度之所以不穩定,是因為初始權重太小或太大導致信號在層間放大或縮小。
因此我們希望每一層的輸入和輸出方差保持一致。
好像有些模糊,為什么方差一致就能讓梯度穩定? 我們由此來展開解釋(shi):
(1)什么叫“方差一致”?
在神經(jing)網絡中(zhong),每(mei)一(yi)層都會(hui)對輸入(ru)做(zuo)一(yi)次線(xian)性(xing)變換,看一(yi)眼老(lao)公式,就不(bu)再重復了(le):
而現在,我們希望:
也就是說,一層輸出的波動幅度(方差)不要比輸入大或小太多。
(2)為什么方差變化會出問題?
其實這和我們剛剛闡述的梯度現象是一個道理,只是剛剛是用反向傳播說明,現在是用正向傳播說明:
想(xiang)象每層都稍(shao)微放大(da)一點信號(方(fang)差增(zeng)加):
如果有 20 層:
這意味著信號在傳播過程中被放大了 38 倍,
→ 在反向傳播時,梯度也會被同樣放大 → 梯度爆炸。
反過來,如(ru)果每層(ceng)都縮小一點信號(方差減少):
那么:
→ 信號越來越小,最終接近 0,
→ 梯度反向傳播時也會逐層消失 → 梯度消失。
還是剛剛那個比方:
- 如果每層都“放大”一點,信號越傳越響亮,最后炸麥 → 梯度爆炸;
- 如果每層都“削弱”一點,信號越傳越輕,最后聽不見 → 梯度消失;
- 只有音量穩定傳遞,才能讓整首歌(網絡)正常演奏完。

因此,我們才需要每一層的輸入和輸出方差保持一致。
(3)這和權重初始化的關系
理清楚邏輯后,我們來看看如何通過初始化來實現方差一致:
對于單個(ge)神經元:(偏置不影響方(fang)差,這里(li)省(sheng)去)
假設:
- 每個 \(x_i\) 均值為 0,方差為 \(Var(x_i)=\sigma_x^2\);
- 權重 \(w_i\) 獨立同分布,方差為 \(Var(w_i)=\sigma_w^2\)。
在這些假設下,線性組合的方差是各項方差之和:
又因為 \(w_i\) 與 \(x_i\) 獨立:(這(zhe)是數學里概率論部(bu)分的知識)
因此:
若我們希望輸出的方差與輸入的方差相同(即方差保持一致),設 \(Var(z) = \sigma_x^2\),則:
最終,我們得出結論:如果輸入方差為 \(\sigma_x^2\) 且滿足上述獨立性假設,那么把權重的方差設為 \(1/n\)(\(n\) 為該層的輸入維度,也稱 fan_in)可以使輸出方差與輸入方差保持一致。
來看一個具體的例子:
假設 \(fan_{in} = n = 100\),且輸入每個通道方差 \(\sigma_x^2 = 1\)(應用歸一化的結果)。
- 由公式得到\(\sigma_w^2 = 1/n = 1/100 = 0.01\)
- 那么輸出方差: \(Var(z) = n \sigma_w^2 \sigma_x^2 = 100 \times 0.01 \times 1 = 1\),與輸入方差相等(方差一致)。
若不這么做,比如 \(\sigma_w = 0.5\)(\(\sigma_w^2=0.25\))更大:
- 輸出方差 \(=100 \times 0.25 \times 1 = 25\) → 被放大 25 倍(梯度爆炸)。
若 \(\sigma_w = 0.01\)(\(\sigma_w^2=1e-4\))更小:
- 輸出方差 \(=100 \times 1e-4 = 0.01\) → 被縮小(梯度消失)。
這便是權重初始化的核心概念:即通過控制權重的方差,讓信號方差保持恒定。 既避免(mian)了梯(ti)度爆炸(zha),又避免(mian)了梯(ti)度消失。
在此(ci)思(si)想上(shang),便發(fa)展(zhan)出了(le)以下幾種適應不同激活函數的(de)初始化,涉及具體(ti)實驗和文獻,就不再展(zhan)開了(le):
| 初始化方法 | 核心思想 | 適用激活函數 | 公式 | 舉例說明 |
|---|---|---|---|---|
| Xavier (Glorot) | 讓輸入輸出方差一致 | Sigmoid / Tanh | \(Var(W)=\frac{1}{n_{in}+n_{out}}\) | 若一層輸入神經元 100 個、輸出 50 個: \(Var(W)=1/(150)=0.0067\) |
| He (Kaiming) | 針對 ReLU 激活的特性調整 | ReLU / Leaky ReLU | \(Var(W)=\frac{2}{n_{in}}\) | 輸入 100 個神經元 → \(Var(W)=0.02\) |
總結一下,把權重初始化為合適的方差,相當于在網絡剛開始訓練時把“信號音量”調到合適的檔位,這能讓信號在層間既不被放大成噪音(爆炸),也不被削弱成耳語(消失)。不同激活函數會改變信號統計特性,所以需要不同的初始化。
2.梯度檢驗(Gradient Checking)
梯度檢驗的目標是驗證反向傳播計算的梯度是否正確。
這在早(zao)期手(shou)寫反(fan)向傳播(bo)時代(dai)是非常(chang)重(zhong)要的(de)調試工具。
梯度檢驗的核心思想是:用數值方法逼近梯度,再與反向傳播計算的梯度對比,檢查實現是否正確,我們用實例來更好的說明這個過程。
2.1計算數值梯度
首先,假設損失函數為:\(J(\theta) = \theta^2\)
當前參數:\(\theta = 3\)
然后,用有限差分法近似梯度:
計算:
現在我們就得到了數值梯度,這是我們用有限差分計算得到的實際數值。
2.2 計算理論梯度
現在(zai),對損(sun)失函數求導代入:
現在我們就得到了理論梯度,這是我們通過求導得到的理論答案。
2.3 進行梯度檢驗
梯度檢驗的公式如(ru)下(xia):
結果為 \(0\),說明反向傳播梯度實現正確,但實際上的數值不會這么簡單。
若我們的反向傳播錯誤(例如少乘了一項),數值梯度與反向傳播梯度之間的差異就會很明顯,從而發現問題。
對梯度檢(jian)驗的結果判(pan)別如下:
| error 量級 | 含義 |
|---|---|
| \(error < 10^{-7}\) | 極小誤差,反向傳播實現完全正確 |
| \(10^{-7} \le error < 10^{-4}\) | 誤差較小,可接受,可能存在微小數值舍入差異 |
| \(10^{-4} \le error < 10^{-2}\) | 誤差明顯,反向傳播可能有小錯誤,需要檢查 |
| \(error \ge 10^{-2}\) | 誤差很大,反向傳播實現錯誤明顯 |
這便是(shi)早期梯度檢驗的主要過程,但(dan)在現在已經很少(shao)使(shi)用了。
2.4 實際運用中要注意的點
在實際使用梯度檢驗時(shi),需(xu)要注意(yi)以下幾(ji)點:
- 梯度檢驗不用于訓練
- 梯度檢驗的目的是驗證反向傳播實現是否正確,并不是訓練算法本身。
- 它通常只在模型開發階段使用,一旦確認實現正確,就可以關閉,以免浪費計算資源。
- 梯度檢驗和 Dropout/正則化一般不一起使用
- Dropout 操作會引入隨機性,會導致數值梯度和反向傳播梯度不完全一致。
- 為了保證梯度檢驗結果準確,通常需要在 關閉 Dropout 的訓練模式 下進行。
3.”人話版“總結
| 概念 | 原理 | 作用 | 比喻 |
|---|---|---|---|
| 梯度消失 | 信號在多層網絡中逐層縮小,導致反向傳播梯度幾乎為 0 | 網絡學習極慢,權重幾乎不更新 | 傳話游戲越傳越小聲,最后聽不見 |
| 梯度爆炸 | 信號在多層網絡中逐層放大,導致反向傳播梯度非常大 | 網絡訓練不穩定,loss 發散或 NaN | 傳話游戲越傳越大聲,最后系統崩潰 |
| 權重初始化 | 給權重一個合適方差,使每層輸出方差 ≈ 輸入方差 | 避免梯度消失或爆炸,讓信號穩定傳播 | 調音器把每層信號音量調到合適檔位,既不吵也不小聲 |
| 梯度檢驗 | 用數值方法近似梯度,與反向傳播梯度比對 | 驗證反向傳播是否正確 | 對照答案檢查作業,發現漏算或寫錯的地方 |

