黑马程序员技术交流社区

标题: 【上海校区】CTR预估专栏 | 一文搞懂阿里Deep Interest Network [打印本页]

作者: 不二晨    时间: 2018-7-26 09:59
标题: 【上海校区】CTR预估专栏 | 一文搞懂阿里Deep Interest Network
1. 背景
Deep Interest Network(DIN) 是盖坤大神领导的阿里妈妈的精准定向检索及基础算法团队,在 2017 年 6 月提出的。
它针对 电子商务领域 (e-commerce industry) 的 CTR 预估,重点在于 充分利用 / 挖掘用户历史行为数据中的信息
先给出结论:
针对互联网电子商务领域,数据特点:Diversity、Local Activation。DIN 给出了解决方案:
1.1 名词解释
这两个词在论文中通篇出现,先把其表示的意思说清楚。
Diversity: 用户在访问电商网站时会对多种商品都感兴趣。也就是用户的兴趣非常的广泛。
Local Activation: 用户是否会点击推荐给他的商品,仅仅取决于历史行为数据中的一小部分,而不是全部。
不明白?举个例子:

Diversity:一个年轻的母亲,从他的历史行为中,我们可以看到她的兴趣非常广泛:羊毛衫、手提袋、耳环、童装、运动装等等。
Local Activation:一个爱游泳的人,他之前购买过 travel book、ice cream、potato chips、swimming cap。当前给他推荐的商品 (或者说是广告 Ad) 是 goggle(护目镜)。那么他是否会点击这次广告,跟他之前是否购买过薯片、书籍、冰激凌一丁点关系也没有!而是与他之前购买过游泳帽有关系。也就是说在这一次 CTR 预估中,部分历史数据 (swimming cap) 起了决定作用,而其他的基本都没啥用。
1.2 相关工作
CTR 预估是一个比较窄的研究领域,但是模型性能一点点的提升,在实际应用中都非常关键,真金白银毫不含糊。随着深度学习在 CV、NLP 等领域取得突破性进展,一些研究也开始尝试将 DNN 应用于 CTR 预估,比如:Wide&Deep, DeepFM 等。
这些做法一般分为两部分:
这些方法的 优点 在于:相比于原来的 Logistic Regression 方法,大大减少了人工特征工程的工作量。
缺点: 在电子商务领域中,用户的历史行为数据 (User Behavior Data) 中包含大量的用户兴趣信息,之前的研究并没有针对 Behavior data特殊的结构 (Diversity + Local Activation) 进行建模。
这就是 DIN 要改进的地方! DIN 同时对 Diversity 和 Local Activation 进行建模。
针对 Diversity:
针对用户广泛的兴趣,DIN 用an interest distribution去表示。
针对 Local Activation:
DIN 借鉴机器翻译中的 Attention 机制,设计了一种 attention-like network structure, 针对当前候选 Ad,去局部的激活 (Local Activate) 相关的历史兴趣信息。和当前候选 Ad 相关性越高的历史行为,会获得更高的 attention score,从而会主导这一次预测。
当 DNN 深度比较深 (参数非常多),输入又非常稀疏的时候,很容易过拟合。DIN 提出 Adaptive regularizaion 来防止过拟合,效果显著。
论文还提出,DIN 方法也可以应用于其他 有丰富用户行为数据 的场景,比如:
2. 系统总览

阿里推荐系统工作流程就像上图所示:
这是一个闭环的系统,对于用户行为数据 (User Behavior Data),系统自己生产并消费。
2.1 训练数据
前面提到,电子商务领域,充分利用 User Behavior Data 非常关键,而它又有着非常显著的特点:
还有的特点,就是 CTR 中输入普遍存在的特点:
CTR 中一旦涉及到用户行为数据,还有一个特点:
也就是:多值离散特征。比如:用户在 YouTube 上看的视频和搜索过的视频。无论是看过的还是搜索过的,都不止一个,但是相对于所有的视频来说,看过和搜索过的数量都太小了 (非常稀疏)。在电子商务上的例子就是:用户购买过的 good_id 有多个,购买过的 shop_id 也有多个,而这也直接导致了每个用户的历史行为 id 长度是不同的。
为了得到一个固定长度的 Embedding Vector 表示,原来的做法是在Embedding Layer后面增加一个Pooling Layer。Pooling 可以用 sum 或 average。最终得到一个固定长度的Embedding Vector,是用户兴趣的一个抽象表示,常被称作User Representation。缺点是会损失一些信息。
DIN 使用 Attention 机制来解决这个问题。Attention 机制 来源于Neural Machine Translation(NMT)。DIN 使用 Attention 机制去更好的建模局部激活。在 DIN 场景中,针对不同的候选广告需要自适应地调整User Representation。也就是说:在Embedding Layer -> Pooling Layer得到用户兴趣表示的时候,赋予不同的历史行为不同的权重,实现局部激活。从最终反向训练的角度来看,就是根据当前的候选广告,来反向的激活用户历史的兴趣爱好,赋予不同历史行为不同的权重。
2.2 特征处理
参考论文Learning piece-wise linear models from large scale data for ad click prediction中 common feature trick,目的是降低空间开销和计算开销。大体的思想是:同一个用户多条样本,它们之间很多信息重复,比如用户统计信息,昨天之前的统计信息等。针对这些重复信息只存储一次,并建立索引。
另外,论文中作者把特征分为四大类,并 没有进行特征组合 / 交叉特征。而是通过 DNN 去学习特征间的交互信息。特征如下:

