预备知识
-
无约束优化问题
我们以前聊过约束优化方法,将带有约束的优化问题(例如 SVM 中间隔的间隔要大于 1)通过 拉格朗日乘子法转化为凸优化问题,再对各参数求偏导从而求的最优解。
那么对于无约束的优化问题呢?我们通常使用跟梯度有关的算法。例如 梯度下降法,在 Logistic回归 中以及神经网络中都有应用。而关于梯度的无约束优化算法还有牛顿法系列。
在介绍牛顿法前我们先来了解两个基础知识,Hesse 矩阵以及 泰勒展开式。
-
Hesse 矩阵
简单来说,Hesse 矩阵就是某一矩阵对于其中各元素的偏导(二阶)。
例如有矩阵:A=[x1x1x2x1x1x2x2x2]
则,H(x)=[∂x12∂2f∂x2∂x1∂2f∂x1∂x2∂2f∂x22∂2f]
Hesse矩阵的通用表达式为:H(x)=[∂xi∂xj∂2f]n∗n
-
泰勒展开式
高数中的经典公式,将一个函数,在某一点处,利用各阶导数计算原函数值。这里以二阶展开举例,省略高阶无穷小的余项。
将 f(x) 在 x0 处的二阶展开:
f(x)=f(x0)+f′(x0)(x−x0)+21f′′(x0)(x−x0)2
对于 x 为矩阵来讲,令 g(x) 表示一阶导,H(x) 表示二阶导:
f(x)==f(x0)+f′(x0)(x−x0)+21f′′(x0)(x−x0)2f(x0)+gT(x0)(x−x0)+21(x−x0)TH(x0)(x−x0)
牛顿法
接下来进入正题,对于无约束优化问题来讲,无法直接求解,所以需要类似梯度下降一样一步一步的迭代。牛顿法也同样基于这个理念。
-
形象化解释
首先来看一个形象化的解释:
∙ 目标:求 f(x)=0 的解 x∗
∙ 初始选择一个接近函数 f(x) 零点的 x0,计算相应的 f(x0) 和切线斜率 f′(x0)。
∙ 利用“两点式”计算经过点 (x0,f(x0)) 且斜率为 f′(x0) 的直线,与 x 轴的交点 (x1,0).
f′(x0)=x0−x1f(x0)−f(x1)=x0−x1f(x0)
x1=x0−f′(x0)f(x0),x1 则为下一次迭代的点,
牛顿法又称为切线法,如图所示:
(图片来自 https://www.cnblogs.com/shixiangwan/p/7532830.html)
以上步骤是求解能使 f(x)=0 时的解 x∗,但我们现在要求的是能使 f′(x)=0 的解,所以,我们的目标变为:
f′′(x0)=x0−x1f′(x0)−f′(x1)
得到:
x1=x0−f′′(x0)f′(x0)⟹ kxk+1=xk−f′′(xk)f′(xk)
这便是我们牛顿法的迭代更新过程。
-
公式化解释
对于函数 g(x),其导数 H(x),对 g(x) 在点 xk 出使用泰勒二阶展开,得:
g(x)=g(xk)+H(xk)(x−xk)
令 x=xk+1,gk=g(xk),Hk=H(xk),则更新迭代公式为:
xk+1=xk+Hk−1(gk+1−gk)
(gk+1=0 时则与之前所推等价)
-
算法过程
- 确定精度要求ε,初始化x0,置k=0
- 计算gk=g(xk),若∣∣g(xk)∣∣≤ε则停止计算,求得近似解x∗=xk;否则转第 3 步
- 计算Hk=H(xk),以及其逆矩阵Hk−1
- 计算xk+1=xk−Hk−1gk,令k=k+1,转第 2 步
我们可以看到,在迭代过程中,需要求 Hk的逆矩阵Hk−1,这个计算比较复杂,效率很低,所以就产生了拟牛顿法。
拟牛顿法
拟牛顿法的思想是与牛顿法一样的,但由于求逆矩阵复杂,多以拟牛顿法寻找一个矩阵用来近似替代 Hk−1
-
拟牛顿条件
想找替代矩阵可不是随便找的,需要满足一个条件(两点式),即:
xk+1−xk=Hk−1(gk+1−gk)
此条件被称为“拟牛顿条件”。
拟牛顿法则是使用 Gk 作为 Hk−1 的近似,要求 Gk 为正定矩阵,且满足拟牛顿条件。根据拟牛顿条件的不同,选取的正定矩阵也不一样:
如果选择 Gk 作为 Hk−1 的近似,就成为 DFP 算法;
如果选择 Bk 作为 Hk 的近似,就成为 BFGS 算法。
按照拟牛顿条件,在每次迭代中可以选择更新替代矩阵:
Gk+1=Gk+ΔGk
为什么要求 Gk或Bk 为正定矩阵呢?那是因为只有它们为正定矩阵时,x 的搜索方向才是 f(x) 下降的方向。
具体的,根据迭代更新公式:xk+1=xk−Hk−1gk,
引入参数 λ,定义 pk=−Hk−1gk
迭代更新公式变为:xk+1−xk=λPk
f(xk+1) 在 xk 处的泰勒一阶展开:f(xk+1)=f(xk)+gkT(xk+1−xk)
将迭代更新公式代入,得:
f(xk+1)=f(xk)−λgkTHk−1gk
因为 Hk 是正定的(Hk−1 也是正定的),所以有 gkTHk−1gk>0,当 λ 为充分小的正数时,总有 f(xk+1)<f(xk),就意味着 f(x) 在迭代中逐步逼近最小值,也就是说 pk 的方向是函数下降方向。
-
DFP (Davidon-Fletcher-Powell)
-
算法推导
DFP 算法选择 Gk 作为 Hk−1 的近似,假设每一步迭代中矩阵 Gk+1 是由 Gk 加上两个附加矩阵构成的,即:
Gk+1=Gk+Pk+Qk,其中 Pk,Qk 为待定矩阵,令 yk=gk+1−gk,δk=xk+1−xk
这时 ,Gk+1yk=Gkyk+Pk+Qkyk
为使 Gk+1 满足拟牛顿条件,可使 Pk,Qk 满足:
Pkyk=δk,可以找到 Pk=δkTykδkδkT
Qkyk=−Gkyk,可以找到 Qk=−ykTGkykGkykykTGk
由以上得到矩阵 Gk+1 的迭代公式:
Gk+1=Gk+δkTykδkδkT−ykTGkykGkykykTGk (公式 G)
可以证明,如果初始矩阵 G0 是正定的,则迭代过程中的每个矩阵 Gk 都是正定的。
-
算法过程
- 确定精度要求ε,初始化x0、G0为正定对称矩阵,置k=0
- 计算gk=g(xk),若∣∣g(xk)∣∣≤ε则停止计算,求得近似解x∗=xk;否则转第 3 步
- 计算pk=Gkgk
- 一维搜索:λk= λ≥0argminf(xk+λpk)
- 计算xk+1=xk+λkpk
- 计算gk+1=g(xk+1),若∣∣g(xk)∣∣≤ε则停止计算,求得近似解x∗=xk;否则,按(公式G)计算Gk+1,置k=k+1
-
BFGS (Broyden-Fletcher-Goldfarb-Shanno)
BFGS 与 DFP 类似,不同的是选取的替代矩阵不同:
Bk+1=Bk+ykTδkykδyT−δkTBkδkBkδkδkTBk
总结
对于牛顿法与拟牛顿法的计算过程的区别:
牛顿法:
通过泰勒展开式近似原函数,每次迭代以计算 Hesse 的逆矩阵为核心,从而逼近 原函数的最小值。
拟牛顿法:
通过初始化 (G0或B0) ,一维搜索 λk,以及替代矩阵(Gk+1或Bk+1)的迭代计算,代替了 Hesse 逆矩阵的计算。
从本质上去看,牛顿法是二阶收敛,梯度下降是一阶收敛,所以牛顿法的收敛速度更快。更通俗地说,如果想找一条最短的路径走到一个山的最底部,梯度下降法每次只从当前所处位置选一个坡度最大的方向走一步,而牛顿法在选择方向时,不仅会考虑坡度是否够大,还会考虑在走了一步之后,坡度是否会变得更大。所以,可以说牛顿法比梯度下降法看得更远一点,能更快地走到最底部。(牛顿法目光更加长远,所以少走弯路;相对而言,梯度下降法只考虑了局部的最优,没有全局思想。)