最优化、凸优化、梯度下降和牛顿法

本文是对公众号SIGAI中凸优化,梯度下降,牛顿法等一系列文章的整理。

  • SIGAI:理解凸优化
  • SIGAI:理解梯度下降法
  • SIGAI:理解牛顿法

最优化问题在机器学习中有非常重要的地位,很多机器学习算法最后都归结为求解最优化问题。凸优化(convex optimization)是最优化问题中非常重要的一类,对于机器学习来说,如果要优化的问题被证明是凸优化问题,则说明此问题可以被比较好的解决。

文章目录

  • 1. 最优化问题
    • 1.1 可行域
    • 1.2 全局极小值(最小值)
    • 1.3 局部极小值
  • 2. 凸优化问题
    • 2.1 凸集
    • 2.1.1 凸集定义
      • 2.1.1 凸集和约束条件的相关结论
    • 2.2 凸函数
      • 2.2.1 凸函数定义
      • 2.2.2 凸函数的判定
    • 2.3 凸优化
  • 3. 最优化问题求解
    • 3.1 迭代法求解思想
    • 3.2 梯度下降法
      • 3.2.1 梯度下降法原理
      • 3.2.2 梯度下降法实现细节
      • 3.2.3 梯度下降法的变种
        • 随机梯度下降
        • 批量梯度下降
        • 动量
        • AdaGrad
        • Adam
    • 3.3 牛顿法
      • 3.3.1 牛顿法推导
      • 3.3.2 实现细节
      • 3.3.3 存在的问题

1. 最优化问题

最优化问题是求解函数极值的问题,包括函数的极大值和极小值(注意这里是极值,而不是最值,最值是全局的概念,如果一个函数有最值,那么只会有一个最值,而极值是从局部考虑的,一个还是的最值可能是极值也可能不是)。

比如求二次函数的最值,常使用配项法或者直接记住公式就可以了,而微积分为求解极值提供了统一的思路:函数的极值点处的导数为0。只要函数时可导的,就可以使用这个方法。

在机器学习中,我们一般将最优化问题统一表述为求解函数的极小值问题: m i n x f ( x ) min_x f(x) minxf(x) 其中 x x x为优化变量, f f f为目标函数。极大值问题可以转化为极小值问题求解
m i n x − f ( x ) min_x -f(x) minxf(x)

1.1 可行域

通过为变量 x x x添加约束条件,限定 x x x可行域,即满足约束条件的点构成的集合。

1.2 全局极小值(最小值)

一个优化问题的全局极小值是对可行域内所有的 x x x,有: f ( x ∗ ) ≤ f ( x ) f(x^*) \leq f(x) f(x)f(x)

1.3 局部极小值

存在一个领域,对于在领域 ∣ ∣ x − x ∗ ∣ ∣ ≤ δ ||x-x^*|| \leq \delta xxδ内的所有 x x x,满足: f ( x ∗ ) ≤ f ( x ) f(x^*) \leq f(x) f(x)f(x)

求解一个一般性的最优化问题的全局极小值是非常困难的,至少要面临的问题是:函数可能有多个局部极值点,另外还有鞍点问题。对于第一个问题,我们找到了一个梯度为0的点,它是极值点,但不是全局极值,如果一个问题有多个局部极值,则我们要把所有局部极值找出来,然后比较,得到全局极值,这非常困难,而且计算成本相当高。第二个问题更严重,我们找到了梯度为0的点,但它连局部极值都不是,典型的是这个函数,在0点处,它的导数等于0,但这根本不是极值点:
最优化、凸优化、梯度下降和牛顿法_第1张图片

2. 凸优化问题

我们常见的梯度下降法和牛顿法等基于导数的优化算法,转到的都是导数/梯度为0的点,而梯度等于0只是取得极值的必要条件而不是充分条件,如果要将这个必要条件变成充分条件,即: x 点 处 的 梯 度 等 于 0 ⇒ x 是 问 题 的 最 优 解 x点处的梯度等于0 \Rightarrow x是问题的最优解 x0x 问题将会得到简化。

