動態

詳情 返回 返回

吳恩達深度學習課程二: 改善深層神經網絡 第二週:優化算法(二)指數加權平均和學習率衰減 - 動態 詳情

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

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

本週為第二課的第二週內容,2.3到2.5和2.9到2.10的內容。


本週為第二課的第二週內容,和題目一樣,本週的重點是優化算法,即如何更好,更高效地更新參數幫助擬合的算法,還是離不開那句話:優化的本質是數學
因此,在理解上,本週的難道要相對較高一些,公式的出現也會更加頻繁。
當然,我仍會補充一些更基礎的內容來讓理解的過程更絲滑一些。
本篇的內容關於指數加權平均數和學習率衰減。
我同樣在最後增加了總結部分,但這部分內容我更建議以理解為主,因為這是之後的具體算法的基礎,且只是公式較多,理解並不困難。

1. 指數加權平均

對這個概念,我們用一個例子來一步步引入,假定下面這組數據是一週的氣温:

\[[10, 16, 12, 14, 18, 11, 15] (從週一到週日) \]

1.1 平均數

我們先從最基本的“平均”開始。
不用再多提,這組數據的簡單平均為:

\[\bar{x}=\frac{10+16+12+14+18+11+15}{7}=13.7 \]

而對於這種最基本的平均值,我們得到就是這一週氣温的“平均水平”,在這個“平均水平”裏,每一天的温度都是同等重要的。
因此,對於平均數,我們往往用它和數據本身作運算,用數據和平均值的運算來量化“波動”。

而現在,有這樣一個問題:
假如我是一個愛家人的笨蛋打工人,在一週裏,相比工作日,我更希望知道週六日的温度適不適合我帶家人出遊。 我想確認看看上週末的氣温,但是我忘了上週的具體氣温,只對一個平均值有印象。
那在這種情況下,我更希望這個平均值和週六日的氣温更接近,而不是週六日的氣温被工作日的氣温“拉平了”。
應對這種情況的就是下一步:加權平均數。

1.2 加權平均數

繼續上面的例子,我們希望“平均值”更貼近週六、週日的氣温。
這時候,“每一天同等重要”的普通平均就不夠用了,我們需要讓“重要的日子權重大”,不重要的權重小,於是就有了加權平均數:

\[\bar{x}_w=\frac{\sum_{i=1}^n w_i x_i}{\sum_{i=1}^n w_i} \]

其中, \(x_i\) 是數據,\(w_i\) 是權重,代表“這個數據點的重要程度”。

我們來看看,仍然是那組氣温:

\[[10, 16, 12, 14, 18, 11, 15] \quad (\text{週一到週日}) \]

現在為了讓平均值更反映出週六日的温度,我們把工作日(週一~週五)權重都設為 \(1\),而把週六、週日權重設為 \(3\)
那麼加權平均值就是:

\[\bar{x}_w=\frac{10+16+12+14+18 + 3\cdot11 + 3\cdot15}{1+1+1+1+1+3+3}\approx 13.45 \]

你會發現它比普通平均 \(13.7\) 更偏向週末的氣温(11℃、15℃)。
總結一下,加權平均數會往“權重大”數據靠近。

可是又有一個問題:上一週的氣温不一定和這一週類似
一年有四季,氣温會隨時間不斷變化,尤其在換季的時候,可能這一週突然降温,而你上週的平均氣温卻還停留在“秋天的温柔”裏。
在這種情況下,如果我們還繼續對所有天數給固定權重,就會出現一個問題:
一個月前的週末和昨天的週末“權重”一樣大,這是不合理的,因為在小範圍裏,過去越久的氣温對預測明天的氣温參考價值越小(再次強調小範圍)

而現在,如果我想預測本週末的氣温,更合理的做法應該是根據更近的信息去預測
總結一下,在現在這個受時間影響的氣温預測問題中:

  1. 時間越久的數據,對我們當前判斷的幫助越小;
  2. 越近的數據,更應該影響我們對“當前平均水平”的認識

你可能會説,那就按時間順序,給越往前的數據越小的權重,這個思路是對的,可是實施起來,我們難度要每過一天,就給所有的數據排新的權重嗎?
能解決這個問題的就是這部分的主角:指數加權平均數。

1.3 指數加權平均數(Exponential Moving Average, EMA)

