此分類用於記錄吳恩達深度學習課程的學習筆記。
課程相關信息鏈接如下:
- 原課程視頻鏈接:[雙語字幕]吳恩達深度學習deeplearning.ai
- github課程資料,含課件與筆記:吳恩達深度學習教學資料
- 課程配套練習(中英)與答案:吳恩達深度學習課後習題與答案
本週為第二課的第二週內容,2.3到2.5和2.9到2.10的內容。
本週為第二課的第二週內容,和題目一樣,本週的重點是優化算法,即如何更好,更高效地更新參數幫助擬合的算法,還是離不開那句話:優化的本質是數學。
因此,在理解上,本週的難道要相對較高一些,公式的出現也會更加頻繁。
當然,我仍會補充一些更基礎的內容來讓理解的過程更絲滑一些。
本篇的內容關於指數加權平均數和學習率衰減。
我同樣在最後增加了總結部分,但這部分內容我更建議以理解為主,因為這是之後的具體算法的基礎,且只是公式較多,理解並不困難。
1. 指數加權平均
對這個概念,我們用一個例子來一步步引入,假定下面這組數據是一週的氣温:
1.1 平均數
我們先從最基本的“平均”開始。
不用再多提,這組數據的簡單平均為:
而對於這種最基本的平均值,我們得到就是這一週氣温的“平均水平”,在這個“平均水平”裏,每一天的温度都是同等重要的。
因此,對於平均數,我們往往用它和數據本身作運算,用數據和平均值的運算來量化“波動”。
而現在,有這樣一個問題:
假如我是一個愛家人的笨蛋打工人,在一週裏,相比工作日,我更希望知道週六日的温度適不適合我帶家人出遊。 我想確認看看上週末的氣温,但是我忘了上週的具體氣温,只對一個平均值有印象。
那在這種情況下,我更希望這個平均值和週六日的氣温更接近,而不是週六日的氣温被工作日的氣温“拉平了”。
應對這種情況的就是下一步:加權平均數。
1.2 加權平均數
繼續上面的例子,我們希望“平均值”更貼近週六、週日的氣温。
這時候,“每一天同等重要”的普通平均就不夠用了,我們需要讓“重要的日子權重大”,不重要的權重小,於是就有了加權平均數:
其中, \(x_i\) 是數據,\(w_i\) 是權重,代表“這個數據點的重要程度”。
我們來看看,仍然是那組氣温:
現在為了讓平均值更反映出週六日的温度,我們把工作日(週一~週五)權重都設為 \(1\),而把週六、週日權重設為 \(3\)。
那麼加權平均值就是:
你會發現它比普通平均 \(13.7\) 更偏向週末的氣温(11℃、15℃)。
總結一下,加權平均數會往“權重大”數據靠近。
可是又有一個問題:上一週的氣温不一定和這一週類似。
一年有四季,氣温會隨時間不斷變化,尤其在換季的時候,可能這一週突然降温,而你上週的平均氣温卻還停留在“秋天的温柔”裏。
在這種情況下,如果我們還繼續對所有天數給固定權重,就會出現一個問題:
一個月前的週末和昨天的週末“權重”一樣大,這是不合理的,因為在小範圍裏,過去越久的氣温對預測明天的氣温參考價值越小(再次強調小範圍)
而現在,如果我想預測本週末的氣温,更合理的做法應該是根據更近的信息去預測。
總結一下,在現在這個受時間影響的氣温預測問題中:
- 時間越久的數據,對我們當前判斷的幫助越小;
- 越近的數據,更應該影響我們對“當前平均水平”的認識。
你可能會説,那就按時間順序,給越往前的數據越小的權重,這個思路是對的,可是實施起來,我們難度要每過一天,就給所有的數據排新的權重嗎?
能解決這個問題的就是這部分的主角:指數加權平均數。
1.3 指數加權平均數(Exponential Moving Average, EMA)
剛才我們説到了一個關鍵需求:
我們希望越新的氣温越影響我們對當前“平均氣温水平”的判斷,越舊的數據影響越小。
如果繼續用加權平均數,每過一天就重新給所有數據分配一次權重,這樣不僅麻煩,還不夠靈活。
於是,指數加權平均數出現了,他可以實現:
讓舊數據的權重自動隨時間“指數衰減”。
即越早的數據影響越弱、越近的數據影響越強,而我們完全不需要手動更新所有權重。
具體來説,我們給出一個參數:
它叫“衰減因子”或 “平滑係數”,代表我們對“歷史印象”的依賴程度,展開來説:
- \(\beta\) 越大 → 越“念舊”,更看重過去積累的平均值
- \(\beta\) 越小 → 越“看重當下”,今天冷一點你馬上覺得“最近都好冷”
而具體實現這個邏輯的公式,也就是指數加權平均值公式就是:
它的含義非常直觀:
我們仍然用這組數據來説明:
我們固定設置 \(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\) 展開,可以看到每一天對今天平均的影響:
可以發現:
- 今天:權重 \((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}}\) 表示今天權重對應普通平均的天數,也可以理解為歷史信息平均貢獻的有效天數。
- \(\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_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\),也略低於真實平均。
為了修正這種“初始偏差”,我們引入偏差修正:
其中:
- 分母 \(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)。
2.1 局部最優的情況
在訓練過程中,參數更新的路徑往往不是一條直線,而是像爬山/下谷一樣崎嶇不平:
有時候,我們可能先到達一個局部最優點(Local Minimum),不是全局最優,但梯度很小,參數更新幾乎停滯。如果學習率保持不變,我們可能永遠停在這個局部最優,無法進一步優化。
要強調一點的是,在高維參數空間裏,局部最優點往往不是局部最小值而是鞍點,大家瞭解即可。
這就像走在山谷裏,如果你步子太小,爬不出小山丘;步子太大,又可能越過真正的大山谷。
解決這個問題的一個策略就是先大步快走(大學習率),再小步精修(小學習率)。
這也是學習率衰減的核心思想:
- 訓練初期:學習率大,快速收斂,覆蓋較大的參數空間;
- 訓練後期:學習率小,精細調整,避免“來回震盪”,更穩定逼近最優解。
2.2 常見的學習率衰減方法
和 EMA 類似,學習率衰減也可以看作隨着訓練步數,歷史信息逐漸被“淡化”,步幅逐漸變小。
常見方法有以下幾種:
(1)固定衰減(Step Decay)
最簡單的方法:每隔固定訓練輪次,將學習率縮小一個比例。
公式:
其中:
- \(\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 很像:每一步訓練後,學習率按指數規律衰減:
- \(\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_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 機制 | 每個腿根據走路經驗自動調節步子大小,更聰明地下山 |