在向量微積分中,標量場的梯度是一個向量場。標量場中某一點上的梯度指向標量場增長最快的方向,梯度的長度是這個最大的變化率。更嚴格的說,從歐幾里得空間Rn到R的函數的梯度是在Rn某一點最佳的線性近似。
在判別式模型中,我們往往需要學習參數,從而使得我們的模型f(x)可以逼近實際的y。如果學習參數,則通常會用到梯度下降、牛頓、擬牛頓學習算法。
1.梯度下降
1.1 爲何使用梯度作爲下降方向?
梯度實際上是函數值變化最快的方向。
比如說,你站在一個山上,梯度所指示的方向是高度變化最快的方向。你沿着這個方向走,能最快的改變(增加或是減小)你所在位置的高度,但是如果你亂走,可能走半天所在位置高度也沒有變化多少。也就是說,如果你一直沿着梯度走,你就能最快的到達山的某個頂峯或低谷(偶爾會到鞍點,不過這幾乎不可能)。
所以實際上,梯度下降法是用來數值搜索局部極小值或極大值的,它是實際應用中一種非常高效,高速且可靠的方法。
1.2 以邏輯斯蒂迴歸(LR)爲例
- 模型參數估計
- 梯度下降學習參數
- 最終模型
1.3 具體學習過程(python代碼示例)
梯度下降是最小化風險函數、損失函數的一種常用方法,隨機梯度下降和批量梯度下降是兩種迭代求解思路。
根據batch_size的不同,可以有大概一下幾種形式。
(1)梯度下降僞代碼
- 每個迴歸參數初始化爲1
- 重複R次
- 計算整個數據集的梯度
- 使用alpha × gradient更新迴歸係數的向量
- 返回迴歸係數
示例代碼:
def gradAscent(dataMatIn, classLabels):
dataMatrix = mat(dataMatIn) #convert to NumPy matrix
labelMat = mat(classLabels).transpose() #convert to NumPy matrix
m,n = shape(dataMatrix)
alpha = 0.001
maxCycles = 500
weights = ones((n,1))
for k in range(maxCycles): #heavy on matrix operations
h = sigmoid(dataMatrix*weights) #matrix mult
error = (labelMat - h) #vector subtraction
weights = weights + alpha * dataMatrix.transpose()* error #matrix mult
return weights
(2)隨機梯度下降僞代碼:
- 每個迴歸參數初始化爲1
- 重複R次
- 計算每個樣本的梯度
- 使用alpha × gradient更新迴歸係數的向量
- 返回迴歸係數
示例代碼:
細心的讀者可以看到,其中alpha是變化的,這樣可以在一定程度上避免局部最優解。
def stocGradAscent1(dataMatrix, classLabels, numIter=150):
m,n = shape(dataMatrix)
weights = ones(n) #initialize to all ones
for j in range(numIter):
dataIndex = range(m)
for i in range(m):
alpha = 4/(1.0+j+i)+0.0001 #apha decreases with iteration, does not
randIndex = int(random.uniform(0,len(dataIndex)))#go to 0 because of the constant
h = sigmoid(sum(dataMatrix[randIndex]*weights))
error = classLabels[randIndex] - h
weights = weights + alpha * error * dataMatrix[randIndex]
del(dataIndex[randIndex])
return weights
(3)自定義batch_size,算法流程與上面基本差不錯,累計誤差更新參數。梯度下降,就是batch_size = 全部樣本量,隨機梯度下降就是batch_size = 1。
2.牛頓法
2.1 基本介紹
在最優化的問題中,線性最優化至少可以使用單純行法求解,但對於非線性優化問題,牛頓法提供了一種求解的辦法。假設任務是優化一個目標函數f,求函數f的極大極小問題,可以轉化爲求解函數f的導數f’=0的問題,這樣求可以把優化問題看成方程求解問題(f’=0)。
爲了求解f’=0的根,把f(x)的泰勒展開,展開到2階形式:
這個式子是成立的,當且僅當 Δx 無線趨近於0。此時上式等價與:
求解:
得出迭代公式:
一般認爲牛頓法可以利用到曲線本身的信息,比梯度下降法更容易收斂(迭代更少次數),如下圖是一個最小化一個目標方程的例子,紅色曲線是利用牛頓法迭代求解,綠色曲線是利用梯度下降法求解。
2.2 算法流程
2.3 特性
- 牛頓法收斂速度爲二階,對於正定二次函數一步迭代即達最優解。
- 牛頓法是局部收斂的,當初始點選擇不當時,往往導致不收斂
- 牛頓法不是下降算法,當二階海塞矩陣非正定時,不能保證產生方向是下降方向。
- 二階海塞矩陣必須可逆,否則算法進行困難。
- 對函數要求苛刻(二階連續可微,海塞矩陣可逆),而且運算量大。
2.4 牛頓法的改進
3.擬牛頓法
3.1 特徵
- 只需用到函數的一階梯度;(Newton法用到二階Hesse陣)
- 下降算法,故全局收斂;
- 不需求矩陣逆;(計算量小)
- 一般可達到超線性收斂;(速度快)
- 有二次終結性。
3.2 DFP法
x, s, y, H 表示第k 步的量,等表示第k+1步的量。
3.3 BFGS法
若把前面的推導,平行地用在y=Bs公式上,可得到
用此公式求方向時,需用到矩陣求逆或解方程
由於每次只有秩2的變換,這裏的計算量仍可以降下來。爲了得到H-公式,可對上面求逆(推導得):
BFGS法有擬牛頓法的全部優點,並且在一定條件下可以證明在BFGS法中使用不精確一維搜索有全局收斂性。
參考文獻
(1)《統計學習方法》
(2)《機器學習實戰》
(3)《運籌學與最優化方法》