剛才我們説到了一個關鍵需求:
我們希望越新的氣温越影響我們對當前“平均氣温水平”的判斷,越舊的數據影響越小。
如果繼續用加權平均數,每過一天就重新給所有數據分配一次權重,這樣不僅麻煩,還不夠靈活。

於是,指數加權平均數出現了,他可以實現:
讓舊數據的權重自動隨時間“指數衰減”
即越早的數據影響越弱、越近的數據影響越強,而我們完全不需要手動更新所有權重。

具體來説,我們給出一個參數:

\[0 < \beta < 1 \]

它叫“衰減因子”或 “平滑係數”,代表我們對“歷史印象”的依賴程度,展開來説:

  • \(\beta\) 越大 → 越“念舊”,更看重過去積累的平均值
  • \(\beta\) 越小 → 越“看重當下”,今天冷一點你馬上覺得“最近都好冷”

而具體實現這個邏輯的公式,也就是指數加權平均值公式就是:

\[v_t = \beta v_{t-1} + (1-\beta)x_t \]

它的含義非常直觀:

\[今天我認為的平均氣温水平= 一部分保留昨天的印象 + 一部分採納今天的真實氣温。 \]

我們仍然用這組數據來説明:

\[[10, 16, 12, 14, 18, 11, 15] \quad (\text{週一到週日}) \]

我們固定設置 \(v_0 = 0\) 開始,並使用一個比較温和的參數: \(\beta = 0.3\)

  • 週一(10℃) :\(v_1 = 0.3 \cdot 0 + 0.7 \cdot 10 = 7\)
  • 週二(16℃) :\(v_2 = 0.3 \cdot 7 + 0.7 \cdot 16 = 13.3\)
  • 週三(12℃) :\(v_3 = 0.3 \cdot 13.3 + 0.7 \cdot 12 \approx 12.39\)

依次類推,\(v_t\) 表示到第 \(t\) 天為止,根據指數加權平均計算出的“當前平均值”
展開兩個小問題:

(1) 指數加權平均的“權重到底是怎麼變小的?”

把今天(第 \(t\) 天)的平均 \(v_t\) 展開,可以看到每一天對今天平均的影響:

\[v_t = (1-\beta)x_t + \beta(1-\beta)x_{t-1} + \beta^2(1-\beta)x_{t-2} + \beta^3(1-\beta)x_{t-3} + \cdots \]

可以發現:

  • 今天:權重 \((1-\beta)\)
  • 昨天:權重 \(\beta(1-\beta)\)
  • 前天:權重 \(\beta^2(1-\beta)\)
    很明顯,隨着時間往回走,權重呈指數式衰減。
    這就是“指數平均”,在一層層迭代中,讓越遠的數據權重越小。

(2) 衰減因子的物理含義

我們展開一下\(\beta=0.3\) 時的權重衰減示例如下:

天數 權重 累計權重比
今天 0.70 70%
昨天 0.21 91%
前天 0.063 91.6%
大前天 0.019 91.8%
四天前 0.006 91.86%

可以看到,當 \(\beta\) 較大時,歷史數據仍然有顯著權重,指數平均“記憶長”;當 \(\beta\) 較小時,歷史數據迅速衰減,指數平均更重視近期數據。

我們可以用等效天數量化 \(\beta\) 的影響:

\[n_{\text{eff}} = \frac{1}{1-\beta} \]

\(n_{\text{eff}}\) 表示今天權重對應普通平均的天數,也可以理解為歷史信息平均貢獻的有效天數

  • \(\beta=0.3\)\(n_{\text{eff}} = \frac{1}{0.7} \approx 1.43\) 天 → 平均更重視今天
  • \(\beta=0.7\)\(n_{\text{eff}} = \frac{1}{0.3} \approx 3.33\) 天 → 平均包含更多歷史信息
  • \(\beta=0.9\)\(n_{\text{eff}} = \frac{1}{0.1} = 10\) 天 → 歷史數據記憶很長

這樣就可以根據需求確定一個較合理的衰減因子。

1.4 指數加權平均的偏差修正(Bias Correction)

剛才我們用公式:

\[v_t = \beta v_{t-1} + (1-\beta)x_t \]

計算得到指數加權平均值。
但是,如果我們從 \(v_0 = 0\) 開始,會發現前幾天的 \(v_t\) 往往偏低。這是為什麼呢?

