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


 

      梯度的方向      

梯度:如果函數是一維的變量,則梯度就是導數的方向;如果是大於一維的,梯度就是在這個點的法向量,並指向數值更高的等值線。比如函數f(x,y), 分別對x,y求偏導數,求得的梯度向量就是(∂f/∂x, ∂f/∂y)T,簡稱grad f(x,y)或者▽f(x,y)

梯度上升:如果我們需要求解損失函數的最大值,用梯度上升法來迭代求解。

梯度下降:在最小化損失函數時,可以通過梯度下降法來一步步的迭代求解,得到最小化的損失函數,和模型參數值。梯度下降不一定能夠找到全局的最優解,有可能是一個局部最優解,但當目標函數是凸函數時,梯度下降法的解是全局解。$\theta_i = \theta_i - \alpha\frac{\partial}{\partial\theta_i}J(\theta_0, \theta_1..., \theta_n)$

  • 假設函數(hypothesis function)例如線性回歸的擬合函數為$h_{\theta}(x) = \theta_0+\theta_1x$
  • 損失函數:$J(\theta_0, \theta_1..., \theta_n) = \frac{1}{2m}\sum\limits_{j=0}^{m}(h_\theta(x_0^{(j)}, x_1^{(j)}, ...x_n^{(j)}) - y_j)^2$
  • 算法調優:
    • 步長(learning rate):步長決定了在梯度下降迭代的過程中,每一步沿梯度負方向前進的長度
    • 參數的初始值選擇:由於有局部最優解的風險,需要多次用不同初始值運行算法,關鍵損失函數的最小值,選擇損失函數最小化的初值。
    • 連續特征歸一化

梯度下降法公式的推導:

一階泰勒:$f(x+\Delta x)=f(x)+f'(x)*\Delta x$

目的是使得左邊的值最小,那應該使得$f'(x)\Delta x$為負數,

令$\Delta x = -f'(x)$,這樣上式就變為$f(x+\Delta x)=f(x)-f'(x)*f'(x)$

但是上式只在局部成立,加上修正因子,就變為$\Delta x=-\lambda*f'(x)$,

最終得到:$x_{n+1}=x_n-\lambda*f'(x_n)$

 

最速下降法過程:

輸入:目標函數$f(x)$,梯度函數$g(x)=\Delta f(x)$,計算精度$\epsilon$

輸出:$f(x)$的極小點$x^*$

  • step 1:取初始值$x^{(0)}$屬於$R^n$,置$k=0$
  • step 2:計算$f(x^{(k)})$
  • step 3:計算梯度$g_k=g(x^{(k)})$,當$||g_k||<\epsilon$時,停止迭代,令$x^*=x^{(k)}$;否則,令$p_k=-g(x^{(k)})$,求$\lambda_k$,使$f(x^{(k)}+\lambda_kp_k)=min f(x^{(k)}+{\lambda}p_k)$,$\lambda\geq0$
  • step 4:置$x^{(k+1)}=x^{(k)}+\lambda_k p_k$,計算$f(x^{(k+1)})$,當$||f(x^{(k+1)})-f(x^{(k)})||<\epsilon$或$||x^{(k+1)}-x^{(k)}||<\epsilon$,停止迭代,令$x^*=x^{(k+1)}$
  • step 5:否則,置$k=k+1$,轉step 3

         

                           梯度下降                                                                梯度下降方向俯視圖

 沿着梯度的方向為什么是函數值增加最快的方向?

          梯度下降一階優化

 

一、梯度下降家族

1.1 批量梯度下降法(Batch Gradient Descent,BGD)

$\theta_i = \theta_i - \alpha\sum\limits_{j=0}^{m}(h_\theta(x_0^{(j)}, x_1^{(j)}, ...x_n^{(j)}) - y_j)x_i^{(j)}$  

m個樣本都用來更新參數

時間復雜度:O(mnT)

1.2 隨機梯度下降法(Stochastic Gradient Descent,SGD)

 $\theta_i = \theta_i - \alpha (h_\theta(x_0^{(j)}, x_1^{(j)}, ...x_n^{(j)}) - y_j)x_i^{(j)}$

