博客 / 詳情

返回

吳恩達深度學習課程二: 改善深層神經網絡 第三週:超參數調整,批量標準化和編程框架(一)超參數調整

此分類用於記錄吳恩達深度學習課程的學習筆記。
課程相關信息鏈接如下:

  1. 原課程視頻鏈接:[雙語字幕]吳恩達深度學習deeplearning.ai
  2. github課程資料,含課件與筆記:吳恩達深度學習教學資料
  3. 課程配套練習(中英)與答案:吳恩達深度學習課後習題與答案

本篇為第二課的第三週內容,3.1到3.3的內容。


本週為第二課的第三週內容,你會發現這周的題目很長,實際上,作為第二課的最後一週內容,這一週是對基礎部分的最後補充。
在整個第一課和第二課部分,我們會了解到最基本的全連接神經網絡的基本結構和一個完整的模型訓練,驗證的各個部分。
之後幾課就會進行更多的實踐和進階內容介紹,從“通用”走向“特化”。
總的來説這周的難度不高,但也有需要理解的內容,我仍會在相對較難理解的部分增加更多基礎和例子,以及最後的“人話版”總結。
本篇的內容關於超參數調整

1.超參數調整

在這兩課的學習裏,我們幾乎每新瞭解一部分內容,就會引入一些新的超參數,先來看看我們至今都有哪些超參數:

類別 超參數名稱 作用説明 典型默認值 / 常用範圍
優化器相關 學習率(Learning Rate, lr) 控制每次更新步子的大小,是最關鍵的超參數 1e-3(Adam),1e-2(SGD)
動量(Momentum β) 平滑梯度方向,減少震盪 0.9
Adam 一階矩 β₁ EMA 平滑梯度方向 0.9
Adam 二階矩 β₂ EMA 平滑梯度平方,適應不同參數尺度 0.999
RMSprop α 平滑梯度平方幅度 0.99 or 0.9
訓練過程 批次大小(Batch Size) 每次梯度更新使用的數據量 32、64、128、256
訓練輪數(Epochs) 數據被完整遍歷的次數 10–200
學習率衰減策略 動態調整學習率以加速收斂 視具體策略而定
模型結構 網絡層數(Depth) 模型的深度影響表達能力 2–50(FC)/幾十~上百(CNN/Transformer)
隱藏層維度(Width) 每層神經元數,影響模型容量 128、256、512、1024
激活函數 提供非線性表達能力 ReLU、LeakyReLU、GELU
正則化 Dropout 比例 防止過擬合 0.1–0.5
L2 正則(Weight Decay) 限制權重大小 1e-4, 1e-5
歸一化(Normalization) Batch Normalization(BN) 使中間層輸出分佈穩定,提升訓練速度 默認
Z-score 標準化 將特徵轉為均值為 0,方差為 1 默認
權重初始化 Xavier 初始化(Glorot) 針對 Sigmoid/Tanh,使前後層方差一致 默認
He 初始化(Kaiming) 針對 ReLU 家族,避免前向/反向信號爆炸 默認

先説明一下,Batch Normalization 是本週的內容,我們之後就會了解到。
你會發現,僅僅是基礎部分,我們就已經有了這麼多的超參數,而我們要應用一個個組合來測試模型的不同參數下的性能並找到更好的那個。
這就是模型訓練裏最普遍的比喻:煉丹
每個超參數就像一種材料,我們要努力研究每一種材料要不要加,要加多少,才能煉出效果更好的丹藥,也就是我們的模型。

雖然訓練過程中避免不了隨機性,但我們在這方面仍總結出了一些經驗,來幫助更好的調參,就像“丹方”。
下面就來展開一下這部分,但要提前説明的是:
它們並不絕對
它們並不絕對
它們並不絕對
我們都想找到一些被證明絕對正確,絕對更省時間,效率更高的方法,但很遺憾的是在煉丹學裏目前還沒有可以這麼説的,調參的本質就是不斷的嘗試

