现在做在线学习和CTR常常会用到逻辑回归( Logistic Regression),而传统的批量(batch)算法每次迭代对全体训练数据集进行计算,无法有效地处理超大规模的数据集和在线数据流。google提出的FTRL(Follow-the-regularized-Leader)算法,在处理诸如逻辑回归之类的带非光滑正则化项(例如1范数,做模型复杂度控制和稀疏化)的凸优化问题上性能非常出色。
对于ctr预估,输入的特征x往往具有上百亿维度,但是由于是稀疏的,每个样本可能只有几百个非零值。这使得在大数据下,可以的高效的使用流式样本进行模型的流式训练<每个样本只用一次>。从LR模型说起,对于label为{0,1}的情况,LR的loss函数如下:
Loss关于参数w的导数 (pt−yt)xt,pt=σ(wtxt) ( p t − y t ) x t , p t = σ ( w t x t ) ,这就是用于参数更新的梯度值。在线梯度下降(OGD)或随机梯度下降(SGD)是解决这类问题的非常高效、高精度的且省计算资源的方法。但实际应用中,考虑模型的最终大小<参数空间,非0权重w决定了内存的使用量。而简单的在线梯度下降并很难产生真正的稀疏解。
有如下几个途径使得模型产生稀疏性:
- 简单的假如 L1 L 1 范数,但是也有局限性,因为运算时是浮点运算,训练出来的权重w很难出现绝对的零值。
- 在1范数的基础上作出截断。这个很好理解,设置一个阀值,做截断保证稀疏。结合L1每在线训练k个数据截断一次。但是问题是,可以丢弃本身权重就较小的特征(如刚开始训练的截断或训练数据中包含该特征的样本数本来就少),破坏了在线训练算法的理论完备性。
- 黑盒方法,出掉一些特征,然后重新训练看被消除的特征是否有效,这样需要算法在数据上跑很多次,不实用。
- FOBOS和RDA算法:前者是梯度下降类方法,相对OGD可以产生更好的稀疏特征,精度比较好;后者可以在精度与稀疏性之间更好的平衡。
FTRL
FTRL可以看作RDA和FOBOS的混合,但在L1范数或者其他非光滑的正则项下,FTRL比前两者更加有效。下面我们详细介绍一下TFRL。
我们关注梯度训练模块,对于一组梯度
gt∈ℝd
g
t
∈
R
d
, t 表示更新次数,OGD对于参数的更新方式是:
wt+1=wt−αtgt
w
t
+
1
=
w
t
−
α
t
g
t
。这里
α
α
是递减的学习速度。FTRL采用如下的更新方式来替换上面的形式:
这里 g1:t=∑ts=1gs,σ1:t=1αt g 1 : t = ∑ s = 1 t g s , σ 1 : t = 1 α t , 这个式子:第一项是梯度更新,第二项保证泛化精度,第三项产生稀疏解。可以改写成:
待续~~~,理论没搞太明白。