可以看到特征主要包括:用户特征、用户行为特征、广告特征、上下文特征。
其中,只有 用户行为特征 中会出现multi-hot,原因就是一个用户会购买多个 good_id, 也会访问多个 shop_id,另一个表现就是这样导致了每个用户的样本长度都是不同的。还记得我们是怎么解决这个问题的吗?
Embedding -> Pooling + Attention
聪明如你,一定答对了吧~
2.3 评价指标
评价标准是阿里自己提出的 GAUC。并且实践证明了 GAUC 相比于 AUC 更加稳定、可靠。
AUC 表示正样本得分比负样本得分高的概率。在 CTR 实际应用场景中,CTR 预测常被用于对每个用户候选广告的排序。但是不同用户之间存在差异:有些用户天生就是点击率高。以往的评价指标对样本不区分用户地进行 AUC 的计算。论文采用的 GAUC 实现了用户级别的 AUC 计算,在单个用户 AUC 的基础上,按照点击次数或展示次数进行加权平均,消除了用户偏差对模型的影响,更准确的描述了模型的表现效果:

其中权重 w 既可以是展示次数 (impression) 也可以是点击次数 (clicks)。n 是用户数量。
3. 原理
用户访问阿里巴巴的电商网站,看到推荐的广告时,大部分人都是没有一个明确的目标的,他自己也不知道要买什么。所以,用一个高效的方法从用户丰富的历史行为数据中获取用户的兴趣信息并进行推荐,就非常关键了。
3.1 Base Model


如上图所示,Base Model 主要由两部分组成:
对于一个用户,之前购买过的 good_ids 组成了一个user behavior sequence ids。针对不同的用户,这个序列的长度是不同的 (不同用户购买的物品数量不同). 所以在 Embedding Layer 和 MLPs 中间,增加了一个 Pooling Layer,使用的是 sumoperation,把这些 goods 或 shops 的 embedding vector 相加,得到一个固定长度的向量作为 MLPs 的输入。
这里对 multi-hot 多值离散特征进行 Pooling 操作,就是对 Diversity 的建模。Base Model 中还没有引入 Attention 机制。
Base Model 上线后表现很好,现在也在承担着阿里线上广告展示系统的大部分流量。(论文发表时)
3.2 DIN Design
但是,仔细的研究下 Base Model 中 Pooling Layer 就会发现,Pooling 操作损失了很多信息,所以有了后面 DIN 的完整模型。
这个图太重要了,一定要仔细研究:

先给出结论:
我们模型的目标:基于用户历史行为,充分挖掘用户兴趣和候选广告之间的关系。用户是否点击某个广告往往是基于他之前的部分兴趣,这是应用 Attention 机制的基础。Attention 机制简单的理解就是对于不同的特征有不同的权重,这样某些特征就会主导这一次的预测,就好像模型对某些特征 pay attention。但是,DIN 中并不能直接用 attention 机制。因为 对于不同的候选广告,用户兴趣表示 (embedding vector) 应该是不同的。也就是说用户针对不同的广告表现出不同的兴趣表示,即时历史兴趣行为相同,但是各个行为的权重不同。这不就是 Local Activation 的含义吗?
这该怎么理解那?下面我们给出两种解释,从两个角度来解释:
1.核心是: 到 Embedding 后的空间中思考。
无论是用户兴趣行为,还是候选广告都会被映射到 Embedding 空间 中。他们两者的关系,是在 Embedding 空间中学习的。
现在有用户 U 和两个候选广告 A,B。在 Embedding 空间中,U 和 A,U 和 B 的相关性都比较高。假设我们使用内积来计算用户和广告之间的相关性。广告 A 和 B 嵌入后的向量分别为 Va, Vb,那么就要求对于 Va Vb 终点连线上的任何一个广告,用户 U 都要有很高的相关性。这样的限制使得模型非常难学习到有效的用户和广告的 embedidng 表示。当然,如果增大 embedding 的大小,也许能行。但是会极大的增加模型参数数量。
2.用户的兴趣分布是一个多峰的函数,随着候选广告的变化而变化,表现出局部激活的特性
用户 Embedding Vector 的维度为 k,它最多表示 k 个相互独立的兴趣爱好。但是用户的兴趣爱好远远不止 k 个,怎么办?DIN 给出的方案是:用户兴趣不再是一个点,而是一个 一个分布,一个多峰的函数。这样即使在低维空间,也可以获得几乎无限强的表达能力。
用户的兴趣不是一个点,而是一个 多峰的函数。一个峰就表示一个兴趣,峰值的大小表示兴趣强度。那么针对不同的候选广告,用户的兴趣强度是不同的,也就是说 随着候选广告的变化,用户的兴趣强度不断在变化。
换句话说:假定用户兴趣表示的 Embedding Vector 是 Vu,候选广告的是 Va,那么 Vu 是 Va 的函数。 也就是说,同意用户针对不同的广告有不同的用户兴趣表示 (嵌入向量不同)。
公式如下:

