1. 程式人生 > >深度學習中優化方法總結

深度學習中優化方法總結

最近在看Google的Deep Learning一書,看到優化方法那一部分,正巧之前用tensorflow也是對那些優化方法一知半解的,所以看完後就整理了下放上來,主要是一階的梯度法,包括SGD, Momentum, Nesterov Momentum, AdaGrad, RMSProp, Adam。 其中SGD,Momentum,Nesterov Momentum是手動指定學習速率的,而後面的AdaGrad, RMSProp, Adam,就能夠自動調節學習速率. 
二階的方法目前我水平太差,看不懂….就不放上來了。

BGD

即batch gradient descent. 在訓練中,每一步迭代都使用訓練集的所有內容. 也就是說,利用現有引數對訓練集中的每一個輸入

生成一個估計輸出yi^,然後跟實際輸出yi比較,統計所有誤差,求平均以後得到平均誤差,以此來作為更新引數的依據.

具體實現: 
需要:學習速率 ϵ, 初始引數 θ 
每步迭代過程: 
1. 提取訓練集中的所有內容{x1,,xn},以及相關的輸出yi 
2. 計算梯度和誤差並更新引數: 

g^+1nθiL(f(xi;θ),yi)θθϵg^

優點: 
由於每一步都利用了訓練集中的所有資料,因此當損失函式達到最小值以後,能夠保證此時計算出的梯度為0,換句話說,就是能夠收斂.因此,使用BGD時不需要逐漸減小學習速率ϵk

缺點: 
由於每一步都要使用所有資料,因此隨著資料集的增大,執行速度會越來越慢.

SGD

SGD全名 stochastic gradient descent, 即隨機梯度下降。不過這裡的SGD其實跟MBGD(minibatch gradient descent)是一個意思,即隨機抽取一批樣本,以此為根據來更新引數.

具體實現: 
需要:學習速率 ϵ, 初始引數 θ 
每步迭代過程: 
1. 從訓練集中的隨機抽取一批容量為m的樣本{x1,,xm},以及相關的輸出yi 
2. 計算梯度和誤差並更新引數: 

g^+1mθiL(f(xi;θ),yi)θθϵg^

優點: 
訓練速度快,對於很大的資料集,也能夠以較快的速度收斂.

缺點: 
由於是抽取,因此不可避免的,得到的梯度肯定有誤差.因此學習速率需要逐漸減小.否則模型無法收斂 
因為誤差,所以每一次迭代的梯度受抽樣的影響比較大,也就是說梯度含有比較大的噪聲,不能很好的反映真實梯度.

學習速率該如何調整: 
那麼這樣一來,ϵ如何衰減就成了問題.如果要保證SGD收斂,應該滿足如下兩個要求: 

k=1ϵk