對梯度下降的理解

在神經網絡以及很多機器學習模型的訓練優化過程中,不可避免的需要用到梯度下降,可以說梯度下降是很多機器學習算法的核心。這篇文章首先介紹了梯度,偏導數等,然後根據一個具體的例子“根據歷史數據來預測當前房價”講解梯度下降及其代碼實現,在實例中使用了Mini-Batch梯度下降(Mini-Batch Stochastic Gradient),並解釋了其誤差迭代曲線的變化趨勢和原因。

梯度下降的基本概念

說起求解梯度,也就是求解函數的導數,簡單來說,導數就是某個點函數變化率或斜率。例如我們有如下圖所示的一個函數f(x)=x2 ,那麼f(x) 在x處的倒數就是在該點時f(x) 的斜率,當x=2時,該點的導數就爲2*2=4.
這裏寫圖片描述
其實梯度和導數是完全一樣的東西,只是梯度(Gradient)是一個存儲偏導數的矢量值函數。所以,梯度是一個向量,它的每個分量都是一個特定變量的偏導數。
現在我們選用一個多變量函數f(x,y)=2x2+y2 作爲例子, 這裏f(x,y) 的梯度是一個矢量,同時包含x和y。下面我們分別計算f(x,y) 的偏導數可以得到:
fx=4x
fy=2y
梯度爲以下矢量:
Δf(x,y)=[fx,fy]T
Δf(x,y)=[4x,2y]T
同樣的,如果我們有4個變量的函數,我們將得到一個具有4個偏導數的梯度向量,通常,n變量函數具有n維梯度向量。
f(x1,x2,x3,...,xn)=Δf=[x1,x2,...,xn]

下面我們看一個具體實例加深對梯度下降的理解

預測房價

我們的目標是根據歷史數據來預測當前的房價,一般構建一個機器學習模型至少需要3個元素:問題T, 性能指標P和經驗E,然後模型會從歷史數據中學習一中能夠用於數據預測的模式。
這裏我們用一個很簡單的線性模型來建模,模型從經驗E(house 數據集)中學習,然後用於預測數據。
用於實驗的數據可以通過以下鏈接下載:https://wiki.csc.calpoly.edu/datasets/wiki/Houses
該集合中有781個數據記錄,8個特徵,我們本次只關注兩個特徵大小和價格。輸入特徵爲大小,價格是我們的目標值。這裏性能指標我們選用SSE(平方誤差總和).
Err=12((W0+W1Xμ)yμ)2
SSE相對於絕對誤差的特點是SSE比絕對誤差的錯誤的懲罰更大。

下面用代碼來實現,首先我們對數據進行歸一化處理,用歸一化數據做梯度下降會比其他情況快得多。

import pandas as pd
import numpy as np

housing_data = pd.read_csv("/Users/huoshirui/Desktop/xgboost", sep=",")

Xs = housing_data[['Size']]
Ys = housing_data[['Price']]

max_size = np.max(Xs)
min_size = np.min(Xs)
max_price = np.max(Ys)
min_price = np.max(Ys)

# normalization
Xs = (Xs - min_size) / (max_size - min_size)
Ys = (Ys - min_price) / (max_price - min_price)

下圖展示了房屋價格和房屋大小的關係:
這裏寫圖片描述
線性模型就是通過已有的數據來擬合一條直線,最簡單的線性方程的表示如下:
f(x)=mx+b
其中,m爲斜率,b爲與y軸的截距,我們的目標就是尋找到合適的m和b使得誤差最小。
對於梯度下降來說,我們希望採取與梯度相反的方向。
我們改變這兩個值,使得函數值可以沿誤差曲面上最陡的方向下降。每次迭代後,這些權重變化將優化我們的模型使得誤差更小。
這裏寫圖片描述
如上圖所示,我們想儘可能找到最小值,但是可能到局部最小值時訓練就停止了,無法到達全局最小值。
但是並不是所有的局部最小值都是不好的,其中有一些與全局最小值是相近的,這是我們就可以接受局部最小值。
同時,我們在初始化模型權重的方式可能導致它停留在局部最小值,爲了避免這種狀況,我們用來自均0值和低方差的隨機正態分佈的值來初始化兩個權向量。
在每次迭代中,我們將從我們的數據集中隨機採樣子集,並將其與權重線性組合。這個子集稱爲mini-batch。在線性組合之後,我們將模型預測得到的結果送入SSE函數來計算當前誤差。計算誤差的偏導數就可以得到梯度:
對W0求偏導數爲:
W0=(W0+W1X)y
對W1求偏導數爲:
W1=X((W0+W1X)y)
這樣我們就可以得到梯度向量:
ΔErr=[W0,W0]
下面就可以使用梯度來更新權重向量W0和W1,以最大限度的減少誤差值。
更新權重時需要沿着每個相應梯度的相反方向,在每個方向上採取尺寸爲η 的最小步長。其中η 爲學習率,假設η 爲0.1。更新權重可以表達成下面的式子:
W0=W0+η(W0)
W1=W1+η(W1)
完整的模型代碼如下,梯度錢加負號用來保證採用梯度相反的方向
這裏寫圖片描述
每迭代一次權重,都會導致直線向誤差最小的方向移動,當誤差足夠小的時候就可以停止學習了。
這裏寫圖片描述
使用mini-batch隨機梯度下降,可以每次訓練使用一小部分數據集來計算梯度, 加速了梯度下降速度
下圖是每次迭代的誤差曲線圖:
這裏寫圖片描述
這個圖中我們可以發現在剛開始訓練的時候誤差下降的很快,但到迭代次數爲100之後誤差下降就變得很慢。這是因爲一開始指向最陡下降的梯度矢量的幅度很大,兩個權重變化就很快。但當他們接近誤差曲面的頂點是,梯度變化越來越小,導致了權重變化很慢。最後學習曲線穩定了,學習過程完成。

reference:https://towardsdatascience.com/machine-learning-101-an-intuitive-introduction-to-gradient-descent-366b77b52645

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章