為什么要加速神經網絡,數據量太大,學習效率太慢。越復雜的神經網絡 , 越多的數據,需要在訓練神經網絡的過程上花費的時間也就越多。原因很簡單,就是因為計算量太大了。可是往往有時候為了解決復雜的問題,復雜的結構和大數據又是不能避免的,所以需要尋找一些方法, 讓神經網絡訓練變得快起來。為了便於理解,這里我們將使用只含有一個特征的線性回歸來展開。此時線性回歸的假設函數為:


一、隨機梯度下降法:Stochastic Gradient Descent (SGD)
批量梯度下降法(Batch Gradient Descent,簡稱BGD)是梯度下降法最原始的形式,具體思路是在更新每一參數時都要使用所有的樣本來進行更新,其數學形式如下:
①、對目標函數求偏導:
其中i=1,2,...,m 表示樣本數, j=0,1表示特征數,這里是有了偏置項為0。
②、每次迭代對參數進行更新:
偽代碼形式:
優點:(1)一次迭代是對所有樣本進行計算,此時利用矩陣進行操作,實現了並行。
(2)由全數據集確定的方向能夠更好地代表樣本總體,從而更准確地朝向極值所在的方向。當目標函數為凸函數時,BGD一定能夠得到全局最優。
缺點:(1)當樣本數目 mm 很大時,每迭代一步都需要對所有樣本計算,訓練過程會很慢。從迭代的次數上來看,BGD迭代的次數相對較少。
隨機梯度下降法(SGD):隨機梯度下降法不同於批量梯度下降,隨機梯度下降是每次迭代使用一個樣本來對參數進行更新。使得訓練速度加快。
①、對一個樣本的目標函數為:
②、對目標函數求偏導:
③、參數更新:
偽代碼形式:
優點:(1)由於不是在全部訓練數據上的損失函數,而是在每輪迭代中,隨機優化某一條訓練數據上的損失函數,這樣每一輪參數的更新速度大大加快。
缺點:(1)准確度下降。由於即使在目標函數為強凸函數的情況下,SGD仍舊無法做到線性收斂。
(2)可能會收斂到局部最優,由於單個樣本並不能代表全體樣本的趨勢。
(3)不易於並行實現。
為什么SGD收斂速度比BGD要快:
假設有30W個樣本,對於BGD而言,每次迭代需要計算30W個樣本才能對參數進行一次更新,需要求得最小值可能需要多次迭代(假設這里是10);而對於SGD,每次更新參數只需要一個樣本,因此若使用這30W個樣本進行參數更新,則參數會被更新(迭代)30W次,而這期間,SGD就能保證能夠收斂到一個合適的最小值上了。也就是說,在收斂時,BGD計算了 10×30W10×30W 次,而SGD只計算了 1×30W1×30W 次。
二、Momentum 更新方法
傳統的參數 W 的更新是把原始的 W 累加上一個負的學習率(learning rate) 乘以校正值 (dx),這種方法可能會讓學習過程曲折無比。公式如下:
W+=-learning rate * dx
momentum的更新方法,公式如下:
m=b1*m-learning rate * dx
W+=m
三、AdaGrad 更新方法
v+=dx^2
W+=-learning rate * dx/(根號v)
四、RMSProp 更新方法
v=b1*v+(1-b1)*dx^2
W+=-learning rate * dx/(根號v)
五、Adam 更新方法
m=b1*m-learning rate * dx
v=b1*v+(1-b1)*dx^2
W+=-learning rate *m/(根號v)