梯度的方向
梯度:如果函數是一維的變量,則梯度就是導數的方向;如果是大於一維的,梯度就是在這個點的法向量,並指向數值更高的等值線。比如函數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】常見的幾種最優化方法(梯度下降法、牛頓法、擬牛頓法、共軛梯度法等)
【4】https://www.jianshu.com/p/e8b5a384a970
【5】https://blog.csdn.net/philosophyatmath/article/details/70153705