现在做在线学习和CTR常常会用到逻辑回归( Logistic Regression),而传统的批量(batch)算法无法有效地处理超大规模的数据集和在线数据流,google先后三年时间(2010年-2013年)从理论研究到实际工程化实现的FTRL(Follow-the-regularized-Leader)算法,在处理诸如逻辑回归之类的带非光滑正则化项(例如1范数,做模型复杂度控制和稀疏化)的凸优化问题上性能非常出色,据闻国内各大互联网公司都第一时间应用到了实际产品中,我们的系统也使用了该算法。这里对FTRL相关发展背景和工程实现的一些指导点做一些介绍,凸优化的理论细节不做详细介绍,感兴趣可以去查阅相应paper,相关paper列表会在文后附上。机器学习并非本人在校时的专业方向,不过在校期间积累的基础不算太差,而且很多东西也是相通的,钻研一下基本意思都还能搞明白。当然,有不准确的地方欢迎大家讨论指正。
本文主要会分三个部分介绍,如果对理论产生背景不感兴趣的话,可以直接看第3部分的工程实现(这一部分google13年那篇工程化的paper介绍得很详细):
- 相关背景:包括通用性的问题描述、批量算法、传统在线学习算法等
- 简单介绍与FTRL关系比较密切的Truncated Gradient、FOBOS以及RDA(Regularized Dual Averaging)等算法
- FTRL理论公式以及工程实现(对前因后果和理论方面不感兴趣的可以直接看这一小节的工程实现部分)
一、相关背景
【问题描述】
对于loss函数+正则化的结构风险最小化的优化问题(逻辑回归也是这种形式)有两种等价的描述形式,以1范数为例,分别是:
a、无约束优化形式的soft regularization formulation:
b、带约束项的凸优化问题convex constraint formulation:
当合理地选择g时,二者是等价的。这里提这两种形式的问题描述,原因在于引出下面无约束优化和带约束优化问题的不同算法,对于不同的描述形式,会有一系列相关算法。
【批量(batch)算法】
批量算法中每次迭代对全体训练数据集进行计算(例如计算全局梯度),优点是精度和收敛还可以,缺点是无法有效处理大数据集(此时全局梯度计算代价太大),且没法应用于数据流做在线学习。这里分无约束优化形式和约束优化(与上面问题描述可以对应起来)两方面简单介绍一下一些传统批量算法。
a、无约束优化形式:1、全局梯度下降,很常用的算法,就不细说了,每一步求一个目标函数的全局梯度,用非增学习率进行迭代;2、牛顿法(切线近似)、LBFGS(割线拟牛顿,用之前迭代结果近似Hessian黑塞矩阵的逆矩阵,BFGS似乎是几个人名的首字母的简称)等方法。牛顿和拟牛顿等方法一般对于光滑的正则约束项(例如2范数)效果很好,据说是求解2范数约束的逻辑回归类问题最好的方法,应用也比较广,但是当目标函数带L1非光滑、带不可微点的约束项后,牛顿类方法比较无力,理论上需要做修改。感兴趣的可以去查查无约束优化的相关数值计算的书,我也没有更深入研究相关细节,这里不做重点关注。
b、不等式约束凸优化形式:1、传统的不等式约束优化算法内点法等;2、投影梯度下降(约束优化表示下),gt是subgradient,直观含义是每步迭代后,迭代结果可能位于约束集合之外,然后取该迭代结果在约束凸集合上的投影作为新的迭代结果(第二个公式中那个符号标识向X的投影):