最近在做CTR,刚好Google在KDD发了一篇文章,讲了他们的一些尝试,总结一下:

先是一些公式的符号说明:

一、优化算法

CTR中经常用Logistic regression进行训练,一个常用的Loss Function为

Online gradient descent(OGD)是一个常用的优化方法,但是在加上L1正则化后,这种方法不能产生有效的稀疏模型。相比之下 Regularized Dual Averaging (RDA)拥有更好的稀疏性,但是精度不如OGD好。

FTRL-Proximal 方法可以同时得到稀疏性与精确性,不同于OGD的迭代步骤:

其中$\eta_t$是一个非增的学习率

FTRL-Proximal通过下式迭代:

其中参数 $\sigma_s$ 是学习率,一般我们有 $\sum_{s=1}^t\sigma_s=\frac{1}{\eta_t}$ 。

更新公式:

算法如下:

这里多个一个 $\lambda_2$ 是一个L2正则化参数。

二、学习率

$\displaystyle \eta_t=\frac{1}{\sqrt{t}}$

由于在求解时,这样,对每一个坐标我们都使用了同样的参数,这样一些没有使用的坐标的参数也会下降,显然这不太合理。

一个近似最优的选择是:

g是梯度向量

三、存储空间

1.特征选择

在CTR中,跟多特征仅仅出现了一次(In fact, in some of our models, half the unique features occur only once in the entire training set of billions of examples),这样特征几乎没有什么用,但是存储起来非常浪费空间。L1正则化虽然解决了一些问题,但是这样降低了一些精度,因此另一个选择是

probabilistic feature inclusion,这种方法中,一个特征第一次出现时,会以一定的概率被保存使用。关于这个概率Google尝试了两种方法:

Poisson Inclusion:以概率p增加特征,这样一般特征被加入就需要出现1/p次

Bloom Filter Inclusion:用一系列的Bloom flters来检测特征的前n次出现,一旦检测到出现了n次(因为BF有冲突,所以实际可能少于n),就加入模型并用在后面的训练中。

2.系数编码

因为大部分系数都在-2和2之间,因此使用了定点的q2.13编码,同时也保证了小数的一些精度。编码包括一位的符号,2位的整数和13位的小数。

因此误差可能在OGD算法中发散,因此使用了一个简单的随机取整策略:

R是一个0到1的随机整数。

3.多个相似模型的训练

在测试一些超参数的影响时,同时训练多个模型非常有用。观察发现,有些数据可以被多个模型共用,但是另外一些(如系数)不能,如果把模型的系数存在一个HASH表里,就可以让多个变体同时使用这些参数,比如学习率。

4.单值结构

有时我们想训练一些模型,他们之间只是删除或增加了一些特征。单值特征为每一个特征存了一个权重,权重被所有有该特征的模型共享,学习方法如下:

在OGD更新中,每个模型用他自己的的那部分特征计算一个Loss, 然后对每一个特征,每一个模型计算一个新的系数,最后把所有值平均后存为单值。该单值下一步被所有模型使用。

5.计数与梯度

假设所有事件包括统一特征的概率相同(一个粗糙但是有效的估计),其中出现了P次,没有出现N次,那么出现的概率就是p=P/(N+P),那么在logistic regression中,正事件的导数是p-1,负事件p,梯度的平方和就是:

6.采样训练数据:

CTR中的负样本远高与正样本,因此采样的数据包括满足所有的正样本和部分负样本:

在训练中给正样本1的权重,负样本1/r的权重以避免模型结果出错。权重乘如Loss Function对应项中。

四、模型评价1

1.进度验证(Progressive Validation)

因为计算梯度的同时需要计算预测值,因此可以收集这些值。在线的loss反映了算法的表现---他度量了训练一个数据前得到的预测结果。这样也使得所有数据被同时作用训练集和测试集使用。

2.可视化加强理解

上图对query进行了切片后,将两个模型与一个控制模型模型进行了比较。度量用颜色表示,每行是一个模型,每列是一个切片。

五、置信估计

六、预测矫正

矫正的数据p是模型预测的CTR,d是一些训练数据。

一个常用矫正:

两个参数可以用Poisson regression在数据上训练。