SGD每次更新參數時,僅使用一個樣本j。

時間復雜度:O(nT)

1.3 小批量梯度下降法(Mini-batch Gradient Descent,MBGD)

$\theta_i = \theta_i - \alpha \sum\limits_{j=t}^{t+x-1}(h_\theta(x_0^{(j)}, x_1^{(j)}, ...x_n^{(j)}) - y_j)x_i^{(j)}$

BGD和SGD的折中,對於m個樣本,采用x個子樣本來更新參數,1<x<m

時間復雜度:O(xnT)

特點:

  • 速度快
  • 收斂慢
  • 容易跳出鞍點:因為每次迭代使用一個樣本,使用的梯度不是很准確,就降低了陷入局部極小與鞍點的幾率。

 

二、牛頓家族

2.1 牛頓法

(1)用牛頓法求$f(x)=0$的根

          牛頓法二階優化

 

先隨機選個初始點$x_0$,然后開始迭代,

$$x_{n+1}=x_n-\frac{f(x_n)}{f'(x_{n})}$$

當$|x_{n+1}-x_n|<\epsilon$,迭代結束,$x_{n+1}$就是$f(x)=0$的近似值解。此處牛頓法是一階算法。

舉例:用牛頓法近似求解根號2

# 牛頓法求零點
# f = x ** 2 - 2
# x_n+1 = x_n - f(x_n)/f'(x_n)
# 收斂條件:f(x)接近於0
def func(x):
    return x ** 2 - 2
def f_func(x):
    return 2 * x
x = 1.5
err = f_func(x)
while abs(func(x)) > 0.000001:
    x = x - func(x) / f_func(x)
print(x)

(2)用牛頓法用作優化算法時候,它是二階的

假設有一個凸優化問題$\min_{x} f(x)$,問題是找一個$x$來最小化$f(x)$

牛頓法公式的推導:

二階泰勒:$f(x+\Delta x)=f(x)+f'(x)\Delta x +1/2*f''(x)*{\Delta x}^2$

希望左式最小,將左式看作$\Delta x$的函數,當取合適的$\Delta x$值時,左邊式子達到極小值,此時導數為0,得到$0=f'(x) +f''(x)*\Delta x$

利用牛頓法求解,選取初始點$x_0$,然后進行如下迭代:

$$x_{n+1}=x_n-\frac{f'(x_n)}{f''(x_n)}$$

直到$|x_{n+1}-x_n|<\epsilon$

牛頓法過程:

輸入:目標函數$f(x)$,梯度$g(x)=\Delta f(x)$,海瑟矩陣$H(x)$,精度要求$\epsilon$

輸出:$f(x)$的極小點

  • step 1:取初始點$x^{(0)}$,置$k=0$ 
  • step 2:計算$g_k=g(x^{(k)})$
  • step 3:若$||g_k||\leq\epsilon$,則停止計算,得近似解$x^*=x^{(k)}$
  • step 4:計算$H_k=H(x^{(k)})$,並求$p_k$,$H_kp_k=-g_k$($p_k=-H_k^{-1}g_k$計算海瑟矩陣比較復雜)
  • step 5:置$x^{(k+1)}=x^{(k)}+p_k$
  • step 6:置$k=k+1$,轉step 2

 

優點:

  • 二階收斂,收斂速度快;
  • 如果$G^*$正定,且初始點合適,算法二階收斂、對正定二次函數,迭代一次就可以得到極小點

缺點:

  • 牛頓法是一種迭代算法,每一步都需要求解目標函數的Hessian矩陣的逆矩陣,計算比較復雜。
  • 牛頓法需要Hessian矩陣正定,如果非正定,會陷入鞍點
  • 當初始點遠離極小點時,牛頓法可能不受理,原因可能是因為牛頓方向不一定是下降方向,經迭代,目標函數值可能上式,此外,即使目標函數值下降,得到的點$x^{(k+1)}$也不一定是沿牛頓方向的最好點或極小點。

2.2 阻尼牛頓法

牛頓法最突出的優點是收斂速度快,具有局部二階收斂性,但是,基本牛頓法初始點需要足夠“靠近”極小點,否則,有可能導致算法不收斂。這樣就引入了阻尼牛頓法,阻尼牛頓法最核心的一點在於可以修改每次迭代的步長,通過沿着牛頓法確定的方向一維搜索最優的步長,最終選擇使得函數值最小的步長。

阻尼牛頓法與牛頓法區別在於增加了沿牛頓方向的一維搜索,迭代公式為$x^{(k+1)}=x^{(k)}+\lambda_kd^{(k)}$,其中,$d^{(k)}=-\Delta ^2f(x^{(k)})^{-1}\Delta ^2f(x^{(k)})$為牛頓方向,$\lambda_k$是一維搜索得到的步長,滿足$f(x^{(k)}+\lambda_kd^{(k)})=min_{\lambda}f(x^{(k)}+\lambda d^{(k)})$

計算過程:

  • step 1:取初始點$x^{(1)}$,允許誤差$\epsilon>0$,置$k=1$ 
  • step 2:計算$\Delta f(x^{(k)}),\Delta ^2 f(x^{(k)})^{-1}$
  • step 3:若$||\Delta f(x^{(k)})||<\epsilon$,則停止計算,否則,令$d^{(k)}=-\Delta ^2 f(x^{(k)})^{-1}\Delta f(x^{(k)})$
  • step 4:從$x^{(k)}$出發,沿方向$d^{(k)}$作一維搜索,$f(x^{(k)}+\lambda_kd^{(k)})=min f(x^{(k)}+{\lambda}d^{(k)})$,令$x^{(k+1)}=x^{(k)}+\lambda_kd^{(k)}$
  • step 5:置$k=k+1$,轉step 2

 

三、擬牛頓家族

前面介紹了牛頓法,它的突出優點是收斂很快,但是運用牛頓法需要計算二階偏導數,而且目標函數的Hesse矩陣可能非正定。為了克服牛頓法的缺點,人們提出了擬牛頓法,它的基本思想是用不包含二階導數的矩陣近似牛頓法中的Hesse矩陣的逆矩陣。 由於構造近似矩陣的方法不同,因而出現不同的擬牛頓法。

 

擬牛頓法公式推導:

設在第k次迭代后,得到點$x^{(k+1)}$,將目標函數$f(x)$在點$x^{(k+1)}$展開成二階泰勒級數$f(x)\approx f(x^{(k+1)})+\Delta f(x^{(k+1)})^T(x-x^{(k+1)})+\frac{1}{2}(x-x^{(k+1)})^T\Delta^2f(x^{(k+1)}))(x-x^{(k+1)})$

令$x=x^{(k)}$,則$f(x^{(k)})\approx f(x^{(k+1)})+\Delta f(x^{(k+1)})^T(x-x^{(k+1)})+\frac{1}{2}(x-x^{(k+1)})^T\Delta^2f(x^{(k+1)}))(x^{(k)}-x^{(k+1)})$

