生活随笔
收集整理的這篇文章主要介紹了
《机器学习》 梯度下降
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
《機器學習》 梯度下降
2012-09-21 17:46 2712人閱讀 收藏 舉報
matrixc
參照《機器學習》這本書的第4.4.3節(jié)。
一.解決目標及情景假設:
當給定一些數(shù)據(jù),輸入x向量已知,輸出y也已知,設計一個線性函數(shù)y=h(x)去擬合這些數(shù)據(jù)。
既然是線性函數(shù),在此不妨設為h(x)=w0*x0+w1*x1。
此時我們遇到的問題就是如何確定w0和w1這兩個參數(shù),即w=(w0,w1)這個向量。
既然是擬合,則擬合效果可以用誤差函數(shù):E(w)=∑ [ h(x)- y ] ^2 / 2 來衡量。
其中w是權(quán)重二維向量,x是輸入二維向量,x和y都是訓練集的數(shù)據(jù),即已知。
至于后面除于2只是為了之后的推導過程中對E求導時候可以消除系數(shù),暫時可以不管。
因為我們解決的目標是找出一個向量w=(w0,w1)使得E(w)值最小,即誤差最小。
其實這個問題本質(zhì)上也是搜索最優(yōu)解的問題,如果用暴力搜索的話,隨機取每個可能的值去讓機器每天每夜地跑,顯然這是不可能的。
所以此時有一種搜索策略:梯度下降。
二. 梯度下降方法:
梯度其實就是高數(shù)求導方法,對E這個公式針對每個維數(shù)(w0,w1)求偏導后的向量▽E(w)=(?E/?w0,?E/?w1)
梯度為最陡峭上升的方向,對應的梯度下降的訓練法則為:
w=w-η▽E(w)
這里的η代表學習速率,決定梯度下降搜索中的步長 。
上式的w是向量,即可用將該式寫成分量形式為:wi=wi-η*?E/?wi
現(xiàn)在關(guān)鍵就使計算?E/?wi:
推導過程很簡單,書上寫的很詳細,這里只記錄結(jié)論:
?E/?wi=∑(h(x)-y)*(xi)
這里的∑是對樣本空間,即訓練集進行一次遍歷,耗費時間較大,可以使用梯度下降的隨機近似:
隨機梯度下降策略來改進時間。
三.隨機梯度下降的隨機近似:
既然是隨機近似,則顧名思義,肯定是用近似方法來改善梯度下降時候的時間復雜度問題。
正如上所說,在?E/?wi=∑(h(x)-y)*(xi)
的時候∑耗費了大量的時間,特別是在訓練集龐大的時候。
所以肯定有人會猜想,如果把求和去掉如何,即變?yōu)?span style="line-height:22px; font-family:Arial; font-size:14px; white-space:pre-wrap; background-color:rgb(255,252,246)">?E/?wi=(h(x)-y)*(xi)。
幸運的是,猜想成立了。
只是要注意一下標準的梯度下降和隨機梯度下降的區(qū)別:
1.標準下降時在權(quán)值更新前匯總所有樣例得到的標準梯度,隨機下降則是通過考察每次訓練實例來更新。
2.對于步長 η的取值,標準梯度下降的η比隨機梯度下降的大。
因為標準梯度下降的是使用準確的梯度,理直氣壯地走,隨機梯度下降使用的是近似的梯度,就得小心翼翼地走,怕一不小心誤入歧途南轅北轍了。
3.當E(w)有多個局部極小值時,隨機梯度反而更可能避免進入局部極小值中。
四.代碼及實例:
直接照著別人博客代碼敲的一遍:http://blog.csdn.net/pennyliang/article/details/6998517
[cpp] view plaincopyprint?
?????????????????????#include<stdio.h>??int?main()??{??????double?matrix[4][2]={{1,4},{2,5},{5,1},{4,2}};??????double?result[4]={19,26,19,20};??????double?theta[2]={0,0};??????double?loss=10.0;??????for(int?i=0;i<100&&loss>0.001;i++)??????{??????????double?error_sum=0;??????????int?j=i%4;??????????{??????????????double?h=0;??????????????for(int?k=0;k<2;k++)??????????????{??????????????????h+=matrix[j][k]*theta[k];??????????????}??????????????error_sum=result[j]-h;???????????????for(int?k=0;k<2;k++)???????????????{???????????????????theta[k]+=0.01*(error_sum)*matrix[j][k];???????????????}???????????}???????????printf("%lf,%lf\n",theta[0],theta[1]);???????????double?loss=0;???????????for(int?j=0;j<4;j++)???????????{???????????????double?sum=0;???????????????for(int?k=0;k<2;k++)???????????????{???????????????????sum+=matrix[j][k]*theta[k];???????????????}???????????????loss+=(sum-result[j])*(sum-result[j]);???????????}???????????printf("%lf\n",loss);???????}???????????return?0;???}?? /** 隨機梯度下降實驗:* 訓練集輸入為矩陣:* 1,4* 2,5* 5,1* 4,2* 輸出結(jié)果為:* 19* 26* 19* 20* 需要參數(shù)為theta:* ?* ?** 目標函數(shù):y=theta0*x0+theta1*x1;*** */
#include<stdio.h>
int main()
{double matrix[4][2]={{1,4},{2,5},{5,1},{4,2}};double result[4]={19,26,19,20};double theta[2]={0,0};//初始為零向量double loss=10.0;for(int i=0;i<100&&loss>0.001;i++){double error_sum=0;int j=i%4;{double h=0;for(int k=0;k<2;k++){h+=matrix[j][k]*theta[k];}error_sum=result[j]-h;for(int k=0;k<2;k++){theta[k]+=0.01*(error_sum)*matrix[j][k];//這里是關(guān)鍵}}printf("%lf,%lf\n",theta[0],theta[1]);double loss=0;for(int j=0;j<4;j++){double sum=0;for(int k=0;k<2;k++){sum+=matrix[j][k]*theta[k];}loss+=(sum-result[j])*(sum-result[j]);}printf("%lf\n",loss);}return 0;}
結(jié)果可以得出c0=3,c1=4。
http://blog.csdn.net/wuyanyi/article/details/8003946
總結(jié)
以上是生活随笔為你收集整理的《机器学习》 梯度下降的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。