原因很簡單:初始值 \(v_0 = 0\) 並沒有反映真實平均值,因為前幾天的 EMA 都會被這個“零值”拉低,從而產生偏差
舉個例子:假設我們繼續用前面的氣温數據,\(\beta=0.3\)

天數 實際氣温 \(x_t\) EMA \(v_t\)
週一 10 7.0
週二 16 13.3
週三 12 12.39

你會發現,週一的 EMA \(v_1 = 7\),比實際温度 \(10\) 低得多;週二 \(v_2=13.3\),也略低於真實平均。
為了修正這種“初始偏差”,我們引入偏差修正

\[\hat{v}_t = \frac{v_t}{1 - \beta^t} \]

其中:

  • 分母 \(1 - \beta^t\) 的作用是把初始零值對 EMA 的拉低影響消掉;
  • 隨着時間 \(t\) 增大,\(\beta^t \to 0\),偏差修正的影響自然消失。

繼續剛才的例子,我們看看修正後的 EMA:

  • 週一:\(\hat{v}_1 = \frac{7}{1-0.3^1} = \frac{7}{0.7} = 10\)
  • 週二:\(\hat{v}_2 = \frac{13.3}{1-0.3^2} = \frac{13.3}{0.91} \approx 14.62\)
  • 週三:\(\hat{v}_3 = \frac{12.39}{1-0.3^3} = \frac{12.39}{0.973} \approx 12.74\)
    可以看到:經過偏差修正後,EMA 在前幾天就能更真實地反映數據水平,同時,隨着 \(t\) 增大,\(\hat{v}_t \approx v_t\),偏差自動消失。

總結一下:EMA 的初始值會導致前幾天平均被“拉低”,用 \(\hat{v}_t = v_t / (1-\beta^t)\) 可以快速修正偏差,同時也不影響後續數據。

2. 學習率衰減

我們在此之前一直用梯度下降法來不斷調整參數,讓損失函數越來越小。
在這個過程中,學習率(learning rate)控制每次參數更新的步幅,我們稱其為一個超參數,需要我們手動地設置,但怎麼設置,好像並沒有一個公認的科學標準。
因為更好的方法是在訓練中動態調整,而不是像我們之前一樣使用一個固定值。

我們早説過:學習率設置得太大或者太小,都會影響訓練效果:

  • 太大:容易“蹦得太遠”,跳過最優點,訓練可能不穩定 (在谷底兩側來回跳下不去)
  • 太小:每次更新太慢,訓練收斂速度非常慢 (十年下不來山)
    所以,為了兼顧速度和穩定性,更好的方法是不是動態地調整步幅?即快點下山,然後細細地找谷底。
    這個調整的學習率的過程,就叫學習率衰減(Learning Rate Decay)。
    Pasted image 20251108213028

2.1 局部最優的情況

在訓練過程中,參數更新的路徑往往不是一條直線,而是像爬山/下谷一樣崎嶇不平:
有時候,我們可能先到達一個局部最優點(Local Minimum),不是全局最優,但梯度很小,參數更新幾乎停滯。如果學習率保持不變,我們可能永遠停在這個局部最優,無法進一步優化。
要強調一點的是,在高維參數空間裏,局部最優點往往不是局部最小值而是鞍點,大家瞭解即可。
Pasted image 20251108213416

這就像走在山谷裏,如果你步子太小,爬不出小山丘;步子太大,又可能越過真正的大山谷。
解決這個問題的一個策略就是先大步快走(大學習率),再小步精修(小學習率)
這也是學習率衰減的核心思想:

  • 訓練初期:學習率大,快速收斂,覆蓋較大的參數空間;
  • 訓練後期:學習率小,精細調整,避免“來回震盪”,更穩定逼近最優解。

2.2 常見的學習率衰減方法

和 EMA 類似,學習率衰減也可以看作隨着訓練步數,歷史信息逐漸被“淡化”,步幅逐漸變小
常見方法有以下幾種:

(1)固定衰減(Step Decay)

最簡單的方法:每隔固定訓練輪次,將學習率縮小一個比例
公式:

\[\eta_t = \eta_0 \cdot \gamma^{\lfloor t / T \rfloor} \]

其中:

  • \(\eta_0\):初始學習率
  • \(\gamma\):衰減比例(例如 0.5)
  • \(T\):步數間隔(輪次epoch)
    舉個例子
    假設初始學習率 \(\eta_0 = 0.1\),每訓練 10 個 epoch 衰減一次,衰減比例 \(\gamma = 0.5\)