如果对于问题加以限定:限定目标函数为凸函数;对于优化变量的可行域(注意,还要包括目标函数定义域的约束),我们限定它是凸集,这类问题有一个非常好性质,那就是局部最优解一定是全局最优解,我们称这类问题为凸优化问题
最优化、凸优化、梯度下降和牛顿法_第2张图片

2.1 凸集

2.1.1 凸集定义

对于 n n n维空间中点的集合 C C C,如果对集合中的任一两点 x x x y y y,以及实数 0 ≤ θ ≤ 1 0 \leq \theta \leq 1 0θ1,都有: θ x + ( 1 − θ ) y ∈ C \theta x +(1-\theta)y \in C θx+(1θ)yC则称该集合为凸集。相应的点 θ x + ( 1 − θ ) y \theta x +(1-\theta)y θx+(1θ)y称为 x x x y y y的凸组合。下图中的左图为一个凸集,而右图不是。
最优化、凸优化、梯度下降和牛顿法_第3张图片

2.1.1 凸集和约束条件的相关结论

  1. 不带约束的优化问题,其优化变量的可行域是一个凸集

n n n维向量空间 R n R^n Rn中,如果 x , y ∈ R n x,y \in R^n x,yRn,显然有: θ x + ( 1 − θ ) y ∈ R n \theta x + (1-\theta)y \in R^n θx+(1θ)yRn

  1. 一组线性等式约束条件,其确定的可行域是一个凸集

证明:给定 m m m n n n列的矩阵 A A A m m m维向量 b b b, 仿射子空间定义为如下的向量空间集合 { x ∈ R n : A x = b } \{x \in R^n:Ax = b\} {xRn:Ax=b} 假设 x 0 , x 1 ∈ R n x_0,x_1 \in R^n x0,x1Rn为可行域中的两个解,则 A x 0 = b , A x 1 = b Ax_0 = b , Ax_1 = b Ax0=b,Ax1=b 对于任意的 0 ≤ θ ≤ 1 0 \leq \theta \leq 1 0θ1有: A ( θ x 0 + ( 1 − θ ) x 1 ) = θ A x 0 + ( 1 − θ ) A x 1 = θ b + ( 1 − θ ) b = b A(\theta x_0 + (1-\theta)x_1) = \theta Ax_0+(1-\theta)Ax_1 = \theta b + (1-\theta)b = b A(θx0+(1θ)x1)=θAx0+(1θ)Ax1=θb+(1θ)b=b

  1. 一组线性不等式约束条件,其确定的可行域是一个凸集

证明:给定 m m m n n n列的矩阵 A A A m m m维向量 b b b, 仿射子空间定义为如下的向量空间集合 { x ∈ R n : A x ≤ b } \{x \in R^n:Ax \leq b\} {xRn:Axb} 假设 x 0 , x 1 ∈ R n x_0,x_1 \in R^n x0,x1Rn为可行域中的两个解,则 A x 0 ≤ b , A x 1 ≤ b Ax_0 \leq b , Ax_1 \leq b Ax0b,Ax1b 对于任意的 0 ≤ θ ≤ 1 0 \leq \theta \leq 1 0θ1有: A ( θ x 0 + ( 1 − θ ) x 1 ) = θ A x 0 + ( 1 − θ ) A x 1 ≤ θ b + ( 1 − θ ) b = b A(\theta x_0 + (1-\theta)x_1) = \theta Ax_0+(1-\theta)Ax_1 \leq \theta b + (1-\theta)b = b A(θx0+(1θ)x1)=θAx0+(1θ)Ax1θb+(1θ)b=b

  1. 多个凸集的交集还是凸集

2.2 凸函数

2.2.1 凸函数定义

