- Python機器學習算法: 原理、實現與案例
- 劉碩
- 1519字
- 2020-01-20 15:06:22
1.3 梯度下降
1.3.1 梯度下降算法
有很多機器學習模型的最優化參數不能像普通最小二乘法那樣通過“閉式”方程直接計算,此時需要求助于迭代優化方法。通俗地講,迭代優化方法就是每次根據當前情況做出一點點微調,反復迭代調整,直到達到或接近最優時停止,應用最為廣泛的迭代優化方法是梯度下降(Gradient Descent)。圖1-2所示為梯度下降算法逐步調整參數,從而使損失函數最小化的過程示意圖。

圖1-2
梯度下降算法常被形象地比喻為“下山”。如果你想盡快走下一座山,那么每邁一步的方向應選擇當前山坡最陡峭的方向,邁一步調整一下方向,一直走到發現腳下已是平地。對于函數而言,梯度向量的反方向是其函數值下降最快的方向,即最陡峭的方向。梯度下降算法可描述為:
(1)根據當前參數計算損失函數梯度
。
(2)沿著梯度反方向調整
,調整的大小稱為步長,由學習率
控制。使用公式表述為:

(3)反復執行上述過程,直到梯度為0或損失函數降低小于閾值,此時稱算法已收斂。
應用梯度下降算法時,超參數學習率的選擇十分重要。如果
過大,則有可能出現走到接近山谷的地方又一大步邁到了山另一邊的山坡上,即越過了最小值點;如果
過小,下山的速度就會很慢,需要算法更多次的迭代才能收斂,這會導致訓練時間過長。以上兩種情形如圖1-3所示。

圖1-3
另外,還需知道的是,圖1-3中的損失函數對于梯度下降算法是很理想的,它僅有一個全局最小值點,算法最終將收斂于該點。但也有很多機器學習模型的損失函數存在局部最小值,其曲線如綿延起伏的山脈,如圖1-4所示。
對于圖1-4中的損失函數,假設梯度下降算法的起始點位于局部最小值點左側,算法則有可能收斂于局部最小值,而非全局最小值。此例子表明,梯度下降算法并不總收斂于全局最小值。
本節我們討論的線性回歸的損失函數是一個凸函數,不存在局部最小值,即只有一個全局最小值,因此梯度下降算法可收斂于全局最小值。

圖1-4
在1.2節中,我們計算出線性回歸損失函數的梯度為:

設學習率為,梯度下降算法的參數更新公式為:

可以看出,執行梯度下降算法的每一步都是基于整個訓練集計算梯度的,因此梯度下降也被稱為批量梯度下降:每次使用整批訓練樣本計算梯度,在訓練集非常大時,批量梯度下降算法會運行得極慢。1.3.2小節將介紹的隨機梯度下降和小批量梯度下降可以解決該問題。
1.3.2 隨機梯度下降和小批量梯度下降
隨機梯度下降和小批量梯度下降可以看成是對批量梯度下降的近似,算法流程基本相同,只是每步使用少量的訓練樣本計算梯度。
隨機梯度下降是與批量隨機下降相反的極端情況,每一步只使用一個樣本來計算梯度。
隨機梯度下降算法的梯度計算公式為:

設學習率為,隨機梯度下降算法的參數更新公式為:

因為每次只使用一個樣本來計算梯度,所以隨機梯度下降運行速度很快,并且內存開銷很小,這使得隨機梯度下降算法可以支持使用海量數據集進行訓練。隨機梯度下降過程中,損失函數的下降不像批量梯度下降那樣緩緩降低,而是不斷上下起伏,但總體上趨于降低,逐漸接近最小值。通常隨機梯度下降收斂時,參數是足夠優的,但不是最優的。隨機梯度下降算法的另一個優勢是,當損失函數很不規則時(存在多個局部最小值),它更有可能跳過局部最小值,最終接近全局最小值。
隨機梯度下降算法的一輪(Epoch)訓練是指:迭代訓練集中每一個樣本,使用單個樣本計算梯度并更新參數(一輪即m步),在每輪訓練前通常要隨機打亂訓練集。
小批量梯度下降是介于批量梯度下降和隨機梯度下降之間的折中方案,每一步既不使用整個訓練集又不使用單個樣本,而使用一小批樣本計算梯度。
設一小批樣本的數量為N,小批量梯度下降算法的梯度計算公式為:

設學習率為,小批量梯度下降算法的參數更新公式為:

小批量梯度下降同時具備批量梯度下降和隨機梯度下降二者的優缺點,應用時可視具體情況指定N值。
- HTML5+CSS3王者歸來
- Java入門經典(第6版)
- 新一代通用視頻編碼H.266/VVC:原理、標準與實現
- Three.js開發指南:基于WebGL和HTML5在網頁上渲染3D圖形和動畫(原書第3版)
- Internet of Things with the Arduino Yún
- Building Mapping Applications with QGIS
- AutoCAD VBA參數化繪圖程序開發與實戰編碼
- Java程序設計入門
- Python機器學習算法: 原理、實現與案例
- SSM開發實戰教程(Spring+Spring MVC+MyBatis)
- 持續輕量級Java EE開發:編寫可測試的代碼
- Julia 1.0 Programming Complete Reference Guide
- CRYENGINE Game Development Blueprints
- 零基礎看圖學ScratchJr:少兒趣味編程(全彩大字版)
- Java自然語言處理(原書第2版)