本来是想通过学习别人的博客,来了解FTRL,但是对于经典之作还是想通读一遍;本文介绍Google在2013年发布在KDD的《Ad Click Prediction: a View from the Trenches》

摘要

文章针对CTR且基于FTRL-Proximal,改善了传统的CTR方法,并且对于特征的每一维使用不同的学习率;还提出了一些其他的技巧:比如节约内存、可视化表示、评估方法、校准方法等等;

一、介绍

对于机器学习来说,在线广告是一个几十亿美元的工业,而其中CTR问题至关重要,一个典型的工业模型可能每天预测几十亿个事件并使用很大的特征空间,所以这篇文章提出了很多方法,具体下面一一介绍;

二、BRIEF SYSTEM OVERVIEW

当一个用户搜寻q,那么匹配q的候选广告集合将被提供给该用户;一种拍卖机制决定了是否这些广告会被展示给用户,并且以什么样的顺序和价格;除了广告主竞价的方式以外,另外一种方式比如对于每个广告a,确定 p(click|q,a) ,即这个广告将被点击的概率;
而这些系统对应的特征是稀疏的,一般使用正则化的LR模型,并且需要实时更新,因为数据是以一种streaming(流)的方式提供的;

三、 ONLINE LEARNING AND SPARSITY

在线学习对于一些泛化线性模型(如LR)有许多优势;尽管数据维度有可能是几十亿维,但是每个实例通常仅有几百个非0值,所以这确保了在大规模数据集上通过streaming的有效的学习,因为每个训练样本只需要被使用一次;
说明一下文中所用的符号表示:g1:t=s=1tgs{{\rm{g}}_{1:t}} = \sum\nolimits_{s = 1}^t {{g_s}},且gsg_s是一个向量;
如果希望用LR建模问题,那么使用下面的在线学习框架:在第tt轮,给定输入xtRdx_t \in R^d,那么预测pt=σ(wtxt)p_t=\sigma(w_tx_t),然后通过Logloss损失函数并反向传播做出参数实时更新;
上面的便是OGD(Online gradient descent)算法,但是需要考虑一个问题:因为模型是稀疏存储的,所以参数ww的非零数量决定了内存使用的量级;不幸的是,OGD并不是一个有效的产生稀疏模型的方法;实际上,通过增加一个L1的次梯度到loss的梯度中永远得不到精确的0;更复杂的方法如FOBOS和truncated gradient在引入稀疏性方面很好,RDA(Regularized Dual Averaging)在稀疏性和精确性之间衡量;FTRL中,L1正则化以一种更有效的方式得以实现
给定一个序列梯度gtRdg_t\in R^d,OGD的做法是:wt+1=wtηtgtw_{t+1}=w_t-\eta_tg_t
其中ηt\eta_t是一个不增的学习率,如ηt=1/t\eta_t=1/\sqrt t,而FTRL-Proximal算法使用的更新方法是:wt+1=argminmin(g1:tw+12s=1tσswws22+λ1w1){w_{t + 1}} = \mathop {\arg \min }\limits_{\min } ({g_{1:t}} \cdot w + {1 \over 2}\sum\limits_{s = 1}^t {{\sigma _s}\left\| {w - {w_s}} \right\|_2^2} + {\lambda _1}{\left\| w \right\|_1})其中σ1:t=1/ηt\sigma_{1:t}=1/\eta_t,上面的式子当λ1=0\lambda_1=0的时候确定了一个系数向量,而当λ1>0\lambda_1>0就有一个很好的稀疏的作用;乍一看FTRL很难更新且需要存储过去的系数,将上面的更新式子重写一下:
推荐系统笔记8-FTRL
因此,只要我们在第t轮开始的时候存储了zt1=g1:t1s=1t1σsws{z_{t - 1}} = {g_{1:t - 1}} - \sum\nolimits_{s = 1}^{t - 1} {{\sigma _s}{w_s}},就只用更新zt=zt1+gt+(1ηt1ηt1)wt{z_t} = {z_{t - 1}} + {g_t} + ({1 \over {{\eta _t}}} - {1 \over {{\eta _{t - 1}}}}){w_t}对于wt+1w_{t+1}的求解如下式:
推荐系统笔记8-FTRL
具体细节看算法1:
推荐系统笔记8-FTRL
其中上面的算法增加了L2正则化和per-coordinate learning rate schedule,注意到当λ1=0\lambda_1=0时,wt+1=ηzt=ηs=1tgs{w_{t + 1}} = - \eta {z_t} = - \eta \sum\nolimits_{s = 1}^t {{g_s}} 也就是等价于OGD算法了;

