吳恩達深度學習——提高算法運行效率

引言

本文是吳恩達深度學習第二課:改善深層網絡的筆記。這次內容包括深度學習的實用技巧、提高算法運行效率、超參數調優。

第二課有以下三個部分,本文是第二部分。

  1. 深度學習的實用指南
  2. 提高算法運行效率
  3. 超參數調優

Mini-batch梯度下降算法

在這裏插入圖片描述
我們知道,向量化能讓我們高效的對mm個樣本進行計算,但如果m=5,000,000m=5,000,000呢。

在對整個訓練數據集進行批量梯度下降法時,每下降一步都需要處理整個訓練集。當樣本總數有500萬,或者5000萬以上時,批量梯度下降法會非常慢。

如果把訓練集分成小一點的部分,每次只根據這一小部分進行梯度下降,這一小部分子集叫做Mini-batch。假設每一子集中只有1000個樣本,這個1000叫做批次大小(batch size)

一般需要在劃分子集之前對整個訓練集進行洗牌操作

在這裏插入圖片描述
這樣就有5000個mini-bacth,對YY也要進行同樣的處理。

在這裏插入圖片描述
Mini-batch tt包含 {X{t},Y{t}}\{X^{\{t\}},Y^{\{t\}}\}

這裏我們用花括號{t}\{t\}來表示不同的mini-batch。

我們來看下它們的維數,XX的維數是(nx,m)(n_x,m),那麼每個mini-bacthX{t}X^{\{t\}}的維數是(nx,1000)(n_x,1000) (因爲這裏剛好能平均分,如果不能均分的話,最後一個小批次可能沒有批次大小那麼多)

同樣Y{t}Y^{\{t\}}的維數是(1,1000)(1,1000)

批量梯度下降法(Batch Gradient descent)就是我們之前將的梯度下降法,就是會一次處理整個數據集,這個名字可能會有點誤解;小批量梯度下降法(Mini-batch Gradient descent)每次處理的是單個小批量的X{t},Y{t}X^{\{t\}},Y^{\{t\}}

下面看下小批量梯度下降法的算法過程:

在這裏插入圖片描述

當我們的數據量比較大是,使用小批量梯度下降法運行的比批量梯度下降發更快,在深度學習中幾乎都會用到,因爲一般深度學習的數據量是很龐大的。

理解小批量梯度下降法

在這裏插入圖片描述
在批量梯度下降法中,每次迭代要遍歷整個訓練集,可以預期每次迭代的成本都會下降。

在這裏插入圖片描述

而小批量梯度下降法中,如果每個小批量都繪製損失函數之的話,那麼就有可能得到上面的圖像。

在這裏插入圖片描述

一個要考慮的因素是批次大小,如果批次大小就是整個數據集大小的話,那麼就是批量梯度下降法,這個算法的缺點是單次迭代耗時太長。

如果批次大小取個極端值11的話,那麼就是隨機梯度下降法(Stochastic Gradient Descent),這個算法會更加快,每個樣本都可以移動一步,但是不一定每次都是梯度下降的方向,但是最終還是能到達最小值附近,雖然可能不會達到最小值,但是其實也不差,如上圖紫線。還有一個缺點是無法利用向量化帶來的加速優勢。

如果批次大小介於上面兩者之間的話,就是小批量梯度下降法,它能達到學習率最快的效果,同時也能利用向量化。也不需要等待整個訓練數據集遍歷完纔去下降一步,只要遍歷完一個小批次就可以移動一步。 如上圖綠線,它也無法保證每次朝梯度下降的方向移動,但是比隨機梯度下降法要更持續地靠近最小值的方向。

那麼如果採用小批量梯度下降法,這個批次大小要如何選擇呢。

如果樣本量很小,比如小於2000,那麼可以直接使用批量梯度下降法;

在這裏插入圖片描述
否則常用的批次大小有64,128,256,512,1024。

實際上這個批次大小也是一個超參數,需要嘗試不同的值,才能找到最有效地減少成本函數的那個。

實際有還有一些優化算法比梯度下降法要快,要理解這些算法,需要用到指數加權平均,我們先來看下指數加權平均。

指數加權平均

指數加權(移動)平均只取最近的N次數據進行局部的平均值計算。下面來看一個例子:

在這裏插入圖片描述
假設這是一個溫度與時間(日)關係的趨勢圖。從每年的1月1日開始到年末。

我們看下如何計算趨勢,即溫度的局部平均值或移動平均值。