1.1 普遍來説影響更大的超參數

在學習過程中相信你也能直觀感受到,有些超參數的調整對結果影響更大。
我們依據課程內容和經驗簡單總結如下:
Pasted image 20251114170441

1.2 方格調參

在大致瞭解了哪些超參數影響更大後,我們對如何調試參數自然也有一些經驗方法。
其中,早期最經典的就是方格調參,我們用課程裏的圖來看一看它的具體實施:

(1)典型的方格調參

Pasted image 20251114174751

很明顯,就是以參數範圍建立座標系,圖中用橫縱座標代表兩個超參數的範圍,各選取五個點形成二十五種組合來進行測試。
根據控制變量的邏輯來看,這確實是比較科學的一種做法。
但這種方法在現在也確實有其缺陷:

  1. 超參數的影響程度:我們在上一部分大致説明了哪些超參數的調整可能對結果影響比較大,而如果調整一些影響較小的超參數可能對結果不會產生什麼影響。
    舉個例子,上圖裏,假設縱軸是學習率,而橫縱是Adam防止除0的超參數 \(\epsilon\) ,那我們使用25種組合的成本是不是更可能只是測試了5種不同學習率帶來的影響差別?
  2. 超參數的數量: 這是無法避免的點,現在我們只調整兩種參數,圖是一個面,假設我們再增加一個超參數,那是不是圖就成了“體”,原來的25種組合一下子就成了125種組合,極大增加了時間成本,更別説我們現在有這麼多超參數了。

因此,在現在的大數據大模型時代,超多的參數量和不同超參數的影響量級和控制變量帶來的大成本產生了衝突。
自然而然的,會有新的方法來解決這種問題。

(2)隨機取值的方格調參

再看一下這種取值方式:
Pasted image 20251114181659

依舊是25種組合,但是這次我們是在方格里隨機取值,這樣就解決了剛剛的25次組合只是測試了5種不同學習率的問題。
可是又有問題產生了,如果不控制變量的話,我們怎麼知道哪個參數更重要?影響是哪個參數產生的?
第一種解決思路就是我們上面所説的,認為影響是更靠前的參數產生的。
但是我們也説了,這種情況並不絕對,它只能給我們一個大致方向上的指引。
因此,在實際調參中,我們會使用一種由粗糙到精細的思路。
即在隨機取點中,我們會發現當參數組合落在某一區域時出現了更好的性能。
這時,雖然我們不知道具體是哪個超參數產生了這種影響,但是我們可以把區域縮小,在更小的搜索區域裏進行更精細的搜索來得到更好的參數組合。

總結來説,就是先進行效率更高的大範圍隨機搜索,再在搜索得到的小範圍裏精細搜索,實現成本和性能兼顧。
在這個基礎上,我們繼續展開。

1.3 隨機取值中的取值邏輯

(1)均勻取值

現在假設我們要調試隱藏層單元的數量,假定要在1到100範圍內取值25次。
從直覺來講,我們是不是更偏向以4為間隔均勻取值
因為對於隱藏層單元的數量,我們能理解到它每個單位量的增加帶來的影響大致是相同的。
舉個例子,從99個單元增加到100個單元和從50個單元增加到51個單元帶來的影響是差不多的。
就像一個變化率,即導數為定值的正比例函數:
Pasted image 20251114190637

在其他超參數中,隱藏層數,訓練輪次也有這類性質。
因此,對於這種單位量的增減產生影響差距不大的超參數,我們更傾向於均勻取值來調試,因為它們單位變化產生的影響不會受數值本身太大的影響。

(2)均勻取值的非適用現象

實際上,並不是所有超參數都適用均值取值。
我們用 Momentum 的動量項 β 來説明這個問題:
Momentum 的 β 一般在 0.8 到 0.999 之間取值。
如果我們像剛才那樣均勻取 25 個點,那麼點之間的間隔大約是 0.008。
問題在於:
雖然數值上都是“加 0.008”,但對模型的影響差異非常明顯。