記$p^{(k)}=x^{(k+1)}-x^{(k)} $,$q^{(k)}=\Delta f(x^{(k+1)})-\Delta f(x^{(k)})$則$q^{(k)} \approx \Delta^2 f(x^{(k+1)})p^{(k)}$

又設Hesse矩陣$\Delta ^2f(x^{(k+1)})$可逆,則$p^{(k)} \approx \Delta^2 f(x^{(k+1)})^{-1}q^{(k)}$

計算出$p^{(k)}$和$q^{(k)}$后,可以根據上式估計在$x^{(k+1)}$處的Hesse矩陣的逆,所以擬牛頓的條件就是$p^{(k)}=H_{k+1}q^{(k)}$

wiki關於擬牛頓法的公式

 

Method                       $B_{k+1}$ $H_{k+1}$
DFP          $H_{k+1} = H_k+\frac{p^{(k)}p^{(k)T}}{p^{(k)T}q^{(k)}}-\frac{H_kq^{(k)}q^{(k)T}H_k}{q^{(k)T}H_kq^{(k)}}
$                                                                                                                                                                                                             
BFGS                 $B_{k+1} = B_k+\frac{q^{(k)}q^{(k)T}}{q^{(k)T}p^{(k)}}-\frac{B_kp^{(k)}p^{(k)T}B_k}{p^{(k)T}B_kp^{(k)}}$                                                                                           

 

