梯度下降法和隨機梯度下降法的區別

2022-05-22 12:12:08 字數 4376 閱讀 3459

這幾天在看《統計學習方法》這本書,發現 梯度下降法 在 感知機 等機器學習演算法中有很重要的應用,所以就特別查了些資料。   

一.介紹

梯度下降法(gradient descent)是求解無約束最優化問題的一種常用方法,有實現簡單的優點。梯度下降法是迭代演算法,每一步需要求解目標函式的梯度向量。

二.應用場景

1.給定許多組資料(xi, yi),xi (向量)為輸入,yi為輸出。設計乙個線性函式y=h(x)去擬合這些資料。

2.感知機:感知機(perceptron)為二類分類的線性分類模型。 輸入為例項的特徵向量,輸出為例項的類別, 取+1 和 -1 二值。

下面分別對這兩種應用場景進行分析。

1.對於第一種場景:

既然是線性函式,在此不妨設為 h(x) = w0*x0 + w1*x1。

此時我們遇到的問題就是如何確定w0和w1這兩個引數,即w=(w0,w1)這個向量。

既然是擬合,則擬合效果可以用平方損失函式:e(w)=∑ [ h(x)- y ] ^2 / 2 來衡量。

其中w是權重二維向量,x是輸入二維向量,x和y都是訓練集的資料,即已知。

至於後面除於2只是為了之後的推導過程中對e求導時候可以消除係數,暫時可以不管。

因此該問題變成了求e(w)最小值的無約束最優化問題

2.對於第二種場景:

假設輸入空間(特徵向量)為x,輸出空間為y = ,由輸入空間到輸出空間的如下函式

f(x) = sign(w · x + b)       w∈rn     其中 w 叫做權值或者權值向量, b叫做偏振。w · x 表示向量w和x的點積

感知機sign(w · x + b)的損失函式為  l(w, b) = -∑yi(w · xi + b)              x ∈m, m為誤分類點集合。

因此該問題變成了求l(w, b)最小值的無約束最優化問題

三.梯度下降方法

梯度其實就是高數求導方法,對e這個公式針對每個維數(w0,w1)求偏導後的向量▽e(w)=(∂e/∂w0,∂e/∂w1)

1. 對於第一種場景

對e這個公式針對每個維數(w0,w1)求偏導後的向量▽e(w)=(∂e/∂w0,∂e/∂w1)

梯度為最陡峭上公升的方向,對應的梯度下降的訓練法則為: w=w-η▽e(w)     這裡的η代表學習速率,決定梯度下降搜尋中的步長 。

上式的w是向量,即可用將該式寫成分量形式為:wi=wi-η*∂e/∂wi

現在關鍵就使計算∂e/∂wi:

推導過程很簡單,書上寫的很詳細,這裡只記錄結論(其實就是對目標函式求導):

∂e/∂wi=∑(h(x)-y)*(xi)

這裡的∑是對樣本空間,即訓練集進行一次遍歷,耗費時間較大,可以使用梯度下降的隨機近似:

2. 對於第二種場景

感知機學習演算法是誤分類驅動的,具體採用隨機梯度下降方法

▽wl(w, b) =   -∑yixi

▽bl(w, b) =   -∑yi

隨機選取乙個誤分類點(xi,   yi), 對w, b進行更新:

w  b  

四.隨機梯度下降的隨機近似:

既然是隨機近似,則顧名思義,肯定是用近似方法來改善梯度下降時候的時間複雜度問題。

正如上所說,在∂e/∂wi=∑(h(x)-y)*(xi) 的時候∑耗費了大量的時間,特別是在訓練集龐大的時候。

所以肯定有人會猜想,如果把求和去掉如何,即變為∂e/∂wi=(h(x)-y)*(xi)。

幸運的是,猜想成立了。

只是要注意一下標準的梯度下降和隨機梯度下降的區別:

1.標準下降時在權值更新前彙總所有樣例得到的標準梯度,隨機下降則是通過考察每次訓練例項來更新。

