牛顿法和拟牛顿法 -- BFGS, L-BFGS, OWL-QN

数据、特征和数值优化算法是机器学习的核心,而牛顿法及其改良(拟牛顿法)是机器最常用的一类数字优化算法,今天就从牛顿法开始,介绍几个拟牛顿法算法。本博文只介绍算法的思想,具体的数学推导过程不做介绍。

1. 牛顿法

牛顿法的核心思想是”利用函数在当前点的一阶导数,以及二阶导数,寻找搜寻方向“(回想一下更简单的梯度下降法,她只用了当前点一阶导数信息决定搜索方向)。

牛顿法的迭代公式是(稍微有修改,最原始的牛顿法γ=1γ=1:

 

xn+1=xn−γ[Hf(xn)]−1∇f(xn)xn+1=xn−γ[Hf(xn)]−1∇f(xn)

其中,[Hf(xn)]−1∇f(xn)[Hf(xn)]−1∇f(xn)是线搜索方向。这个方向的含义是什么呢。有两种物理解释:

  1. 一阶导数∇f(x)∇f(x)当前搜寻点 与 ∇f(x)=0∇f(x)=0连线的方向。

  2. 当前点泰勒展开(舍弃二阶以上项)函数中 当前搜寻点 与 泰勒展开函数极小值连线方向。

2. 拟牛顿算法

上述的牛顿法需要计算Hessian矩阵的逆矩阵,运算复杂度太高。在动辄百亿、千亿量级特征的大数据时代,模型训练耗时太久。因此,很多牛顿算法的变形出现了,这类变形统称拟牛顿算法。拟牛顿算法的核心思想用一个近似矩阵BB替代逆Hessian矩阵H−1H−1。不同算法的矩阵BB的计算有差异,但大多算法都是采用迭代更新的思想在tranning的没一轮更新矩阵BB。

下面介绍两种最常用的拟牛顿算法:

  • BFGS

BFGS(Broyden–Fletcher–Goldfarb–Shanno)的算法流程如下:

1. 初始化:初始点x0x0以及近似逆Hessian矩阵B−10B0−1。通常,B0=IB0=I,既为单位矩阵。

2. 计算线搜索方向:pk=−B−1k∇f(xk)pk=−Bk−1∇f(xk)

3. 用”Backtracking line search“算法沿搜索方向找到下一个迭代点:xk+1=xk+αkpkxk+1=xk+αkpk

4. 根据Armijo–Goldstein 准则,判断是否停止。

5. 计算xk+1=xk+αkpkxk+1=xk+αkpk; 以及 yk=∇f(xk+1)−∇f(xk)yk=∇f(xk+1)−∇f(xk)

6. 迭代近似逆Hessian矩阵:

 

B−1k+1=(I−skyTkyTksk)B−1k(I−yksTkyTksk)+sksTkyTkskBk+1−1=(I−skykTykTsk)Bk−1(I−ykskTykTsk)+skskTykTsk

上式5中的推到方法比较复杂,有兴趣的可以搜一下相关文献。

  • L-BFGS

BFGS算法需要存储近似逆Hessian矩阵B−10B0−1。对于很多应用来说(比如百度的CTR预估),千亿量级的feature数需要10161016p存储。显然,目前的计算机技术还很难满足这样的空间需求。因此,内存受限的BFGS算法(Limited-memory BFGS)就诞生了。

L-BFGS算法不存储近似逆Hessian矩阵B−10B0−1, 而是直接通过迭代算法获取本轮的搜索方向pk=−B−1k∇f(xk)pk=−Bk−1∇f(xk)。

虽然L-BFGS算法不需要保存B−10B0−1矩阵,但要保存每次迭代的中间信息,不过都是一维数组,而迭代次数有不会很多(100次以内),所以存储要求大大降低。

L-BFGS算法的流程如下:

定义:

 

sk=xk+1−xksk=xk+1−xk

 

yk=gk+1−gkyk=gk+1−gk

以上两个一维数组需要保存每次迭代的结果。

再定义:

 

ρk=1yTkskρk=1ykTsk

 

gk≡∇f(xk)gk≡∇f(xk)

L-BFGS算法如下:

1. 初始化:初始点x0x0以及近似逆Hessian矩阵B−10B0−1。通常,B0=IB0=I,既为单位矩阵。

2. 用”Backtracking line search“算法沿搜索方向找到下一个迭代点:xk+1=xk+αkpkxk+1=xk+αkpk。

3. 根据Armijo–Goldstein 准则,判断是否停止。

4. 更新搜索方向 pkpk; 用下面的”two loop recursion"算法。

two loop recursion算法:

 

q=gkFor(i=k−1,k−2,…,k−m):αi=ρisTiqq=q−αiyiHk=yTk−1sk−1/yTk−1yk−1z=HkqdoneFor(i=k−m,k−m+1,…,k−1):βi=ρiyTizz=z+si(αi−βi)donepk=B−1kgk=zq=gkFor(i=k−1,k−2,…,k−m):αi=ρisiTqq=q−αiyiHk=yk−1Tsk−1/yk−1Tyk−1z=HkqdoneFor(i=k−m,k−m+1,…,k−1):βi=ρiyiTzz=z+si(αi−βi)donepk=Bk−1gk=z

  • OWL-QN

OWL-QN算法的全称是Orthant-Wise Limited-memory Quasi-Newton。从全称可以看出,该算法是单象限的L-BFGS算法,也就是说,OWL-QN算法每次迭代都不会超出当前象限。

为什么要加象限限制呢?L-BFGS算法需要计算函数的导数,这就要求优化函数需要处处可导。对于l2−norml2−norm正则项,这个要求是满足的,但对l1−norml1−norm正则项,这函数并非处处可导:

 

f(x)=ℓ(x)+c∑i|xi|−−−(1)f(x)=ℓ(x)+c∑i|xi|−−−(1)

l1−norml1−norm正则项具有特征选择的效果,是很多大规模机器学习算法的选择。为了牛顿法思想可以应用于l1−norml1−norm正则项的机器学习算法,学者提出了OWL-QN算法。

观察式(1),正则项在任意一个象限里都是线性的,一阶导数为常数,二阶导数为0。OWL-QN算法的核心思想就是将参数每次迭代更新都限制在一个象限内,即每次迭代都不改变参数的正负性。

但是,优化过程中,很多参数的正负肯定是需要改变的。OWL-QN算法通过在下次迭代中选择合适的象限来改变参数的正负。比如,一个参数在当前点是正相权重,在线搜索时,按照标准的线搜索算法,该参数会变成负。OWL-QN算法限制了符号变换,对于需要变换符号的参数,将其置为0。待下一次迭代时,再根据情况决定该维度的搜索方向。

与L-BFGS算法相比,OWL-QN算法做了以下几点调整:

1. 采用伪梯度(pseudo-gradient)♢f(xk)♢f(xk)替代BFGS里的梯度

2. 线搜索是,如果某一维度变量需要跨越象限(正负号改变),则该维度值置为0

其中,1中的伪梯度是这么算的,不为0的参数,其偏微分即为其正负号(线性),若某一位为0,其梯度也置为0。

总结OWL-QN算法如下[4]:

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值