日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

梯度下降法和随机梯度下降法的区别

發布時間:2025/3/15 编程问答 18 豆豆
生活随笔 收集整理的這篇文章主要介紹了 梯度下降法和随机梯度下降法的区别 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

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

?

? ?一.介紹

? ? ??梯度下降法(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 = {+1, -1},由輸入空間到輸出空間的如下函數

? ? ? ? ? ? ? ? ? ? ? ? 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 ?<—— ? w -?η * (-yixi)

? ? ? ? ? ? b ?<—— ? ?b -?η * (-yi) ? ? ? ? ? ? ? ? 式中η(0 < η <= 1)是步長,在統計學習中又稱為學習率(learning rate)

??

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

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

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

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

? ? ? 幸運的是,猜想成立了。

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

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

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

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

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

?四.代碼及實例:

??1. 對于第一種場景

? ? ? ? ?

1 /*2 * 隨機梯度下降實驗:3 * 訓練集輸入為矩陣:4 * 1,45 * 2,56 * 5,17 * 4,28 * 輸出結果為:9 * 19 10 * 26 11 * 19 12 * 20 13 * 需要參數為 w: 14 * ? 15 * ? 16 * 17 * 目標函數:y=w0*x0+w1*x1; 18 * 19 * */ 20 #include<stdio.h> 21 #include <stdlib.h> 22 int main() 23 { 24 double matrix[4][2]={{1,4},{2,5},{5,1},{4,2}}; 25 double result[4]={19,26,19,20}; 26 double w[2]={0,0};//初始為零向量 27 double loss=10.0; 28 const double n = 0.01; //步長 29 for(int i=0;i<100&&loss>0.001;i++) 30 { 31 double error_sum=0; 32 int j=i%4; 33 { 34 double h=0; 35 for(int k=0;k<2;k++) 36 { 37 h+=matrix[j][k]*w[k]; 38 } 39 error_sum = h - result[j]; 40 for(int k=0;k<2;k++) 41 { 42 w[k]-= n * (error_sum) * matrix[j][k];//這里是關鍵 43 } 44 } 45 printf("%lf,%lf\n",w[0],w[1]); 46 double loss=0; 47 for(int j=0;j<4;j++) 48 { 49 double sum=0; 50 for(int k=0;k<2;k++) 51 { 52 sum += matrix[j][k] * w[k]; 53 } 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,35 * 4,36 * 1,17 * 輸出結果為(表示實例的分類):8 * 1 9 * 1 10 * -1 11 * 需要參數為 w: 12 * ? 13 * ? 14 * 15 * 目標函數:y = w0 * x0 + w1 * x1 + b; 16 * 17 * */ 18 #include<stdio.h> 19 #include <stdlib.h> 20 int main() 21 { 22 double x[3][2]={{3,3},{4,3},{1,1}}; 23 double y[4]={1, 1, -1}; 24 double w[2]={0,0};//初始為零向量 25 double b = 0; 26 int j; 27 const double n = 1; //步長 28 29 while(1) 30 { 31 for(j=0;j<3;j++) 32 { 33 if(y[j] * (w[0] * x[j][0] + w[1] * x[j][1] + b) <= 0) 34 break; 35 } 36 if(j < 3) 37 { 38 for(int k=0;k<2;k++) 39 w[k] += n * y[j] * x[j][k];//這里是關鍵 40 b += n * y[j]; 41 } 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 。

總結

以上是生活随笔為你收集整理的梯度下降法和随机梯度下降法的区别的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。