1. 程式人生 > >梯度下降法(GD,SGD,Mini-Batch GD)線上性迴歸中的使用

梯度下降法(GD,SGD,Mini-Batch GD)線上性迴歸中的使用

https://github.com/crystal30/SGDLinrearRegression

一.  梯度下降法(Batch Gradient Descent)

1.梯度下降法的原理

(1)   梯度下降法是一種基於搜尋的最優化方法,不是一個機器學習演算法。

(2)   作用:最小化一個損失函式.

擴充套件:梯度上升法與梯度下降法相反,是最大化一個效用函式。

如下圖eta太大,得不到最優解


另外,梯度下降法有可能找不到全域性最優解,只能找到區域性最優解


2.線性迴歸中使用梯度下降法





3.向量化計算

為程式設計方便,把計算過程整理為向量的形式




在這裡向量y和theta均預設為列向量

4.線性迴歸中使用梯度下降法的演算法步驟

二、隨機梯度下降法(Stochastic Gradient Descent)

1.隨機梯度下降法的原理

隨機梯度下降法即指:每次計算梯度時,只隨機的選取一個樣本來計算梯度,這樣就大大的減小了計算的複雜度


批量梯度下降法比較穩定,一定可以朝著函式的極小值的方向(如果函式只有一個極小值,則可以說是最小值)邁進。

隨機梯度下降法速度快,但每次的方向不穩定,甚至可能向反方向(函式上升的方向)邁進。

隨機梯度下降法的優點:更快的執行速度。且機器學習演算法領域很多演算法都需使用隨機的優點(如隨機搜尋,隨機森林)

隨機梯度下降法的缺點: 可能跳出區域性最優解

2.線性迴歸中使用隨機梯度下降法的演算法步驟

(1)將資料分為訓練資料和測試資料

(2)分別將訓練資料和測試資料歸一化(注:利用多元線性迴歸的正規方程解不需要資料歸一化,因為其是一個具體的公式,帶入具體的數值即可;而梯度下降法中,每一個特徵相當於一個維度,當某個維度的量綱較大時,會導致整體的搜尋步長變大,演算法效能有所下降)

X為訓練資料,y為target,共有m個樣本;Xb為全1的列向量與X的拼接

程式實現:Xb = numpy.hstack([numpy.ones(shape=(X.shape[0],1)),X])

(6)當i=m時,i_iters =i_iters+1(遍歷次數加一)

(7)當i_iters>iters,終止迭代,否則繼續進入(3)

三.小批量梯度下降法(Mini-Batch Gradient Descent)

1.小批量梯度下降法

批量梯度下降法一定能沿著極小值的方向邁進,比較穩定,然而每次計算梯度時都需要遍歷所有樣本,計算量比較大。

隨機梯度下降法的運算速度雖然比較快,但有可能跳出區域性最優解,每次的邁進方向不穩定,甚至有可能向反方向邁進。

故每次計算梯度時,選取一部分樣本,即小批量梯度下降法。與隨機梯度下降法相比,增強了方向的穩定性。與批量梯度下降法相比,運算量大大減少,執行速度也更快。

2.線性迴歸中使用小批量梯度下降法的演算法步驟

(1)將資料分為訓練資料和測試資料

(2)分別將訓練資料和測試資料歸一化(注:利用多元線性迴歸的正規方程解不需要資料歸一化,因為其是一個具體的公式,帶入具體的數值即可;而梯度下降法中,每一個特徵相當於一個維度,當某個維度的量綱較大時,會導致整體的搜尋步長變大,演算法效能有所下降)

X為訓練資料,y為target,共有m個樣本;Xb為全1的列向量與X的拼接

程式實現:Xb = numpy.hstack([numpy.ones(shape=(X.shape[0],1)),X])

(6) 當i=m//batch時,i_iters =i_iters+1(遍歷次數加一)

(7) 當i_iters>iters,終止迭代,否則繼續進入(3)

四.梯度的除錯

1.利用梯度的定義來進行梯度除錯

梯度下降法不僅能線上性迴歸中使用,在其他演算法中也具有廣泛的用途。當損失函式非常複雜,不能確保分析得出的梯度表示式準確時,可以參照一個benchmark(通過定義求梯度),看我們的梯度表示式是否正確(當然引起與benchmark不同的原因有很多,這裡我們不考慮其他原因)。這就是我們所說的梯度除錯