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

1. 牛顿法

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

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

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

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

  1. 一阶导数\(\nabla f({\bf{x}}){\mkern 1mu} \)当前搜寻点 与 \(\nabla f({\bf{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. 计算线搜索方向:\({{\bf{p}}_k} =  - B_k^{ - 1}\nabla f({{\bf{x}}_k})\)

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

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

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

6. 迭代近似逆Hessian矩阵:

\[B_{k + 1}^{ - 1} = \left( {I - \frac{{{s_k}y_k^T}}{{y_k^T{s_k}}}} \right)B_k^{ - 1}\left( {I - \frac{{{y_k}s_k^T}}{{y_k^T{s_k}}}} \right) + \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}\), 而是直接通过迭代算法获取本轮的搜索方向\({{\bf{p}}_k} =  - B_k^{ - 1}\nabla f({{\bf{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} \]

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

再定义:

\[{\rho _k} = \frac{1}{{y_k^{\rm{T}}{s_k}}}\]

\[{g_k} \equiv \nabla f({x_k})\]

L-BFGS算法如下:

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

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

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

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

two loop recursion算法:

\[\begin{array}{l}
q = {g_k}{\mkern 1mu} \\
For(i = k - 1,k - 2, \ldots ,k - m):\\
{\alpha _i} = {\rho _i}s_i^{\rm{T}}q{\mkern 1mu} \\
q = q - {\alpha _i}{y_i}{\mkern 1mu} \\
{H_k} = y_{k - 1}^{\rm{T}}{s_{k - 1}}/y_{k - 1}^{\rm{T}}{y_{k - 1}}\\
z = {H_k}q\\
done\\
For{\rm{(}}i = k - m,k - m + 1, \ldots ,k - 1):\\
{\beta _i} = {\rho _i}y_i^{\rm{T}}z{\mkern 1mu} \\
z = z + {s_i}({\alpha _i} - {\beta _i}){\mkern 1mu} \\
done\\
{{\bf{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\)正则项,这函数并非处处可导:

\[f\left( x \right) = \ell \left( x \right) + c\sum\limits_i {\left| {{x_i}} \right|}  -  -  - (1)\]

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

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

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

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

1. 采用伪梯度(pseudo-gradient)\(\diamondsuit {\rm{ }}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.

【原创】牛顿法和拟牛顿法 -- BFGS, L-BFGS, OWL-QN的更多相关文章

  1. A-03 牛顿法和拟牛顿法

    目录 牛顿法和拟牛顿法 一.牛顿法详解 1.1 无约束最优化问题 1.2 牛顿法迭代公式 1.3 牛顿法和梯度下降法 二.牛顿法流程 2.1 输入 2.2 输出 2.3 流程 三.拟牛顿法简介 更新. ...

  2. 拟牛顿法——DFP、BFGS、L-BFGS

    DFP 该算法的核心是:通过迭代的方法,对Hk+1(-1)近似.迭代方式: 其中D0通常取为单位矩阵,关键是每一步构造矫正矩阵△Dk. 考虑△Dk 的待定形式为 拟牛顿的条件 这里插播一下拟牛顿的条件 ...

  3. 牛顿法|阻尼牛顿法|拟牛顿法|DFP算法|BFGS算法|L-BFGS算法

    一直记不住这些算法的推导,所以打算详细点写到博客中以后不记得就翻阅自己的笔记. 泰勒展开式 最初的泰勒展开式,若  在包含  的某开区间(a,b)内具有直到n+1阶的导数,则当x∈(a,b)时,有: ...

  4. Todd's Matlab讲义第3讲:牛顿法和for循环

    方程数值求解 下面几讲,我们将聚集如下方程的解法: \begin{equation} f(x)=0 \tag{3.1}\label{3.1} \end{equation} 在微积分课程中,我们知道,许 ...

  5. [Math] 常见的几种最优化方法

    我们每个人都会在我们的生活或者工作中遇到各种各样的最优化问题,比如每个企业和个人都要考虑的一个问题“在一定成本下,如何使利润最大化”等.最优化方法是一种数学方法,它是研究在给定约束之下如何寻求某些因素 ...

  6. (转) ICML2016 TUTORIAL参会分享

    ICML2016 TUTORIAL参会分享 本文转自: https://mp.weixin.qq.com/s?__biz=MzI3MDE4NTk4MQ==&mid=2658399541& ...

  7. **ML : ML中的最优化方法

    前言:         在机器学习方法中,若模型理解为决策模型,有些模型可以使用解析方法.不过更一般的对模型的求解使用优化的方法,更多的数据可以得到更多的精度.         AI中基于归纳的方法延 ...

  8. 大叔学ML第五:逻辑回归

    目录 基本形式 代价函数 用梯度下降法求\(\vec\theta\) 扩展 基本形式 逻辑回归是最常用的分类模型,在线性回归基础之上扩展而来,是一种广义线性回归.下面举例说明什么是逻辑回归:假设我们有 ...

  9. ICML2016 TUTORIAL参会分享

    本次ICML会议的tutorial安排在主会前一天.这次tutorial内容非常丰富,有微软亚研的hekaiming(已经跳去facebook)介绍深度残差网络,也有deepmind的david si ...

随机推荐

  1. Android loader 详解

    装载器从android3.0开始引进.它使得在activity或fragment中异步加载数据变得简单.装载器具有如下特性: 它们对每个Activity和Fragment都有效. 他们提供了异步加载数 ...

  2. Java 序列化的高级认识

    序列化 ID 问题 情境:两个客户端 A 和 B 试图通过网络传递对象数据,A 端将对象 C 序列化为二进制数据再传给 B,B 反序列化得到 C. 问题:C 对象的全类路径假设为 com.inout. ...

  3. SQL语句AND 和 OR执行的优先级

    例句: ) FROM RT_CUSTALLOCRESULT WHERE REGDATE BETWEEN '2014-03-01' AND '2014-03-31' ) FROM RT_CUSTALLO ...

  4. JAVA类型信息——反射机制

    JAVA类型信息——反射机制 一.反射机制概述 1.反射机制:就是java语言在运行时拥有的一项自我观察的能力,java通过这种能力彻底了解程序自身的情况,并为下一步的动作做准备. 2.反射机制的功能 ...

  5. 用eclipse创建maven项目

    Maven是基于项目对象模型(POM),也可以进行模块化开发.并且是个强大的管理工具.本经验用eclipse来创建maven项目 步骤: 1.下载并正确安装eclipse 2.在eclipse上成功安 ...

  6. 01 - 开发成功的Oracle应用

    笔记 1. 开发数据库应用,不能把数据库当黑盒.需要了解数据库的一下内容 数据库的体系结构 并发控制 开发的时候就要调优你的代码 数据库有哪些特性,不要在你的代码里重复实现 深入的学习SQL 2. 我 ...

  7. Android 核心分析之十三Android GWES之Android窗口管理

    Android GWES之Android窗口管理1基本构架原理 Android的窗口管理是C/S模式的.Android中的Window是表示Top Level等顶级窗口的概念.DecorView是Wi ...

  8. java 基本数据类型 回顾

  9. JavaWeb项目开发案例精粹-第6章报价管理系统-07View层

    1. 2.back_index.html <HTML> <HEAD> <META HTTP-EQUIV="Content-Type" CONTENT= ...

  10. Centos环境下部署游戏服务器-软件安装

    这篇文章主要介绍一下游戏服务器需要安装的软件和需要修改的配置.现介绍下项目,本项目服务器端是c++ + mysql组合,客户端是as写的,需要安装的服务为Mysql,Php,Apache, 以及一个n ...