1. Mini-batch梯度下降法
介紹
假設我們的數據量非常多,達到了500萬以上,那么此時如果按照傳統的梯度下降算法,那么訓練模型所花費的時間將非常巨大,所以我們對數據做如下處理:
如圖所示,我們以1000為單位,將數據進行划分,令\(x^{\{1\}}=\{x^{(1)},x^{(2)}……x^{(1000)}\}\), 一般地用\(x^{\{t\}},y^{\{t\}}\)來表示划分后的mini-batch。
注意區分該系列教學視頻的符號標記:
小括號() 表示具體的某一個元素,指一個具體的值,例如\(x^{(i)}\)
中括號[] 表示神經網絡中的某一層,例如\(Z^{[l]}\)
大括號{} 表示將數據細分后的一個集合,例如\(x^{\{1\}}=\{x^{(1)},x^{(2)}……x^{(1000)}\}\)
算法步驟
假設我們有5,000,000個數據,每1000作為一個集合,計入上面所提到的\(x^{\{1\}}=\{x^{(1)},x^{(2)}……x^{(1000)}\},……\)
- 1)所以需要迭代運行5000次神經網絡運算。
for i in range(5000):
-
2)每一次迭代其實與之前筆記中所提到的計算過程一樣,首先是前向傳播,但是每次計算的數量是1000
-
3)計算損失函數,如果有正則化,則記得加上正則項
-
4)反向傳播
注意,mini-batch相比於之前一次性計算所有數據不僅速度快,而且反向傳播需要計算5000次,所以效果也更好。
2. 理解mini-batch梯度下降法
如上面所提到的,我們以1000位單位對數據進行划分,但是這只是為了更方便說明問題才這樣划分的,那么我們在實際操作中應該如何划分呢?
首先考慮兩個極端情況:
-
mini-batch size = m
此時即為Batch gradient descent,\((x^{\{t\}},y^{\{t\}})=(X,Y)\) -
mini-batch size = 1
此時即為Stochastic gradient descent, \((x^{\{t\}},y^{\{t\}})=(x^{(i)},y^{(i)})\)
如圖示,藍色收斂曲線表示mini-batch size=m,比較耗時,但是最后能夠收斂到最小值;而紫色收斂曲線表示mini-batch size=1,雖然速度可能較快,但是收斂曲線十分曲折,並且最終不會收斂到最小點,而是在其附近來回波動。
說了這么多,那么mini-batch size該如何選擇呢?以下是選擇的原則:
- 如果數據量比較小(m<2000),可以使用batch gradient descent。一般來說mini-batch size取2的次方比較好,例如64,128,256,512等,因為這樣與計算機內存設置相似,運算起來會更快一些。
3. 指數加權平均
為了理解后面會提到的各種優化算法,我們需要用到指數加權平均,在統計學中也叫做指數加權移動平均(Exponentially Weighted Moving Averages)。
首先我們假設有一年的溫度數據,如下圖所示
我們現在需要計算出一個溫度趨勢曲線,計算方法如下:
\(V_0=0\)
\(V_1=β*V_0+(1-β)θ_1\)
\(……\)
\(V_t=β*V_{t-1}+(1-β)θ_t\)
上面的\(θ_t\)表示第t天的溫度,β是可調節的參數,\(V_t\)表示\(\frac{1}{1-β}\)天的每日溫度。
- 當\(β=0.9\)時,表示平均了過去十天的溫度,且溫度趨勢曲線如圖中紅線所示
- 當\(β=0.98\)時,表示平均了過去50天的溫度,溫度趨勢曲線如圖中綠線所示。此時綠線相比較紅線要平滑一些,是因為對過去溫度的權重更大,所以當天天氣溫度的影響降低,在溫度變化時,適應得更緩慢一些。
- 當\(β=0.5\)時,溫度趨勢曲線如圖中黃線所示
4. 理解指數加權平均
我們將上面的公式\(V_t=β*V_{t-1}+(1-β)θ_t\)展開可以得到
(假設β=0.9)
可以看到在計算第t天的加權溫度時,也將之前的溫度考慮進來,但是都有一個衰減因子β,並且隨着天數的增加,衰減幅度也不斷增加。(有點類似於卷積計算)
5. 指數加權平均的偏差修正
為什么需要修正呢?我們仔細分析一下就知道了
首先我們假設的是\(β=0.98, V_0=0\),然后由\(V_t=βV_{t-1}+(1-β)θ_t\)可知
\(V_1=0.98V_0+0.02θ_1=0.02θ_1\)
\(V_2=0.98V_1+0.02θ_2=0.0196θ_1+0.02θ_2\)
假設\(θ_1=40℃\),那么\(V_1=0.02*40=0.8℃\),這顯然相差太大,同理對於后面的溫度的計算也只會是變差越來越大。所以我們需要進行偏差修正,具體方法如下:
注意!!!上面公式中的 \(V_{t-1}\)是未修正的值。
為方便說明,令\(β=0.98,θ_1=40℃,θ_2=39℃\),則
當\(t=1,θ_1=40℃\)時,\(V_1=\frac{0.02*40}{1-0.98}=40\),哇哦~有沒有很巧的感覺,再看
當\(t=2,θ_2=39℃\)時,\(V_2=\frac{0.98*V_{t-1}+0.02*θ_2}{1-0.98^2}=\frac{0.98*(0.02*θ_1)+0.02*39}{1-0.98^2}=39.49\)
所以,記住你如果直接用修正后的\(V_{t-1}\)值代入計算就大錯特錯了
6. 動量梯度下降法
首先介紹一下一般的梯度算法收斂情況是這樣的
可以看到,在前進的道路上十分曲折,走了不少彎路,在縱向我們希望走得慢一點,橫向則希望走得快一點,所以才有了動量梯度下降算法。
Momentum算法的第t次迭代:
- 計算出dw,db
- 這個計算式子與上一屆提到的指數加權平均有點類似,即
\(V_{dw}=βV_{dw}+(1-β)dw\)
\(V_{db}=βV_{db}+(1-β)db\) - \(W=W-αV_{dw},b=b-αV_{db}\)
最終得到收斂的效果如下圖的紅色曲線所示。
該算法中涉及到的超參數有兩個,分別是 \(α,β\),其中一般\(β=0.9\)是比較常取的值。
7. RMSprop
該算法全稱叫Root Mean Square Prop(均方根傳播)
這一節和上一節講的都比較概括,不是很深入,所以就直接把算法記錄下來吧。
在第t次迭代:
- 計算該次mini-batch的dw,db
- \(S_{dw}=βS_{dw}+(1-β)dw^2\)
\(S_{db}=βS_{db}+(1-β)db^2\) - \(w:=w-α\frac{dw}{\sqrt{S_{dw}}}\)
\(b:=b-α\frac{db}{\sqrt{S_{db}}}\)
收斂效果(原諒色)
8. Adam優化算法
Adam其實是Momentum和RMSprop兩個算法的結合,具體算法如下:
- 初始化\(V_{dw}=0,V_{db}=0,S_{dw}=0,S_{dw}=0\)
- 在第t次迭代
- 計算出dw,db
- \(V_{dw}=β_1V_{dw}+(1-β_1)dw\),\(V_{db}=β_1V_{db}+(1-β_1)db\)
\(S_{dw}=β_2S_{dw}+(1-β_2)dw^2\),\(S_{db}=β_2S_{db}+(1-β_2)db^2\) - \(V_{dw}^{corrected}=\frac{V_{dw}}{1-β_1^t}\),\(V_{db}^{corrected}=\frac{V_{db}}{1-β_1^t}\)
\(S_{dw}^{corrected}=\frac{S_{dw}}{1-β_2^t}\),\(S_{db}^{corrected}=\frac{S_{db}}{1-β_2^t}\) - \(W=W-α\frac{V_{dw}^{corrected}}{\sqrt{S_{dw}^{corrected}}+ε}\),\(b=b-α\frac{V_{db}^{corrected}}{\sqrt{S_{db}^{corrected}}+ε}\)
該算法中的超參數有\(α,β_1,β_2,ε\),一般來說\(β_1=0.9,β_2=0.999,ε=10^{-8}\)
9. 學習率衰減
之前算法中提到的學習率α都是一個常數,這樣有可能會一個問題,就是剛開始收斂速度剛剛好,可是在后面收斂過程中學習率偏大,導致不能完全收斂,而是在最低點來回波動。所以為了解決這個問題,需要讓學習率能夠隨着迭代次數的增加進行衰減,常見的計算公式有如下幾種:
- Learning rate decay
decay_rate:衰減率
epoch_num: 迭代次數
舉個栗子:
假設\(α_0\)初始化為0.2,decay_rate=1,則α的衰減過程如下:
Epoch | α |
---|---|
1 | 0.1 |
2 | 0.067 |
3 | 0.05 |
…… | …… |
- 其他衰減算法
- 指數衰減:\(α=0.9^{epoch_num}α_0\)
- \(α=\frac{K}{\sqrt{epoch_num}}α_0\)或\(α=\frac{k}{t}α_0\)(這個t表示mini-batch的第t組數據)
- 離散衰減,每次迭代后變為上一次迭代的一半。
10. 局部最優問題
圖左中有很多局部最優點。
圖右用青色標記出來的點稱為鞍點(saddle point),因為和馬鞍相似,所以稱為鞍點。
鞍點相比於局部最優點要更加棘手,因為從橫向上看似乎是最低點,但是縱向上看卻不是最低點,所以收斂過程有點緩慢,原因如下:
橫向收斂只能沿着紅線方向收斂,直到鞍點,而到了鞍點后才能往兩邊收斂,所以收斂的比較緩慢。
但是momentum和Adam等算法因為能夠加速學習,所以收斂速率更快,能夠更快地收斂。