基于二阶近似方法的优化算法

暂时只更新到牛顿法

参考文章

二阶梯度方法使用二阶导数改进了优化,最广泛使用的时牛顿法

牛顿法

思想

用目标函数的二阶泰勒展开近似该目标函数,通过求解这个二次函数的极小值来求解凸优化的搜索方向

牛顿法的主要应用在两个方面:1.求方程的根;2. 最优化

预备知识

一元泰勒展开式

此次使用一元泰勒展开式进行讨论

f ( x ) = f ( x 0 ) + f ′ ( x 0 ) ( x − x 0 ) + 1 2 ! f ′ ′ ( x 0 ) + ⋯ + 1 n ! f ( n ) ( x 0 ) ( x − x 0 ) n f(x) = f(x_0)+f^{\prime}(x_0)(x-x_0)+\frac{1}{2!}f^{\prime \prime}(x_0)+\cdots+\frac{1}{n!}f^{(n)}(x_0)(x-x_0)^n f(x)=f(x0)+f(x0)(xx0)+2!1f(x0)++n!1f(n)(x0)(xx0)n

海森矩阵(Hessian)

Hessian矩阵定义的二次范数

H(x^{(k)}) =

实际应用

1. 求解方程根

并不是所有的方程都有求根公式或者求根公式很复杂,导致求解困难。
利用牛顿法,可以迭代求解

过程
利用泰勒展开式在 x 0 x_0 x0处展开,展开到一阶,即
f ( x ) = f ( x 0 ) + f ′ ( x 0 ) ( x − x 0 ) f(x) = f(x_0)+f^{\prime}(x_0)(x-x_0) f(x)=f(x0)+f(x0)(xx0)

求解方程
f ( x ) = 0 f(x) = 0 f(x)=0
这就等价于
f ( x 0 ) + f ′ ( x 0 ) ( x − x 0 ) = 0 f(x_0)+f^{\prime}(x_0)(x-x_0) = 0 f(x0)+f(x0)(xx0)=0
解得
x 1 = x = x 0 − f ( x 0 ) f ′ ( x 0 ) x_1 = x = x_0 - \frac{f(x_0)}{f^{\prime}(x_0)} x1=x=x0f(x0)f(x0)

注意,这里我们是使用泰勒一阶展开式来近似, f ( x ) = f ( x 0 ) + f ′ ( x 0 ) ( x − x 0 ) f(x) = f(x_0)+f^{\prime}(x_0)(x-x_0) f(x)=f(x0)+f(x0)(xx0)是近似表达,不完全相等。这里求得的 x 1 x_1 x1,并不能使 f ( x ) = 0 f(x)=0 f(x)=0,即 f ( x 1 ) ≠ 0 f(x_1) \not = 0 f(x1)=0,只能说 f ( x 1 ) f(x_1) f(x1) f ( x 0 ) f(x_0) f(x0)更接近于等于 0 0 0

于是得到迭代过程
x n + 1 = x n − f ( x n ) f ′ ( x n ) x_{n+1} = x_n - \frac{f(x_n)}{f^{\prime}(x_n)} xn+1=xnf(xn)f(xn)

通过不停迭代,此公式会在 f ( x ∗ ) = 0 , f(x^*) = 0, f(x)=0,计算过程如下
在这里插入图片描述

2. 最优化

假设无约束最优化问题

m i n x ∈ R n f ( x ) min_{x \in R^{n} }f(x) minxRnf(x)

x ∗ x^* x为目标函数的极小点。

