跳轉到

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\) ,損失函數是經驗風險:

\[ L(\theta) = \frac{1}{N}\sum_{i=1}^N \ell(f_\theta(\mathbf{x}_i), y_i) \]

兩個最常用的損失:

  • 均方誤差(回歸): \(\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(\theta + \delta) \approx L(\theta) + \nabla L^\top \delta \]

要讓 \(L\) 下降最快,取 \(\delta = -\eta\,\nabla L\) (與 \(\nabla L\) 反向最有效率,因 Cauchy–Schwarz):

\[ \boxed{\;\theta \leftarrow \theta - \eta\, \nabla L(\theta)\;} \]

收斂率(凸函數情形)#

若 \(L\) 是 \(\beta\) -平滑且 \(\alpha\) -強凸的,梯度下降以線性收斂率逼近最小值:

\[ L(\theta_k) - L(\theta^*) \;\le\; \left(1 - \frac{\alpha}{\beta}\right)^k \big(L(\theta_0) - L(\theta^*)\big) \]

每一步把「剩餘誤差」乘上一個小於 1 的常數。

隨機梯度下降(SGD)#

資料太大時,用小批量(mini-batch)估計梯度:

\[ \theta \leftarrow \theta - \eta\, \nabla L_{\mathcal{B}}(\theta), \qquad L_{\mathcal{B}} = \frac{1}{|\mathcal{B}|}\sum_{i \in \mathcal{B}} \ell_i \]

\(\nabla L_{\mathcal{B}}\) 是 \(\nabla L\) 的無偏估計: \(\mathbb{E}_{\mathcal{B}}[\nabla L_{\mathcal{B}}] = \nabla L\) 。 噪聲雖大,卻能幫助跳出淺的局部極小。

動量與 Adam#

  • 動量(Momentum):累積歷史梯度,像滾球一樣加速:
\[ v \leftarrow \beta v + \nabla L, \qquad \theta \leftarrow \theta - \eta\, v \]
  • Adam:對每個參數自適應調整步長,用梯度的一、二階動量估計:
\[ m_t = \beta_1 m_{t-1} + (1-\beta_1) g_t, \qquad s_t = \beta_2 s_{t-1} + (1-\beta_2) g_t^2, \qquad \theta \leftarrow \theta - \eta\, \frac{\hat m_t}{\sqrt{\hat s_t} + \epsilon} \]

簡易範例:一維拋物線#

\(L(\theta) = \theta^2\) , \(\nabla L = 2\theta\) , \(\eta = 0.1\) , \(\theta_0 = 1\) :

\[ \theta_k = (1 - 2\eta)^k \theta_0 = 0.8^k \]
\(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\) ,發散——步子太大越過谷底。

歷史典故#

習題#

  1. 對 \(L(\theta) = (\theta - 3)^2\) 套用梯度下降, \(\eta = 0.25\) ,求 \(\theta_k\) 的封閉式,並求收斂的最大 \(\eta\) 。
  2. 證明:SGD 的批量梯度是全量梯度的無偏估計。
  3. 解釋為什麼動量可以幫助穿越狹長峽谷形的損失面(提示:垂直方向振盪互相抵消,水平方向累積加速)。

補充#

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\) ,故

\[ \mathbb{E}_{\mathcal{B}}[\nabla L_{\mathcal{B}}] = \mathbb{E}\left[\frac{1}{|\mathcal{B}|}\sum_{i \in \mathcal{B}} \nabla\ell_i\right] = \frac{1}{|\mathcal{B}|}\sum_{i=1}^{N} P(i \in \mathcal{B})\,\nabla\ell_i = \frac{1}{N}\sum_{i=1}^{N} \nabla\ell_i = \nabla L \]

期望恰為全量梯度——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\) ,故

\[ \theta_k = 3 + (1-2\eta)^k(\theta_0 - 3) \]

\(\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\) (反而最差——自適應方法對學習率敏感,此例說明優化器沒有免費午餐,超參需配合調)。