梯度下降法简介
條件數表征函數相對于輸入的微小變化而變化的快慢程度。輸入被輕微擾動而迅速改變的函數對于科學計算來說可能是有問題的,因為輸入中的舍入誤差可能導致輸出的巨大變化。
大多數深度學習算法都涉及某種形式的優化。優化指的是改變x以最小化或最大化某個函數f(x)的任務。我們通常以最小化f(x)指代大多數最優化問題。最大化可經由最小化算法最小化-f(x)來實現。
我們把要最小化或最大化的函數稱為目標函數(objective function)或準則(criterion)。當我們對其進行最小化時,我們也把它稱為代價函數(cost function)、損失函數(loss function)或誤差函數(error function)。梯度下降法的核心,是最小化目標函數。
導數f’(x)代表f(x)在點x處的斜率。換句話說,它表明如何縮放輸入的小變化才能在輸出獲得相應的變化:f(x+ε)≈f(x)+εf’(x)。因此導數對于最小化一個函數很有用,因為它告訴我們如何更改x來略微地改善y。例如,我們知道對于最夠小的ε來說,f(x-εsign(f’(x)))是比f(x)小的。因此我們可以將x往導數的反方向移動一小步來減少f(x)。這種技術被稱為梯度下降(gradient descent)。
當f’(x)=0,導數無法提供往哪個方向移動的信息。f’(x)=0的點稱為臨界點(critical point)或駐點(stationary point)。一個局部極小點(local minimum)意味著這個點的f(x)小于所有鄰近點,因此不可能通過移動無窮小的步長來減少f(x)。一個局部極大點(local maximum)意味著這個點的f(x)大于所有鄰近點,因此不可能通過移動無窮小的步長來增大f(x).有些臨界點既不是最小點也不是最大點。這些點被稱為鞍點(saddle point)。
臨界點是斜率為零的點。這樣的點可以是局部極小點(local minimum),其值低于相鄰點;局部極大點(local maximum),其值高于相鄰點;或鞍點,同時存在更高和更低的相鄰點。
使f(x)取得絕對的最小值(相對所有其他值)的點是全局最小點(global minimum)。函數可能只有一個全局最小點或存在多個全局最小點,還可能存在不是全局最優的局部極小點。在深度學習的背景下,我們要優化的函數可能含有許多不是最優的局部極小點,或者還有很多處于非常平坦的區域內的鞍點。尤其是當輸入是多維的時候,所有這些都將使優化變得困難。因此,我們通常尋找使f非常小的點,但這在任何形式意義下并不一定是最小。
當存在多個局部極小點或平坦區域時,優化算法可能無法找到全局最小點。在深度學習的背景下,即使找到的解不是真正最小的,但只要它們對應于代價函數顯著低的值,我們通常就能接受這樣的解。
針對具有多維輸入的函數,我們需要用到偏導數(partial derivative, 在數學中,一個多變量的函數的偏導數是它關于其中一個變量的導數,而保持其它變量恒定(相對于全導數,在其中所有變量都允許變化)。函數f關于變量x的偏導數寫為f’x或 ?的概念。偏導數 ?衡量點x處只有xi增加時f(x)如何變化。梯度(gradient)是相對一個向量求導的導數:f的導數是包含所有偏導數的向量,記為▽xf(x)。梯度的第i個元素是f關于xi的偏導數。在多維情況下,臨界點是梯度中所有元素都為零的點。
在u(單位向量)方向的方向導數(directional derivative)是函數f在u方向的斜率。換句話說,方向導數是函數f(x+αu)關于α的導數(在α=0時取得)。使用鏈式法則,我們可以看到當α=0時, ?。為了最小化f,我們希望找到使f下降得最快的方向。計算方向導數:
其中θ是u與梯度的夾角。將‖u‖2=1代入,并忽略與u無關的項,就能簡化得到 ?。這在u與梯度方向相反時取得最小。換句話說,梯度向量指向上坡,負梯度向量指向下坡。我們在負梯度方向上移動可以減少f。這被稱為最速下降法(method of steepest descent)或梯度下降(gradient descent)。
最速下降建議新的點為x’=x-ε▽xf(x)。其中ε為學習率(learning rate),是一個確定步長大小的正標量。我們可以通過幾種不同的方式選擇ε。普遍的方式是選擇一個小常數。有時我們通過計算,選擇使方向導數消失的步長。還有一種方法是根據幾個ε計算f(x-ε▽xf(x)),并選擇其中能產生最小目標函數值的ε。這種策略被稱為線搜索。
最速下降在梯度的每一個元素為零時收斂(或在實踐中,很接近零時)。在某些情況下,我們也許能夠避免運行該迭代算法,并通過解方程▽xf(x)=0直接跳到臨界點。
雖然梯度下降被限制在連續空間中的優化問題,但不斷向更好的情況移動一小步(即近似最佳的小移動)的一般概念可以推廣到離散空間。遞增帶有離散參數的目標函數被稱為爬山(hill climbing)算法。
梯度下降法(Gradient descent):是一個一階最優化算法,通常也稱為最速下降法。要使用梯度下降法找到一個函數的局部極小值,必須向函數上當前點對應梯度(或者是近似梯度)的反方向的規定步長距離點進行迭代搜索。如果相反地向梯度正方向迭代進行搜索,則會接近函數的局部極大值點,這個過程則稱為梯度上升法。
梯度下降方法基于以下的觀察:如果實值函數F(x)在點a處可微(導數)且有定義,那么函數F(x)在a點沿著梯度(在單變量的實值函數的情況,梯度只是導數,或者,對于一個線性函數,也就是線的斜率。梯度一詞有時用于斜度,也就是一個曲面沿著給定方向的傾斜程度。)相反的方向-▽F(a)下降最快。
梯度下降法的缺點包括:(1)、靠近極小值時速度減慢;(2)、直線搜索可能會產生一些問題;(3)、可能會”之字型”地下降。
批量梯度下降法(Batch Gradient Descent, BGD):是梯度下降法最原始的形式,它的具體思路是在更新每一參數時都使用所有的樣本來進行更新。優點:全局最優解,易于并行實現;缺點:當樣本數目很多時,訓練過程會很慢。
隨機梯度下降法(Stochastic Gradient Descent, SGD):由于批量梯度下降法在更新每一個參數時,都需要所有的訓練樣本,所以訓練過程會隨著樣本數量的加大而變得異常的緩慢。隨機梯度下降法正是為了解決批量梯度下降法這一弊端而提出的。隨機梯度下降是通過每個樣本來迭代更新一次。SGD伴隨的一個問題時噪音較BGD要多,使得SGD并不是每次迭代都向著整體最優化方向。優點:訓練速度快;缺點:準確度下降,并不是全局最優,不易于并行實現。
小批量梯度下降法(Mini-batch Gradient Descent, MBGD):MBGD在每次更新參數時使用b個樣本。
BGD在每次迭代時使用全部樣本;SGD在每次迭代時使用1個樣本;MBGD在每次迭代時使用b個樣本。
梯度下降優化算法包括:Momentum、NAG、Adagrad、RMSprop、Adam等。
以上內容主要摘自:?《深度學習中文版》?和?維基百科
待后面介紹線性回歸時會給出梯度下降法的C++實現。
GitHub:?https://github.com/fengbingchun/NN_Test
總結
- 上一篇: 激活函数之softmax介绍及C++实现
- 下一篇: CUDA Samples: Long V