f ( x ) f(x) f(x)具有二阶连续导数,若第 k k k次迭代值为 x ( k ) x^{(k)} x(k),则可将 f ( x ) f(x) f(x) x ( k ) x^{(k)} x(k)附近的二阶泰勒展开
f ( x ) = f ( x ( k ) ) + g k T ( x − x ( k ) ) + 1 2 ( x − x ( k ) ) T ⋅ H ⋅ ( x − x ( k ) ) f(x) = f(x^{(k)})+g^{T}_k(x-x^{(k)})+\frac{1}{2}(x-x^{(k)})^T\cdot H \cdot (x-x^{(k)}) f(x)=f(x(k))+gkT(xx(k))+21(xx(k))TH(xx(k))
g k = g ( x ( k ) ) = ∇ f ( x ( k ) ) g_k = g(x^{(k)}) = \nabla f(x^{(k)}) gk=g(x(k))=f(x(k)),表示 f ( x ) f(x) f(x)在点 x ( k ) x^{(k)} x(k)梯度向量

H ( x ( k ) ) H(x^{(k)}) H(x(k)) f ( x ) f(x) f(x)海瑟矩阵( H e s s i a n Hessian Hessian矩阵)在点 x ( k ) x^{(k)} x(k)处的值
H ( x ) = [ ∂ 2 f ∂ x i ∂ x j ] H(x) = \big[ \frac{\partial^2f}{\partial{x_i}\partial{x_j}} \big] H(x)=[xixj2f]

函数 f ( x ) f(x) f(x)有极值的必要条件是在极值点处一阶导数为 0 0 0,即梯度向量为 0 0 0
特别的当 H ( x ( k ) ) H(x^{(k)}) H(x(k))正定矩阵时,函数 f ( x ) f(x) f(x)的极值为极小值

为了得到一阶导数 f ′ ( x ) = 0 f^{\prime}(x)=0 f(x)=0的点,我们使用上节中的求解方程根的方法。
根据二阶泰勒展开,对 ∇ f ( x ) \nabla f(x) f(x) x ( k ) x^{(k)} x(k)进行展开得

∇ f ( x ) = g k + H k ⋅ ( x − x ( k ) ) \nabla f(x) = g_k + H_k \cdot (x-x^{(k)}) f(x)=gk+Hk(xx(k))
其中 H k = H ( x ( k ) ) , H_k = H(x^{(k)}), Hk=H(x(k)),

g k + H k ⋅ ( x ( k + 1 ) − x ( k ) ) = 0 g_k + H_k \cdot (x^{(k+1)} - x^{(k)}) = 0 gk+Hk(x(k+1)x(k))=0
x ( k + 1 ) = x ( k ) − H k − 1 g k x^{(k+1)} = x^{(k)} - H_k^{-1} g_k x(k+1)=x(k)Hk1gk

我们令
H k p k = − g k H_k p_k = -g_k Hkpk=gk
则得到迭代公式
x ( k + 1 ) = x ( k ) − p k x^{(k+1)} = x^{(k)} - p_k x(k+1)=x(k)pk

最终可在 ∇ f ( x ∗ ) = 0 \nabla f(x^*) = 0 f(x)=0收敛

算法


目标为 J ( Θ ) = 1 m ∑ i = 1 m L ( f ( x i ; θ ) , y ( i ) ) J(\Theta) = \frac{1}{m}\sum_{i=1}^{m}L(f(x^{i};\theta),y^{(i)}) J(Θ)=m1i=1mL(f(xi;θ),y(i))牛顿法


R e q u i r e Require Require:初始参数 θ 0 \theta_0 θ0
R e q u i r e Require Require: 包含 m m m个样本的训练集
     ~~~~      w h i l e while while 没有达到停止准则    ~~    d o do do
     ~~~~      计算梯度: g ← 1 m ∇ θ ∑ i L ( f ( x ( i ) ; θ ) , y ( i ) ) g \leftarrow \frac{1}{m}\nabla_{\theta}\sum_i L(f(x^{(i)};\theta),y^{(i)}) gm1θiL(f(x(i);θ),y(i))
     ~~~~      计算 H e s s i a n Hessian Hessian矩阵: H ← 1 m ∇ θ 2 ∑ i L ( f ( x ( i ) ; θ ) , y ( i ) ) H \leftarrow \frac{1}{m}\nabla_{\theta}^2\sum_iL(f(x^{(i)};\theta),y^{(i)}) Hm1θ2iL(f(x(i);θ),y(i))
     ~~~~      计算 H e s s i a n Hessian Hessian逆: H − 1 H^{-1} H1
     ~~~~      计算更新: Δ θ = − H − 1 g \Delta\theta = -H^{-1}g Δθ=H1g
     ~~~~      应用更新: θ = θ + Δ θ \theta = \theta + \Delta\theta θ=θ+Δθ

e n d    w h i l e end ~~ while end  while

计算海森矩阵的逆
拟牛顿法

思想

计算海森矩阵的逆 H − 1 H^{-1} H1是比较复杂的,这一计算比较复杂,这一计算比较复杂,考虑用一个 n n n阶矩阵 G k = G ( x ( k ) ) G_k= G(x^{(k)}) Gk=G(x(k))来近似代替 H k − 1 = H − 1 ( x ( k ) ) H_k^{-1} = H^{-1}(x^{(k)}) Hk1=H1(x(k))。这就是拟牛顿法的基本想法。


注意

  1. 牛顿法只适用于Hessian矩阵正定的情况
  2. 在深度学习中,目标函数的表面通常非凸(有很多特征),如鞍点。因此使用牛顿法是有问题的,
    • 如果Hessian矩阵的特征值并不都是正的,例如,靠近鞍点处,牛顿法实际上会导致更新错误的方向移动
    • 这种情况可通过正则化Hessian矩阵来避免

牛顿法 VS 梯度下降

  1. 梯度下降法和牛顿法相比,两者都是迭代求解,
  • 梯度下降法是梯度求解
    • x ( k + 1 ) = x ( k ) − λ ∇ f ( x ( k ) ) x^{(k+1)} = x^{(k)} - \lambda \nabla f(x^{(k)}) x(k+1)=x(k)λf(x(k))
  • 牛顿法是用二阶的海森矩阵的逆矩阵求解
    • x ( k + 1 ) = x ( k ) − λ ( H ( k ) ) − 1 ∇ f ( x ( k ) ) x^{(k+1)} = x^{(k)} - \lambda (H^{(k)})^{-1} \nabla f(x^{(k)}) x(k+1)=x(k)λ(H(k))1f(x(k))
  • 相对而言,使用牛顿法收敛更快(迭代更少次数)。但是每次迭代的时间比梯度下降法长。

红色曲线是牛顿法迭代求解,绿色曲线是利用梯度下降法
在这里插入图片描述
为什么牛顿法下降更快

找到了各种不同的解释,我将都列出来

通俗来说梯度下降法每次只从你当前所处位置选一个坡度最大的方向走一步,牛顿法在选择方向时,不仅会考虑坡度是否够大还会考虑你走了一步之后,坡度是否会变得更大。所以,可以说牛顿法比梯度下降法看得更远一点,能更快地走到最底部。

更多的可见:最优化问题中,牛顿法为什么比梯度下降法求解需要的迭代次数更少?

根据wiki上的解释,从几何上说,牛顿法就是用一个二次曲面去拟合你当前所处位置的局部曲面,而梯度下降法是用一个平面去拟合当前的局部曲面,通常情况下,二次曲面的拟合会比平面更好,所以牛顿法选择的下降路径会更符合真实的最优下降路径。

共轭梯度

共轭梯度是一种通过迭代下降的共轭方向(conjugate directions)以有效避免Hessian矩阵求逆计算的方法。
这种方法的灵感来自于对最速下降方法弱点的仔细研究

DFP(Davidon-Fletcher-Powell)算法(DFP algorithm)

BFGS

Broyden-Fletcher-Goldfard-Shanno(BFRS)算法具有牛顿法的一些优点,但没有牛顿法的计算负担。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值