3.1 Per-Coordinate Learning Rates

OGD对于所有特征维度使用一个全局的学习率:ηt=1/t\eta_t=1/\sqrt t,但是这样子不好:举个例子来说,抛10次硬币,其中正面出现的概率,那么我们可以将这个问题化为10个二分类问题,再打包为一个问题,也就是我们可以用10次OGD算法;假设coin ii比coin jj翻转的次数更多,那么对于coin ii的学习下降速率比coin jj的更快,代表coin ii有更多的数据,另一方面对于coin jj来说,需要较高的学习率,因为数据少,所以需要对新数据做出快速的反映;其公式为:
推荐系统笔记8-FTRL

四、SAVINGMEMORY AT MASSIVE SCALE

上面讨论了使用L1正则化来为预测阶段减少内存,这节介绍额外的技巧来在训练的时候减少内存;

4.1 Probabilistic Feature Inclusion

这种方法的解释就是当新特征第一次出现时,它们就以概率的方式包含在模型中,文中介绍了两种方法:1、Poisson Inclusion:对某一维度特征所来的训练样本,以p的概率接受并更新模型;;2、Bloom Filter Inclusion:用bloom filter从概率上做某一特征出现k次才更新;使用这两种方法的效果如下所示:
推荐系统笔记8-FTRL

4.2 Encoding Values with Fewer Bits

由于需要保存的数据一般处于(2,2)(-2,2)之间,使用32或64位浮点数存储浪费了空间。使用q2.13编码而不是浮点数形式,即16bit编码形式:二进制数的左边2bit + 右边13bit + 一个符号位。这样可以节省75%的内存;

4.3 Training Many Similar Models

  • 1)对同一份训练数据序列,同时训练多个相似的model;
  • 2)这些model有各自独享的一些feature,也有一些共享的feature;
  • 3)出发点:有的特征维度可以是各个模型独享的,而有的各个模型共享的特征,可以用同样的数据训练。

4.4 A Single Value Structure

  • 1)多个model公用一个feature存储(例如放到cbase或redis中),各个model都更新这个共有的feature结构;
  • 2)对于某一个model,对于他所训练的特征向量的某一维,直接计算一个迭代结果并与旧值做一个平均;

4.5 Computing Learning Rates with Counts

在第三节我们讨论了需要存储梯度的和以及梯度的平方和,可以用gross approximations来用于学习率计算,所以文章使用正负样本的数目来计算梯度的和

4.6 Subsampling Training Data

实际中CTR远小于50%,所以意味着正样本更加有价值,可以利用这个特点来减少数据规模而基本不影响模型准确性;使用如下子采样方式:

  • 至少一次广告被点击就采样(正样本全部采样)
  • 没有广告被点击的query数据,负样本以一个比例rrr(0,1]r\in(0,1])采样;

但是上面的采样方法会导致有偏预测,可通过一个权重wtw_t来解决,如下所示:
推荐系统笔记8-FTRL
这样子就会使得采样的期望无偏,如下所示:
推荐系统笔记8-FTRL
也就是训练时增加未被全部采样的样本的权重;

相关文章:

  • 2022-12-23
  • 2021-07-15
  • 2021-10-03
  • 2021-04-20
  • 2021-08-13
  • 2021-06-17
猜你喜欢
  • 2021-10-05
  • 2021-08-01
  • 2021-12-03
  • 2021-07-06
  • 2022-01-29
相关资源
相似解决方案