在函数的定义域内,如果对于任意的 x x x y y y,以及实数 0 ≤ θ ≤ 1 0 \leq \theta \leq 1 0θ1,都满足如下条件:
f ( θ x + ( 1 − θ ) y ) ≤ θ f ( x ) + ( 1 − θ ) f ( y ) f(\theta x +(1-\theta)y) \leq \theta f(x) + (1-\theta)f(y) f(θx+(1θ)y)θf(x)+(1θ)f(y) 则函数为凸函数。这个不等式和凸集的定义类似。从图像上看,一个函数如果是凸函数,那么它是向下凸出去的。用直线连接函数上的任何两点A和B,线段AB上的点都在函数的上方,如下图所示:
最优化、凸优化、梯度下降和牛顿法_第4张图片
如果上式中满足严格小于,则称函数为严格凸函数。

2.2.2 凸函数的判定

  1. 一阶判定规则: f ( y ) ≥ f ( x ) + ∇ f ( x ) T ( y − x ) f(y) \geq f(x) + \nabla f(x)^T(y-x) f(y)f(x)+f(x)T(yx),为函数在任何点处的切线都位于函数的下方
  2. 二阶判定规则: f ′ ′ ( x ) ≥ 0 f^{''}(x) \geq 0 f(x)0,如果严格大于,则函数时严格凸的。
    对于多元函数,如果它是凸函数, 则其Hessian矩阵为半正定矩阵。如果Hessian矩阵是正定的,则函数是严格凸函数。

根据多元函数极值判别法,假设多元函数在点M的梯度为0,即M是函数的驻点,则有:

  • 如果Hessian矩阵正定,函数在该点有极小值
  • 如果Hessian矩阵负定,函数在该点有极大值
  • 如果Hessian矩阵不定,还需要看更高阶的导数

从单变量的角度来说,二阶导数一直大于0表示一阶导数的值一直在增加,又有一阶导数有0值,即一阶导数必然是由负值增加到0,在由0增加到正值,那么原函数必然是先降低在上升,函数必有极小值。

对于n阶矩阵 A A A,对于任意的非0的n维向量 x x x, 都有 x T A x > 0 x^TAx > 0 xTAx>0,则称矩阵A(A可以看做二次型的系数)为正定矩阵。判定矩阵正定的常用方法有以下几种:

  • 矩阵的特征值全大于0
  • 矩阵的所有顺序主子式都大于0
  • 矩阵合同于单位阵 I I I

x T A x < 0 x^TAx < 0 xTAx<0则称矩阵为负定矩阵, x T A x ≥ 0 x^TAx \geq 0 xTAx0则矩阵为半正定。

凸函数的非负线性组合时凸函数,假设 f i f_i fi是凸函数,并且 w i ≥ 0 w_i \geq 0 wi0,则: f ( x ) = ∑ i = 1 k w i f i ( x ) f(x) = \sum_{i=1}^k w_i f_i(x) f(x)=i=1kwifi(x)是凸函数
注意:这边是函数的非负性组合,不是特征的非负性组合

2.3 凸优化

如果一个最优化问题的可行域是凸集,并且目标函数是凸函数,则该问题为凸优化问题。凸优化问题可以形式化的写成: m i n f ( x ) min f(x) minf(x) x ∈ C x \in C xC 其中 x x x为优化变量, f f f为凸目标函数, C C C为优化变量的可行域,为一个凸集。

将可行域具体化,凸优化问题可以表述为: m i n f ( x ) min f(x) minf(x) g i ( x ) ≤ 0 , i = 1 , . . . , m g_i(x) \leq 0, i = 1,...,m gi(x)0,i=1,...,m h i ( x ) = 0 , i = 1 , . . . , p h_i(x)=0,i=1,...,p hi(x)=0,i=1,...,p
凸优化问题有一个重要的特性:所有局部最优解都是全局最优解。这个特性可以保证我们在求解时不会陷入局部最优解,即如果找到了问题的一个局部最优解,则它一定也是全局最优解,这极大的简化了问题的求解。

3. 最优化问题求解

