zoukankan      html  css  js  c++  java
  • 梯度下降法家族、牛顿法家族、拟牛顿家族

     

          梯度的方向      

    梯度:如果函数是一维的变量,则梯度就是导数的方向;如果是大于一维的,梯度就是在这个点的法向量,并指向数值更高的等值线。比如函数f(x,y), 分别对x,y求偏导数,求得的梯度向量就是(∂f/∂x, ∂f/∂y)T,简称grad f(x,y)或者▽f(x,y)

    梯度上升:如果我们需要求解损失函数的最大值,用梯度上升法来迭代求解。

    梯度下降:在最小化损失函数时,可以通过梯度下降法来一步步的迭代求解,得到最小化的损失函数,和模型参数值。梯度下降不一定能够找到全局的最优解,有可能是一个局部最优解,但当目标函数是凸函数时,梯度下降法的解是全局解。$ heta_i = heta_i - alphafrac{partial}{partial heta_i}J( heta_0, heta_1..., heta_n)$

    • 假设函数(hypothesis function)例如线性回归的拟合函数为$h_{ heta}(x) = heta_0+ heta_1x$
    • 损失函数:$J( heta_0, heta_1..., heta_n) = frac{1}{2m}sumlimits_{j=0}^{m}(h_ heta(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)$,$lambdageq0$
    • 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)

    $ heta_i = heta_i - alphasumlimits_{j=0}^{m}(h_ heta(x_0^{(j)}, x_1^{(j)}, ...x_n^{(j)}) - y_j)x_i^{(j)}$  

    m个样本都用来更新参数

    时间复杂度:O(mnT)

    1.2 随机梯度下降法(Stochastic Gradient Descent,SGD)

     $ heta_i = heta_i - alpha (h_ heta(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)

    $ heta_i = heta_i - alpha sumlimits_{j=t}^{t+x-1}(h_ heta(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||leqepsilon$,则停止计算,得近似解$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)})^TDelta^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)})^TDelta^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||leqepsilon$,则停止计算,得近似解$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)$,$lambdageq0$
    • 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||leqepsilon$,则停止计算,得近似解$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)$,$lambdageq0$
    • 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

    $eta_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$,则停止计算,得点$ar x=x^{(k)}$;否则,进行下一步

    step 3:构造搜索方向,令$d^{(k)}=-g_k+eta_{k-1}d^{(k-1)}$,其中,当$k=1$时,$eta_{k-1}=0$时,计算因子$eta_{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$,则停止计算,得点$ar 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)})+eta_jd^{(j)}$,其中,$eta_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

    $eta_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)})+eta_jd^{(j)}$,其中,$eta_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】梯度下降法、牛顿法、拟牛顿法 三类迭代法应用场景有何差别?

  • 相关阅读:
    Elasticsearch集成IKAnalyzer分析器
    Elasticsearch操作Document文档
    ElasticSearch简介
    Lucene查询索引
    Lucene索引维护(添加、修改、删除)
    Lucene使用IKAnalyzer分词
    Lucene搜索引擎入门
    MySQL优化(四)——读写分离
    MySQL优化(三)——主从复制
    Java 身份证验证工具类代码模板
  • 原文地址:https://www.cnblogs.com/nxf-rabbit75/p/10439857.html
Copyright © 2011-2022 走看看