神经网络优化篇:理解mini-batch梯度下降法(Understanding mini-batch gradient descent)
理解mini-batch梯度下降法
使用batch梯度下降法時,每次迭代都需要歷遍整個訓練集,可以預期每次迭代成本都會下降,所以如果成本函數\(J\)是迭代次數的一個函數,它應該會隨著每次迭代而減少,如果\(J\)在某次迭代中增加了,那肯定出了問題,也許的學習率太大。
使用mini-batch梯度下降法,如果作出成本函數在整個過程中的圖,則并不是每次迭代都是下降的,特別是在每次迭代中,要處理的是\(X^{\{t\}}\)和\(Y^{\{ t\}}\),如果要作出成本函數\(J^{\{ t\}}\)的圖,而\(J^{\{t\}}\)只和\(X^{\{ t\}}\),\(Y^{\{t\}}\)有關,也就是每次迭代下都在訓練不同的樣本集或者說訓練不同的mini-batch,如果要作出成本函數\(J\)的圖,很可能會看到這樣的結果,走向朝下,但有更多的噪聲,所以如果作出\(J^{\{t\}}\)的圖,因為在訓練mini-batch梯度下降法時,會經過多代,可能會看到這樣的曲線。沒有每次迭代都下降是不要緊的,但走勢應該向下,噪聲產生的原因在于也許\(X^{\{1\}}\)和\(Y^{\{1\}}\)是比較容易計算的mini-batch,因此成本會低一些。不過也許出于偶然,\(X^{\{2\}}\)和\(Y^{\{2\}}\)是比較難運算的mini-batch,或許需要一些殘缺的樣本,這樣一來,成本會更高一些,所以才會出現這些擺動,因為是在運行mini-batch梯度下降法作出成本函數圖。
需要決定的變量之一是mini-batch的大小,\(m\)就是訓練集的大小,極端情況下,如果mini-batch的大小等于\(m\),其實就是batch梯度下降法,在這種極端情況下,就有了mini-batch \(X^{\{1\}}\)和\(Y^{\{1\}}\),并且該mini-batch等于整個訓練集,所以把mini-batch大小設為\(m\)可以得到batch梯度下降法。
另一個極端情況,假設mini-batch大小為1,就有了新的算法,叫做隨機梯度下降法,每個樣本都是獨立的mini-batch,當看第一個mini-batch,也就是\(X^{\{1\}}\)和\(Y^{\{1\}}\),如果mini-batch大小為1,它就是的第一個訓練樣本,這就是的第一個訓練樣本。接著再看第二個mini-batch,也就是第二個訓練樣本,采取梯度下降步驟,然后是第三個訓練樣本,以此類推,一次只處理一個。
看在兩種極端下成本函數的優化情況,如果這是想要最小化的成本函數的輪廓,最小值在那里,batch梯度下降法從某處開始,相對噪聲低些,幅度也大一些,可以繼續找最小值。
相反,在隨機梯度下降法中,從某一點開始,重新選取一個起始點,每次迭代,只對一個樣本進行梯度下降,大部分時候向著全局最小值靠近,有時候會遠離最小值,因為那個樣本恰好給指的方向不對,因此隨機梯度下降法是有很多噪聲的,平均來看,它最終會靠近最小值,不過有時候也會方向錯誤,因為隨機梯度下降法永遠不會收斂,而是會一直在最小值附近波動,但它并不會在達到最小值并停留在此。
實際上選擇的mini-batch大小在二者之間,大小在1和\(m\)之間,而1太小了,\(m\)太大了,原因在于如果使用batch梯度下降法,mini-batch的大小為\(m\),每個迭代需要處理大量訓練樣本,該算法的主要弊端在于特別是在訓練樣本數量巨大的時候,單次迭代耗時太長。如果訓練樣本不大,batch梯度下降法運行地很好。
相反,如果使用隨機梯度下降法,如果只要處理一個樣本,那這個方法很好,這樣做沒有問題,通過減小學習率,噪聲會被改善或有所減小,但隨機梯度下降法的一大缺點是,會失去所有向量化帶給的加速,因為一次性只處理了一個訓練樣本,這樣效率過于低下,所以實踐中最好選擇不大不小的mini-batch尺寸,實際上學習率達到最快。會發現兩個好處,一方面,得到了大量向量化,上個視頻中用過的例子中,如果mini-batch大小為1000個樣本,就可以對1000個樣本向量化,比一次性處理多個樣本快得多。另一方面,不需要等待整個訓練集被處理完就可以開始進行后續工作,再用一下上個視頻的數字,每次訓練集允許采取5000個梯度下降步驟,所以實際上一些位于中間的mini-batch大小效果最好。
用mini-batch梯度下降法,從這里開始,一次迭代這樣做,兩次,三次,四次,它不會總朝向最小值靠近,但它比隨機梯度下降要更持續地靠近最小值的方向,它也不一定在很小的范圍內收斂或者波動,如果出現這個問題,可以慢慢減少學習率,在下個視頻會講到學習率衰減,也就是如何減小學習率。
如果mini-batch大小既不是1也不是\(m\),應該取中間值,那應該怎么選擇呢?其實是有指導原則的。
首先,如果訓練集較小,直接使用batch梯度下降法,樣本集較小就沒必要使用mini-batch梯度下降法,可以快速處理整個訓練集,所以使用batch梯度下降法也很好,這里的少是說小于2000個樣本,這樣比較適合使用batch梯度下降法。不然,樣本數目較大的話,一般的mini-batch大小為64到512,考慮到電腦內存設置和使用的方式,如果mini-batch大小是2的\(n\)次方,代碼會運行地快一些,64就是2的6次方,以此類推,128是2的7次方,256是2的8次方,512是2的9次方。所以經常把mini-batch大小設成2的次方。在上一個視頻里,的mini-batch大小設為了1000,建議可以試一下1024,也就是2的10次方。也有mini-batch的大小為1024,不過比較少見,64到512的mini-batch比較常見。
最后需要注意的是在的mini-batch中,要確保\(X^{\{ t\}}\)和\(Y^{\{t\}}\)要符合CPU/GPU內存,取決于的應用方向以及訓練集的大小。如果處理的mini-batch和CPU/GPU內存不相符,不管用什么方法處理數據,會注意到算法的表現急轉直下變得慘不忍睹,所以希望對一般人們使用的mini-batch大小有一個直觀了解。事實上mini-batch大小是另一個重要的變量,需要做一個快速嘗試,才能找到能夠最有效地減少成本函數的那個,一般會嘗試幾個不同的值,幾個不同的2次方,然后看能否找到一個讓梯度下降優化算法最高效的大小。希望這些能夠指導如何開始找到這一數值。
學會了如何執行mini-batch梯度下降,令算法運行得更快,特別是在訓練樣本數目較大的情況下。
總結
以上是生活随笔為你收集整理的神经网络优化篇:理解mini-batch梯度下降法(Understanding mini-batch gradient descent)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: STM32CubeMX教程12 DMA
- 下一篇: 如何写好技术文档 - 排版格式和规范(一