在這裏插入圖片描述
每天需要用0.9的加權值乘以之前的值加上0.1乘以當天的溫度。比如上面是第一天的計算式子。

在這裏插入圖片描述
計算第二天的累計值也是一樣,0.9乘以前一天的累計值加上0.1乘以當天的溫度。以此類推:
在這裏插入圖片描述
這樣就得到了每天的指數加權平均值,如果用紅線畫圖的話,就得到下面的圖像:
在這裏插入圖片描述
我們再來看下上面的公式,用β\beta表示上面的0.9。
在這裏插入圖片描述
在計算時,可以把VtV_t看成大概是11β\frac{1}{1-\beta}的每日溫度。

在這裏插入圖片描述
如果β=0.9\beta=0.9就是10天的平均值,我們來看下其他值,假如β=0.98\beta=0.98,那麼110.98=50\frac{1}{1-0.98} = 50,就是50天的平均值。

在這裏插入圖片描述
作圖時就可以得到上面的綠線,可以看到更加的平緩。當β=0.98\beta=0.98相當於給之前的值加了太多權值,而只給當天值增加0.02的權重,所以當β\beta較大時,指數加權平均值適應地更慢一些,比如紅線已經下來了,但是綠線還在上面。

我們還可以試另一個極端的值,比如β=0.5\beta=0.5,相當於只平均了兩天的值。那麼得到的圖像肯定是很抖動的,如下圖黃線:

在這裏插入圖片描述
但是這個曲線能更快的適應溫度的變化。

理解指數加權平均

在這裏插入圖片描述
我們進一步分析來理解如何計算出每日溫度的平均值,當β=0.9\beta=0.9時,
我們自頂向下的來分析這個式子。
在這裏插入圖片描述
v100v_{100}可以改寫成什麼呢

在這裏插入圖片描述
v99v_{99}這個式子代入到v100v_{100}中就得到:

在這裏插入圖片描述
同樣,替換v98v_{98}的式子,可以進一步地寫成:

在這裏插入圖片描述
θ\theta的值寫出來得:
在這裏插入圖片描述
這就是一個加權平均。比如我們分析v100v_{100}的組成,這個值包括100天的溫度加上99天的數據,98天的數據…

在這裏插入圖片描述
畫圖的一個辦法是,我們有日期的溫度,從右到左分別是100天的溫度,99天的溫度,98天的溫度…

然後我們構建一個指數衰減函數

在這裏插入圖片描述

從0.1開始,到0.9乘以0.1,到0.9的平方乘以0.1,
在這裏插入圖片描述
所以就有了上面這個指數衰減函數圖像,然後計算v100v_{100}是通過把兩個函數對應的元素相乘,然後求和

在這裏插入圖片描述
比如100天的溫度乘以0.1 + 99天的溫度乘以0.1×0.90.1\times 0.9

在這裏插入圖片描述
θ\theta前面的這些係數之和加起來會逼近11,稱爲偏差修正。下節會講到。

那到底平均多少天的溫度呢,實際上0.9100.351e0.9^{10} \approx 0.35 \approx \frac{1}{e}

大體上說,如果有1ε1 - \varepsilon,這個例子中ε=0.1\varepsilon = 0.1
如果(1ε)1ε=1e(1-\varepsilon)^{\frac{1}{\varepsilon}} = \frac{1}{e},也就是10天后曲線的高度,下降到原來的三分之一,由於時間越往前推移θ\thetauanzhogn越小,所以相當於說:我們每次只考慮最近N=11βN = \frac{1}{1 - \beta}天的數據來來計算當前時刻的指數加權移動平均,這也是移動平均的來源。

因此當β=0.9\beta=0.9時,我們說在計算一個指數加權平均數,只關注了過去10天的溫度,權重下降到不到當日權重的三分之一。相反如果β=0.98\beta=0.98,那麼0.98需要多少次方纔能達到這麼小的數值,是50次,0.9850=1e0.98^{50}=\frac{1}{e}。可以看成是平均了50天的溫度,因此我們就得到了約等於平均11β\frac{1}{1 - \beta}天的溫度。這裏用ε=1β\varepsilon = 1- \beta

這樣就大概知道能平均多少天的溫度。

在這裏插入圖片描述
如果編碼實現呢,給出上面的式子

在這裏插入圖片描述
先初始化vθ=0v_\theta = 0

然後得到θt\theta_t的值,通過βvθ+(1β)θt\beta v_\theta + (1 - \beta)\theta_t來更新vθv_\theta的值即可。

可以看到這個算法是很高效的。

