初探梯度下降之隨機梯度下降(SGD)

看了一下前一篇 是半個月前了~過了個年 生了個病 就發現攤久了就真的成為惰性 很舒服了…今早不想看教資的時候 就去校正了一下論文 看到隨機梯度下降算法 那就再來記錄一下 也算是假期最后一更啦 接下來要等9號考完試 再更辣!

隨機梯度下降算法

先解釋一些概念。

1.什么是梯度下降

我們先從一張圖來直觀解釋這個過程。


如上圖假設這樣一個場景:一個人被困在山上,需要從山上下來,但此時山上的濃霧很大,導致可視度很低。因此,下山的路徑就無法確定,他必須利用自己周圍的信息去找到下山的路徑。這個時候,他就可以利用梯度下降算法來幫助自己下山。具體來說就是,以他當前的所處的位置為基準,尋找方向,然后朝著山的高度下降的地方走。
但是因為選擇方向的原因,我們找到的的最低點可能不是真正的最低點。如圖所示,黑線標注的路線所指的方向并不是真正的地方。
那么問題來了?
既然是選擇一個方向下山,那么這個方向怎么選?每次該怎么走?
先說選方向,在算法中是以隨機方式給出的,這也是造成有時候走不到真正最低點的原因。如果選定了方向,以后每走一步,都是選擇最陡的方向,直到最低點。
總結起來就一句話:隨機選擇一個方向,然后每次邁步都選擇最陡的方向,直到這個方向上能達到的最低點。

其實梯度下降的過程即可類比與上述描述的下山的過程
我們可以這樣理解:首先,我們有一個可微分的函數。這個函數就代表著一座山。我們的目標就是找到這個函數的最小值,也就是山底。最快的下山的方式就是找到當前位置最陡峭的方向,然后沿著此方向向下走,對應到函數中,就是找到給定點的梯度,然后朝著梯度相反的方向,就能讓函數值下降的最快!因為梯度的方向就是函數之變化最快的方向。
所以,我們重復利用這個方法,反復求取梯度,最后就能到達局部的最小值,這就類似于我們下山的過程。

2.那什么是梯度?求取梯度有什么用?

還是從例子入手:


上圖就是一個求梯度的實例,由這個實例我們可以看到,梯度就是分別對每個變量進行微分,然后用逗號分割開,梯度是用<>包括起來,說明梯度其實一個向量。
在單變量的函數中,梯度其實就是函數的微分,代表著函數在某個給定點的切線的斜率;在多變量函數中,梯度是一個向量,向量有方向,梯度的方向就指出了函數在給定點的上升最快的方向。
這也就告訴我們為什么需要求梯度。我們需要到達山底,就需要在每一步觀測到此時最陡峭的地方,梯度就恰巧告訴了我們這個方向。梯度的方向是函數在給定點上升最快的方向,那么梯度的反方向就是函數在給定點下降最快的方向。所以我們只要沿著梯度的方向一直走,就能走到局部上的一個最低點。

3.我們使用梯度下降來做什么?有什么優缺點?

a. 在機器學習算法中,有時候需要對原始的模型構建損失函數,然后通過優化算法對損失函數進行優化,以便尋找到最優的參數,使得損失函數的值最小。而在求解機器學習參數的優化算法中,使用較多的就是基于梯度下降的優化算法(Gradient Descent, GD)。
b.優缺點
優點:效率。在梯度下降法的求解過程中,只需求解損失函數的一階導數,計算的代價比較小,可以在很多大規模數據集上應用。
缺點:求解的是局部最優值,即由于方向選擇的問題,得到的結果不一定是全局最優步長選擇,過小使得函數收斂速度慢,過大又容易找不到最優解。

進入一個分支~

隨機梯度算法

概念

隨機梯度下降(SGD)是一種簡單但非常有效的方法,多用用于支持向量機、邏輯回歸等凸損失函數下的線性分類器的學習。并且SGD已成功應用于文本分類和自然語言處理中經常遇到的大規模和稀疏機器學習問題。
SGD既可以用于分類計算,也可以用于回歸計算
分類和回歸的實現可參考:
https://blog.csdn.net/qq_38150441/article/details/80533891

SGD算法是從樣本中隨機抽出一組,訓練后按梯度更新一次,然后再抽取一組,再更新一次,在樣本量及其大的情況下,可能不用訓練完所有的樣本就可以獲得一個損失值在可接受范圍之內的模型了。(劃個重點:每次迭代使用一組樣本。)
為什么叫隨機梯度下降算法呢?這里的隨機是指每次迭代過程中,樣本都要被隨機打亂,這個也很容易理解,打亂是有效減小樣本之間造成的參數更新抵消問題。

分類

隨機梯度下降算法通常還有三種不同的應用方式,它們分別是SGD、Batch-SGD、Mini-Batch SGD
a.SGD是最基本的隨機梯度下降,它是指每次參數更新只使用一個樣本,這樣可能導致更新較慢;
b.Batch-SGD是批隨機梯度下降,它是指每次參數更新使用所有樣本,即把所有樣本都代入計算一遍,然后取它們的參數更新均值,來對參數進行一次性更新,這種更新方式較為粗糙;
c.Mini-Batch-SGD是小批量隨機梯度下降,它是指每次參數更新使用一小批樣本,這批樣本的數量通常可以采取trial-and-error的方法來確定,這種方法被證明可以有效加快訓練速度

運用

訓練模型的目的是使得目標函數達到極小值。對于一個深度神經網絡,它的參數數目比較龐大,因此目標函數通常是一個包含很多參量的非線性函數。對于這個非線性函數,我們采用的是隨機梯度下降算法來對參數進行更新。具體步驟如下:
(1)對網絡參數進行初始化,一般情況下,權重初始化為均值是0,方差為0.01的高斯分布隨機值,而偏置統一初始化為0;
(2)將參數代入網絡計算前饋輸出值,從而可以根據已有的目標標簽得出目標函數值;
(3)根據目標函數值以及各參數與目標函數所構成的樹結構,運用后向傳播算法計算出每個參數的梯度;
(4)設置學習率大小(隨著迭代的步驟增多,學習率通常要逐漸減小,這樣可以有效避免訓練中出現誤差震蕩情況),進行參數更新,最一般的更新方式是 新參數=舊參數-學習率×梯度;
(5)重復進行第2~4步,直到網絡收斂為止。

實現代碼參考(https://blog.csdn.net/kwame211/article/details/80364079

今天又是一個合格的搬運工辣~
參考資料
http://www.lxweimin.com/p/c7e642877b0e
https://blog.csdn.net/LW_GHY/article/details/71054965

End~
加油!

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容