02.2 損失函數與梯度下降#
本章導讀#
感知器只會「對錯二分」。現代深度學習換了一個更優雅的框架: 把「學得好不好」寫成一個連續函數 \(L(\theta)\) (損失函數),然後沿著下坡走—— 這就是梯度下降。所有神經網路訓練,本質上都是這一個動作的重複。
淺顯說明#
想像你蒙著眼睛站在山上,想走到山谷最低點:
- 看不見全景,但腳底感覺得到坡度(梯度)。
- 策略:朝最陡的下坡方向跨一小步,再感覺、再跨。
- 步子太大會越過谷底(發散),太小走不到(收斂太慢)。
數學上:「坡度」是 \(\nabla L\) ,「一小步」是學習率 \(\eta\) ,「走路」就是 \(\theta \leftarrow \theta - \eta\nabla L\) 。
正規理論#
損失函數#
給定模型 \(f_\theta(\mathbf{x})\) 與資料集 \(\{(\mathbf{x}_i, y_i)\}_{i=1}^N\) ,損失函數是經驗風險:
兩個最常用的損失:
- 均方誤差(回歸): \(\ell(\hat y, y) = \frac{1}{2}(\hat y - y)^2\) 。
- 交叉熵(分類): \(\ell(\hat y, y) = -\sum_k y_k \log \hat y_k\) ,其中 \(\hat y_k\) 是 softmax 機率。
梯度下降#
泰勒展開給出一階近似:
要讓 \(L\) 下降最快,取 \(\delta = -\eta\,\nabla L\) (與 \(\nabla L\) 反向最有效率,因 Cauchy–Schwarz):
收斂率(凸函數情形)#
若 \(L\) 是 \(\beta\) -平滑且 \(\alpha\) -強凸的,梯度下降以線性收斂率逼近最小值:
每一步把「剩餘誤差」乘上一個小於 1 的常數。
隨機梯度下降(SGD)#
資料太大時,用小批量(mini-batch)估計梯度:
\(\nabla L_{\mathcal{B}}\) 是 \(\nabla L\) 的無偏估計: \(\mathbb{E}_{\mathcal{B}}[\nabla L_{\mathcal{B}}] = \nabla L\) 。 噪聲雖大,卻能幫助跳出淺的局部極小。
動量與 Adam#
- 動量(Momentum):累積歷史梯度,像滾球一樣加速:
- Adam:對每個參數自適應調整步長,用梯度的一、二階動量估計:
簡易範例:一維拋物線#
\(L(\theta) = \theta^2\) , \(\nabla L = 2\theta\) , \(\eta = 0.1\) , \(\theta_0 = 1\) :
| \(k\) | 0 | 1 | 2 | 3 | 5 |
|---|---|---|---|---|---|
| \(\theta_k\) | 1.000 | 0.800 | 0.640 | 0.512 | 0.328 |
每步乘 \(0.8\) ,正是理論預測的 \((1 - 2\eta)^k\) 。若 \(\eta > 1\) , \(|1-2\eta|>1\) ,發散——步子太大越過谷底。
歷史典故#
- 1986 年反向傳播 + 梯度下降:見卷宗 ../1986-反向傳播演算法.md——Rumelhart、Hinton、Williams 讓多層網路可以訓練。
- 2012 年 AlexNet:見 ../2012-AlexNet影像革命.md——GPU 上的 SGD 竟打敗了手工特徵,開啟深度學習革命。
- 2022 年 Chinchilla 規模法則:見 ../2022-Chinchilla規模法則.md——訓練多大的模型、用多少資料,由冪律決定(06.3 節)。
習題#
- 對 \(L(\theta) = (\theta - 3)^2\) 套用梯度下降, \(\eta = 0.25\) ,求 \(\theta_k\) 的封閉式,並求收斂的最大 \(\eta\) 。
- 證明:SGD 的批量梯度是全量梯度的無偏估計。
- 解釋為什麼動量可以幫助穿越狹長峽谷形的損失面(提示:垂直方向振盪互相抵消,水平方向累積加速)。
補充#
1. 數學推導證明#
證明(習題 2):批量梯度是無偏估計。
全量梯度 \(\nabla L = \frac{1}{N}\sum_{i=1}^{N} \nabla\ell_i\) 。小批量 \(\mathcal{B}\) 是從 \(\{1,\dots,N\}\) 均勻無放回抽 \(|\mathcal{B}|\) 個,則每個 \(i\) 被抽中的機率為 \(|\mathcal{B}|/N\) ,故
期望恰為全量梯度——SGD 的噪聲均值為零,只貢獻方差(有助跳出淺局部極小,代價是收斂抖動)。 \(\blacksquare\)
證明(習題 1): \(L(\theta) = (\theta-3)^2\) 的封閉式與收斂條件。
梯度 \(\nabla L = 2(\theta - 3)\) ,更新 \(\theta_{k+1} = \theta_k - 2\eta(\theta_k - 3)\) 。令 \(e_k = \theta_k - 3\) ,則 \(e_{k+1} = (1-2\eta)e_k\) ,故
\(\eta = 0.25\) 、 \(\theta_0 = 0\) 時 \(\theta_k = 3 - 0.5^k \cdot 3\) (5 步後 \(2.90625\) ,與程式輸出一致)。收斂 iff \(|1-2\eta| < 1\) ,即 \(0 < \eta < 1\) ; \(\eta = 1\) 時在兩側來回跳(不收斂也不發散), \(\eta > 1\) 時 \(|e_k| \to \infty\) (發散)——步子太大越過谷底。 \(\blacksquare\)
說明(習題 3):動量穿越峽谷。 設峽谷沿 \(w_0\) 平緩、沿 \(w_1\) 陡峭:陡峭方向梯度正負交替,動量累積 \(v \leftarrow \beta v + g\) 把交替項平均掉(振盪抵消);平緩方向梯度同號累積, \(v\) 越滾越大(加速)。數學上動量是梯度的指數滑動平均,等於給更新加了低通濾波。
2. 簡易範例#
範例一:一維拋物線的手算。 \(L = \theta^2\) 、 \(\eta = 0.1\) : \(\theta_k = 0.8^k\) ( \(1 \to 0.8 \to 0.64 \to 0.512 \to \cdots\) )。程式 _code/02.2-gradient-descent.py 逐項斷言實際值等於 \(0.8^k\) ——理論與數值到小數點後三位全合。
範例二:四種優化器比較。 程式在狹長損失 \(L = \frac{1}{2}(w_0^2 + 20w_1^2)\) (條件數 20)上跑 50 步( \(\eta = 0.05\) ):GD 終值 \(L \approx 7.40\times 10^{-2}\) ;SGD(含無偏噪聲) \(\approx 9.85\times 10^{-2}\) (稍差但可接受);動量 \(\approx 2.51\times 10^{-2}\) (最佳,印證穿越峽谷的直覺);Adam 在此學習率下 \(\approx 3.62\) (反而最差——自適應方法對學習率敏感,此例說明優化器沒有免費午餐,超參需配合調)。