我們可以用“等效記憶天數”來理解 β 的作用。
動量的更新中,β 越大,代表它“記住過去梯度”的時間越長。
先回憶一下等效天數的公式:

\[\text{等效記憶天數} \approx \frac{1}{1-\beta} \]

這時,數值本身的量級就會導致非常明顯的差別,我們看兩個例子:

  1. β = 0.80 → 0.808

\[\frac{1}{1-0.80} = 5\text{ 天} \]

\[\frac{1}{1-0.808} \approx 5.2\text{ 天} \]

也就是説,從 5 天增加到 5.2 天,幾乎沒有變化
模型對歷史梯度的記憶長度基本相同,訓練曲線幾乎不變。
2. β = 0.990 → 0.998(加 0.008)

\[\frac{1}{1-0.990} = 100\text{ 天} \]

\[\frac{1}{1-0.998} = 500\text{ 天} \]

這次變化雖然在 β 上仍然只是 +0.008
但等效記憶從 100 天增加到 500 天,差距巨大。
這意味着模型會突然“記住”很長時間之前的梯度,
訓練的方向、收斂速度、穩定性都會出現明顯變化。

通過這樣的比較就能看出:

  • 在 β 的低值區間(0.8 左右),加 0.008 → 記憶時間幾乎不變
  • 在 β 的高值區間(0.99 以上),加 0.008 → 記憶時間變化呈數倍增加
    因此:
    β 的不同區間敏感度完全不同,就像一個導數隨變量本身遞增的函數:
    Pasted image 20251114192139

這時,如果在 0.8 到 0.999 之間做均勻取值,大部分採樣點會落在 0.8 ~ 0.9 這個影響較小的區域:

  • 這一段的 β 改變,訓練行為變化不明顯
  • 真正對模型影響顯著的 β > 0.95 區域,卻分配到非常少的採樣點
    結果就是:均勻取值並不能有效探索重要的區域。
    那要怎麼做呢?

(3)對數軸上的均勻取值

既然 β 在不同區間的敏感度完全不同,那我們自然就會問:能不能把“敏感的區域多取點,不敏感的區域少取點”?

答案當然是可以。
而且已經有成熟的方法 —— 在“對數意義下”均勻取值
我們以此來展開。

首先,什麼是對數軸?
我們平常畫的那個數軸(1、2、3、4、5…),叫做 線性軸:每兩個刻度之間的距離都是一樣的。

但是就像剛剛説的,有些超參數變化 不是按“加法”影響,而是按“倍數”影響
比如學習率 0.001 → 0.0001,差值雖然都很小,但對訓練影響是“十倍”的差距。
這時候,線性軸就完全不適用了。
於是我們需要一個新的座標方式:
對數軸(Log-scale)就是“按倍數劃分刻度”的數軸。

下一個問題:那我們要怎麼把線性軸變成對數軸實現均值取值?

第一步:對參數做一次 log(取對數)

假設我們要在範圍: \(\beta \in [0.80,0.999]\) 裏取值。
但根據等效天數的概念,我們真正關心的是其實是 1−β 的量級變化,所以我們先看它的範圍:

  • 當 β = 0.80 → 1−β = 0.20
  • 當 β = 0.999 → 1−β = 0.001
    你會發現:
    0.20 到 0.001 這個範圍 跨了 200 倍的變化,完全是“數量級級別”的變化。

因此我們先做一件事:
把 (1−β) 做 log,使得“倍數變化”變成“線性變化”。
看看實例:

1−β log(1−β)
0.20 −0.70
0.02 −1.70
0.002 −2.70
0.001 −3.00

你會發現,原本 “差 200 倍” 的範圍
在 log 之後變成 “差 2.3” 的線性範圍。
你可能有些忘了這部分的原理,我們補充一下基礎:
\(y=ln(x)\)\(y\) 是指“底數 \(e\) 的多少次方,才能得到 \(x\) ?”
因此,相比數值,指數對量級更敏感。
Pasted image 20251114200043

\(x<1\) 時,\(\ln(x)\) 會把那些“本來都擠在 0 附近、分不清誰大誰小”的小數,拉開到整個負半軸,因為雖然它們的數值變化小,但是量級變化大
這正是我們想要的效果: 把原本“倍數變化”的空間,展開成“線性變化”的空間。

於是我們對 \((1-\beta)\) 做一次對數後,原本差 200 倍的數值,
在 log 軸上會變成一個 寬度只有約 2.3 的區間
這樣我們就可以在這個區間裏——
真正做到“按影響均勻取值”。

第二步:在 log 軸上進行線性均勻採樣

經過 log 變換後,我們得到一條新的“對數軸”。
它的特點是:

  • 在原本敏感的地方(比如 1−β 很小的時候),會被拉得很長
  • 在原本不敏感的地方,會被壓得很短
    這意味着,如果我們在這條 log 軸上均勻取點,比如取 10 個點,它們在原始空間裏就會變成:
  • 小數值部分(例如 0.001~0.01)會分佈得更密集
  • 大數值部分(例如 0.05~0.2)會分佈得更稀疏
第三步:把 log 空間的點“反變換”回原始 β

最後,在 log 空間裏選完點之後,我們必須把它們重新映射回真實的超參數 β。
流程是:

  1. 在 log(1−β) 上均勻取點
  2. 對每個點做 exp(指數)恢復得到 (1−β)
  3. 再轉回 β

這一來一回的變換,就像是在對原本“擠作一團”的參數空間進行 重新拉伸與分配
最後在取值上:

  • β 接近 0.999 的地方會分佈得特別密
  • 接近 0.80 的地方則分佈得特別稀

也就實現了我們想要的效果:根據”影響”均勻取值。
就像這樣:
Pasted image 20251114202534

1.4 調參流派

Pasted image 20251114202737

在課程中,吳恩達老師把調參分為兩派:

  1. 熊貓派:資源少,對一個模型一點點反覆調優,就像一次只有一兩個孩子的熊貓。
  2. 魚派:資源充足,可以同時對多個模型測試調優,就像一次一窩的魚。
    我們肯定都希望自己的資源能支持自己當“魚派”,不涉及理解,就不多説了。

2. “人話版”總結

概念 原理 比喻
超參數影響力不同 有些超參數(如學習率)調一點點都會大變動;有些(如隱藏層寬度)調一格幾乎沒影響。 有的材料一撒就是辣死人的辣椒粉;有的材料像白開水,加多少都一樣。
方格調參(Grid Search) 在每個超參數範圍裏選固定數量(如 5 個)點,組合測試。方法科學但成本爆炸。 在地圖上每隔 10 公里挖一口井,保證覆蓋但挖到破產。
隨機調參(Random Search) 隨機取點,不強行覆蓋每個刻度,效率更高。粗略掃一遍,再縮小區域精細搜索。 先隨機撒網找魚羣,再把網往魚多的地方縮小圍捕。
均勻取值(線性軸) 對隱藏層數、訓練輪數這種“單位變化影響差不多”的參數,用等間隔取點更合理。 車子每提高 5 km/h,感覺差不多,不會突然飛起來。
為何不能對所有參數用均勻取值 某些超參數(如 Momentum 的 β)在不同區間敏感度差異巨大,線性均勻取值會浪費採樣。 有些區域像沼澤,一腳下去變化巨大;有些區域像柏油路,十步都一樣。
對數取值(log-scale) 若參數變化影響是“倍數級”的(如學習率、1−β),應把其取 log,使“倍數變化”變線性,再均勻取點。 把原本擠在一起的小數拉長,就像把揉成團的麪皮擀開再切。
調參流派:熊貓派與魚派 熊貓派:資源少,一次只能調一個模型。魚派:資源多,一次幾十個模型同時調。 熊貓每胎只有一個;魚一次生幾十個,把失敗的交給自然選擇。
user avatar
0 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.