机器学习优化算法L-BFGS及其分布式实现

最近做的科研项目需要用到L-BFGS,这段时间看了不少关于L-BFGS的博客以及论文,在此进行一下小小的总结。

在无约束优化问题中,牛顿法及拟牛顿法是常用的方法,L-BFGS属于拟牛顿法,下面从牛顿法开始说起。

牛顿法,顾名思义,是由伟大的牛顿先生首先提出的(当然有资料显示,在更早前就有人提出相同方法,但可能因为牛顿先生名气过大,冠以他的名字会更火)。我们考虑无约束问题 minf(x)xRn , 牛顿法需要使用Taylor展开,因此我们假设 f(x) 是二阶可微实函数,把 f(x) xk 处Taylor展开并取二阶近似为

f(x)f(xk)+f(xk)T(xxk)+12(xxk)T2f(xk)(xxk)(1)

其中, 2f(x) f(x) xk 处的 Hessen矩阵。我们的目标是求 f(x) 的最小值,而导数为0的点极有可能为极值点,故在此对 f(x) 求导,并令其导数为0,即 f(x)=0 ,可得
f(x)=f(xk)+2f(xk)(xxk)=0(2)

2f(x) 可逆,由(2)可以得到牛顿法的迭代公式
xk+1=xk2f(xk)1f(xk)(3)
d=2f(xk)1f(xk) 被称为牛顿方向,可以证明牛顿法至少是2阶收敛的,在此由于篇(neng)幅(li)所限,就不进行证明了。

细心的读者可能会发现,我们上面的推导公式,做了很多前提假设,假设了Hessen矩阵 2f(x) 可逆,那么问题来了,如果 f(x) 的Hessen矩阵奇异,或者非奇异但是不正定怎么办?这个时候,我们就需要使用拟牛顿法了,拟牛顿法,同样可以顾名思义,就是模拟牛顿法,用一个近似于 2f(x)1 的矩阵 Hk+1 来替代 2f(x)1 。公式(2)在 xk+1 附近有,

f(x)=f(xk+1)+2f(xk+1)(xxk+1)
x=xk ,则有
f(xk)=f(xk+1)+2f(xk+1)(xxk+1)
pk=xk+1xk
qk=f(xk+1)f(xk)
代入则有,
pk2f(xk+1)1qk
拟牛顿法用 Hk+1 来替代 2f(x)1 ,即
pk=Hk+1qk(4)
这也被称为拟牛顿条件。在各种拟牛顿法中,一般的构造 Hk+1 的策略是, H1 通常选择任意的一个n阶对称正定矩阵(一般为 I ),然后通过不断的修正 Hk 给出 Hk+1 ,即
Hk+1=Hk+ΔHk(5)
ΔHk 称为校正矩阵,不同的拟牛顿法的区别也多在于此项。一般来说,构造的 ΔHk 通常是正定的,这样再加上初始的 H1 正定,我们就可以保证在迭代过程中 Hk 始终正定。

在说BFGS算法之前,我们先介绍另一个拟牛顿算法,DFP算法。初次听说DFP算法的人应该是不能顾名思义了,在最优化领域,很多算法是由发明人的名字简称构成的,DFP算法就是由Davidon首先提出,后来又经过Fletcher和Powell改进的算法。下面来说DFP算法中校正矩阵 ΔHk 的构造方法。我们假设

ΔHk=mvvT+nwwT(6)
其中 m n 均是实数, v w 表示 N 维向量,这样我们就能保证 ΔHk 是正定的。把(6)代入(5),(5)代入(4)可得
pk=Hkqk+mvvTqk+nwwTqk=Hkqk+v(mvTqk)+w(nwTqk)(7)
我们的目标是求 ΔHk ,即要从公式(7)中解出 m n v w 。怎么从复杂的公式(7)中求出上述那些值呢,这个时候万能的假设又显示了其强大的力量,我们可以通过假设来得到一组特殊解,令 mvTqk=1 nwTqk=1 ,则此时只需 v=pk w=Hkqk 就能够满足公式(7)。综上,我们得到的一组特殊解为,
v=pk=xk+1xk
w=Hkqk=Hk[f(xk+1)f(xk)]
m=1vTqk,n=1wTqk
将上述结果代入(5)(6),可得
Hk+1=Hk+pk(pk)T(pk)TqkHkqk(qk)THk(qk)THkqk(8)
好了,现在我们得到了DFP算法 Hk 的公式,整个DFP算法的过程如下:

  1. 给定初始点 x1 ,迭代停止条件 ε 以及初始的 H1=I ,令迭代次数 k=1
  2. 计算出在 x1 处的梯度 g1=f(x1)
  3. 确定牛顿方向 dk=Hkgk
  4. xk 出发,沿 dk 方向进行搜索,并求出满足 f(xk+λkdk)=minλ0f(xk+λdk) 的步长 λk ,同时,令 xk+1=xk+λkdk
  5. 检查本次迭代是否达到我们之前设定的收敛条件,即 ||f(xk+1)||ε ,如果满足收敛条件,则返回点 x¯=xk+1 ,否则继续进行步骤6.
  6. gk+1=f(xk+1) pk=xk+1xk qk=f(xk+1)f(xk) ,并利用公式(8)计算 Hk+1 ,令 k=k+1 ,返回步骤3.

