梯度下降算法的簡單理解
1 問題的引出
在線性回歸模型中,先設一個特征x與系數θ1,θ0,最后列出的誤差函數如下圖所示:
手動求解
目標是優化得到其最小化的J(θ1),下圖中的×為y(i),下面給出TrainSet:{(1,1),(2,2),(3,3)}通過手動尋找來找到最優解,由圖可見當θ1取1時,與y(i)完全重合,J(θ1) = 0
下面是θ1的取值與對應的J(θ1)變化情況
由此可見,最優解即為0,現在來看通過梯度下降法來自動找到最優解,對於上述待優化問題,下圖給出其三維圖像,可見要找到最優解,就要不斷向下探索,使得J(θ)最小即可。
2 梯度下降的幾何形式
下圖為梯度下降的目的,找到J(θ)的最小值。
其實,J(θ)的真正圖形是類似下面這樣的,因為其是一個凸函數,只有一個全局最優解,所以不必擔心像上圖一樣找到局部最優解
直到了要找到圖形中的最小值之后,下面介紹自動求解最小值的辦法,這就是梯度下降法
對參數向量θ中的每個分量θj,迭代減去速率因子a* (dJ(θ)/dθj)即可,后邊一項為J(θ)關於θj的偏導數
3 梯度下降的原理
導數的概念
由公式可見,對點x0的導數反映了函數在點x0處的瞬時變化速率,或者叫在點x0處的斜度。推廣到多維函數中,就有了梯度的概念,梯度是一個向量組合,反映了多維圖形中變化速率最快的方向。
下圖展示了對單個特征θ1的直觀圖形,起始時導數為正,θ1減小后並以新的θ1為基點重新求導,一直迭代就會找到最小的θ1,若導數為負時,θ1的就會不斷增到,直到找到使損失函數最小的值。
有一點需要注意的是步長a的大小,如果a太小,則會迭代很多次才找到最優解,若a太大,可能跳過最優,從而找不到最優解。
另外,在不斷迭代的過程中,梯度值會不斷變小,所以θ1的變化速度也會越來越慢,所以不需要使速率a的值越來越小
下圖就是尋找過程
當梯度下降到一定數值后,每次迭代的變化很小,這時可以設定一個閾值,只要變化小魚該閾值,就停止迭代,而得到的結果也近似於最優解。
若損失函數的值不斷變大,則有可能是步長速率a太大,導致算法不收斂,這時可適當調整a值
為了選擇參數a,就需要不斷測試,因為a太大太小都不太好。
如果想跳過的a與算法復雜的迭代,可以選擇 Normal Equation。
小結
梯度下降法是最早最簡單,也是最為常用的最優化方法。當目標函數是凸函數時,梯度下降法的解是全局解。一般情況下,其解不保證是全局最優解,梯度下降法的速度也未必是最快的。梯度下降法的優化思想是用當前位置負梯度方向作為搜索方向,因為該方向為當前位置的最快下降方向,所以也被稱為是”最速下降法“。最速下降法越接近目標值,步長越小,前進越慢,步長越大,誤差越大。梯度下降法的搜索迭代示意圖如下圖所示:
梯度下降法的缺點:
(1)靠近極小值時收斂速度減慢,如下圖所示;
(2)直線搜索時可能會產生一些問題;
(3)可能會“之字形”地下降。
4 兩種方法
在機器學習中,基於基本的梯度下降法發展了兩種梯度下降方法,分別為隨機梯度下降法和批量梯度下降法。
比如對一個線性回歸(Linear Logistics)模型,假設下面的h(x)是要擬合的函數,J(theta)為損失函數,theta是參數,要迭代求解的值,theta求解出來了那最終要擬合的函數h(theta)就出來了。其中m是訓練集的樣本個數,n是特征的個數。
1)批量梯度下降法(Batch Gradient Descent,BGD)
(1)將J(theta)對theta求偏導,得到每個theta對應的的梯度:
(2)由於是要最小化風險函數,所以按每個參數theta的梯度負方向,來更新每個theta:
(3)從上面公式可以注意到,它得到的是一個全局最優解,但是每迭代一步,都要用到訓練集所有的數據,如果m很大,那么可想而知這種方法的迭代速度會相當的慢。所以,這就引入了另外一種方法——隨機梯度下降。
對於批量梯度下降法,樣本個數m,x為n維向量,一次迭代需要把m個樣本全部帶入計算,迭代一次計算量為m*n2。
2)隨機梯度下降(Stochastic Gradient Descent,SGD)
(1)上面的風險函數可以寫成如下這種形式,損失函數對應的是訓練集中每個樣本的粒度,而上面批量梯度下降對應的是所有的訓練樣本:
(2)每個樣本的損失函數,對theta求偏導得到對應梯度,來更新theta:
(3)隨機梯度下降是通過每個樣本來迭代更新一次,如果樣本量很大的情況(例如幾十萬),那么可能只用其中幾萬條或者幾千條的樣本,就已經將theta迭代到最優解了,對比上面的批量梯度下降,迭代一次需要用到十幾萬訓練樣本,一次迭代不可能最優,如果迭代10次的話就需要遍歷訓練樣本10次。但是,SGD伴隨的一個問題是噪音較BGD要多,使得SGD並不是每次迭代都向着整體最優化方向。
隨機梯度下降每次迭代只使用一個樣本,迭代一次計算量為n2,當樣本個數m很大的時候,隨機梯度下降迭代一次的速度要遠高於批量梯度下降方法。兩者的關系可以這樣理解:隨機梯度下降方法以損失很小的一部分精確度和增加一定數量的迭代次數為代價,換取了總體的優化效率的提升。增加的迭代次數遠遠小於樣本的數量。
對批量梯度下降法和隨機梯度下降法的總結:
批量梯度下降---最小化所有訓練樣本的損失函數,使得最終求解的是全局的最優解,即求解的參數是使得風險函數最小,但是對於大規模樣本問題效率低下。
隨機梯度下降---最小化每條樣本的損失函數,雖然不是每次迭代得到的損失函數都向着全局最優方向, 但是大的整體的方向是向全局最優解的,最終的結果往往是在全局最優解附近,適用於大規模訓練樣本情況。
5 其他
對於樣本數量額非常之多的情況,Batch Gradient Descent算法會非常耗時,因為每次迭代都要遍歷所有樣本,可選用Stochastic Gradient Descent 算法,需要注意外層循環Loop,因為只遍歷一次樣本,不見得會收斂。
隨機梯度算法就可以用作在線學習了,但是注意隨機梯度的結果並非完全收斂,而是在收斂結果處波動的,可能由非線性可分的樣本引起來的:
可以有如下解決辦法:(來自MLIA)
1. 動態更改學習速率a的大小,可以增大或者減小
2. 隨機選樣本進行學習