3.1 DFP

用不包含二階導數的矩陣$H_k$近似代替牛頓法中的Hesse矩陣的逆矩陣$G_k^{-1}$。

 

秩1校正推導過程:當G為n階對稱正定矩陣時,滿足擬牛頓條件的矩陣$H_k$也應該是n階對稱正定矩陣,構造策略為,$H_1$取為任意一個n階對稱正定矩陣,通常選擇為n階單位矩陣I,然后通過修正$H_k$給出$H_{k+1}$,

令$H_{k+1}=H_k+\Delta H_k$,(1)

其中,$\Delta H_k$稱為校正矩陣。

令$\Delta H_k=\alpha_kz^{(k)}(z^{(k)T})$,(2)

$\alpha_k$是一個常數,$z^{(k)}$是n維列向量,這樣定義的$\Delta H_k$是秩為1的對稱矩陣,

令$p^{(k)}=H_kq^{(k)}+\alpha_kz^{(k)}z^{(k)T}q^{(k)}$,(3)

由此得到$z^{(k)}=\frac{p^{(k)}-H_kq^{(k)}}{\alpha_kz^{(k)T}q^{(k)}}$,(4)

 另一方面,(3)式等號兩端左乘以$q^{(k)T}$,整理得到

$q^{(k)T}(p^{(k)}-H_kq^{(k)})=\alpha_k(z^{(k)T}q^{(k)})^2$,(5)

利用 (2)(4)(5),把(1)式寫成:

$H_{k+1} = H_k+\frac{p^{(k)}-H_kq^{(k)}p^{(k)}-H_kq^{(k)T}}{q^{(k)T(p^{(k)}-H_kq^{(k)})}}$

 

后來,Davidon首先提出DFP,又被Fletcher和Powell改進,定義校正矩陣為 $\frac{p^{(k)}p^{(k)T}}{p^{(k)T}q^{(k)}}-\frac{H_kq^{(k)}q^{(k)T}H_k}{q^{(k)T}H_kq^{(k)}}$
這樣得到的矩陣為$H_{k+1}=H_k+\frac{p^{(k)}p^{(k)T}}{p^{(k)T}q^{(k)}}-\frac{H_kq^{(k)}q^{(k)T}H_k}{q^{(k)T}H_kq^{(k)}}$

輸入:目標函數$f(x)$,梯度$g(x)=\Delta f(x)$,精度要求$\epsilon$

輸出:$f(x)$的極小點$x^*$

  • step 1:取初始點$x^{(0)}$,取$H_0$為正定對稱矩陣,置$k=0$ 
  • step 2:計算$g_k=g(x^{(k)})$,若$||g_k||\leq\epsilon$,則停止計算,得近似解$x^*=x^{(k)}$;否則轉step 3
  • step 3:置$p_k=-H_kg_k$
  • step 4:一維搜索:求$\lambda_k$使得$f(x^{(k)}+\lambda_kp_k)=min f(x^{(k)}+{\lambda}p_k)$,$\lambda\geq0$
  • step 5:置$x^{(k+1)}=x^{(k)}+\lambda_kp_k$
  • step 6:計算$g_{k+1}=g(x^{(k+1)})$,若$||g_{k+1}|| < \epsilon$,則停止計算,得近似解$x^*=x^{(k+1)}$,否則,則計算出$H_{k+1}$
  • step 7:置$k=k+1$,轉step 3

 

疑問:怎么確定$H_0$? https://www.zhihu.com/question/269123324/answer/345679876

 

3.2 BFGS

用不包含二階導數的矩陣$B_k$近似代替牛頓法中的Hesse矩陣$G_k$。

$H_{k+1}=B_{k+1}^{-1}$

關於矩陣$B$的BFGS公式: 