epoch 學習率 \(\eta_t\)
1~10 0.1
11~20 0.05
21~30 0.025

可以看到,學習率像階梯一樣逐步降低,訓練初期大步,後期小步。

(2)指數衰減(Exponential Decay)

和 EMA 很像:每一步訓練後,學習率按指數規律衰減

\[\eta_t = \eta_0 \cdot e^{-\lambda t} \]

  • \(\lambda\):衰減速率
  • \(t\):當前訓練步數(輪次epoch)
    特點:學習率連續衰減,前期下降快,後期下降慢,類似 EMA 對歷史數據權重的衰減。
    舉個例子
    初始學習率 \(\eta_0 = 0.1\) ,衰減速率 \(\lambda = 0.1\)
epoch \(t\) 學習率 \(\eta_t = 0.1 \cdot e^{-0.1 t}\)
1 0.1 × e^{-0.1 × 1} ≈ 0.0905
2 0.1 × e^{-0.1 × 2} ≈ 0.0819
3 0.1 × e^{-0.1 × 3} ≈ 0.0741
4 0.1 × e^{-0.1 × 4} ≈ 0.0670
5 0.1 × e^{-0.1 × 5} ≈ 0.0607

(3)1/t 衰減(Inverse Time Decay)

另一種方式是按時間倒數衰減

\[\eta_t = \frac{\eta_0}{1 + \lambda t} \]

  • 初期衰減較快
  • 後期衰減逐漸減緩
  • 適合訓練很長時間的模型
    舉個例子
    假設初始學習率 \(\eta_0 = 0.1\),衰減速率 \(\lambda = 0.05\),計算前幾個 epoch 的學習率:
epoch \(t\) 學習率 \(\eta_t = \frac{0.1}{1 + 0.05 t}\)
1 0.1 / (1 + 0.05 × 1) = 0.0952
2 0.1 / (1 + 0.05 × 2) = 0.0909
3 0.1 / (1 + 0.05 × 3) = 0.08696
4 0.1 / (1 + 0.05 × 4) = 0.0833
5 0.1 / (1 + 0.05 × 5) = 0.08

(4)自適應學習率方法

有些優化器內置類似 EMA 的機制,自動根據歷史梯度調整每個參數的有效學習率:

  • 相當於每個參數都有自己的“指數加權平均歷史”,
  • 訓練初期快速更新,後期逐漸收斂,類似 EMA 的偏差修正和衰減效果結合起來。
    這類優化算法就是實踐應用中使用的,也是之後要介紹的主要內容。

3."人話版"總結

概念 基本原理 比喻
平均數(Mean) 對一組數據求算術平均,每個數據權重相同 所有數據都是等重要的朋友,每個人的意見一樣
加權平均數(Weighted Mean) 給不同數據分配不同權重,權重大 → 更影響平均值 更重要的人意見更大,比如週末氣温對出遊更重要
指數加權平均數(Exponential Moving Average, EMA) 歷史數據權重按指數衰減,越新的數據權重越大;公式 \(v_t = \beta v_{t-1} + (1-\beta)x_t\) 記憶力隨時間衰減:最近的印象更鮮明,舊印象慢慢淡忘
EMA 偏差修正(Bias Correction) 解決初始值導致前期平均被拉低問題:\(\hat{v}_t = v_t / (1-\beta^t)\) 剛開始看信息時容易低估真實水平,修正後更準確
學習率(Learning Rate) 控制梯度下降每次更新參數的步幅 下山步子大小:步子大 → 快但可能蹦過谷底,步子小 → 精確但慢
學習率衰減(Learning Rate Decay) 隨訓練進程逐漸減小學習率,提高收斂穩定性 先大步快下山,再小步精細找谷底
固定衰減(Step Decay) 每隔固定步數按比例縮小學習率 爬山每隔一段路就換小步走
指數衰減(Exponential Decay) 學習率隨訓練步數按指數規律連續衰減 步子逐漸變小,前期快,後期慢
1/t 衰減(Inverse Time Decay) 學習率按時間倒數衰減 前期快跑,後期慢慢走
自適應學習率方法(Adaptive LR) 每個參數根據歷史梯度調整步幅,類似 EMA 機制 每個腿根據走路經驗自動調節步子大小,更聰明地下山

Add a new 評論

Some HTML is okay.