文章目錄
聲明
本篇文章參考念師
本文中,將瞭解一些機器學習中的優化算法基本理論。
主要包括:
- Mini-Bacth梯度下降法
- 指數加權平均法
- 動量梯度下降法
- RMSProp梯度下降法
- Adam優化算法
- 學習速率衰減
- 局部最優問題
Mini-Bacth梯度下降法
原理:爲了提高海量數據的訓練速度,將海量數據分組計算並迭代,每個小組就是一個mini-batch。
將每次遍歷樣本(epoch)的基本流程實現過程表示如下:講使用表示第t個mini-batch輸入樣本。
for t = 1,...,5000{
針對x{t}進行前向傳播計算:
Z = WX{t} + b
A = g(Z)
計算當前批次的代價函數
反向傳播計算出dW和db
更新W和b
}
整個訓練過程中,可能需要經過多次遍歷樣本(多個epoch)才能達到穩定。
對比batch梯度下降、隨機梯度下降、minibatch梯度下降
使用batch梯度下降法時,每次迭代的過程中,代價函數總是單調下降的:
而當我們是minibatch梯度下降時,由於每次迭代過程中僅僅是針對一小部分數據進行迭代,所以不能保證每次迭代過程中代價函數都是下降的,但其整體趨勢是不斷下降的:
那麼,在minibatch梯度下降中,需要選擇一個超參數batch-size的值。分兩種情況討論:
- 當batch-size=樣本數量m時:該方法實際爲batch梯度下降法。此時,沒個batch爲全量的數據集。
- 當batch-size=1時:該方法實際爲隨即梯度下降法。此時,沒個batch爲一個樣本。
其中,minibatch梯度下降法、隨即梯度下降法、batch梯度下降法三種方式的代價函數逼近圖如下所示:
- batch梯度下降法:未發生震動,穩定逼近最優值,需要的迭代次數最少,但耗時最多。
- 隨即梯度下降法:波動程度最大,需要的迭代次數最多。雖然計算速度快,但是忽略了利用向量化帶來的速度提升。
- minibatch梯度下降法:位於兩者之間。
batch-size的選擇:
- 當訓練樣本集不大時(小於2000),可以直接使用batch梯度下降法。
- 其他情況下batch-size通常可以選擇64、128、256、512。(主要考慮計算機內存、顯存的影響)。
指數加權平均法
通常設置=0.9。
上圖顯示了當處於不同值時的預測結果。其中,紅線表示了=0.9時的結果,綠線表示了=0.98時的結果,黃線表示了-0.5時的結果。可以發現隨着值越大,曲線越平緩,值越小曲線越陡峭。
接下來了解加權平均的本質內容:
首先從如下公式着手:
假設=0.9時,那麼有:
此時,將其展開可以得到:
這就是加權平均的含義,對之前的數據添加相關的權重。其僞代碼如下:
v = 0
for theta in theta_list:
v = beta * v + (1 - beta) * theta
從代碼中可以看出,只需要存儲一個變量v的值即可,而不需要把所有過程中的v全部存儲下來。
偏差修正
爲了使計算的平均值更加有效(初始值不應該從0開始),將學習偏差修正的方法。在使用如下公式時:
當=0.98時,應該是從接近0開始的。然而,我們之前的曲線起點並不是零。那是我們進行了偏差修正後的結果,真實曲線應該如下圖中的紫線所示:
從圖中可以看到紫色的曲線起點值很小,這與真實的結果不太符合。接下來,講解一下偏差修正的實現方式:
下面,用=0.98,t=2時進行舉例:
動量梯度下降法
基於指數加權平均法。通常下,我們得到的在訓練過程中優化的代價函數圖如下:
從圖中,可以發現在波動過程中存在大量的上下波動影響了尋優的速度。因此,我們希望在縱軸上減少迭代過程中的波動程度,在橫軸上加快學習速率。這就可以使用加權平均法,減少上下波動。具體實現過程基本如下:
for iter in iterations:
計算每次迭代過程中的dW,db
利用加權平均計算V_dW:beta * V_dw + (1-beta)dW
利用加權平均計算V_db:beta * V_db + (1-beta)db
更新W和b:W=W-alpha*V_dW;b=b-alpha*V_db
在實踐中,=0.9通常是一個比較有效的值。
RMSProp梯度下降法
基於指數加權平均法。相比動量梯度下降法而言,RMSProp梯度下降法將dW和db除以變化的波動速度,可以有效的降低無效波動的程度。具體實現代碼如下:
for iter in iterations:
計算每次迭代過程中的dW,db
利用加權平均計算S_dW:beta * S_dw + (1-beta)dW^2
利用加權平均計算S_db:beta * S_db + (1-beta)db^2
更新W和b:W=W-alpha*(dW/(s_dW)^0.5);b=b-alpha*(db/(s_db)^0.5)
Adam優化算法
其結合了動量梯度下降和RMSProp梯度下降法,是目前應用最廣的優化算法之一。具體實現如下:
for iter in iterations:
計算每次迭代過程中的dW,db
利用加權平均計算V_dW:beta1 * V_dw + (1-beta1)dW;
利用加權平均計算V_db: beta1 * V_db + (1-beta1)db;
利用加權平均計算S_dW:beta2 * S_dw + (1-beta2)dW ^ 2;
利用加權平均計算S_db: beta2 * S_db + (1-beta2)db ^ 2;
# 偏差修正
V_dW_correct = V_dW/(1-beta1^itet)
V_db_correct = V_db/(1-beta1^itet)
S_dW_correct = S_dW/(1-beta2^itet)
S_db_correct = S_db/(1-beta2^itet)
# 更新W和b
W=W-alpha*(V_dW_correct/(S_dW_corrct)^0.5+epsilon);b=b-alpha*(V_db_correct/(S_db_corrct)^0.5+epsilon)
其中,涉及的超參數如下:
- alpha:需要調試
- beta1:通常設置爲0.9
- beta2:通常設置爲0.999
- epsilon:通常設置爲,爲了防止分母出現0的情況。
學習速率衰減
爲什麼學習速率衰減有助於加快學習過程呢?
在圖中,藍色的線表示使用固定學習速率得到的結果,可以發現當它在最優點附近值,由於學習速率較大,呈現出較大的波動。因此,在早期,保持較大的學校速率加速向最優值逼近;而當達到最優值附近時,則學習速率應該不斷下降,從而導致較小的波動程度。
常用的學習速率衰減的方法如下:
其中,epoch_num表示第一輪數據集遍歷。
當我們假設=0.2,decay_rate=1時:
除此之外,還有一些其他常用的學校速率衰減方法,例如:
此外,在進行長時間訓練時,還可以手動進行學校速率衰減。
局部最優問題
局部最優的概念和在深度學習中局部最優的影響。
上圖中,存在很多局部最優點,如果使用該模型應用梯度下降法時,很容易陷入局部最優中。這種印象造成了我們認爲局部最優對於我們的優化過程有着很大的影響。然而在深度學習中,由於參數的維度很大,局部最優其實對本身的尋優過程影響不大。因爲在實際應用中,我們所達到的梯度爲0的點通常並不是最優點,而是鞍點,如下所示。
而對於鞍點而言,其並未達到局部最優,梯度下降法仍然繼續進行尋找迭代過程。