$B_{k+1} = B_k+\frac{q^{(k)}q^{(k)T}}{q^{(k)T}p^{(k)}}-\frac{B_kp^{(k)}p^{(k)T}B_k}{p^{(k)T}B_kp^{(k)}}$

 

輸入:目標函數$f(x)$,梯度$g(x)=\Delta f(x)$,精度要求$\epsilon$

輸出:$f(x)$的極小點$x^*$

  • step 1:取初始點$x^{(0)}$,取$B_0$為正定對稱矩陣,置$k=0$ 
  • step 2:計算$g_k=g(x^{(k)})$,若$||g_k||\leq\epsilon$,則停止計算,得近似解$x^*=x^{(k)}$;否則轉step 3
  • step 3:由$B_kp_k=-g_k$求出$p_k$
  • step 4:一維搜索:求$\lambda_k$使得$f(x^{(k)}+\lambda_kp_k)=min f(x^{(k)}+{\lambda}p_k)$,$\lambda\geq0$
  • step 5:置$x^{(k+1)}=x^{(k)}+\lambda_kp_k$
  • step 6:計算$g_{k+1}=g(x^{(k+1)})$,若$||g_{k+1}|| < \epsilon$,則停止計算,得近似解$x^*=x^{(k+1)}$,否則,則計算出$B_{k+1}$
  • step 7:置$k=k+1$,轉step 3

 

關於矩陣$H$的BFGS公式: 

$H_{k+1}^{BFGS} = H_k+(1+\frac{q^{(k)T}H_kq^{(k)}}{p^{(k)T}q^{(k)}})\frac{p^{(k)}p^{(k)T}}{p^{(k)T}q^{(k)}}-\frac{p^{(k)}q^{(k)T}H_k+H_kq^{(k)}p^{(k)T}}{p^{(k)T}q^{(k)}}$

這個重要公式是由Broyden,Fletcher,Goldfard和Shanno於1970年提出的,所以簡稱為BFGS

 

疑問:為什么BFGS會比DFP流行?https://www.zhihu.com/question/269123324/answer/345679876

BFGS有自動糾錯功能

 

3.3 L-BFGS

  在BFGS算法中,仍然有缺陷,比如當優化問題規模很大時,矩陣的存儲和計算將變得不可行。為了解決這個問題,就有了L-BFGS算法。L-BFGS即Limited-memory BFGS。 L-BFGS的基本思想是只保存最近的m次迭代信息,從而大大減少數據的存儲空間。對照BFGS,重新整理一下公式:

具體步驟參考:https://zhuanlan.zhihu.com/p/29672873

L-BFGS算法為什么快?https://www.zhihu.com/question/49418974/answer/155668749

 

四、共軛梯度法(Conjugate Gradient)

共軛:設$A$是對稱正定矩陣,若$R^{n}$中的兩個方向$d^{(1)}$和$d^{(2)}$滿足$d^{(1)T}Ad^{(2)}=0$,則稱這兩個方向關於$A$共軛,或稱它們關於$A$正交

定理:對於二次凸函數,若沿一組共軛方向(非零向量)搜索,經有限步迭代必達到極小點。

共軛梯度法基本思想:把共軛性與最速下降法結合,利用已知點處的梯度構成一組共軛方向,並沿這組方向進行搜索,求出目標函數的極小點,根據共軛方向的基本性質,這種方法具有二次終止性。

4.1 FR

$\beta_j=\frac{||g_{i+1}||^2}{||g_{i}||^2}$

 

二次函數計算步驟:

step 1:給定初始點$x^{(1)}$,置k=1

step 2:計算$g_k=\Delta f(x^{(k)})$,若$||g_k||=0$,則停止計算,得點$\bar x=x^{(k)}$;否則,進行下一步

step 3:構造搜索方向,令$d^{(k)}=-g_k+\beta_{k-1}d^{(k-1)}$,其中,當$k=1$時,$\beta_{k-1}=0$時,計算因子$\beta_{k-1}$

step 4:令$x^{(k+1)}=x^{(k)}+\lambda_kd^{(d)}$,計算步長$\lambda_k=-\frac{g_k^Td^{(k)}}{d^{(k)T}Ad^{(k)}}$