Google在KDD2013上关于CTR的一篇论文的更多相关文章

  1. google在nature上发表的关于量子计算机的论文(Quantum supremacy using a programmable superconducting processor 译)— 附论文

    Google 2019年10月23号发表在Nature(<自然><科学>及<细胞>杂志都是国际顶级期刊,貌似在上面发文两篇,就可以评院士了)上,关于量子计算(基于 ...

  2. 使用Gardener在Google Cloud Platform上创建Kubernetes集群

    Gardener是一个开源项目,github地址: https://github.com/gardener/gardener/ 使用Gardener,我们可以在几分钟之内在GCP, AWS, Azur ...

  3. 我在阿里这仨月 前端开发流程 前端进阶的思考 延伸学习的方式很简单:google 一个关键词你能看到十几篇优秀的博文,再这些博文中寻找新的关键字,直到整个大知识点得到突破

    我在阿里这仨月 Alibaba 试用期是三个月,转眼三个月过去了,也到了转正述职的时间.回想这三个月做过的事情,很多很杂,但还是有重点. 本文谈一谈工作中遇到的各种场景,需要用到的一些前端知识,以及我 ...

  4. 自监督学习(Self-Supervised Learning)多篇论文解读(上)

    自监督学习(Self-Supervised Learning)多篇论文解读(上) 前言 Supervised deep learning由于需要大量标注信息,同时之前大量的研究已经解决了许多问题.所以 ...

  5. 使用Eclipse Memory Analyzer Tool(MAT)分析线上故障(一) - 视图&功能篇

    Eclipse Memory Analyzer Tool(MAT)相关文章目录: 使用Eclipse Memory Analyzer Tool(MAT)分析线上故障(一) - 视图&功能篇 使 ...

  6. 用Visual Studio Code Debug世界上最好的语言(Mac篇)

    用Visual Studio Code Debug世界上最好的语言(Mac篇) 首先,你要有台Macbook Pro,接着才继续看这个教程. PS:Windows用户看这里用Visual Studio ...

  7. 在Google的GKE上创建支持Internal Load Balancer的Service

    在Google的Kubernetes Engine上发布service,可以采用除On-Promise相同的Cluster IP和NodePort两种方式外,还可以创建LoadBalaner的Serv ...

  8. http://dl-ssl.google.com/android上不去解决方案

    转:https://blog.csdn.net/j04110414/article/details/44149653/ 一. 更新sdk,遇到了更新下载失败问题: Fetching https://d ...

  9. 在Google map图上做标记,并把标记相连接

    <!DOCTYPE html> <html> <head> <title>GeoLocation</title> <meta name ...

随机推荐

  1. 图片每天换及纯css3手风琴特效

    <a target="_blank" id="a"><img id="img" /></a> <s ...

  2. H5基于iScroll实现下拉刷新,上拉加载更多

    前言 前一段有个手机端的项目需要用到下拉刷新和上拉加载更多的效果,脑海里第一反映就是微博那种效果,刚开始的理解有些偏差,以为下拉也是追加数据,上拉也是追加数据,后请教同事后发现其实下拉只是刷新最新数据 ...

  3. 【JVM】JVM系列之JVM体系(一)

    一.前言 为什么要学习了解Java虚拟机 1.我们需要更加清楚的了解Java底层是如何运作的,有利于我们更深刻的学习好Java. 2.对我们调试错误提供很宝贵的经验. 3.这是合格的Java程序必须要 ...

  4. Cache-Aside Pattern(缓存模式)

    Load data on demand into a cache from a data store. This pattern can improve performance and also he ...

  5. Game中的状态机

    我相信大多数博友都会玩游戏. 玩游戏,牵涉到状态包含 登陆,正常,死亡,复活,下线, 在上面状态的基础上.同时包含 站立,走动,跑动,不可移动施法状态, 战斗状态, 通常这是三个不同的分组.也就说可以 ...

  6. Linux上的SQL Server——预告片

    大家可能都听说了,微软在几个星期前宣布发布可以在Linux上完整运行的SQL Server!如果你想看下在Linux上SQL Server如何运行,进行查询是什么样的体验,可以看下下面的视频.

  7. Python_Day_05 计数器(counter),有序字典(OrderDict),默认字典(defaultdict),可命名元祖(namedtuple),双向队列(deque),单项队列(deuqe.Queue)

    Counter(计数器) 是一个字典的子类,存储形式同样为字典,其中存储的键为字典的元素,值为元素出现的次数,在使用之前我们需要先导入文件 import collections 初始化一个计数器 im ...

  8. 使用EncryptByPassPhrase和DecryptByPassPhrase对MS SQLServer某一字段时行加密和解密

    在数据库实现加密与解密的文章,Insus.NET较早前也有写过,可以在本博客中可以搜索得到. 今天使用EncryptByPassPhrase和DecryptByPassPhrase来简单实现. 在数据 ...

  9. 如何给Ubuntu12.10 安装Vmware Tools

    众所周知在VMware虚拟机中安装好了VMware Tools,才能实现主机与虚拟机之间的文件共享,同时可支持自由拖拽的功能,鼠标也可在虚拟机与主机之前自由移动(而不再用按ctrl+alT释放),而且 ...

  10. java判断输入的数是不是素数

    package test; import java.util.Scanner; //判断输入的数是不是素数 public class Test18 { public static void main( ...