2.對於步長 η的取值,標準梯度下降的η比隨機梯度下降的大。

因為標準梯度下降的是使用準確的梯度,理直氣壯地走,隨機梯度下降使用的是近似的梯度,就得小心翼翼地走,怕一不小心誤入歧途南轅北轍了。

3.當e(w)有多個區域性極小值時,隨機梯度反而更可能避免進入區域性極小值中。

四.**及例項:

1. 對於第一種場景

1 /*

2 * 隨機梯度下降實驗:

3 * 訓練集輸入為矩陣:

4 * 1,4

5 * 2,5

6 * 5,1

7 * 4,2

8 * 輸出結果為:

9 * 19

10 * 26

11 * 19

12 * 20

13 * 需要引數為 w:

14 * ?

15 * ?

16 *

17 * 目標函式:y=w0*x0+w1*x1;

18 *

19 * */

20 #include21 #include 22 int main()

23 ,,,};

25 double result[4]=;

26 double w[2]=;//初始為零向量

27 double loss=10.0;

28 const double n = 0.01; //步長

29 for(int i=0;i<100&&loss>0.001;i++)

30

39 error_sum = h - result[j];

40 for(int k=0;k<2;k++)

41

44 }

45 printf("%lf,%lf\n",w[0],w[1]);

46 double loss=0;

47 for(int j=0;j<4;j++)

48

54 loss += (sum - result[j]) * (sum-result[j]);

55 }

56 printf("%lf\n",loss);

57 }

58 59 system("pause");

60 return 0;

61 }

結果可以得出  w0=3,w1=4。

1. 對於第二種場景

1 /*

2 * 基於感知機的隨機梯度下降實驗: 《統計學習方法》- p29-例2.1

3 * 訓練集輸入為矩陣:

4 * 3,3

5 * 4,3

6 * 1,1

7 * 輸出結果為(表示例項的分類):

8 * 1

9 * 1

10 * -1

11 * 需要引數為 w:

12 * ?

13 * ?

14 *

15 * 目標函式:y = w0 * x0 + w1 * x1 + b;

16 *

17 * */

18 #include19 #include 20 int main()

21 ,,};

23 double y[4]=;

24 double w[2]=;//初始為零向量

25 double b = 0;

26 int j;

27 const double n = 1; //步長

28

29 while(1)

30

36 if(j < 3)

37

42 else

43 break;

44 printf("%d :%lf,%lf %lf\n", j, w[0], w[1], b);

45

46 }

47 48 system("pause");

49 return 0;

50 }

結果可以得出  w0=1,w1=1, b = -3 。

參考:1.    

2.    李航 統計學習方法

梯度下降法和隨機梯度下降法

批量梯度下降法 batch gradient descent 在更新引數時使用所有的樣本來進行更新 隨機梯度下降法 stochastic gradient descent 求梯度時沒有用所有的m個樣本的資料,而是僅僅選取乙個樣本j來求梯度。小批量梯度下降法 mini batch gradient d...

梯度下降法和隨機梯度下降法的區別

梯度下降和隨機梯度下降之間的關鍵區別 1 標準梯度下降是在權值更新前對所有樣例彙總誤差,而隨機梯度下降的權值是通過考查某個訓練樣例來更新的。2 在標準梯度下降中,權值更新的每一步對多個樣例求和,需要更多的計算。3 標準梯度下降,由於使用真正的梯度,標準梯度下降對於每一次權值更新經常使用比隨機梯度下降...

降低損失 梯度下降法和隨機梯度下降法

reference 迭代方法圖 包含乙個標題為 計算引數更新 的華而不實的綠框。現在,我們將用更實質的方法代替這種華而不實的演算法。假設我們有時間和計算資源來計算 w1 的所有可能值的損失。對於我們一直在研究的回歸問題,所產生的損失與 w1 的圖形始終是凸形。換言之,圖形始終是碗狀圖,如下所示 凸形...