機器學習:隨機梯度下降和批量梯度下降算法介紹

2021-01-08 電子發燒友
機器學習:隨機梯度下降和批量梯度下降算法介紹

佚名 發表於 2017-11-28 04:00:28

隨機梯度下降(Stochastic gradient descent)

批量梯度下降(Batch gradient descent)

梯度下降(GD)是最小化風險函數、損失函數的一種常用方法,隨機梯度下降和批量梯度下降是兩種迭代求解思路,下面從公式和實現的角度對兩者進行分析,如有哪個方面寫的不對,希望網友糾正。

下面的h(x)是要擬合的函數,J(theta)損失函數,theta是參數,要迭代求解的值,theta求解出來了那最終要擬合的函數h(theta)就出來了。其中m是訓練集的記錄條數,j是參數的個數。

 

 

1、批量梯度下降的求解思路如下:

(1)將J(theta)對theta求偏導,得到每個theta對應的的梯度

 

(2)由於是要最小化風險函數,所以按每個參數theta的梯度負方向,來更新每個theta

(3)從上面公式可以注意到,它得到的是一個全局最優解,但是每迭代一步,都要用到訓練集所有的數據,如果m很大,那麼可想而知這種方法的迭代速度!!所以,這就引入了另外一種方法,隨機梯度下降。

2、隨機梯度下降的求解思路如下:

(1)上面的風險函數可以寫成如下這種形式,損失函數對應的是訓練集中每個樣本的粒度,而上面批量梯度下降對應的是所有的訓練樣本:

 

(2)每個樣本的損失函數,對theta求偏導得到對應梯度,來更新theta

(3)隨機梯度下降是通過每個樣本來迭代更新一次,如果樣本量很大的情況(例如幾十萬),那麼可能只用其中幾萬條或者幾千條的樣本,就已經將theta迭代到最優解了,對比上面的批量梯度下降,迭代一次需要用到十幾萬訓練樣本,一次迭代不可能最優,如果迭代10次的話就需要遍歷訓練樣本10次。但是,SGD伴隨的一個問題是噪音較BGD要多,使得SGD並不是每次迭代都向著整體最優化方向。

3、對於上面的linear regression問題,與批量梯度下降對比,隨機梯度下降求解的會是最優解嗎?

(1)批量梯度下降---最小化所有訓練樣本的損失函數,使得最終求解的是全局的最優解,即求解的參數是使得風險函數最小。

(2)隨機梯度下降---最小化每條樣本的損失函數,雖然不是每次迭代得到的損失函數都向著全局最優方向, 但是大的整體的方向是向全局最優解的,最終的結果往往是在全局最優解附近。

4、梯度下降用來求最優解,哪些問題可以求得全局最優?哪些問題可能局部最優解?

對於上面的linear regression問題,最優化問題對theta的分布是unimodal,即從圖形上面看只有一個peak,所以梯度下降最終求得的是全局最優解。然而對於multimodal的問題,因為存在多個peak值,很有可能梯度下降的最終結果是局部最優。

      5、隨機梯度和批量梯度的實現差別

以前一篇博文中NMF實現為例,列出兩者的實現差別(註:其實對應Python的代碼要直觀的多,以後要練習多寫python!

[java] view plain 

// 隨機梯度下降,更新參數  

public void updatePQ_stochastic(double alpha, double beta) {  

for (int i = 0; i < M; i++) {  

ArrayList Ri = this.dataset.getDataAt(i).getAllFeature();  

for (Feature Rij : Ri) {  

// eij=Rij.weight-PQ for updating P and Q  

double PQ = 0;  

for (int k = 0; k < K; k++) {  

PQ += P[i][k] * Q[k][Rij.dim];  

}  

double eij = Rij.weight - PQ;  

// update Pik and Qkj  

for (int k = 0; k < K; k++) {  

double oldPik = P[i][k];  

P[i][k] += alpha  

* (2 * eij * Q[k][Rij.dim] - beta * P[i][k]);  

Q[k][Rij.dim] += alpha  

* (2 * eij * oldPik - beta * Q[k][Rij.dim]);  

}  

}  

}  

}  

// 批量梯度下降,更新參數  

public void updatePQ_batch(double alpha, double beta) {  

for (int i = 0; i < M; i++) {  

ArrayList Ri = this.dataset.getDataAt(i).getAllFeature();  

for (Feature Rij : Ri) {  

 

// Rij.error=Rij.weight-PQ for updating P and Q  

double PQ = 0;  

for (int k = 0; k < K; k++) {  

PQ += P[i][k] * Q[k][Rij.dim];  

}  

Rij.error = Rij.weight - PQ;  

}  

}  

for (int i = 0; i < M; i++) {  

ArrayList Ri = this.dataset.getDataAt(i).getAllFeature();  

for (Feature Rij : Ri) {  

for (int k = 0; k < K; k++) {  

// 對參數更新的累積項  

double eq_sum = 0;  

double ep_sum = 0;  

 

for (int ki = 0; ki < M; ki++) {// 固定k和j之後,對所有i項加和  

ArrayList tmp = this.dataset.getDataAt(i).getAllFeature();  

for (Feature Rj : tmp) {  

if (Rj.dim == Rij.dim)  

ep_sum += P[ki][k] * Rj.error;  

}  

}  

for (Feature Rj : Ri) {// 固定k和i之後,對多有j項加和  

eq_sum += Rj.error * Q[k][Rj.dim];  

}  

// 對參數更新  

P[i][k] += alpha * (2 * eq_sum - beta * P[i][k]);  

Q[k][Rij.dim] += alpha * (2 * ep_sum - beta * Q[k][Rij.dim]);  

}  

}  

}  

打開APP閱讀更多精彩內容

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容圖片侵權或者其他問題,請聯繫本站作侵刪。 侵權投訴

相關焦點

  • 【乾貨】機器學習最常用優化之一——梯度下降優化算法綜述
    【新智元導讀】梯度下降算法是機器學習中使用非常廣泛的優化算法,也是眾多機器學習算法中最常用的優化方法。幾乎當前每一個先進的(state-of-the-art)機器學習庫或者深度學習庫都會包括梯度下降算法的不同變種實現。
  • 詳解梯度下降算法 正確訓練模型利刃!
    【IT168 資訊】梯度下降是目前最流行的優化策略,目前用於機器學習和深度學習。它在訓練模型時使用,可以與每種算法結合使用,易於理解和實施。因此,每個使用機器學習的人都應該理解它的概念。閱讀完這篇文章後,你將了解梯度下降是如何工作的,它今天使用了哪些類型,以及它們的優點和權衡。
  • 梯度下降—Python實現
    梯度下降是數據科學的基礎,無論是深度學習還是機器學習。深入了解梯度下降原理一定會對你今後的工作有所幫助。你將真正了解這些超參數的作用以及處理使用此算法可能遇到的問題。然而,梯度下降並不局限於一種算法。另外兩種流行的梯度下降(隨機和小批量梯度下降)建立在主要算法的基礎上,你可能會看到比普通批量梯度下降更多的算法。
  • 梯度下降算法詳解
    原創 | CDA數據分析研究院,轉載需授權介紹如果說在機器學習領域有哪個優化算法最廣為認知,用途最廣,非梯度下降算法莫屬。但是換一種思路,比如用梯度下降算法去優化線性回歸的損失函數,完全就可以不用考慮多重共線性帶來的問題。其實不僅是線性回歸,邏輯回歸同樣是可以用梯度下降進行優化,因為這兩個算法的損失函數都是嚴格意義上的凸函數,即存在全局唯一極小值,較小的學習率和足夠的迭代次數,一定可以達到最小值附近,滿足精度要求是完全沒有問題的。
  • 梯度下降背後的數學原理幾何?
    雷鋒網 AI 科技評論按:對於諸位「機器學習兒」而言,梯度下降這個概念一定不陌生,然而從直觀上來看,梯度下降的複雜性無疑也會讓人「敬而遠之」。本文作者 Suraj Bansal 通過對梯度下降背後的數學原理進行拆解,並配之以簡單的現實案例,以輕鬆而有趣的口吻帶大家深入了解梯度下降這一在機器學習領域至關重要的方法。
  • 技術| 深度解讀最流行的優化算法:梯度下降
    本文旨在讓你對不同的優化梯度下降法的算法有一個直觀認識,以幫助你使用這些算法。我們首先會考察梯度下降法的各種變體,然後會簡要地總結在訓練(神經網絡或是機器學習算法)的過程中可能遇到的挑戰。我們首先會考察梯度下降法的各種變體,然後會簡要地總結在訓練(神經網絡或是機器學習算法)的過程中可能遇到的挑戰。接著,我們將會討論一些最常見的優化算法,研究它們的解決這些挑戰的動機及推導出更新規律(update rules)的過程。我們還會簡要探討一下,在平行計算或是分布式處理情況下優化梯度下降法的算法和架構。最後,我們會考慮一下其他有助於優化梯度下降法的策略。
  • 隨機梯度下降法介紹及其參數講解
    算法介紹簡單來說,梯度下降就是從山頂找一條最短的路走到山腳最低的地方。
  • Batch、Mini-batch和隨機梯度下降的區別和Python示例
    在研究機器學習和深度學習時出現的主要問題之一是梯度下降的幾種類型。在梯度下降的三種類型(Batch梯度下降、Mini-batch梯度下降和隨機梯度下降)中,我應該使用哪一種呢?在這篇文章中,我們將了解這些概念之間的區別,並從梯度下降的代碼實現來闡明這些方法。
  • 機器學習 101:一文帶你讀懂梯度下降
    現在我們已經公式化了我們的學習算法,讓我們深入研究代碼。 首先,我們使用pandas在python中加載數據,並分離房屋大小和價格特徵。之後,我們對數據進行標準化,以防止某些特徵的大小範圍與其他特徵不同。而且,標準化過的數據在進行梯度下降時,收斂速度比其他方法快得多。
  • 10個梯度下降優化算法+備忘單
    第2種方法通常會使用梯度(Gradient)的滑動平均(也可稱之為「動量」)而不是純梯度來決定下降方向。第3種方法則是結合兩者,例如Adam和AMSGrad。隨機梯度下降(Stochastic Gradient Descend)最原始的隨機梯度下降算法主要依據當前梯度∂L/∂w乘上一個係數學習率α來更新模型權重w的。
  • 從頭開始:用Python實現帶隨機梯度下降的Logistic回歸
    本文由機器之心編輯,「機器之心」專注生產人工智慧專業性內容,適合開發者和從業者閱讀參考。點擊右上角即刻關注。logistic 回歸是一種著名的二元分類問題的線性分類算法。它容易實現、易於理解,並在各類問題上有不錯的效果,即使該方法的原假設與數據有違背時。在本教程中,你將了解如何在 Python 中實現隨機梯度下降的 logistic 回歸算法。
  • 線性回歸和梯度下降的初學者教程
    這就是為什麼我們需要使用梯度下降。梯度下降是一種找到最佳擬合線的工具。在深入研究梯度下降之前,先看看另一種計算最佳擬合線的方法。最佳擬合線的統計計算方法:直線可以用公式表示:y=mx+b。回歸線斜率m的公式為:m = r * (SD of y / SD of x)。
  • 一文看懂各種神經網絡優化算法:從梯度下降到Adam方法
    應該用梯度下降,隨機梯度下降,還是Adam方法? 這篇文章介紹了不同優化算法之間的主要區別,以及如何選擇最佳的優化方法。 什麼是優化算法? 優化算法的功能,是通過改善訓練方式,來最小化(或最大化)損失函數E(x)。 模型內部有些參數,是用來計算測試集中目標值Y的真實值和預測值的偏差程度的,基於這些參數,就形成了損失函數E(x)。
  • 最清晰的講解各種梯度下降法原理與Dropout
    一、梯度法思想梯度法思想的三要素:出發點、下降方向、下降步長。機器學習中常用的權重更新表達式為:,這裡的λ就是學習率,本文從這個式子出發來把機器學習中的各種「梯度」下降法闡釋清楚。第二、隨機梯度下降法(Stochastic Gradient Descent)SGD一輪迭代只用一條隨機選取的數據,儘管SGD的迭代次數比BGD大很多,但一次學習時間非常快。
  • 吳恩達機器學習筆記 - 線性回歸、代價函數與梯度下降
    比如預測房屋價格:輸入和輸出:房屋的預測價格 y = h(房屋面積 x)機器學習算法的訓練就是計算最優的參數 a 和 b,這裡的函數只有一個輸入特徵面積,所以叫單變量線性回歸模型。三、代價函數我的理解:代價函數(cost function,loss function)在機器學習中的作用是確定最優的函數參數,使得擬合數據點的誤差達到最小,即擬合效果最好。
  • 一文讀懂線性回歸和梯度下降
    這又牽扯到一個概念:梯度下降(Radient Descent)最小均方算法(Least mean square,LMS算法)(對的朋友,你沒有看錯,不是梯度下降,是LMS算法。我們又兩種方式將只有一個樣本的數學表達轉化為樣本為多個的情況:梯度下降(gradient descent)和正則方程(The normal equations)。這裡我們重點講梯度下降。
  • 機器學習之多元線性回歸模型梯度下降公式與代碼實現(篇二)
    上一篇我們介紹了線性回歸的概述和最小二乘的介紹,對簡單的一元線性方程模型手推了公式和python代碼的實現。梯度下降法又稱最速下降法,是求解無約束最優化問題的一種最常用的方法,在對損失函數最小化時經常使用。梯度下降法是一種迭代算法。選取適當的初值x(0),不斷迭代,更新x的值,進行目標函數的極小化,直到收斂。
  • 從梯度下降到擬牛頓法:詳解訓練神經網絡的五大學習算法
    通過這種方式,一般我們會由初始參數向量開始(通常為隨機初始化)訓練神經網絡。然後,算法會更新生成一組新參數,訓練損失函數也會在每一次算法迭代中使用更新的參數進行函數值的降低。兩步迭代之間的的訓練損失減少又稱之為訓練損失衰減率(loss decrement)。
  • 文科生都能看懂的機器學習教程:梯度下降、線性回歸、邏輯回歸
    現在,機器學習這麼火,想入行的人越來越多,然而被搞糊塗的人也越來越多。因為大眾很難理解機器學習是幹嗎的?那些神秘拗口的概念,比如邏輯回歸、梯度下降到底是什麼?j  一個23歲的藥物學專業的學生說,當他去參加機器學習培訓課程的時候,感覺自己就家裡那位不懂現代科技的奶奶。
  • 一分鐘看完梯度下降法
    今天,我想講一下梯度下降法(Gradient Descent),基於線性回歸損失函數的梯度下降法。