背景
目前互联网已经进入了AI驱动业务发展的阶段,传统的机器学习开发流程基本是以下步骤:
数据收集->特征工程->训练模型->评估模型效果->保存模型,并在线上使用训练的有效模型进行预测。
这种方式主要存在两个瓶颈:模型更新周期慢,不能有效反映线上的变化,最快小时级别,一般是天级别甚至周级别。另外一个是模型参数少,预测的效果差;模型参数多线上predict的时候需要内存大,QPS无法保证。
针对这些问题,一般而言有两种解决方式:一种是采用On-line-learning的算法,一种采用一些优化的方法,在保证精度的前提下,尽量获取稀疏解,从而降低模型参数的数量。
传统的训练方法在模型训练上线后,一般是静态的,不会与线上的状况有任何的互动,加入预测错误,只能在下一次更新的时候完成修正,但是这个更新的时间一般比较长。
现实中为了及时对市场的变化进行反应,越来越多的业务选用在线学习方式直接处理流式数据、实时进行训练实时进行更新模型。
在线学习
在线学习算法的特点是:每来一个训练样本,就用该样本产生的loss和梯度对模型迭代一次,一个一个数据地进行训练,能够根据线上反馈数据,实时快速地进行模型调整,使得模型及时反映线上的变化,提高线上预测的准确率。因此可以处理大数据量训练和在线训练。常用的有在线梯度下降(OGD)和随机梯度下降(SGD)等,Online Learning的优化目标是使得整体的损失函数最小化,它需要快速求解目标函数的最优解。
现在做在线学习和CTR常常会用到逻辑回归( Logistic Regression),google先后三年时间(2010年-2013年)从理论研究到实际工程化实现的FTRL(Follow-the-regularized-Leader)算法,在处理诸如逻辑回归之类的带非光滑正则化项(例如1范数,做模型复杂度控制和稀疏化)的凸优化问题上性能非常出色。
FTRL及工程实现
FTRL介绍
FTR是FTRL的前身,思想是每次找到让之前所有样本的损失函数之和最小的参数。FTRL,即 Follow The Regularized Leader,借鉴经典的TG,OGD , L1-FOBOS, L1-RDA 在之前的几个工作上产生的,主要出发点就是为了提高稀疏度且满足精度要求。FTRL 在FTL的优化目标的基础上,加入了正则化,防止过拟合。FTRL的损失函数一般也不容易求解,这种情况下,一般需要找一个代理的损失函数。代理损失函数需要满足以下条件:
-
代理损失函数比较容易求解,最好是有解析解。
-
代理损失函数求得的解,和原函数的解的差距越小越好
为了衡量条件2中的两个解的差距,引入regret的概念。如果一个在线学习算法可以保证其 regret 是 t 的次线性函数,那么随着训练样本的增多,在线学习出来的模型无限接近于最优模型。即随着训练样本的增加,代理损失函数和原损失函数求出来的参数的实际损失值差距越来越小。而毫不意外的,FTRL 正是满足这一特性。另一方面,现实中对于 sparsity,也就是模型的稀疏性也很看重。上亿的特征并不鲜见,模型越复杂,需要的存储、时间资源也随之升高,而稀疏的模型会大大减少预测时的内存和复杂度。另外稀疏的模型相对可解释性也较好,这也正是通常所说的 L1 正则化的优点。
工程实现
逻辑回归下的per-coordinate FTRL_Proximal的伪代码如下:

实现的时候,可在公式表达的基础上做了一些变换在实际数据集上再采用分布式并行加速。
四个参数的设定结合paper里的指导意见以及反复实验测试,找一组适合自己问题的参数就可以了。上面所谓的per-coordinate,其意思是FTRL是对w每一维分开训练更新的,每一维使用的是不同的学习速率,也是上面代码中lamda2之前的那一项。与w所有特征维度使用统一的学习速率相比,这种方法考虑了训练样本本身在不同特征上分布的不均匀性,如果包含w某一个维度特征的训练样本很少,