其中,Vi 表示 behavior id i 的嵌入向量,比如 good_id,shop_id 等。Vu 是所有 behavior ids 的加权和,表示的是用户兴趣。候选广告影响着每个 behavior id 的权重,也就是 Local Activation。权重表示的是:每一个 behavior id 针对当前的候选广告 Va,对总的用户兴趣表示的 Embedding Vector 的贡献大小。在实际实现中,权重用激活函数 Dice 的输出来表示,输入是 Vi 和 Va。
3.3 Dice: Data Dependent Activation Function
PReLU 其实是 ReLU 的改良版,ReLU 可以看作是x*Max(x,0),相当于输出 x 经过了一个在 0 点的阶跃整流器。由于 ReLU 在 x 小于 0 的时候,梯度为 0,可能导致网络停止更新,PReLU 对整流器的左半部分形式进行了修改,使得 x 小于 0 时输出不为 0。
研究表明,PReLU 能提高准确率但是也稍微增加了过拟合的风险。PReLU 形式如下:

无论是 ReLU 还是 PReLU 突变点都在 0,论文里认为,对于所有输入不应该都选择 0 点为突变点而是应该依赖于数据的。于是提出了一种 data dependent 的方法:Dice 激活函数。形式如下:

可以看出,pi 是一个概率值,这个概率值决定着输出是取 yi 或者是 alpha_i * yi,pi 也起到了一个整流器的作用。
pi 的计算分为两步:
另外,期望和方差使用每次训练的 mini batch data 直接计算,并类似于 Momentum 使用了 指数加权平均

alpha 是一个超参数,推荐值为 0.99
3.4 Adaptive Regularization
由于深度模型比较复杂,输入又非常稀疏,导致参数非常多,不出意外的过拟合了。
CTR 中输入稀疏而且维度高,已有的 L1 L2 Dropout 防止过拟合的办法,论文中尝试后效果都不是很好。用户数据符合 长尾定律long-tail law,也就是说很多的 feature id 只出现了几次,而一小部分 feature id 出现很多次。这在训练过程中增加了很多噪声,并且加重了过拟合。
对于这个问题一个简单的处理办法就是:人工的去掉出现次数比较少的 feature id。缺点是:损失的信息不好评估;阈值的设定非常的粗糙。
DIN 给出的解决方案是:


B 是 mini batch 样本,大小为 b;ni 是出现频率;Ii 表示我们考虑特征非零的样本。
这样做的原因是,作者实践发现出现频率高的物品无论是在模型评估还是线上收入中都有较大影响。
我个人的感觉是:
这仅仅是由于出现频率高的商品更符合大众的兴趣,而现有的模型还不能实现真正的千人千面推荐,所以使得热度高的商品重要性依旧非常大,不这样做的话模型性能就下降。
这就好比最简单的推荐系统:给所有人都推荐最热的商品。当技术还不够成熟,模型效果没那么好的时候,我们增加对热点商品的权重 (极端就是给所有人都推荐热点商品),从最终的指标来看多半能提升模型效果,毕竟这符合大多数人兴趣爱好。但是这并不是我们想要的千人千面的推荐。
4. 实现
DIN 在阿里内部的实现,使用了多个 GPU。并行化是基于 模型并行化、数据并行化。命名为 X-Deep Learning(XDL)
4.1 组成部分
由三部分组成:
4.2 架构图
分为 模型并行化、数据并行化

4.3 Common Feature Trick
对于一个用户,一次 pageview 中假设展示了 200 个商品。那么每个商品就对应一条样本。但是,这 200 条样本中是有很多Common Feature的。所以 DIN 的实现中并没有把用户都展开,类似于下图:

对于很多静态的不变的特征,比如性别、年龄、昨天以前的行为等只计算一次、存储一次。之后利用索引与其他特征关联,大幅度的压缩了样本的存储,加快了模型的训练。最终实验仅用了 1/3 的资源,获得了 12 倍的加速。
4.4 结果展示
下图展示了用户兴趣分布:颜色越暖表示用户兴趣越高,可以看到用户的兴趣分布有多个峰。

利用候选的广告,反向激活历史兴趣。不同的历史兴趣爱好对于当前候选广告的权重不同,做到了 local activation,如下图:

5. 总结
参考资料



链接:https://juejin.im/post/5b5591156fb9a04fe91a7a52




作者: 不二晨    时间: 2018-7-26 11:32
奈斯,很赞
作者: 吴琼老师    时间: 2018-7-26 15:56





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2