接着来说一下本文的重点BFGS算法,这个算法是由Broyden,Fletcher,Goldfarb和Shanno于1970年提出的,这个算法从提出到现在一直被认为是最好的拟牛顿法,应用依然十分的广泛。前面DFP算法通过 Hk+1 来近似 2f(xk)1 ,由公式(4)的另一种形式,通过使用 Bk+1 来近似 2f(xk) ,这个时候拟牛顿条件就变成了下面这个样子

qk=Bk+1pk(9)
我们可以看出,相对于公式(4),公式(9)相当于用 Bk+1 代替 Hk+1 ,同时将 pk qk 进行交换,同样的道理,我们可以将 Hk+1 的迭代公式改成如下形式
Bk+1=Bk+qk(qk)T(qk)TpkBkpk(pk)TBk(pk)TBkpk(10)
公式(10)被称作关于矩阵 B 的BFGS修正公式。当然,我们的目标是要得到 Hk+1 ,也就是说我们要得到 B1k+1 的值,此时,我们对公式(10)利用 Sherman–Morrison公式,显然,就能够得到BFGS算法 H 矩阵的迭代公式(11)。(在这我用到了“显然”,好像这一步好像是非常简单,或者显得作者技术非常高深,我们之前就深受“显然”的伤害,比如习题答案中。实际上,在这我用显然,是我没有推出这一步,很多资料上也都是一笔带过,可能那些大牛作者来说,这真是小菜一碟,但我尝试推导了一下,没有推出来,项目时间所限,我也没有深究,如果有人有相关资料,可以跟我说下,后续我还会再推导一次,如果有结果我会更新的)
Hk+1=VTkHkVk+1(qk)Tpkpk(pk)T(11)
其中, Vk=I1(qk)Tpkqk(pk)T 公式(11)可能看起来很陌生,下面我们将它整理一下,就得到下面这个形式
Hk+1=Hk+pk(pk)T(pk)TqkHkqk(qk)THk(qk)THkqk+(qk)THkqkyyT(12)
其中 y=pk(pk)TqkHkqk(qk)THkqk 我们可以知道,对比DFP算法,BFGS算法 H 矩阵的更新公式就多了最后一项。BFGS算法的其他步骤跟DFP算法相同,只需要将步骤6中根据公式(8)计算 Hk+1 换成根据公式(11)。

好了,到这里我们说完了BFGS公式,但我们的题目是L-BFGS算法,很多人会问道L-BFGS算法跟BFGS算法相比有什么不同呢。L-BFGS算法全称是Limited-momery BFGS算法,与BFGS算法相比,这个算法能够有效的节省内存的占用,我们知道,BFGS算法在运行的时候,每一步迭代都需要保存一个 n×n 的矩阵,现在我们很多机器学习问题都是高维的,当 n 很大的时候,这个矩阵占用的内存是非常惊人的,并且所需的计算量也是很大的,这使得传统的BFGS算法变得非常不适用。而L-BFGS则是很对这个问题的改进版,从上面所说可知,BFGS算法是通过曲率信息 (pk,qk) 来修正 Hk 从而得到 Hk+1 ,L-BFGS算法的主要思路是:算法仅仅保存最近 m 次迭代的曲率信息来计算 Hk+1 。这样,我们所需的存储空间就从 n×n 变成了 2m×n 而通常情况下 m<<n 。下面再说,如何通过 m 次曲率信息来构造 Hk 。我们回到公式(11),通过反复递归的调用公式(11),可以得到如下公式:

Hk=(VTk1VTkm)H0k(VkmVk1)+1(qk)Tpk(VTk1VTkm+1)pkmpTkm(Vkm+1Vk1)+1(qk)Tpk(VTk1VTkm+2)pkm+1pTkm+1(Vkm+2Vk1)++1(qk)Tpkpk1pTk1(12)
其中, H0k 表示的是在第 k 次迭代时候的初始值,一个实践中经验的公式是
H0k=rkI(13)rk=pTk1qk1qTk1qk1(14)
好了,现在可以说一下L-BFGS算法的整体框架了。
机器学习优化算法L-BFGS及其分布式实现_第1张图片
好了,现在还剩一个问题,就是怎么计算下降方向 dk ,当然我们可以直接根据公式(12)求出 Hk 然后再利用公式 dk=Hkf(xk) 来计算,一种更为常用、更为方便的方式是利用two-loop recursion方法来计算,下图就是该算法的过程。
机器学习优化算法L-BFGS及其分布式实现_第2张图片
从参考资料4和参考资料6,可以证明two-loop recurion算法的结果跟我们之前所说通过 Hk 的算法得到的形式是完全一样的,在此就不进行赘述了。

到此,我们也说完了L-BFGS算法了,下面开始说L-BFGS算法并行化的实现,这部分参考的是MS Research 14年发表在NIPS上的文章《Large-scale L-BFGS using MapReduce》。下面说一下他们是如何将L-BFGS算法通过MapReduce并行化实现。先来看一下算法1,算法1的主要步骤在于2,3,4这三步。当把数据分成多个分块的时候,步骤2计算 f(x) 是很容易被并行化的,比如在机器1上计算 f(x1)f(x10) ,在机器2上计算 f(x11)f(x20) ,然后通过一个Reduce把这些合成一个完整的梯度向量。而对于步骤4来说,它本质上来说也是一个一维搜索来求 f(x+λd) 的最小值,我们同样可以通过把数据分区,然后Map算各自分区上的值,Reduce合起来,并查找最小的 λ 值。所以,对于算法1来说,只要我们能够把步骤3也就是算法2进行并行化,我们就能把整个算法给并行化了。下面开始说怎么能够把算法2分布式实现。在算法2中,大部分的操作都是点乘,我们可以使用map-reduce来计算每一个点乘操作,比如算法2步骤3中的 (pi)Td 以及 (qi)Tpi 等。这样,整个算法2我们需要进行的map-reduce操作至少应该为 2m 次,再考虑到算法1中需要反复的迭代,假设算法1迭代 N 次,则整个算法的map-reduce操作次数为 2mN 次,一般来说迭代次数 N 非常大,假如 m=10N=100 ,则需要2000次的map-reduce操作,这个过程任务调度、job启停开销都是非常大的,基本不可行。我们再仔细观察一下算法2,可以观察到下面三个特征:

  1. 在算法2整个过程中,输入的变量都不会改变
  2. 对最终方向 d 所有的操作都是输入向量的线性组合,尽管我们暂时不知道这些系数是什么
  3. 整个算法核心的操作都是点乘

这三个特征非常重要,正式由于有了这三个特征,才能实现下面的算法。根据特征1和2,可以把算法2所有的输入表示成不变的基向量

b1=pkm,b2=pkm+1,,bm=pk1(15)

bm+1=qkm,bm+2=qkm+1,,b2m=qk1(16)

b2m+1=f(xk)(17)

接着,根据特征2,将 d 表示成这些 bi 的线性组合,组合系数为 δ ,则 d 可以写成
d=j=1j=2m+1δjbj(18)
从公式(18)可以看出,因为 bj 是输入,并且在整个算法运行的过程中不会改变(特征1),所以一旦知道了组合系数 δj ,就可以知道 d 。接着,我们把所有的点乘,根据是否有 d 参与分成两类,对于之设计输入向量 (pi,qi) 的点乘,由于入参不变,点乘的结果也不会变,可以提前算出所有的点乘结果,用点乘结果的常数来替换点乘。对于设计到 d 的点乘,由于我们根据特征2以及公式(18)已经将 d 表示成了基向量的线性组合,在这里就可以用线性组合来替换 d ,这个是个非常elegant的变化,替换以后整个 d 就可以表示成完全由基向量 bj 间点乘的线性组合。好了,说了这么多,下面展示一下这个新算法,MS的人把这个算法叫做VL-BFGS(Vector-free L-BFGS),从名字就知道,这个算法把算法2中所有向量操作都变成实数操作了(vector-free)。
机器学习优化算法L-BFGS及其分布式实现_第3张图片
对于VL-BFGS算法的入参来说,由于所有的向量都是相同维度的,可以将这些向量的数据进行切分,这样的话,可以通过一次map-reduce来计算整个矩阵,当然对于算法来说,就是 (2m+1)×(2m+1) 个实数。在每个机器上存储 (2m+1)×(2m+1) 个实数是不成问题的,所以整个算法3可以直接在一台机器上进行运行。算法3中的步骤是与算法2中一一对应的,例如算法3中9-11行就相当于算法2中的第6行,在这就不再细说了。

本来就想简单的说一说,现在洋洋洒洒的写了这么多,这是我的第一篇博客,我力求写的有根有据,但是由于水平所限,还很有可能出现很多的错误,希望各位读者不吝赐教。最后,很多人可能会问,你用L-BFGS做什么,可以稍微的透露一下,做推荐,用矩阵分解的算法,这是优化中的一步,后续我会实现整个算法,等项目结束了以后,会把项目代码的github连接补充上。最后,做一下下期预告,在读论文的过程中看到MS Research07年发在ICML上的《Scalable training of L 1-regularized log-linear models》也很有意思,下期会整理这个Orthant-Wise Limited-memory Quasi-Newton算法,敬请期待,上映时间不定,感谢阅读。

本文参考文献:

  1. http://www.codelast.com/?p=2780
  2. http://www.tuicool.com/articles/EviQ32m
  3. http://en.wikipedia.org/wiki/Limited-memory_BFGS
  4. http://wenku.baidu.com/view/cd610728fe4733687e21aae3.html
  5. Chen W, Wang Z, Zhou J. Large-scale L-BFGS using MapReduce[C]//Advances in Neural Information Processing Systems. 2014: 1332-1340.
  6. J Nocedal and S J Wright. Numerical Optimization, volume 43 of Springer Series in Operations Research. Springer, 1999.
  7. 陈宝林. 最优化理论与算法[M]. 清华大学出版社有限公司, 2005.

你可能感兴趣的:(数据挖掘-分布式)