FTRL 是 Follow The Regularized Leader 的缩写,它是 Google 在 2010 -- 2013 年三年时间内,从理论研究到实际工程化实现的在线优化算法框架。FTRL 在处理带
中文网络上,已有一些关于 FTRL 的介绍。比较详细和出名的是新浪微博的冯扬撰写的「在线最优化求解」。但在我看来,已有的关于 FTRL 的介绍,都或多或少有些值得调整和改进的地方。这促成了这篇文章。
这篇文章讲 FTRL 的理论部分,大致会按照这样的路径来阐述:
- 我们想要解决什么问题?
- FTRL 的前辈们是怎么尝试解决问题的?
- 前辈们之间是什么关系?又留下了哪些尚未解决的问题?FTRL 是如何解决这些遗留问题的?
而后,在下一篇工程部分的文章中,我们会讨论一下 FTRL 的工程实现有哪些值得谈一谈的问题。
我们面临的问题
传统的运用机器学习解决实际问题的步骤如下:
- 数据融合,获取数据样本的标签。
- 特征工程及其 ETL,获取每个样本的特征。
- 样本处理,处理正负样本比例、无效或作弊样本等问题,输出用于训练、验证、测试的样本集。
- 构建模型,根据业务特点和数据特点,选取恰当的模型;比如 LR、FM、GBDT、DNN 等。
- 训练模型,在训练集上训练模型,在验证集上调参。
- 模型评估,在测试机上评估模型。
- 在线预测,将有效模型上线,进行在线预测。
这样的流程能够解决很多问题,但存在至少两方面的瓶颈:
- 整套流程在样本维度是「批量」的,在特征高维数据大量的情况下,这导致模型更新周期较长。在工程能力强的团队手上,模型的更新周期最好能做到小时级别;在工程能力差的团队手上,这个周期可能是天级甚至是周级别的。
- 模型的复杂度和线上预测性能之间难以权衡:模型复杂度低,线上预测效果差;模型复杂度高,线上预测效果好,但需要的存储、时间资源也随之升高,无法保证 RT 和 QPS。
为了解决这里的问题 (1),在线学习(Online Learning)逐渐兴起;为了解决问题 (2),人们从各种正则、剪枝开始,尝试用各种手段,在保证模型精度的前提下,尽可能获得稀疏的模型。
在线学习的兴起
我曾经在多个场合谈到,机器学习模型的三要素是:
- 模型结构;
- 优化目标;
- 求解方法。
在这里,模型结构通常会需要根据实际问题的特点进行调整。例如,对于具有稠密特征样本的分类问题,GBDT 类的树模型往往效果良好。又例如,对于具有高维稀疏特征的大规模样本,逻辑回归和因子分解机(及其变体)就会是不错的选择。
优化目标往往会以目标函数这一数学形式来表达。目标函数中的损失函数,则是用来描述「模型对经验数据拟合程度好坏」的方法。目标函数(或损失函数)的选择,通常也是和实际问题的特点相关的。例如对于回归问题和分类问题,通常就会选择不同的损失函数。
对于样本集合
中编号为 的样本 来说,在确定好模型结构 的基础上,损失函数记为
求解方法则是解决如何在有限的时间内,求得一个既简单(模型复杂度低,不易过拟合)性能又好(对经验数据拟合程度较高)的模型。在模型结构确定的基础上,机器学习模型的学习,往往会化归为带参数目标函数的最优化求解问题。如何解决这些最优化问题,或者说,采用何种求解方法,往往要根据问题特点、模型结构、目标函数等等各种因素的不同,综合考虑。
批量
在机器学习兴起的早期,由于数据规模较小,计算性能较低与求解复杂度较高的矛盾尚不明显,人们很自然地选择与直觉相符合的批量求解方式来优化模型。具体来说,人们通常会随机给定模型参数
对于这种解法,典型的方式是梯度下降(Gradient Descend)和牛顿法、拟牛顿法等。以梯度下降法为例,其
在这种做法当中,每一次迭代,都需要扫描整个样本集合
随机小批量
我在强迫症患者也需要随机梯度下降一文中介绍了随机(小批量)梯度下降(Stochastic Gradient Descend)的方法和它的好处。按照本文的记号约定,随机梯度下降第
这里描述的是随机小批量梯度下降。其中
在这种做法当中,每一次迭代,无需扫描整个样本集合
在线学习
随机(小批量)的优化方法解决了一部分问题,但做到极限,模型的更新周期也只能缩短到小时级。因此,在线学习逐渐走上了舞台。
和前辈们相比,在线学习最大的特点(或者说需求)有两个:
- 每次只处理少数几个样本,甚至每次只处理一个样本;
- 处理过的样本对于优化过程来说会被「丢弃」,再也看不到了,因此在线学习需要一种「不吃后悔药」的优化方法。
回过头来看随机(小批量)梯度下降,我们发现它恰好能满足在线学习的这两方面需求。对于第一个需求来说,这是显然的。对于第二个需求来说,在线接收的样本某种意义上就可以理解为是一种随机,只要这些随机送到优化器的样本的梯度在统计期望上与总体样本是一致的(而这是在线学习的基本假设),那就适用随机(小批量)梯度下降。
事情看起来很美妙,只需要把随机(小批量)梯度下降整合进在线学习的工程框架当中就可以了。但是事情没有那么美妙,因为这依然无法解决我们面临的第二个问题——对模型稀疏性的追求。
对模型稀疏性的追求
模型稀疏的好处
模型稀疏的好处有几个方面。
一是能解决之前提到的「模型复杂度低,线上预测效果差;模型复杂度高,线上预测效果好,但需要的存储、时间资源也随之升高,无法保证 RT 和 QPS」之问题。这是比较显然的。稀疏的模型会大大减少预测时的内存和复杂度。以 LR 为例,若已知输入向量的维度是
二是模型的稀疏与
三是稀疏性较好的模型,相对来说可解释性更好。这对于我们来说,特别是在实际应用当中,是很有好处的。以那个经典的例子来解释,假设你现在需要训练一个模型,解释人的某些特征和罹患某种疾病之间的关系。如果模型稀疏,那么意味着,罹患某种疾病只与少数一些特征有关。这种模型,对于医生来说,是很友好的。因为当医生拿到一个人的指标数据(特征),他就能根据模型,很容易地告诉来访的就医者说:「你的 XX 指标比较高,而 YY 指标比较低,这是罹患 ZZ 疾病的高危因素。因此你需要在日常生活中注意某些方面,同时定期进行身体检查。」
在批量梯度下降中,追求模型稀疏性
我们从最基本的批量梯度下降开始,逐步探寻如何解得一个稀疏的模型。
如谈谈 L1 与 L2-正则项一文所说的那样,我们只需将
这样一来,模型优化时需要最小化的目标函数变更为如下形式:
这里,等式右边的第一项表示模型在训练集
那么为什么加入
我们假设对于某个
正则在 SGD 中
注意,在批量梯度下降中,
但是,SGD 的假设(随机梯度的期望等于全局梯度)并不能保证在全局梯度满足上式的情况下,随机梯度总能使上式成立。这意味着,在 SGD 的场景中,使用
那么问题就来了:按之前的说法,在线学习中,我们必然要依赖类似 SGD 的算法;但
FTRL 的前辈们
前面提到,加入
一个粗暴有简单的想法是:基于
- 按带
正则项的 SGD 的方法训练 轮 - 在第
轮迭代中,先按通常的 SGD 进行更新,得到 ,然后对所有参数进行考察,以超参数 进行截断置零:
显然,这种做法太过粗暴,存在很多问题;但它是所有类似方法的祖师爷,反映的是「不等式约束下的凸优化」的思路。在这种思路下,求到的梯度
简单截断法采取的投影方式,是直接截断。接下来,我们看看 FTRL 的其他前辈们是怎么做的。
Truncated Gradient
既然简单地截断过于粗暴,那么我们就让截断温和一点。这就是 09 年提出的截断梯度法。
- 按带
正则项的 SGD 的方法训练 轮 - 在第
轮迭代中,先按通常的 SGD 进行更新,得到 ,然后对所有参数进行考察,以超参数 和 进行截断:
这里
显然,
FOBOS (Forward-Backward Splitting)
FOBOS 最开始的名字叫做 Forward Looking Subgradients,简写叫做 FOLOS;后来改名叫做 Forward-Backward Splitting,按说应该简写成 FOBAS。但作者为了减少可能的困扰,就只修改了一个字母,变成了 FOBOS。
吐槽:但实际上,变得更加困惑了好不好……
FOBOS 可以看做是 TG 的改进。
首先,FOBOS 将
其次,FOBOS 将投影操作改进如下:
这里,优化符号中的第一项保证了投影之后的结果距离梯度下降的结果不太远,第二项是正则项,用于产生稀疏性。我们将它转换为无约束优化的形式:
可见,更新结果不仅与上一轮迭代的结果有关(梯度下降),还与迭代之后的状态有关(正则约束),这就是所谓的 Forward-Backword Splitting。
当
不难发现,它与 TG 的形式非常接近。当 TG 中的
RDA (Regularized Dual Averaging)
RDA 是微软 10 年发表的研究成果,其权重更新策略如下:
这里,
表示梯度 对参数 的积分中值,即:第 轮迭代中的梯度对参数 产生的变动在所有样本上产生的平均影响。 则是前 轮迭代上述平均影响的平均值(Dual Average)。 是正则项。 是额外的正则项。 是一个非负的非降序列。 是一个严格的凸函数。
除开正则项的变化,和 FOBOS 及之前的截断方法比较,RDA 最大的差别在于丢弃了梯度下降的那一项,换成了梯度的二次平均值。接下来,我们取
,其中 ; ; ,其中 。
记
可见,当某一维度参数的二次平均梯度小于阈值
FTRL (Follow The Regularized Leader)
接下来介绍 FTRL。
FOBOS 和 RDA 的区别
为便于比较,这里把 FOBOS 和 RDA 在单一维度上的更新策略再次抄录如下。
首先我们看 FOBOS 和 RDA 的截断部分的差异。
FOBOS 的截断判断取的是单次梯度下降的结果,而 RDA 的截断判断取的是往期所有梯度的二次平均。考虑到我们面临的是「在线学习」,样本在局部抖动的几率比较大。因此 FOBOS 的做法容易因为某些异常、离群样本的出现而错误地截断;RDA 的做法则稳妥许多,参考了过去所有样本的梯度结果。
FOBOS 的截断阈值是
接下来我们看 FOBOS 和 RDA 截断之外部分的差异。
FOBOS 的取值主体是
这也就是说,FOBOS 的精度较高,但解的稀疏性相对较差;RDA 的解的稀疏性好,但精度较差。于是,很自然地,我们会问:是否有办法,将二者的优点合在一起呢?
统一 FOBOS 和 RDA 的形式
想要取长补短,就要想办法将 FOBOS 和 RDA 的形式统一起来。这样才方便拆墙补墙。
首先看 FOBOS 的无约束优化形式:
注意,这里
再合并起来有,
其中
这里
拆墙补墙得到 FTRL
统一了 FOBOS 和 RDA 的形式之后,我们就可以将它们各自的优点拿出来了。
对于 FOBOS,它的优点体现在
注意这里式中第 3 项与 FOBOS 的第三项稍有区别。我们还可以为它加上
FTRL 更新公式的推导
我们将
其中
式
根据式
式
- 当
时,有 。因为若不然:- 当
,有 。式 左边有 ,与式 矛盾。 - 当
,有 。式 左边有 ,与式 矛盾。
- 当
- 当
时,有 。因为若不然:- 当
,由式 知 ,与式 矛盾。 - 当
,与 的情况类似,与式 矛盾。
- 当
- 当
,类似分析,有 。
如此一来,我们得到 FTRL 的更新公式:
从式
FTRL 为什么是有效的
我们引出 FTRL 是按「稀疏性」的路径,从 FOBOS 和 RDA 拆借出来的。从上面的推导,我们能看出 FTRL 能够较好地获得稀疏解。但是,我们仍未能说明,FTRL 能够获得较好的稀疏解。(大家来找茬,笑)这一小节里,我们来说明 FTRL 是有效的。
首先回顾一下 SGD 的更新公式:
我们丢掉式
记式
当式
在式
用式
考虑
Gitalk 加载中 ...