从上文的介绍中,我们知道函数的极值点处,一阶导数为0,根据二阶导数的Hessian矩阵,可以判定该值是极小值,极大值或者是鞍点,那么对于最优化问题,直接求导,令梯度为0,然后解方程不就可以了吗?事实上没有那么简单,看下面这个复杂函数:
f ( x , y ) = x 3 − 2 X 2 + e x y − y 3 + 10 y 2 + 100 s i n ( x y ) f(x,y) = x^3 - 2X^2+e^{xy}-y^3+10y^2+100sin(xy) f(x,y)=x32X2+exyy3+10y2+100sin(xy) 分别对x,y求导,并令其为0时,得到: { 3 x 2 − 4 x + y e x y + 100 y c o s ( x y ) = 0 x y x y − 3 y 2 + 20 y + x c o s ( x y ) = 0 \begin{cases} 3x^2-4x+ye^{xy}+100ycos(xy)=0\\ xy^{xy}-3y^2+20y+xcos(xy)=0& \end{cases} {3x24x+yexy+100ycos(xy)=0xyxy3y2+20y+xcos(xy)=0 这个方程非常难以求解,对于有指数函数,对数函数,三角函数的方程,我们称为超越方程,求解的难度并不比求极值本身小。

3.1 迭代法求解思想

精确的求解不太可能,因此只能求近似解,这称为数值计算。工程上实现时通常采用的是迭代法,它从一个初始点开始,反复使用某种规则从移动到下一个点,构造这样一个数列,直到收敛到梯度为0的点处。即有下面的极限成立 l i m k → + ∞ ∇ f ( x k ) = 0 lim_{k \rightarrow +\infin} \nabla f(x_k)=0 limk+f(xk)=0其中k为迭代次数。
这些规则一般会利用一阶导数信息即梯度;或者二阶导数信息即Hessian矩阵。这样迭代法的核心是得到这样的由上一个点确定下一个点的迭代公式: x k + 1 = h ( x k ) x_{k+1}=h(x_k) xk+1=h(xk)

3.2 梯度下降法

梯度下降法只利用了函数的一阶导数信息。

3.2.1 梯度下降法原理

如果一元函数 f ( x ) f(x) f(x)n阶可导,它的泰勒展开公式为: f ( x + Δ x ) = f ( x ) + f ′ ( x ) Δ x + 1 2 f ′ ′ ( x ) ( Δ x ) 2 + . . . + 1 n ! f ( n ) ( x ) ( Δ x ) n f(x + \Delta x) = f(x) + f'(x) \Delta x +\frac{1}{2}f''(x)(\Delta x)^2+...+\frac{1}{n!}f^{(n)}(x)(\Delta x)^n f(x+Δx)=f(x)+f(x)Δx+21f(x)(Δx)2+...+n!1f(n)(x)(Δx)n 多元函数的泰勒展开为: f ( X + Δ X ) = f ( X ) + ( ∇ f ( X ) ) T Δ x + o ( Δ X ) f(X+\Delta X) = f(X)+(\nabla f(X))^T\Delta x + o(\Delta X) f(X+ΔX)=f(X)+(f(X))TΔx+o(ΔX) 此处忽略了二次及更高项。 f ( X + Δ X ) − f ( X ) = ( ∇ f ( X ) ) T Δ x + o ( Δ X ) f(X+\Delta X) - f(X)= (\nabla f(X))^T\Delta x + o(\Delta X) f(X+ΔX)f(X)=(f(X))TΔx+o(ΔX) 如果 Δ X \Delta X ΔX足够小, o ( Δ X ) o( \Delta X) o(ΔX)可以忽略: f ( X + Δ X ) − f ( X ) ≈ ( ∇ f ( X ) ) T Δ X f(X+\Delta X) - f(X) \approx (\nabla f(X))^T\Delta X f(X+ΔX)f(X)(f(X))TΔX
因为 X X X为多元变量,不像一元变量 x x x只有左右两个方向,这是 X X X可以走的方向有很多,该怎么走呢,因为我们想要 f ( X ) f(X) f(X)朝极小值走,即 f ( x + Δ X ) < f ( X ) f(x+\Delta X)<f(X) f(x+ΔX)<f(X),所以只要保证 ( ∇ f ( X ) ) T Δ X < 0 (\nabla f(X))^T\Delta X<0 (f(X))TΔX<0即可。因为 ( Δ f ( X ) ) T Δ X = ∥ ∇ f ( X ) ∥ ∥ Δ X ∥ c o s θ (\Delta f(X))^T\Delta X=\| \nabla f(X) \| \|\Delta X\| cos \theta (Δf(X))TΔX=f(X)ΔXcosθ 其中 ∥ ⋅ ∥ \| \cdot \| 表示向量的模, θ \theta θ为向量之间的夹角。因为向量的模一定大于等于0,所以只需要 c o s θ ≤ 0 cos\theta \leq 0 cosθ0就能得到我们想要的结果。

因为 c o s θ = [ − 1 , 1 ] cos \theta =[-1,1] cosθ=[1,1],当 θ = π \theta = \pi θ=π时有极小值-1,此时 f ( X + Δ X ) f(X+\Delta X) f(X+ΔX)沿着 f ( X ) f(X) f(X)的梯度方向,达到了最大的下降值,该下降的值为: ∥ ∇ f ( X ) ∥ ∥ Δ X ∥ \| \nabla f(X) \| \|\Delta X\| f(X)ΔX
Δ X = − α ∇ f ( X ) \Delta X = -\alpha \nabla f(X) ΔX=αf(X) α \alpha α是一个接近于0的整数,称为步长,由人工设定,用于保证 x + x+ x+ x x x的邻域,此时有: ( ∇ f ( X ) ) T Δ X = − α ( ∇ f ( X ) ) T ( ∇ f ( X ) ) ≤ 0 (\nabla f(X))^T\Delta X=-\alpha (\nabla f(X))^T(\nabla f(X)) \leq 0 (f(X))TΔX=α(f(X))T(f(X))0 而变量 x x x的迭代公式为 X k + 1 = X k − α ∇ f ( X k ) X_{k+1} = X_k - \alpha \nabla f(X_k) Xk+1=Xkαf(Xk)

只要没有到达梯度为0的点,则函数值会沿着负梯度递减,最终会收敛到梯度为0的点,这就是梯度下降法。迭代终止的条件是函数的梯度值为0(实际实现时是接近于0),此时认为已经达到极值点。注意我们找到的是梯度为0的点,这不一定就是极值点,后面会说明。梯度下降法只需要计算函数在某些点处的梯度,实现简单,计算量小。

3.2.2 梯度下降法实现细节

1. 初始值的设定

一般的,对于不带约束条件的优化问题,我们可以将初始值设置为0,或者设置为随机数,对于神经网络的训练,一般设置为随机数,这对算法的收敛至关重要

2. 学习率的设定

学习率设置为多少,也是实现时需要考虑的问题。最简单的,我们可以将学习率设置为一个很小的正数,如0.001。另外,可以采用更复杂的策略,在迭代的过程中动态的调整学习率的值。比如前1万次迭代为0.001,接下来1万次迭代时设置为0.0001

3. 梯度下降的问题

  • 局部极小值
  • 鞍点

3.2.3 梯度下降法的变种

梯度下降法有大量的变种,它们都只利用之前迭代时的梯度信息来构造每次的更新值

随机梯度下降

每次使用一个样本对参数进行更新,单个样本的梯度方向不一定是最优的,所以和梯度下降相比,随机梯度下降需要更多的迭代次数达到收敛效果。
但是随机梯度下降因为下降方向不定,所以可能会跳出鞍点和当前邻域内局部最优值。

批量梯度下降

批量梯度下降结合了梯度下降和随机梯度下降,每次使用一个小批量的训练数据对参数进行迭代,特别是对不能完全load到内存的训练数据,建议使用批量梯度下降。

动量

动量累计了之前的权重更新值,假设 V t + 1 V_{t+1} Vt+1 t + 1 t+1 t+1次迭代的动量,优化变量 x x x的迭代方程为: X t + 1 = X t + V t + 1 X_{t+1} = X_t + V_{t+1} Xt+1=Xt+Vt+1 V t + 1 V_{t+1} Vt+1取代了之前的梯度项。动量项的计算公式为: V t + 1 = − α ∇ f ( x t ) + μ V t V_{t+1} = - \alpha \nabla f(x_t) + \mu V_t Vt+1=αf(xt)+μVt动量项累积了之前的梯度信息,类似于保持行走时的惯性,以避免来回震荡,加快收敛速度。

AdaGrad

AdaGrad为自适应梯度,即adaptive gradient算法,AdaGrad根据前几轮迭代时的历史梯度值来调整学习率,参数更新公式为: ( x t + 1 ) i = ( x t ) i − α ∑ i = 1 t ( f j ′ ( x i ) ) 2 + ϵ f t ′ ( x i ) (x_{t+1})_i = (x_t)_i - \frac{\alpha}{\sqrt{\sum_{i=1}^t(f'_j(x_i))^2+\epsilon}}f'_t(x_i) (xt+1)i=(xt)ii=1t(fj(xi))2+ϵ αft(xi) α \alpha α为全局学习步长, f t ( x i ) f_t(x_i) ft(xi)是第 i i i个优化变量的第 t t t次迭代梯度, ϵ \epsilon ϵ是一个很小的整数,避免出现分母为0的情况。

每个变量都随着学习的进行,根据历史学习率累积总量来决定当前学习率减小的程度。在机器学习的应用中,AdaGrad非常适合样本稀疏的问题,因为稀疏的样本下,每次梯度下降的方向,以及涉及的变量都可能有很大的差异。AdaGrad的缺点是虽然不同变量有了各自的学习率,但是初始的全局学习率还是需要手工指定。如果全局学习率过大,优化同样不稳定;而如果全局学习率过小,因为AdaGrad的特性,随着优化的进行,学习率会越来越小,很可能还没有到极值就停滞不前了。

Adam

Adam算法全称为adaptive moment estimation。它用梯度项构造了两个向量 m m m v v v,这两个向量的更新公式为 ( m t ) i = β 1 ( m t − 1 ) i + ( 1 − β 1 ) ( f t ′ ) i (m_t)_i = \beta_1(m_{t-1})_i + (1-\beta_1)(f'_t)_i (mt)i=β1(mt1)i+(1β1)(ft)i ( v t ) i = β 2 ( v t − 1 ) i + ( 1 − β 2 ) ( f t ′ ) i 2 (v_t)_i = \beta_2(v_{t-1})_i + (1-\beta_2)(f'_t)_i^2 (vt)i=β2(vt1)i+(1β2)(ft)i2 其中 β 1 , β 2 \beta_1,\beta_2 β1,β2由人工指定, i i i为优化向量的分量下标,参数的更新公式:
( x t + 1 ) i = ( x t ) i − α 1 − ( β 2 ) i 2 1 − ( β 1 ) i t ( m t ) i ( v t ) i + ϵ (x_{t+1})_i = (x_t)_i - \alpha \frac{\sqrt{1-(\beta_2)_i^2}}{1-(\beta_1)_i^t}\frac{(m_t)_i}{\sqrt{(v_t)_i}+\epsilon} (xt+1)i=(xt)iα1(β1)it1(β2)i2 (vt)i +ϵ(mt)i
这里, m m m代替梯度, v v v构造学习率。

除了以上介绍的随机梯度改进方法,还有如AdaDelta、 NAG等其他的一些方法。

3.3 牛顿法

第三部分使用了一阶泰勒展开式来解释梯度下降的原理,并使用了一阶导数迭代求参。牛顿法则使用到了二阶导数近似 x x x邻域内的值。

3.3.1 牛顿法推导

多元函数在 X 0 X_0 X0的二阶泰勒展开为:
f ( X ) = f ( X 0 ) + ( ∇ f ( X 0 ) ) T ( X − X 0 ) + 1 2 ( X − X 0 ) T ( ∇ 2 f ( X 0 ) ) ( X − X 0 ) + o ( ( X − X 0 ) 2 ) f(X) = f(X_0)+(\nabla f(X_0))^T(X-X_0) + \frac{1}{2}(X-X_0)^T(\nabla^2f(X_0)) (X-X_0)+o((X-X_0)^2) f(X)=f(X0)+(f(X0))T(XX0)+21(XX0)T(2f(X0))(XX0)+o((XX0)2)
忽略二次及以上项。并对上式两边同时求梯度:
∇ ( X ) = ∇ f ( X 0 ) + ∇ 2 f ( X 0 ) ( X − X 0 ) \nabla(X) = \nabla f(X_0) + \nabla ^2f(X_0)(X-X_0) (X)=f(X0)+2f(X0)(XX0)
其中 ∇ 2 f ( X 0 ) \nabla ^2f(X_0) 2f(X0)为Hessian矩阵,记为 H H H。 令函数的梯度为0,则有:
X = X 0 − ( ∇ 2 f ( X 0 ) ) − 1 ∇ f ( X 0 ) X = X_0 - (\nabla^2f(X_0))^{-1}\nabla f(X_0) X=X0(2f(X0))1f(X0)
将梯度向量简写为 g g g, 上面的公式简写为:
X = X 0 − H − 1 g X = X_0 - H^{-1}g X=X0H1g
从初始点 X 0 X_0 X0处开始,反复计算函数的Hessian矩阵和梯度向量,然后用下式进行迭代:
X k + 1 = X k − H k − 1 g k X_{k+1} = X_k - H_k^{-1} g_k Xk+1=XkHk1gk
其中 − H − 1 g -H^{-1}g H1g称为牛顿方向,迭代终止的条件是梯度的模接近于0,或者函数值下降小于制定阈值。

3.3.2 实现细节


其中 γ \gamma γ是一个超参,接近于0,该参数保证了 X k + 1 X_{k+1} Xk+1 X k X_k Xk的邻域内,从而可以忽略泰勒展开的高次项。如果目标函数是二次函数,Hessian矩阵是一个常数矩阵,对于任意给定的初始点,牛顿法只需要一步迭代就可以收敛到极值点。

x 2 + y 2 x^2+y^2 x2+y2为例:
最优化、凸优化、梯度下降和牛顿法_第5张图片
如果我们把步长设置的足够大(在这里为1),则算法一步就收敛了。在这里,初始迭代位置为(0,4),最优解为(0,0)。

对于不带约束条件的问题,我们可以将x的初始值设定为任意值,最简单的,可以设置为全0的向量。迭代终止的判定规则和梯度下降法相同,是检查梯度是否接近于0。

和梯度下降法相比牛顿法有更快的收敛速度,但每一步迭代的成本也更高。在每次迭代中,除了要计算梯度向量还要计算Hessian矩阵,并求解Hessian矩阵的逆矩阵。实际实现时一般不直接求Hessian矩阵的逆矩阵,而是求解如下方程组:
H k d = − g k H_kd = -g_k Hkd=gk
求解这个线性方程组一般使用迭代法,如共轭梯度法等。

3.3.3 存在的问题

和梯度下降法一样,牛顿法寻找的也是导数为0的点,这不一定是极值点,因此会面临局部极小值和鞍点问题,这在之前的文章中已经介绍过了,这里不再重复。

牛顿法面临的另外一个问题是Hessian矩阵可能不可逆,从而导致这种方法失效。此外,求解Hessian矩阵的逆矩阵或者求解线性方程组计算量大,需要耗费大量的时间。为此,提出了拟牛顿法这种改进方案,在后面会介绍。

除此之外,牛顿法在每次迭代时序列xi可能不会收敛到一个最优解,它甚至不能保证函数值会按照这个序列递减。解决第一个问题可以通过调整牛顿方向的步长来实现,目前常用的方法有两种:直线搜索和可信区域法。可信域牛顿法在后面也会介绍。

直线搜索
牛顿法并不能保证每一步迭代时函数值下降,也不保证一定收敛。为此,提出了一些补救措施,其中的一种是直线搜索(line search)技术,即搜索最优步长。具体做法是让取一些典型的离散值,如0.0001,0.001,0.01等,比较取哪个值时函数值下降最快,作为最优步长。

可信域牛顿法(不是很理解)
可信域牛顿法(Trust Region Newton Methods)可以求解带界限约束的最优化问题,是对牛顿法的改进。在可信域牛顿法的每一步迭代中,有一个迭代序列 x k x_k xk,一个可信域的大小 ∇ k \nabla _k k,以及一个二次目标函数:
q k ( s ) = ( ∇ f ( X k ) ) T s + 1 2 s T ∇ 2 f ( x k ) s q_k(s) = (\nabla f(X_k))^Ts + \frac{1}{2}s^T\nabla^2f(x_k)s qk(s)=(f(Xk))Ts+21sT2f(xk)s
这个式子可以通过泰勒展开式得到,忽略二次以上的项,这是对函数下降值: f ( x k + s ) − f ( x k ) f(x_k + s)-f(x_k) f(xk+s)f(xk)的近似。算法寻找一个 s k s_k sk,在满足约束条件 ∣ ∣ s ∣ ∣ ≤ Δ k ||s|| \leq \Delta_k sΔk下近似最小化 q k ( s ) q_k(s) qk(s)。接下来根据以下式子来更新 x k x_k xk Δ k \Delta_k Δk:
p k = f ( x k + s k ) − f ( x k ) q k ( s k ) p_k = \frac{f(x_k+s_k)-f(x_k)}{q_k(s_k)} pk=qk(sk)f(xk+sk)f(xk)
这是函数值的实际减少量和二次近似模型预测方向导致的函数减少量的比值。迭代方向可以接受的条件是 p k p_k pk足够大,由此可以得到参数的更新规则为:
x k + 1 = { x k + s k , p k > η 0 x k , p k ≤ η 0 x_{k+1} = \begin{cases} x_k+s_k, && p_k>\eta_0\\ x_k,&&p_k\leq \eta_0& \end{cases} xk+1={xk+sk,xk,pk>η0pkη0
其中 η 0 \eta_0 η0是一个人工设定的值。 Δ k \Delta_k Δk的更新规则取决于人工设定的正常数 η 1 \eta_1 η1 η 2 \eta_2 η2,其中: η 1 < η 2 < 1 \eta_1 <\eta_2<1 η1<η2<1.
最优化、凸优化、梯度下降和牛顿法_第6张图片
拟牛顿法
牛顿法在每次迭代时需要计算出Hessian矩阵,然后求解一个以该矩阵为系数矩阵的线性方程组,这非常耗时,另外Hessian矩阵可能不可逆。为此提出了一些改进的方法,典型的代表是拟牛顿法(Quasi-Newton)。

拟牛顿法的思想是不计算目标函数的Hessian矩阵然后求逆矩阵,而是通过其他手段得到Hessian矩阵或其逆矩阵的近似矩阵。具体做法是构造一个近似Hessian矩阵或其逆矩阵的正定对称矩阵,用该矩阵进行牛顿法的迭代。将函数在点处进行泰勒展开,忽略二次以上的项,有:


这个条件称为拟牛顿条件,用来近似代替Hessian矩阵的矩阵需要满足此条件。根据此条件,构造出了多种拟牛顿法,典型的有DFP算法、BFGS算法、L-BFGS算法等,在这里我们重点介绍BFGS算法。下图列出了常用的拟牛顿法的迭代公式(图片来自维基百科):

最优化、凸优化、梯度下降和牛顿法_第7张图片
BFGS算法是它的四个发明人Broyden,Fletcher,Goldfarb和Shanno名字首字母的简写。算法的思想是构造Hessian矩阵的近似矩阵:

总结:
梯度下降,牛顿法等可以解所有最优化问题,但是凸优化问题得到的解是全局最优的,而其他的最优化问题得到的解则不一定是全局最优。

你可能感兴趣的:(ML)