梯度下降、牛頓法、擬牛頓法

介紹

在向量微積分中,標量場的梯度是一個向量場。標量場中某一點上的梯度指向標量場增長最快的方向,梯度的長度是這個最大的變化率。更嚴格的說,從歐幾里得空間Rn到R的函數的梯度是在Rn某一點最佳的線性近似。

判別式模型中,我們往往需要學習參數,從而使得我們的模型f(x)可以逼近實際的y。如果學習參數,則通常會用到梯度下降、牛頓、擬牛頓學習算法。


參考自網絡資源

1.梯度下降

1.1 爲何使用梯度作爲下降方向?

梯度實際上是函數值變化最快的方向。

比如說,你站在一個山上,梯度所指示的方向是高度變化最快的方向。你沿着這個方向走,能最快的改變(增加或是減小)你所在位置的高度,但是如果你亂走,可能走半天所在位置高度也沒有變化多少。也就是說,如果你一直沿着梯度走,你就能最快的到達山的某個頂峯或低谷(偶爾會到鞍點,不過這幾乎不可能)。

所以實際上,梯度下降法是用來數值搜索局部極小值或極大值的,它是實際應用中一種非常高效,高速且可靠的方法。

1.2 以邏輯斯蒂迴歸(LR)爲例

  1. 模型參數估計
  2. 梯度下降學習參數
  3. 最終模型

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 特性

  1. 牛頓法收斂速度爲二階,對於正定二次函數一步迭代即達最優解。
  2. 牛頓法是局部收斂的,當初始點選擇不當時,往往導致不收斂
  3. 牛頓法不是下降算法,當二階海塞矩陣非正定時,不能保證產生方向是下降方向。
  4. 二階海塞矩陣必須可逆,否則算法進行困難。
  5. 對函數要求苛刻(二階連續可微,海塞矩陣可逆),而且運算量大。

2.4 牛頓法的改進

3.擬牛頓法

3.1 特徵

  1. 只需用到函數的一階梯度;(Newton法用到二階Hesse陣)
  2. 下降算法,故全局收斂;
  3. 不需求矩陣逆;(計算量小)
  4. 一般可達到超線性收斂;(速度快)
  5. 有二次終結性。

3.2 DFP法

x, s, y, H 表示第k 步的量,等表示第k+1步的量。

3.3 BFGS法

若把前面的推導,平行地用在y=Bs公式上,可得到

用此公式求方向時,需用到矩陣求逆或解方程

由於每次只有秩2的變換,這裏的計算量仍可以降下來。爲了得到H-公式,可對上面求逆(推導得):

BFGS法有擬牛頓法的全部優點,並且在一定條件下可以證明在BFGS法中使用不精確一維搜索有全局收斂性。

參考文獻
(1)《統計學習方法》
(2)《機器學習實戰》
(3)《運籌學與最優化方法》

發佈了70 篇原創文章 · 獲贊 267 · 訪問量 107萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章