step 5:若$k=n$,則停止計算,得點$\bar x=x^{(k+1)}$;否則,置$k:=k+1$,返回step 2

 

任意凸函數計算步驟:

step 1:給定初始點$x^{(1)}$,允許誤差$epsilon>0$,置$y^{(1)}=x^{(1)},d^{(1)}=\Delta f(y^{(1)}),k=j=1$

step 2:若$||\Delta f(y^{(j)})||<\epsilon$,則停止計算;否則,作一維搜索,求$\lambda_j$,求滿足$f(y^{(j)}+\lambda_jd^{(j)})=min_{\lambda >= 0}(y)$

step 3:如果$j<n$,則進行step 4;否則,進行step 5

step 4:令$d^{(j+1)}=-\Delta f(y^{(j+1)})+\beta_jd^{(j)}$,其中,$\beta_j=\frac{||\Delta f(y^{(j+1)})||^2}{||\Delta f(y^{(j)})||^2}$,置$j:=j+1$,轉step 2

step 5:令$x^{(k+1)}=y^{(n+1)},y^{(1)}=x^{(k+1)},d^{(1)}=-\Delta f(y^{(1)})$,置$j=1,k:=k+1$,轉step 2

4.2 PRP

$\beta_j=\frac{g_{j+1}^T(g_{j+1}-g_j)}{g_j^Tg_j}$

 

任意凸函數計算步驟:

step 1:給定初始點$x^{(1)}$,允許誤差$epsilon>0$,置$y^{(1)}=x^{(1)},d^{(1)}=\Delta f(y^{(1)}),k=j=1$

step 2:若$||\Delta f(y^{(j)})||<\epsilon$,則停止計算;否則,作一維搜索,求$\lambda_j$,求滿足$f(y^{(j)}+\lambda_jd^{(j)})=min_{\lambda >= 0}(y)$

step 3:如果$j<n$,則進行step 4;否則,進行step 5

step 4:令$d^{(j+1)}=-\Delta f(y^{(j+1)})+\beta_jd^{(j)}$,其中,$\beta_j=\frac{g_{j+1}^T(g_{j+1}-g_j)}{g_j^Tg_j}$,置$j:=j+1$,轉step 2

step 5:令$x^{(k+1)}=y^{(n+1)},y^{(1)}=x^{(k+1)},d^{(1)}=-\Delta f(y^{(1)})$,置$j=1,k:=k+1$,轉step 2

 

  共軛梯度法是介於最速下降法與牛頓法之間的一個方法,它僅需利用一階導數信息,但克服了最速下降法收斂慢的缺點,又避免了牛頓法需要存儲和計算Hesse矩陣並求逆的缺點,共軛梯度法不僅是解決大型線性方程組最有用的方法之一,也是解大型非線性最優化最有效的算法之一。在各種優化算法中,共軛梯度法是非常重要的一種。其優點是所需存儲量小,具有步收斂性,穩定性高,而且不需要任何外來參數

五、比較

梯度下降法和牛頓法的比較:

從本質來說,梯度下降法是一階收斂,牛頓法是二階收斂,所以牛頓法的收斂速度更快。梯度下降法每次考慮的是當前位置的負梯度下降,而牛頓法不但考慮當前位置下降的是否夠快,還會考慮下一步下降的是否夠大,也就是說牛頓法目標更長遠一點牛頓法是用一個二次曲面去擬合你當前所處位置的局部曲面,而梯度下降法使用一個平面去擬合當前的局部曲面,通常情況二次曲面擬合會比平面更好,所以牛頓法的下降路徑會更符合真實的最優下降路徑。

 來源

 

 參考文獻:

【1】常見的幾種最優化方法(梯度下降法、牛頓法、擬牛頓法、共軛梯度法等)

【2】深度學習實戰教程(二):線性單元和梯度下降

【3】梯度下降(Gradient Descent)小結

【4】https://www.jianshu.com/p/e8b5a384a970

【5】https://blog.csdn.net/philosophyatmath/article/details/70153705

【6】梯度下降法、牛頓法、擬牛頓法 三類迭代法應用場景有何差別?


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM