【每周一文】Ad Click Prediction: a View from the Trenches(2013)
2016-04-12 22:57
387 查看
概述
该文是GoogleFTRL在点击率模型上的应用,从技术实现的角度介绍了在线学习算法FTRL的工程实现,并且给出一些内存优化、特征选择等工程细节。从此FTRL算法才大规模推广使用。该笔记主要介绍一下几类在线学习算法的思路以及FTRL实现细节以及工程上技巧。
问题
点击率预估问题(CTR)是计算广告中非常重要的模块,预估一个用户对广告的点击概率,从而提升广告效果。LR模型时CTR问题中最经典的模型,而LR模型训练也是无约束最优化问题中经典案例。因此问题最终归约为如何有效优化LR模型;同时还需要考虑模型稀疏性,模型稀疏性可能会和训练数据不足、模型复杂度过高相关,也是控制过拟合的有效手段。
LR模型需要解决问题是样本为正例的概率表示为pt=σ(wt,xt)σ(a)=1/(1+exp(−a))对应的log损失函数为l(wt)=−ytlogpt−(1−yt)log(1−pt)样本为正例的概率表示为p_t=\sigma(w_t,x_t) \\ \sigma(a)=1/(1+exp(-a)) \\ 对应的log损失函数为 l(w_t)=-y_tlogp_t-(1-y_t)log(1-p_t)
求解方案
批量算法
求解该类问题最经典的算法是GD(梯度下降法也称最速下降法),即沿着梯度方法逐渐优化模型参数。梯度下降法能够保证精度,要想预防过拟合问题一般会加上正则项,L1或者L2正则。
L1相对于L2正则能够产生更稀疏的参数(为什么?)
在线优化算法
相比于批量GD算法,OGD能够利用实时产生的正负样本,一定程度上能够优化模型效果。在线优化算法需要特殊关注模型鲁棒性和稀疏性,由于样本是一个一个到来,默写参数可能因为训练样本不足导致过拟合等。因此OGD会着重处理模型稀疏性。
L1正则法
对于L1正则,模型权重更新方式为Wt+1=Wt−ηtGt−ηtλsgn(wt)W^{t+1}=W^t-\eta^tG^t-\eta^t\lambda sgn(w^t)模型稀疏控制参数λ\lambda会将接近0的参数趋近于0.
简单截断法
相对于L1正则属于比较暴力的解决方案,直接将不满足阈值的系数设置为0.以k为窗口,如果t/k不为整数时采用标准的SGD进行优化,否则采用如下方法Wt+1=T0(Wt−ηtGt,θ)T0(vi,θ)={0,vi,if |vi|≤θ othersW^{t+1}=T_0(W^t-\eta^tG^t, \theta) \\T_0(v_i,\theta) =
\begin{cases}
0, & \text{if $|v_i| \le \theta$ } \\
v_i, & \text{others}
\end{cases}
通过参数θ\theta控制模型稀疏性。
梯度截断法(TG)
简单截断法比较暴力,不够优雅,因此提出改进思路。Wt+1=T1(Wt−ηtGt,ηtλt,θ)T1(vi,α,θ)=⎧⎩⎨max(0,vi−α),min(0,vi+α),vi,if vi∈[0,θ] if vi∈[−θ,0]othersW^{t+1}=T_1(W^t-\eta^tG^t, \eta^t \lambda^t,\theta) \\T_1(v_i,\alpha, \theta) =\begin{cases}
\max(0, v_i-\alpha), & \text{if $v_i \in [0, \theta]$ } \\
\min(0, v_i+\alpha), & \text{if $v_i \in [-\theta,0]$} \\
v_i, & \text{others}
\end{cases}参数λ 和θ\lambda\ 和\theta控制模型稀疏,值越大越稀疏。
TG和简单截断法的区别在于
注:可以将T1算法按照每一维度进行展开,则L1和简单截断法都是该策略的特殊case。
FOBOS算法
该算法又称为前后项算法,其权重的更新方式分为两个部分W(t+1/2)=Wt−ηtGtWt+1=argmin12||W−Wt+1/2||2+ηt+1/2Ψ(W)W^{(t+1/2)}=W^t-\eta^tG^t \\ W^{t+1}=argmin\frac12||W-W^{t+1/2}||^2+\eta^{t+1/2}\Psi(W)权重更新分为两个部分,第一步先进行一步标准的梯度下降;然后对结果进行微调,即满足最速下降又保证了一定的稀疏性。
其中Ψ(W)\Psi(W)是正则项可以对权重进行约束,常用的选择为L1,则对应的方法为L1-FOBOS
RDA算法
RDA(正则对偶平均)是微软的研究成果,其权重更新策略为Wt+1=argmin1t∑r=1t<Gt,W>+Ψ(W)+βtth(W)W^{t+1}=argmin\frac1t\sum_{r=1}^t+\Psi(W)+\frac{\beta^t}{t}h(W)权重更新包括三个部分第一部分线性加权,即对历史梯度进行加权平均;第二部分正则项部分对特征进行稀疏化;第三部分严格递增序列相当于额外的正则项。实验证明该方法能够产生较好的稀疏和精度。
FTRL
FTRL是Google提出的在线算法,由于其在工程实现上进行了大量优化,在工业界应用非常广泛。权重更新策略
FTRL更新策略为wt+1=argmin(g1:tw+12∑s=1tσs||w−ws||2+λ1||w||+12λ2||w||2)w_{t+1}=argmin(g_{1:t}w+\frac12\sum_{s=1}^t\sigma_s||w-w_s||^2+\lambda_1||w||+\frac12 \lambda_2||w||^2)其中g1:t=∑ts=1gtg_{1:t}=\sum_{s=1}^tg_t,相当于新产生的权重验证所有样本的梯度并且和历史权重不偏离太远。最后通过L1正则进行稀疏性约束。这样既保证了权重更新的精度有保证了稀疏性。
另外参数σs\sigma_s是一个和学习率相关参数∑ts=1σs=1ηt\sum_{s=1}^t \sigma_s=\frac1 \eta_t
公式推导
上面的公式看起来比较复杂,将其展开可以得到F(w)=g1:tw+12∑s=1tσs||w−ws||2+λ1||w||+12λ2||w||2=g1:tw+12∑s=1tσs(wTw−2wTws+wTsws)+λ1||w||+12λ2||w||2=(g1:t−∑s=1tσsws)w+12(∑s=1tσs+λ2)wTw+λ1||w||+const=zTtw+12(ηt+λ2)wTw+λ1||w||+constF(w)=g_{1:t}w+\frac12\sum_{s=1}^t\sigma_s||w-w_s||^2+\lambda_1||w||+\frac12 \lambda_2||w||^2 \\
=g_{1:t}w+\frac12\sum_{s=1}^t\sigma_s(w^Tw-2w^Tw_s+w_s^Tw_s)+\lambda_1||w||+\frac12 \lambda_2||w||^2 \\ =(g_{1:t}-\sum_{s=1}^t\sigma_s w_s) w+\frac12(\sum_{s=1}^t\sigma_s+\lambda_2)w^Tw+\lambda_1||w||+const \\
=z_t^T w+\frac12(\eta_t+\lambda_2)w^Tw+\lambda_1||w||+const
其中zt−1=g1:t−1−∑t−1s=1σsws,根据定义可以得到zt−1=zt−1+gt−(1ηt−1ηt−1)wtz_{t-1}=g_{1:t-1}-\sum_{s=1}^{t-1}\sigma_s w_s,根据定义可以得到z_{t-1}=z_{t-1}+g_t-(\frac 1\eta_t-\frac 1\eta_{t-1})w_t
对上式进行求导可以得到
zt+(ηt+λ2)w+λ1∂|W|=0z_t+(\eta_t+\lambda_2)w+\lambda_1 \partial|W|=0
从上式中可以容易得到w和z必须是异号,否则等式不能成立。
因此根据L1正则的次导数和梯度公式,讨论如下。
∂|W|=⎧⎩⎨0,1,−1,if −1<w<1 if w>1 if w<−1\partial |W| =
\begin{cases}
0, & \text{if $-11$ } \\
-1 , & \text{if $w<-1$}
\end{cases}
当|zti|<λ1|z_{t_i}|<\lambda_1时
w_i > 0,则有w=−zi−λ1ηt+λ2<0w=\frac{-z_i-\lambda_1}{\eta_t+\lambda_2} < 0 不成立
w_i < 0,则有w=−zi+λ1ηt+λ2>0w=\frac{-z_i+\lambda_1}{\eta_t+\lambda_2} > 0 不成立
w_i=0
当zt>λ1z_t>\lambda_1时
由于两者必须异号,此时有w_i < 0
w=−zi+λ1ηt+λ2w=\frac{-z_i+\lambda_1}{\eta_t+\lambda_2}
当zt<−λ1z_t<-\lambda_1时同理w=−zi−λ1ηt+λ2w=\frac{-z_i-\lambda_1}{\eta_t+\lambda_2}
因此有wi={0,−(zi−sgn(zi)λ1)ηt+λ2,if |zi|≤λ1 if others w_i =
\begin{cases}
0, & \text{if $|z_i| \le \lambda_1$ } \\
\frac{-(z_i-sgn(z_i)\lambda_1)}{\eta_t+\lambda_2}, & \text{if $others$ }
\end{cases}
工程优化
各个维度采用不同的学习率ηti=αβ+∑√ts=1g2si\eta_{t_i}=\frac {\alpha}{\beta+\sqrt \sum_{s=1}^tg^2_{s_i}}稀疏特征处理,Possion Inclusion(通过一定概率扔掉特征)、BloomFilter Iclusion(通过碰撞优化特征)
浮点数重新编码
训练多个模型,采用不同参数。但是采用相同特征进行存储,特征更新采用加权平均方式进行更新。比较类似于异步梯度下降法
学习率更新优化∑g21:t=PNP+N\sum g_{1:t}^2=\frac{PN}{P+N}通过正负样本个数进行优化
对于CTR模型,负样本数量特别多,考虑采用负样本采样,假设采样概率为r,此时相当于每个样本都有了权重w_t(正样本权重为1,负样本权重为1/r),同时相当于梯度也会乘上该系数,不会改变最终的损失。El(wt)=stwtl(wt)+(1−st)0=l(wt),其中st=1/wt为该样本被选中的概率El(w_t)=s_tw_tl(w_t)+(1-s_t)0=l(w_t),其中s_t=1/w_t为该样本被选中的概率
伪代码
根据上面的推导和优化,最终代码如下经过上面推导,整体还是比较好理解。
总结
FTRL提供了一套完整的在线学习算法和工程框架,根据伪代码可以非常容易实现并且应用。该模型常和其他方法结合使用,例如FTRL+LBFGS等相关文章推荐
- 自动轮播图(可以有点击事件的其中点击事件用 block 传值)
- 结构化开发方法和面向对象开发方法
- Hibernate单向一对多关联
- 文件夹按层级打印
- 键盘接收2个文件路径,将一个 拷贝到另一个中
- 删除一个文件夹
- 【每周一文】Learning Classifiers from Only Positive and Unlabeled Data(2008)
- ObjectAttribute.js
- JAVA多线程学习(一)
- Mongodb 聚合管道
- 统计一个文件夹的大小
- 声明一个共享数组,起两个线程,两个线程分别隔一段时间(可以写一个随机数),给数组中 添加数据,每一个线程为数组添加 3 个数据即可。
- win7 下anaconda 安装及安装包
- 《麦田里的守望者》感
- 【每周一文】Building Text Classifiers Using Positive and Unlabeled Examples(2003)
- 取出一个字符串中字母出现的次数。如:字符串:"abcdekka27qoq" ,输出格式为: a(2)b(1)k(2)
- View的事件体系---V3.1 View基础知识
- HDU 1269 —— 迷宫城堡
- oracle物理dg安装:方法二
- GCD,NSTimer等一些发现