5.2 三種梯度下降
在上節(jié)中戳寸,我們使用了梯度下降實現(xiàn)了多元線性回歸。如果你仔細看過上面的算法拷泽。你就知道疫鹊,這個算法能夠找到一個解是很自然的。對于單個數(shù)據(jù)點來說司致,這個解并沒有什么意義拆吆。因為實際上我們解的是一個四元一次方程,而僅僅只有一個輸入點的話脂矫,四元一次方程有無數(shù)個解滿足這個輸入枣耀。所以找到一個解并不稀奇。比如我們輸入第二個數(shù)據(jù)點羹唠。
inputs = np.array(
[cost_of_material[1],
cost_of_sales[1],cost_of_human[1], cost_of_product[1]]
)
print("預測價格2:", inputs.dot(weights))
print("實際價格2:", sell_price[1]*100)
它的輸出是:
預測價格2: 94.33426689722515
實際價格2: 102.0
可見實際的誤差非常巨大奕枢。計算機學習的過程不是要找到最適合某個特殊點的一組權(quán)重娄昆,而是找到一組權(quán)重,使得整體的誤差最小缝彬。
如何獲得整體誤差萌焰?
如果我們對每一條數(shù)據(jù),都更新權(quán)重谷浅。這種情形叫做隨機梯度下降扒俯,因為每次更新的權(quán)重都會使得權(quán)重擺動。我們無法預知權(quán)重擺動的方向一疯,每次學習都是獨立的撼玄。
這種方案假定系統(tǒng)中存在一種主導的保守勢能,或者是類似于物理中的中心力場墩邀。這種邏輯認為背后的保守勢能是一種外場掌猛,而每條數(shù)據(jù)點都處在這種外場影響下,所以最后每條數(shù)據(jù)點都會趨于同一組最優(yōu)權(quán)重眉睹。這就是隨機梯度下降學習法的核心邏輯荔茬。但是這種算法對于每一條數(shù)據(jù)都會過度響應,所以算法最后停止在哪條數(shù)據(jù)上竹海,對于學到的權(quán)重有比較大的影響慕蔚。所以往往需要遍歷數(shù)據(jù)集很多次,最后取平均值作為學習到的權(quán)重斋配。
第二種梯度下降學習法是完全梯度下降法孔飒。它對整個數(shù)據(jù)集計算權(quán)重更新的平均值,即梯度的平均值艰争,在均值計算完成后更新權(quán)重坏瞄。它與上面的兩種方案不一樣,它是每次計算梯度后不運用到每條數(shù)據(jù)上甩卓,而是等所有梯度都算完了再用平均值更新所有的數(shù)據(jù)點的下一步學習的權(quán)重惦积。這種完全梯度下降法的弊端在于學習速率的全局化,學習速率全局化意味著無法靈活調(diào)整學習速度猛频,所以每次調(diào)參需要花費很長的時間。學習效率無法提升蛛勉。
第三種方案是對一批數(shù)據(jù)而非全部學習鹿寻,然后取學到的權(quán)重的平均值作為下一批數(shù)據(jù)的基準權(quán)重。這種梯度下降學習法叫做批處理梯度下降诽凌。它避免了隨機梯度下降的單條數(shù)據(jù)的過度響應的問題毡熏,對于學習速率也很容易控制,而且甚至可以通過抽樣的方法來快速訓練一部分數(shù)據(jù)侣诵。所以往往最多只需要遍歷一遍數(shù)據(jù)就可以得到最優(yōu)權(quán)重痢法,在很多時候甚至可以只學習很小一部分樣本狱窘,比如十分之一的樣本,就可以得到比較準確的結(jié)果财搁。從算法效率上來講蘸炸,批處理梯度下降的效率是非常高的。因為它的計算可以大大利用矩陣算法的效率尖奔,而且不用多次遍歷數(shù)據(jù)搭儒。
我們將在后面的小節(jié)中著重講這三種梯度下降法。