其實它並不是最好的,也不是最精準的計算平均數的方法,如果要計算移動窗,直接算出過去10天的總和或過去50天的總和,然後除以10或50就好了,這樣可以得到更好的估測值,但缺點是保留了所有最近(10/50天)的值,佔用了更多內存。

指數加權平均的偏差修正

在這裏插入圖片描述
在上個視頻中,紅色曲線對應β\beta的值爲0.9,綠色曲線對應的β\beta值爲0.98.

但實際上,在β=0.98\beta=0.98時,我們得到的是紫色曲線。
在這裏插入圖片描述
它的起點比真實的要低很多,不能很好的估計起始位置的溫度,此問題稱爲:冷啓動問題,這是由於v0=0v_0=0造成的。

在這裏插入圖片描述
比如來看下v1v_1,我們先寫出v1v_1的公式,根據公式v1=0.02θ1v_1 = 0.02 \theta_1,如果第一天的溫度θ1\theta_1是40華氏度,那麼得到溫度就是8度,因此得到的值要小得多。

在這裏插入圖片描述
v2v_2也是一樣,也會小於實際第2天的溫度,有個方法可以修改這一估測,叫修正偏差。

就是把所有時刻的vtv_t除以1βt1 - \beta^t
比如當t=2t=2時,1β21 - \beta^2 = 0.0396
在這裏插入圖片描述
那麼v21β2\frac{v_2}{1 - \beta^2}就等於
在這裏插入圖片描述
你會發現隨着tt的增加,βt\beta^t越接近於00,因此當tt很大時,修正偏差幾乎沒起作用。

從上面的圖像也可以看出,當tt很大時,紫線和綠線重合了,但是在開始階段,偏差修正能更好的預測溫度。

動量梯度下降法

動量梯度下降法(Momentum)運行速度幾乎總是比標準的梯度下降法要快。
它的基本想法就是計算梯度的指數加權平均數,然後更新權重。

假設你要優化一個函數形狀如圖的成本函數:
在這裏插入圖片描述
紅點是最小值位置,

在這裏插入圖片描述
如果用標準的梯度下降法可能會得到上面這種產生上下波動的圖像,這種上下波動會減慢梯度下降法的速度,同時無法使用更大的學習率,不然會偏移函數的範圍,像紫線一樣:

在這裏插入圖片描述
因此只能選擇一個較小的學習率,從而導致速度變慢。

在縱軸上我們希望學習慢一點,因爲從縱軸來看,高度不高;而橫軸上我們希望學習快一點,因爲比較狹長。

此時就可以使用動量梯度下降法。

動量梯度下降法基於批量梯度下降法或小批量梯度下降法得到的dW,dbdW,db計算指數加權平均數,具體的是:

在這裏插入圖片描述
就像我們上小節計算溫度的式子一樣,這樣就可以減緩某個方向上梯度下降的速度。
比如上面的例子中,在縱軸方向上下襬動,在平均過程中,微分的正負數相互抵消,所以平均值接近於零。

但在橫軸方向,所有的微分都指向橫軸方向,因此橫軸方向的平均值仍然較大。

在這裏插入圖片描述
所以最終動量梯度下降法可能走的是上面這條紅色的更加快捷的路徑。

在這裏插入圖片描述
一般β\beta會稍小於11,動量就是物理學裏面的慣性,相當於有一個加速度,加速度就是上面後面那個式子。

在這裏插入圖片描述
初始值vdW=0,vdb=0v_{dW} = 0,v_{db} = 0

上面就是動量梯度下降法的實現,有兩個超參數:學習率α\alpha和控制指數加權平均數的β\beta
常用的β=0.9\beta=0.9,就是平均了前十次迭代的速度。

關於偏差修正,實際上一般不會對動量梯度下降法進行偏差修正。因爲只要十次迭代後就不再是一個具有偏差的預測。

RMSprop

還有一種叫RMSprop(root mean square prop)的算法,它也可以加速梯度下降。

在這裏插入圖片描述
我們還是以上小節的例子說明,這裏假設縱軸是參數bb,橫軸是參數ww。我們想要減小縱軸方向上的速度,加快橫軸方向上的速度。

RMSprop算法可以實現這一點,來看下它的實現細節:

在這裏插入圖片描述
上面的dW2dW^2代碼中就是dW ** 2,所以這種方法也可以看成是基於指數加權平均的。

在橫軸方向WW,我們希望學習速度快,而在縱軸方向bb,我們希望學習慢。

