[关闭]
@onejune 2018-07-18T22:58:50.000000Z 字数 7467 阅读 1989

paper reading: Scalable Time-Decaying Adaptive Prediction Algorithm

ML FTRL TDAP online_learning


目录


写在前面的话

  这是SIGKDD(2016)上华为发表的一篇重要的paper3,主要解决推荐场景下训练样本随时间衰减的问题。
  在新闻推荐和广告推荐场景下,用户最近的行为,相比历史上的行为,更能表现用户的真实意图和偏好,但是对于当前主流的online learning算法,包括FTRL4都未能很好的处理这种Time-Decaying Adaptive问题。
  华为基于FTRL-Proximal进一步提出了一种改进的在线学习手段TDAP(Time Decaying Adaptive Prediction),主要目的在于为在线学习引入数据随时间快速变化的因子—这就是通常所说的concept drifting5
  做为一个在FTRL上深耕数年之久的广告变现团队,我们一直被这个问题所困扰,我们当前采用的是一种比较暴力的方式,通过滑动窗口机制处理正负样本数不再变化的特征,现在终于有了一个相对比较温和和合理的解决方案。google了一下,网上还没有人专门分享过这篇paper,于是就总结和梳理了一下,有不足之处,敬请谅解。

背景介绍

1. online learning很强大

online learning技术是一种新兴的并且有效的机器学习方法,尤其在在线广告、个性化推荐、异常检测以及可疑url识别场景下。相对于offline learning在每次更新模型时都需要batch train所有训练数据,online learning只需要对新到来的样本进行增量学习即可,显得更加优雅和高效,并且在精度和准确性上不会有任何损失,反而获得了更好的稀疏性(sparsity)

2. online learning的局限性

然而,online learning却无法解决用户的兴趣偏好随时间转移的问题。比如我可能上个月喜欢浏览跑步类的商品,这个月却喜欢科技类的产品,因为我已经购买了足够多的跑步类产品,下个月可能就不再登陆购物网站。

所以,当前的online learning算法需要迫切解决的一个问题就是:如何高效的拟合和缩放这种快速变化的(fast-changing)在线数据?我们需要一个可伸缩的时间衰减(scalable time-decaying)在线学习算法。

3. 面临的挑战

Online Learning Algorithm

1. FTRL-Proximal Algorithm

FTRL是H. Brendan McMahan这个哥们儿前前后后搞了3年,发了4篇paper才搞出来的一个算法,2013年KDD那篇正式的工程化paper(Ad Click Prediction: a View from the Trenches)标志着FTRL有理论走向实践。之前在部门专门分享过一次FTRL的原理及在公司业务场景下的详细应用,包括xgboost+FTRL的实践,有时间得再详细整理成博客,里面的很多东西值得去深入探究。

2. Problem Definition

TOCO(time-decaying online convex optimization)问题可以如下定义:
给定一个时间阶段T ≥ 1,以及一系列训练样本,用分别表示特征和标签,则有:


对比FTRL的凸优化目标函数形式:

TOCO的目标函数多了最后一项——和时间衰减相关的函数。其中是自变量为t,单调递增的时间衰减函数。是平滑项,即:.

Time-Decaying Adaptive Prediction Algorithm

1. 时间衰减函数

常见的时间衰减函数有多项式衰减指数衰减,这篇paper里使用了指数衰减函数,原因有2点:
- 工业届和学术界广泛使用
- 有助于后面的模型更新函数推导出递归的解析解
衰减函数定义如下:


T≥1,表示当前的时间,t是历史模型的时间,t∈[1, T].这里F是一个单调递增函数。t越小,表示数据越“old”,对应的F也就越小。

2. 模型更新函数

首先回顾一下FTRL的特征权重更新策略。FTRL-Proximal代表了一族在线学习的手段,包含RDA,FOBOS,FTRL等,这些算法着重从理论上探讨了最优化算法在online学习场景下产生稀疏解的方法。这一族算法认为每一步的解都会产生损失,希望整体的损失小,因此为了这个目的,往往设计成每次的更新与前几步相似,步长递减,即学习率递减。

FTRL综合考虑了FOBOS和RDA的长处,其特征权重更新公式为:


第一项是损失函数的梯度向量,第二项和第三项分别是L1和L2正则项,其中L2正则起一个平滑的作用,并不影响稀疏解,只有L1才会影响稀疏性,第四项也是一个平滑项,起到加速收敛和改进精度的作用。第四项中的σ表示学习率。在FTRL中,每个特征维度的学习率都需要单独考虑,即(Per-Coordinate Learning Rate),主要是考虑到每个维度的样本量不同导致的梯度下降速度不同,因此在FTRL中用对应维度的梯度分量来反映学习率的变化。

TDAP的特征权重更新公式如下:


值得注意的是,TDAP算法的更新函数与FTRL近似算法的不同之处在于将时间衰减因子引入了平滑项。即:。这里,按维度展开就是:

如果让 γ=, 则。这里γ是衰减率,值越大,表示历史模型的衰减越快。我们可以发现,如果,(6)式就等价于FTRL算法了。

3. 解析解(closed form)

跟FTRL的求解方式一样,可以得到TDAP的解析解。在FTRL中,通过将特征权重的各个维度拆解为N个独立的标量最小化问题即可求得迭代解表达式。
公式(6)可以重写成如下形式:


具体const的由来,可以参见FTRL的推导过程。
我们定义,我们可以得到的递归解析解:

这个式子跟FTRL几乎完全一致,只不过σ换成了引入时间衰减因素的δ。

4. 递归的解析解(recursive closed form)

到此为止,我们已经从数学上求解出了这个最优化问题,下面需要做的就是:如何得到递归的解析解,即:使用第t+1轮计算出来的各个参数,来更新当前第t轮的值?

从(9)式的递归解中可以看到,我们只需要关心两个表达式:,我们对这两项分别变换:

5. 算法伪代码

无论是FTRL还是TDAP,其算法流程都是:
 (1)特征提取
 (2)根据截断阈值更新每个feature的weight
 (3)预估ctr,计算梯度
 (4)更新临时变量

TDAP算法伪代码如下:
tdap algorithm

对比FTRL算法:
ftrl algorithm
这里都使用了Logistic回归,TDAP算法相对FTRL使用了更多的临时变量,特征的每一维都需要记录:
从伪代码中我么可以看到:在时间衰减函数的影响下,较老的数据对目标模型的影响进行了缩减,从而适应了数据的快速变化。
详细的java代码如下:

  1. /**
  2. optimize function for TDAP algorithm.
  3. */
  4. private void optimize(Sample sample) {
  5. //get super parameter
  6. Parameter parameter = modelConfig.getPara();
  7. for (int i = 0; i < sample.strFeatures.size(); ++i) {
  8. FeatureInfo featureInfo = sample.featureInfos[i];
  9. if (featureInfo == null) {
  10. String fName = sample.strFeatures.get(i);
  11. FeatureInfo fi = model.features.get(fName);
  12. sample.featureInfos[i] = fi;
  13. featureInfo = fi;
  14. }
  15. //figure feature weight
  16. if (featureInfo.z <= parameter.lambda1 && featureInfo.z >= -parameter.lambda1) {
  17. featureInfo.omiga = 0;
  18. }
  19. else
  20. {
  21. double rst = -1 / (featureInfo.d + parameter.lambda2)
  22. * (featureInfo.z - Math.signum(featureInfo.z) * parameter.lambda1);
  23. featureInfo.omiga = rst;
  24. }
  25. }
  26. //predict and figure graduate
  27. double grad;
  28. predict(sample, predict, null, grad, sample.featureInfos, false);
  29. //recursive form update for future model update
  30. for (int i = 0; i < sample.featureInfos.length; ++i) {
  31. FeatureInfo featureInfo = sample.featureInfos[i];
  32. if (featureInfo == null) {
  33. continue;
  34. }
  35. double delta = (doubleSqrt(featureInfo.u + grad * grad) - doubleSqrt(featureInfo.u)) / parameter.alpha;
  36. featureInfo.u += grad * grad;
  37. featureInfo.d = Math.exp(-parameter.γ) * (featureInfo.d + delta);
  38. featureInfo.v += grad;
  39. featureInfo.h = Math.exp(-parameter.γ) * (featureInfo.h + delta * featureInfo.omiga);
  40. featureInfo.z = featureInfo.v - featureInfo.h;
  41. }
  42. }

小结

参考文献

  1. Scalable Time-Decaying Adaptive Prediction Algorithm
  2. Ad Click Prediction: a View from the Trenches
  3. A Gentle Introduction to Concept Drift in Machine Learning
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注