1. 程式人生 > >深度學習反向傳播---隨機梯度下降法

深度學習反向傳播---隨機梯度下降法

一、誤差準則函式與隨機梯度下降:

數學一點將就是,對於給定的一個點集(X,Y),找到一條曲線或者曲面,對其進行擬合之。同時稱X中的變數為特徵(Feature),Y值為預測值。

如圖:


一個典型的機器學習的過程,首先給出一組輸入資料X,我們的演算法會通過一系列的過程得到一個估計的函式,這個函式有能力對沒有見過的新資料給出一個新的估計Y,也被稱為構建一個模型。

我們用X1、X2...Xn 去描述feature裡面的分量,用Y來描述我們的估計,得到一下模型:


我們需要一種機制去評價這個模型對資料的描述到底夠不夠準確,而採集的資料x、y通常來說是存在誤差的(多數情況下誤差服從高斯分佈),於是,自然的,引入誤差函式:


關鍵的一點是如何調整theta值,使誤差函式J最小化。J函式構成一個曲面或者曲線,我們的目的是找到該曲面的最低點:


假設隨機站在該曲面的一點,要以最快的速度到達最低點,我們當然會沿著坡度最大的方向往下走(梯度的反方向)

用數學描述就是一個求偏導數的過程:


這樣,引數theta的更新過程描述為以下:

   (α表示演算法的學習速率)

二、不同梯度下降演算法的區別:

  • 梯度下降:梯度下降就是我上面的推導,要留意,在梯度下降中,對於的更新,所有的樣本都有貢獻,也就是參與調整.其計算得到的是一個標準梯度。因而理論上來說一次更新的幅度是比較大的。如果樣本不多的情況下,當然是這樣收斂的速度會更快啦~

  • 隨機梯度下降:可以看到多了隨機兩個字,隨機也就是說我用樣本中的一個例子來近似我所有的樣本,來調整,因而隨機梯度下降是會帶來一定的問題,因為計算得到的並不是準確的一個梯度,容易陷入到區域性最優解中

  • 批量梯度下降:其實批量的梯度下降就是一種折中的方法,他用了一些小樣本來近似全部的,其本質就是我1個指不定不太準,那我用個30個50個樣本那比隨機的要準不少了吧,而且批量的話還是非常可以反映樣本的一個分佈情況的。

三、演算法實現與測試:

通過一組資料擬合 y = theta1*x1 +theta2*x2

  1. #Python 3.3.5
  2. import random  
  3. # matrix_A  訓練集
  4. matrix_A = [[1
    ,4], [2,5], [5,1], [4,2]]  
  5. Matrix_y = [19,26,19,20]  
  6. theta = [2,5]  
  7. #學習速率
  8. leraing_rate = 0.005
  9. loss = 50
  10. iters = 1
  11. Eps = 0.0001
  12. #隨機梯度下降
  13. while loss>Eps and iters <1000 :  
  14.     loss = 0
  15.     i = random.randint(0, 4)  
  16.     h = theta[0]*matrix_A[i][0] + theta[1]*matrix_A[i][1]   
  17.     theta[0] = theta[0] + leraing_rate*(Matrix_y[i]-h)*matrix_A[i][0]  
  18.     theta[1] = theta[1] + leraing_rate*(Matrix_y[i]-h)*matrix_A[i][1]  
  19.     Error = 0
  20.     Error = theta[0]*matrix_A[i][0] + theta[1]*matrix_A[i][1] - Matrix_y[i]  
  21.     Error = Error*Error  
  22.     loss = loss +Error  
  23.     iters = iters +1
  24. print ('theta=',theta)  
  25. print ('iters=',iters)  
  26. """ 
  27. #梯度下降 
  28. while loss>Eps and iters <1000 : 
  29.     loss = 0 
  30.     for i in range(4): 
  31.         h = theta[0]*matrix_A[i][0] + theta[1]*matrix_A[i][1]  
  32.         theta[0] = theta[0] + leraing_rate*(Matrix_y[i]-h)*matrix_A[i][0] 
  33.         theta[1] = theta[1] + leraing_rate*(Matrix_y[i]-h)*matrix_A[i][1] 
  34.     for i in range(4): 
  35.         Error = 0 
  36.         Error = theta[0]*matrix_A[i][0] + theta[1]*matrix_A[i][1] - Matrix_y[i] 
  37.         Error = Error*Error 
  38.         loss = loss +Error 
  39.     iters = iters +1 
  40. print ('theta=',theta) 
  41. print ('iters=',iters) 
  42. """
  43. """ 
  44. #批量梯度下降 
  45. while loss>Eps and iters <1000 : 
  46.     loss = 0 
  47.     sampleindex =  random.sample([0,1,2,3],2) 
  48.     for i in sampleindex : 
  49.         h = theta[0]*matrix_A[i][0] + theta[1]*matrix_A[i][1]  
  50.         theta[0] = theta[0] + leraing_rate*(Matrix_y[i]-h)*matrix_A[i][0] 
  51.         theta[1] = theta[1] + leraing_rate*(Matrix_y[i]-h)*matrix_A[i][1] 
  52.     for i in sampleindex : 
  53.         Error = 0 
  54.         Error = theta[0]*matrix_A[i][0] + theta[1]*matrix_A[i][1] - Matrix_y[i] 
  55.         Error = Error*Error 
  56.         loss = loss +Error 
  57.     iters = iters +1 
  58. print ('theta=',theta) 
  59. print ('iters=',iters) 
  60. """


求解結果:
  1. >>>   
  2. theta= [2.99809592161579454.001522800837675]  
  3. iters= 75
但如果對輸入資料新增一些噪聲
  1. matrix_A = [[1.05,4], [2.1,5], [5,1], [4,2]]  
求解結果為:
  1. >>>   
  2. theta= [3.00959506851977253.944718521027671]  
  3. iters= 1000
可見在有噪聲的情況下,要及時調整模型誤差精度、迭代次數上限,一期達到我們的需求。