1 前言
機器學習和深度學習里面都至關重要的一個環節就是優化損失函數,一個模型只有損失函數收斂到一定的值,才有可能會有好的結果,降低損失的工作就是優化方法需做的事。常用的優化方法:梯度下降法家族、牛頓法、擬牛頓法、共軛梯度法、Momentum、Nesterov Momentum、Adagrad、RMSprop、Adam等。
梯度下降法不論是在線性回歸還是 Logistic 回歸中,主要目的是通過迭代找到目標函數的最小值,或者收斂到最小值。
梯度下降法作為機器學習中較常使用的優化算法,其有着三種不同的形式:
- 批量梯度下降(Batch Gradient Descent)
- 隨機梯度下降(Stochastic Gradient Descent)
- 小批量梯度下降(Mini-Batch Gradient Descent)
其中小批量梯度下降法也常用在深度學習中進行模型的訓練。接下來,將逐步對這三種不同的梯度下降法進行理解。
為方便理解這三種梯度下降法,可以參考本博客《機器學習——批量梯度下降法、隨機梯度下降法、小批量梯度下降法》
2 梯度下降算法
2.1 場景假設
梯度下降法的基本思想可以類比為一個下山的過程。
假設這樣一個場景:一個人被困在山上,需要從山上找到山的最低點。但此時山上的濃霧很大,導致可視度很低;因此,下山的路徑就無法確定,必須利用自己周圍的信息一步一步地找到下山的路。這個時候,便可利用梯度下降算法來幫助自己下山。
怎么做呢?首先以他當前的所處的位置為基准,尋找這個位置最陡峭的地方,然后朝着下降方向走一步,然后又繼續以當前位置為基准,再找最陡峭的地方,再走直到最后到達最低處。
2.2 梯度下降
梯度下降的基本過程就和下山的場景很類似。
首先,我們有一個可微分的函數,代表着一座山。目標是找到這個函數的最小值,也就是山底。
根據之前的場景假設,最快的下山的方式就是找到當前位置最陡峭的方向,然后沿着此方向向下走。對應到函數中,就是找到給定點的梯度 ,然后朝着梯度相反的方向,就能讓函數值下降的最快!
重復利用這個方法,反復求取梯度,最后就能到達局部的最小值,這就類似於我們下山的過程。而求取梯度就確定了最陡峭的方向,也就是場景中測量方向的手段。
2.2.1 微分
微分例子:
1.單變量的微分,函數只有一個變量時
${\large \frac{\mathrm{d}(x^{2}) }{\mathrm{d} x} =2x} $
2.多變量的微分,當函數有多個變量的時候,分別對每個變量進行求微分
${\large \frac{\partial (x^{2}y^{2})}{\partial x} =2xy^{2}} $
2.2.2 梯度
梯度實際上就是多變量微分的一般化。
例子:
$J(\theta )=5-(4\theta_{1} +3\theta_{2}-2\theta_{3})$
$\nabla J(\Theta)=\left\langle\frac{\partial J}{\partial \theta_{1}}, \frac{\partial J}{\partial \theta_{2}}, \frac{\partial J}{\partial \theta_{3}}\right\rangle=(-5,-2,12)$
可以看到,梯度就是分別對每個變量進行微分,然后用逗號分割開,梯度是用$<>$包括起來,說明梯度其實一個向量。
- 在單變量的函數中,梯度其實就是函數的微分,代表着函數在某個給定點的切線的斜率。
- 在多變量函數中,梯度是一個向量,向量有方向,梯度的方向就指出了函數在給定點的上升最快的方向。梯度的方向是函數在給定點上升最快的方向,那么梯度的反方向就是函數在給定點下降最快的方向。
2.2.3 數學解釋
數學公式:$\theta ^{1} =\theta ^{0} +\alpha \bigtriangledown J(\theta)$
意義是:$J$ 是關於 $\theta$ 的一個函數,當前所處位置為 $\theta ^{0}$ 點,要從這個點走到 $J$ 的最小值點。首先先確定前進的方向:梯度的反向。然后走一段距離的步長: $\alpha$ ,走完這個段步長,到達 $\theta ^{1}$!
2.2.4 學習率 α
$\alpha$ 在梯度下降算法中被稱為 學習率 或者 步長。通過 $\alpha$ 來控制每一步距離,以保證步子不要跨太大,避免走太快,錯過最低點。同時也要保證不要走的太慢,影響效率。$\alpha$ 不能太大也不能太小,太小的話,可能導致走不到最低點;太大的話,導致錯過最低點。
2.2.5 梯度乘負號
梯度前加負號,意味着朝梯度相反方向前進。梯度的方向就是函數在此點上升最快的方向。梯度下降需要朝下降最快的方向前進,自然是負梯度的方向,所以需要加上負號。
3 實例
3.1 單變量函數的梯度下降
假設有一個單變量函數:$J(\theta) =\theta ^{2} $
函數的微分:$J^{'} (\theta) =2\theta$
初始化:設置初始位置 $ \theta^{0}=1$,設置學習率: $\alpha =0.4$
根據梯度下降的計算公式:$\theta ^{1} =\theta ^{0} +\alpha \bigtriangledown J(\theta)$
計算過程:
$\theta ^{0} =1$
$\theta ^{1} =\theta ^{0}-\alpha J ^{'}(\theta ^{0})=1-0.4*2=0.2$
$\theta ^{2} =\theta ^{1}-\alpha J ^{'}(\theta ^{1})=0.2-0.4*0.4=0.04$
$\theta ^{3} =0.08$
$\theta ^{4} =0.0016$
如圖,經過四次的運算,也就是走了四步,基本抵達函數最低點,也就是山底。
3.2 多變量函數的梯度下降
假設有一個目標函數:$J(\theta)=\theta_{1}^{2} +\theta_{2}^{2}$
假設初始起點:$\theta^{0}= (1,3)$,初始學習率:$\alpha =0.1$
函數的梯度為:$\bigtriangledown J(\theta)=<2\theta_{1},2\theta_{2}>$
計算過程:
$\begin{array}{l} \Theta^{0}=(1,3) \\ \Theta^{1}=\Theta^{0}-\alpha \nabla J(\Theta)=(1,3)-0.1 *(2,6)=(0.8,2.4) \\ \Theta^{2}=(0.8,2.4)-0.1 *(1.6,4.8)=(0.64,1.92) \\ \Theta^{3}=(0.5124,1.536) \\ \Theta^{4}=(0.4096,1.228800000000001) \\ \vdots \\ \Theta^{10}=(0.1073741824000003,0.32212254720000005) \\ \Theta^{50}=\left(1.141798154164342 e^{-05}, 3.42539442494306 e^{-05}\right) \\ \vdots \\ \Theta^{100}=\left(1.6296287810675902 e^{-10}, 4.8888886343202771 e^{-10}\right) \end{array}$
我們發現,已經基本靠近函數的最小值點:
4 批量梯度下降
為了便於理解,這里使用只含有一個特征的線性回歸來展開。
此時線性回歸的假設函數為:
$h_{\theta} (x^{(i)})=\theta_1 x^{(i)}+\theta_0$
其中 $i=1,2,...,m$,其中 $m$ 表示樣本數。
對應的目標函數(代價函數)即為:
$J(\theta_0, \theta_1) = \frac{1}{2m} \sum_ \limits {i=1}^{m}(h_{\theta}(x^{(i)}) - y^{(i)})^2$
批量梯度下降法是最原始的形式,它是指在每一次迭代時使用所有樣本來進行梯度的更新。從數學上理解如下:
(1)對目標函數求偏導
$\frac{\Delta J(\theta_0,\theta_1)}{\Delta \theta_j} = \frac{1}{m} \sum_ \limits {i=1}^{m} (h_{\theta}(x^{(i)})-y^{(i)})x_j^{(i)}$
其中 $i=1,2,...,m$,$m$ 表示樣本數,$j = 0,1$ 表示特征數,這里我們使用了偏置項 $x_0^{(i)} = 1$
(2)每次迭代對參數進行更新:
$\theta_j := \theta_j - \alpha \frac{1}{m} \sum_ \limits {i=1}^{m} (h_{\theta}(x^{(i)})-y^{(i)})x_j^{(i)}$
注意:這里更新時存在一個求和函數,即為對所有樣本進行計算處理,可與下文SGD法進行比較。
優點:
(1)一次迭代是對所有樣本進行計算,此時利用矩陣進行操作,實現了並行。
(2)由全數據集確定的方向能夠更好地代表樣本總體,從而更准確地朝向極值所在的方向。當目標函數為凸函數時,BGD一定能夠得到全局最優。
缺點:
(1)當樣本數目 $m$ 很大時,每迭代一步都需要對所有樣本計算,訓練過程會很慢。
從迭代的次數上來看,BGD迭代的次數相對較少。
5 隨機梯度下降
隨機梯度下降法不同於批量梯度下降,隨機梯度下降是每次迭代使用一個樣本來對參數進行更新。使得訓練速度加快。
對於一個樣本的目標函數為:
$J^{(i)}(\theta_0,\theta_1) = \frac{1}{2}(h_{\theta}(x^{(i)})-y^{(i)})^2$
(1)對目標函數求偏導:
$\frac{\Delta J^{(i)}(\theta_0,\theta_1)}{\theta_j} = (h_{\theta}(x^{(i)})-y^{(i)})x^{(i)}_j$
(2)參數更新:
$\theta_j := \theta_j - \alpha (h_{\theta}(x^{(i)})-y^{(i)})x^{(i)}_j$
注意:這里不再有求和符號
6 小批量梯度下降
小批量梯度下降,是對批量梯度下降以及隨機梯度下降的一個折中辦法。其思想是:每次迭代 使用 batch_size 個樣本來對參數進行更新。
這里我們假設$batch_size = 10$,樣本數$m=1000$
優點:
(1)通過矩陣運算,每次在一個 batch 上優化神經網絡參數並不會比單個數據慢太多。
(2)每次使用一個 batch 可以大大減小收斂所需要的迭代次數,同時可以使收斂到的結果更加接近梯度下降的效果。(比如上例中的30W,設置 batch_size=100 時,需要迭代 3000 次,遠小於 SGD 的 30W 次)
(3)可實現並行化。
缺點:
(1)batch_size的不當選擇可能會帶來一些問題。
batcha_size的選擇帶來的影響:
(1)在合理地范圍內,增大batch_size的好處:
a. 內存利用率提高了,大矩陣乘法的並行化效率提高。
b. 跑完一次 epoch(全數據集)所需的迭代次數減少,對於相同數據量的處理速度進一步加快。
c. 在一定范圍內,一般來說 Batch_Size 越大,其確定的下降方向越准,引起訓練震盪越小。
(2)盲目增大batch_size的壞處:
a. 內存利用率提高了,但是內存容量可能撐不住了。
b. 跑完一次 epoch(全數據集)所需的迭代次數減少,要想達到相同的精度,其所花費的時間大大增加了,從而對參數的修正也就顯得更加緩慢。
c. Batch_Size 增大到一定程度,其確定的下降方向已經基本不再變化。
參考文獻: