zoukankan      html  css  js  c++  java
  • 【原创】牛顿法和拟牛顿法 -- BFGS, L-BFGS, OWL-QN

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

    1. 牛顿法

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

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

    [{{f{x}}_{n + 1}} = {{f{x}}_n} - gamma {[Hf({{f{x}}_n})]^{ - 1}} abla f({{f{x}}_n})]

    其中,({[Hf({{f{x}}_n})]^{ - 1}} abla f({{f{x}}_n}))是线搜索方向。这个方向的含义是什么呢。有两种物理解释:

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

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

    2. 拟牛顿算法

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

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

    • BFGS

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

    1. 初始化:初始点({x_0})以及近似逆Hessian矩阵(B_0^{ - 1})。通常,({B_0} = I),既为单位矩阵。

    2. 计算线搜索方向:({{f{p}}_k} =  - B_k^{ - 1} abla f({{f{x}}_k}))

    3. 用”Backtracking line search“算法沿搜索方向找到下一个迭代点:({{f{x}}_{k + 1}} = {{f{x}}_k} + {alpha _k}{{f{p}}_k})

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

    5. 计算({{f{x}}_{k + 1}} = {{f{x}}_k} + {alpha _k}{{f{p}}_k}); 以及 ({{f{y}}_k} = abla f({{f{x}}_{k + 1}}) - abla f({{f{x}}_k}))

    6. 迭代近似逆Hessian矩阵:

    [B_{k + 1}^{ - 1} = left( {I - frac{{{s_k}y_k^T}}{{y_k^T{s_k}}}} ight)B_k^{ - 1}left( {I - frac{{{y_k}s_k^T}}{{y_k^T{s_k}}}} ight) + frac{{{s_k}s_k^T}}{{y_k^T{mkern 1mu} {s_k}}}]

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

    • L-BFGS

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

    L-BFGS算法不存储近似逆Hessian矩阵(B_0^{ - 1}), 而是直接通过迭代算法获取本轮的搜索方向({{f{p}}_k} =  - B_k^{ - 1} abla f({{f{x}}_k}))。

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

    L-BFGS算法的流程如下:

    定义:

    [{s_k} = {x_{k + 1}} - {x_k}{mkern 1mu} ]

    [{y_k} = {g_{k + 1}} - {g_k}{mkern 1mu} ]

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

    再定义:

    [{ ho _k} = frac{1}{{y_k^{ m{T}}{s_k}}}]

    [{g_k} equiv abla f({x_k})]

    L-BFGS算法如下:

    1. 初始化:初始点({x_0})以及近似逆Hessian矩阵(B_0^{ - 1})。通常,({B_0} = I),既为单位矩阵。

    2. 用”Backtracking line search“算法沿搜索方向找到下一个迭代点:({{f{x}}_{k + 1}} = {{f{x}}_k} + {alpha _k}{{f{p}}_k})。

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

    4. 更新搜索方向 ({{f{p}}_k}); 用下面的”two loop recursion"算法。

    two loop recursion算法:

    [egin{array}{l}
    q = {g_k}{mkern 1mu} \
    For(i = k - 1,k - 2, ldots ,k - m):\
    {alpha _i} = { ho _i}s_i^{ m{T}}q{mkern 1mu} \
    q = q - {alpha _i}{y_i}{mkern 1mu} \
    {H_k} = y_{k - 1}^{ m{T}}{s_{k - 1}}/y_{k - 1}^{ m{T}}{y_{k - 1}}\
    z = {H_k}q\
    done\
    For{ m{(}}i = k - m,k - m + 1, ldots ,k - 1):\
    {eta _i} = { ho _i}y_i^{ m{T}}z{mkern 1mu} \
    z = z + {s_i}({alpha _i} - {eta _i}){mkern 1mu} \
    done\
    {{f{p}}_k} = B_k^{ - 1}{g_k} = z
    end{array}]

    • OWL-QN

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

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

    [fleft( x ight) = ell left( x ight) + csumlimits_i {left| {{x_i}} ight|}  -  -  - (1)]

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

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

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

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

    1. 采用伪梯度(pseudo-gradient)(diamondsuit { m{ }}f({x^k}))替代BFGS里的梯度

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

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

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

     

    参考文献:

    1. http://en.wikipedia.org/wiki/Broyden%E2%80%93Fletcher%E2%80%93Goldfarb%E2%80%93Shanno_algorithm

    2. http://en.wikipedia.org/wiki/Limited-memory_BFGS

    3. http://aria42.com/blog/2014/12/understanding-lbfgs/

    4. Andrew, Galen, and Jianfeng Gao. "Scalable training of L 1-regularized log-linear models." Proceedings of the 24th international conference on Machine learning. ACM, 2007.

  • 相关阅读:
    2018-2019-2 20165335『网络对抗技术』Exp5:MSF基础应用
    2018-2019-2 网络对抗技术 20165335 Exp4 恶意代码分析
    2018-2019-2 网络对抗技术 20165335 Exp3 免杀原理与实践
    2018-2019-2 网络对抗技术 20165335 Exp2 后门原理与实践
    2017-2018-2 『网络对抗技术』Exp1:PC平台逆向破解 20165335
    2018-2019-2 《网络对抗技术》Exp0 Kali安装 Week1 20165335
    2018-2019-2 网络对抗技术 20165318 Exp 9 Web安全基础
    2018-2019-2 网络对抗技术 20165115 Exp 8 Web基础
    2018-2019-2 20165115《网络对抗技术》Exp7 网络欺诈防范
    2018-2019-2 网络对抗技术 20165115 Exp6 信息搜集与漏洞扫描
  • 原文地址:https://www.cnblogs.com/richqian/p/4535550.html
Copyright © 2011-2022 走看看