所以我們希望SdWS_{dW}是一個較小的數,而SdbS_{db}是一個較大的數。

在這裏插入圖片描述
我們來看微分的話(比如看下面這條線的微分),垂直方向的微分遠大於水平方向的微分。
在這裏插入圖片描述
所以bb方向上的導數dbdb非常大,而dWdW較小。

也可以這麼理解,如果某個方向上梯度震盪很大,應該減小其步長;而震盪大,則這個方向的SS也較大,更新參數時除完S\sqrt{S}後,可以看成學習率(或梯度)變小了,速度就慢了;反之,如果某個方向上梯度震盪很小,應該增大其步長;而震盪小,則這個方向的SS也較小,除完之後就大了。
在這裏插入圖片描述
RMSprop的路徑可能是上圖綠線這樣,還有個好處是,可以使用較大的學習率。

值得說明的一點是,這裏用了wwbb兩個參數只會爲了簡化,實際上會有很多個參數,dW,dbdW,db是一個高維的參數向量。

這就是RMSprop(root mean square,均方根),因爲會將微分進行平方(均方根裏的方),然後使用平方根(均方根裏的根)。

我們再Momentum中採用超參數β\beta,爲了避免混淆,我們現在不用β\beta,而用超參數β2\beta_2,同時爲了確保不會除零,加上一個很小的值ε\varepsilon,通常取ε=108\varepsilon = 10^{-8}

在這裏插入圖片描述

Adam優化算法

Adam算法基本就是將Momentum和RMSprop結合在一起。

在這裏插入圖片描述
這裏面有多超參數,β\beta參數都有經驗值,α\alpha需要調。

在這裏插入圖片描述
有了Adam算法我們可以更加快速的訓練神經網絡。

學習率衰減

加快學習算法的一個辦法就是隨時間慢慢減少學習率,通常稱爲學習率衰減(learning reate decay)。

下面以一個例子來說明爲什麼要梯度衰減。
在這裏插入圖片描述
假設我們用mini-batch 梯度下降法,將一個批次大小設爲128,在迭代過程中可能會有噪音,它們會向最小值的方向移動,但是不會精確地收斂(可能不會達到最小值)。

因爲學習率是固定的,而不同的小批次中有噪音,但是在訓練的初期學習率可以較大,這樣能快速的學習,但到了後期,尤其是上圖最裏面那個等高線裏面,學習率應該變小,使得步伐也變小。所以最後可以在更接近最小值附近擺動,如綠線所示:

在這裏插入圖片描述

每次學習完整個訓練集叫一次epoch。學習率應該隨着epoch的增多而減少。
在這裏插入圖片描述
這裏的衰減率是另一個超參數,當初始α0=0.2\alpha_0 = 0.2,衰減率爲1時。學習率隨着迭代次數的增加是下面這樣的:

在這裏插入圖片描述

除了這個學習率衰減的方法,還有其他的方法。

在這裏插入圖片描述

局部最優的問題

在這裏插入圖片描述
以這個圖爲例,在這個損失函數圖像中,分佈着很多局部最優點,而只有一個全局最優,梯度下降法可能會困在一個局部最優中。

而人們的直接往往會被這些低維圖像所誤導,如果你在訓練一個神經網絡,代價函數中大部分梯度爲零的點實際上並不是想上面這樣的局部最優,而是鞍點(像馬鞍一點最低的那個點)

在這裏插入圖片描述
對於一個高維空間的函數,如果梯度爲零,則在每個方向上可能是凸函數,或者是凹函數。

假設在一個20000維的空間中,如果一個點要稱爲局部最優,則需要在所有的2萬個方向上都像下面這樣(凸函數圖像或凹函數圖像這樣):
在這裏插入圖片描述
因此這個概率非常低,更可能的是遇到下面這種鞍點:
在這裏插入圖片描述
如果局部最優點不是問題,那麼問題是什麼呢,真正的問題是停滯區(plateaus,指的是導數長時間接近於零的一段區域)。
在這裏插入圖片描述
比如說慢慢接近於停滯區的紅點,然後因爲左右側的隨機擾動,算法最終能離開這個停滯區。

在這裏插入圖片描述

  • 所以實際上如果參數很多的話,不太可能會陷入局部最優點。
  • 停滯區會讓學習過程變得相當慢,這也是上面介紹的那些算法可以改善學習算法的地方。

比如Adam算法可以加快沿停滯區向下移動的速度,並且加快離開停滯區的速度。

參考

  1. 吳恩達深度學習 專項課程
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章