Deep Interest Network(DIN)是阿里妈妈精准定向检索及基础算法团队在2017年6月提出的。其针对电子商务领域(e-commerce industry)的CTR预估,重点在于充分利用/挖掘用户历史行为数据中的信息。
本系列文章会解读论文以及源码,顺便梳理一些深度学习相关概念和TensorFlow的实现。
本文是系列第一篇 :论文解读。参考了大量文章,衷心感谢各位的分享,具体请参见文末链接。
Deep Interest Network(DIN)是阿里妈妈精准定向检索及基础算法团队在2017年6月提出的。其针对电子商务领域(e-commerce industry)的CTR预估,重点在于充分利用/挖掘用户历史行为数据中的信息。
DIN通过引入attention机制,针对不同的广告构造不同的用户抽象表示,从而实现了在数据维度一定的情况下,更精准地捕捉用户当前的兴趣。
核心思想是 :用户的兴趣是多元化的(diversity),并且对于特定的广告,用户不同的兴趣会产生不同的影响(local activation)。
文章介绍了现有的点击率 (CTR) 预估模型大都满足相同的模式:
这个模式存在一个问题。比如在电商场景下,用户兴趣可以使用用户的历史行为来描述 (比如用户访问过的商品,店铺或者类目),然而如果按照现有的处理模式,对于不同的候选广告,用户的兴趣始终被映射为同一个固定长度的向量来表示,这极大的限制了模型的表达能力,毕竟用户的兴趣是多样的。
Embedding&MLP模型的瓶颈就是表达用户多样的兴趣,维度受限的用户表示向量将成为表达用户多样化兴趣的瓶颈。
为了解决这个问题,论文中提出了 DIN 网络。对于不同的候选广告,考虑该广告和用户历史行为的相关性,以便自适应地学习用户兴趣的特征表达。具体来说,文章介绍了 local activation unit 模块,其基于 Attention 机制,对用户历史行为进行加权来表示用户兴趣,其中权重参数是通过候选广告和历史行为交互来进行学习的。
另外,本文还介绍了 Mini-batch Aware Regularization 与 Dice 激活函数两种技术,以帮助训练大型的网络。
Diversity:
用户在访问电商网站时会对多种商品都感兴趣。也就是用户的兴趣非常的广泛。比如一个年轻的母亲,从她的历史行为中,我们可以看到她的兴趣非常广泛:羊毛衫、手提袋、耳环、童装、运动装等等。
Local Activation:
用户是否会点击推荐给他的商品,仅仅取决于历史行为数据中的一小部分,而不是全部。历史行为中部分数据主导是否会点击候选广告。比如一个爱游泳的人,他之前购买过travel book、ice cream、potato chips、swimming cap。当前给他推荐的商品(或者说是广告Ad)是goggle(护目镜)。那么他是否会点击这次广告,跟他之前是否购买过薯片、书籍、冰激凌一丁点关系也没有!而是与他之前购买过游泳帽有关系。也就是说在这一次CTR预估中,部分历史数据(swimming cap)起了决定作用,而其他的基本没啥用。
下面主要摘录:用NumPy手工打造 Wide & Deep。
推荐系统的主要挑战之一,是同时解决Memorization和Generalization。Memorization根据历史行为数据,推荐通常和用户已有行为的物品直接相关的物品。而Generalization会学习新的特征组合,提高推荐物品的多样性。 DeepFM 中 Wide & Deep 分别对应 Memorization & Generalization。
面对拥有大规模离散sparse特征的CTR预估问题时,将特征进行非线性转换,然后再使用线性模型是在业界非常普遍的做法,最流行的即「LR+特征叉乘」。Memorization 通过一系列**人工的特征叉乘(cross-product)**来构造这些非线性特征,捕捉sparse特征之间的高阶相关性,即 “记忆” 历史数据中曾共同出现过的特征对。
例如
特征1——专业: {计算机、人文、其他},
特征2——下载过音乐《消愁》:{是、否},
这两个特征one-hot后的特征维度分别为3维与2维,对应的叉乘结果是
特征3——专业☓下载过音乐《消愁》: {计算机∧是,计算机∧否,人文∧是,人文∧否,其他∧是,其他∧否}。
典型代表是LR模型,使用大量的原始sparse特征和叉乘特征作为输入,很多原始的dense特征通常也会被分桶离散化构造为sparse特征。这种做法的优点是模型可解释高,实现快速高效,特征重要度易于分析,在工业界已被证明是很有效的。
Memorization的缺点是:
Generalization 为sparse特征学习低维的dense embeddings 来捕获特征相关性,学习到的embeddings 本身带有一定的语义信息。可以联想到NLP中的词向量,不同词的词向量有相关性,因此Generalization是基于相关性之间的传递。这类模型的代表是DNN和FM。
Generalization的优点是更少的人工参与,对历史上没有出现的特征组合有更好的泛化性 。
在推荐系统中,当user-item matrix非常稀疏时,例如有和独特爱好的users以及很小众的items,NN很难为users和items学习到有效的embedding。这种情况下,大部分user-item应该是没有关联的,但dense embedding 的方法还是可以得到对所有 user-item pair 的非零预测,因此导致 over-generalize并推荐不怎么相关的物品。此时Memorization就展示了优势,它可以“记住”这些特殊的特征组合。
各种NN与FM看似繁杂,实际上,只要把握住它们的发展脉络,即**“如何兼顾记忆与扩展”、“如何处理高维、稀疏的类别特征”、“如何实现特征交叉”**,你就会发现各种高大上的新算法不过是沿着这条脉络,在某个枝叉上的修补。这样一来,各种NN与FM,在你脑中,就不再是一个个独立的缩写,而能够编织成网,融会贯通。
相比于实数型特征,稀疏的类别/ID类特征,才是推荐、搜索领域的“一等公民”,被研究得更多。即使有一些实数值特征,比如历史曝光次数、点击次数、CTR之类的,也往往通过bucket的方式,变成categorical特征,才喂进模型。
但是,稀疏的categorical/ID类特征,也有着单个特征表达能力弱、特征组合爆炸、分布不均匀导致受训程度不均匀的缺点。为此,一系列的新技术被开发出来。
单个categorical/ID特征表达能力是极弱的,因此必须做特征交叉,以增强categorical特征的表达能力。而围绕着如何做特征交叉,衍生出各种算法。
深度神经网络(DNN)先将categorical/id特征通过embedding映射成稠密向量,再喂入DNN,让DNN自动学习到这些特征之间的深层交叉,以增强扩展能力。
准确的CTR预估需要精细化权衡用户、广告主、平台三方利益。经过多年的技术更新迭代与发展,CTR预估技术经历了从 LR/FM 到 融合模型(RF/GBDT/XGBoost) 到 深度CTR预估模型(FNN/PNN/WDL/DeepFM/DIN)的过程,而贯穿其中的主线是如何让模型自动地进行组合特征的挖掘?
比如:
也可以看看阿里思路的出发点:
我们第一考虑到的是降维,在降维的基础上,进一步考虑特征的组合。所以DNN很自然进入了我们的考虑范围。再考虑的是如果把用户行为序列建模起来,我们希望是用户打开手淘后,先在有好货点了一个商品,再在猜你希望点了一个商品,最后进入搜索后会受到之前的行为的影响,当然有很多类似的方法可以间接实现这样的想法。但直接建模的话,LR这类的模型,很难有能力来支持这类特征,所以很容易就想到了RNN模型。
DNN模型大多遵从 Embedding + MLP这一基础网络架构,即将原始高维的不同的离散特征映射为固定长度的低维embedding向量,并将embedding向量作为多个全连接层的输入,拟合高阶的非线性关系,最后通过Sigmoid等手段将输出值归一到0~1,表示点击概率。相比于传统的LR、GBDT、FM等模型,这类DNN的模型能减少大量的人工构造特征过程,并且能学习特征之间的非线性关系。
通常流程是:
Sparse Features -> Embedding Vector -> pooling layer -> MLPs -> Sigmoid -> Output
下图的 Base Model, 是现有的大多数 CTR 模型采用的模式:
红蓝粉三色节点分别表示商品 ID (Goods ID), 店铺 ID (Shop ID), 类目 ID (Cate ID) 三种稀疏特征, 其他的输入特征, 使用白色节点表示 (比如左边的用户特征, 比如用户 ID; 还有右边的上下文特征, 比如广告位之类的特征). 注意 Goods 1 ~ Goods N 用来描述用户的历史行为. 候选广告 Candidate Ad 本身也是商品, 也具有 Goods / Shop / Cate ID 三种特征.
自底向上观测 Base Model 的工作机制:
优点:
缺点:
针对DNN模型的问题,阿里提出了DIN模型。其核心思想:用户的兴趣是多元化的(diversity),并且对于特定的广告,用户不同的兴趣会产生不同的影响(local activation)。DIN同时对Diversity和Local Activation进行建模。
DIN 不会通过使用同一向量来表达所有用户的不同兴趣,而是通过考虑历史行为的相关性来自适应地计算用户兴趣的表示向量(对于给定的广告)。 该表示向量随不同广告而变化。DIN 通过考虑【给定的候选广告】和【用户的历史行为】的相关性,来计算用户兴趣的表示向量。具体来说就是通过引入局部激活单元,通过软搜索历史行为的相关部分来关注相关的用户兴趣,并采用加权和来获得有关候选广告的用户兴趣的表示。与候选广告相关性较高的行为会获得较高的激活权重,并支配着用户兴趣。该表示向量在不同广告上有所不同,大大提高了模型的表达能力。
Deep Interest NetWork有以下几点创新:
DIN架构图如下:
DIN同时对Diversity和Local Activation进行建模,具体体现如下图。
下面我们逐一看看系统的各个部分。
论文中作者把阿里的展示广告系统特征分为四大类。
1)用户画像特征;
2)用户行为特征,即用户点击过的商品,各个用户行为长度不同;
3)待曝光的广告,广告其实也是商品;
4)上下文特征;
每个特征类别包括多个特征域(feature field),例如:用户画像特征包括性别,年龄段等;用户行为特征,包括用户点击过的商品,商品的类别,以及所属的商铺等;Context包括时间。
CTR中输入普遍存在的特点:
有一些特征域是单值特征,不同的特征值之间是互斥的,例如性别只可能属于男或者女,可以转化为one-hot表示;
有一些特征域是多值离散特征,例如用户行为特征,用户可能点击过多个商品,构成一个商品点击序列,只能用multi-hot编码表示。与 one-hot 编码不同,multi-hot 编码中,一个向量可能存在多个 1,比如:
用户在YouTube上看的视频和搜索过的视频。无论是看过的还是搜索过的,都不止一个,但是相对于所有的视频来说,看过和搜索过的数量都太小了(非常稀疏)。
在电子商务上的例子就是:用户购买过的good_id有多个,购买过的shop_id也有多个,而这也直接导致了每个用户的历史行为id长度是不同的。
DNN 并没有进行特征组合/交叉特征。而是通过DNN去学习特征间的交互信息。
对于单值特征处理比较简单,对于多值特征的处理稍微麻烦些。多值特征导致了每个用户的样本长度都是不同的。如何解决这个问题?通过 Embedding -> Pooling + Attention
。
深度学习在推荐、搜索领域的运用,是围绕着稀疏的ID类特征所展开的,其主要方法就是Embedding。变ID类特征的“精确匹配”为“模糊查找”,以增强扩展。即将高维、稀疏categorical/id类特征通过embedding映射成一个低维、稠密向量。
Embedding层特点如下:
Embedding = 0.9 * 微信向量 + 0.5 * 微博向量 + 0.3 * 淘宝向量
;MLP只能接受固定长度的输入,但是每个用户在一段时间内的商品点击序列长度可能会不同,属于变长特征,那么该如何处理这样的变长特征?
一般来说是由 Pooling 层来处理,下面就让我们看看Pooling层。
Pooling的作用是把embedding向量转化为一个固定长度的向量,解决维度不定的问题。
用户有多个兴趣爱好,这导致两个问题:
为了降低纬度并使得商品店铺间的算术运算有意义,我们先对id特征进行Embedding嵌入。
那么如何对用户多种多样的兴趣建模?我们把这些id特征embedding之后的多个低维向量(embedding向量列表),“合并”成一个向量,作为用户兴趣的表示。
因为全连接需要固定长度的输入,所以我们需要“合并”成一个固定长度向量,这样才能喂入DNN。
这个“合并”就是所谓Pooling。
围绕着这个Pooling过程,各家有各家的高招:
Youtube DNN这篇论文中,Youtube的做法最简单、直观,就是将用户看过的视频embedding向量、搜索过的关键词embedding向量,做一个简单的平均。
Neural Factorization Machine中,将n个(n=特征数)k维向量压缩成一个k维向量,取名为bi-interaction pooling。既完成pooling,也实现了特征间的二阶交叉。
DIN用各embedding向量的加权平均实现了pooling,而”权重”由attention机制计算得到。
基于深度学习的文本分类,同样面临着如何将一段话中的多个词向量压缩成一个向量来表示这段话的问题。常用的方法,就是将多个词向量喂入RNN,最后一个时刻RNN的输出向量就代表了多个词向量的“合并”结果。显然,DIEN则借鉴了这一思路,并且改造了GRU的构造,利用attention score来控制门。
DNN base模型采用pooling的方式,一般有两种方法,求和池化(sum pooling,各个对应元素进行累加)和平均池化(average pooling,各个对应元素求平均)。然后将所有向量连接在一起(concatenate),以获得实例的总体表示向量。
base模型对于任何要预测的candidate,不管这个candidate是衣服,电子产品等,用户的表示向量都是确定的、不变的,对于任何candidate都无差别对待。
回到阿里的展示广告系统,如架构图所示,每个商品有3个特征域,包括商品自身,商品类别,商品所属的商铺。对于每个商品来说,3个特征embedding拼接之后才是商品的表示向量。
对商品序列做pooling,架构图中采用的是求和的方式,pooling之后得到用户行为序列的表示向量。然后再和其他的特征embedding做拼接,作为MLP的输入。
MLP输入端的整个embedding向量,除了candidate的embedding部分,其余的embedding部分可以视为用户的表示向量。
仔细的研究下Base Model中Pooling Layer就会发现,Pooling操作损失了很多信息。
所以DIN 使用 Pooling(weighted sum)对Diversity建模,因为直接sum体现不出差异多样性,加权可以。
即DIN用各embedding向量的加权平均实现了pooling,而”权重”由attention机制计算得到。
Attention机制简单的理解就是,针对不同的广告,用户历史行为与该广告的权重是不同的。假设用户有ABC三个历史行为,对于广告D,那么ABC的权重可能是0.8、0.1、0.1;对于广告E,那么ABC的权重可能是0.3、0.6、0.1。这里的权重,就是Attention机制即架构图中的Activation Unit所需要学习的。
DIN模型其实就是在DNN基础上加了attention。通过Attention来实现Pooling,使用户兴趣的向量表示,根据候选物料的不同而不同,实现用户兴趣的“千物千面”。
模型的目标:基于用户历史行为,充分挖掘用户兴趣和候选广告之间的关系。用户是否点击某个广告往往是基于他之前的部分兴趣,这是应用Attention机制的基础。因为无论是用户兴趣行为,还是候选广告都会被映射到Embedding空间中。所以他们两者的关系,是在Embedding空间中学习的。
DIN的attention机制部分是为了用一个 fix length 的 vector 刻画用户面对不同的商品展现出不同的兴趣,这个点看起来很简单,但是实际比较困难。
Embedding Layer
后面增加一个Pooling Layer
。Pooling可以用sum或average。最终得到一个固定长度的Embedding Vector
,是用户兴趣的一个抽象表示,常被称作User Representation
。缺点是会损失一些信息。Embedding Layer -> Pooling Layer
得到用户兴趣表示的时候,也没有考虑用户与广告之间的关系,即不同广告之间的权重是一致的。这样传统的预估方法在一个user面对不同商品(广告)时用一个同样的vector来表达这个user。如果在这种情况下要想表达多样的兴趣,最简单的方案是增加user vector的维度,然而这会带来overfitting和计算压力。所以DIN用类似attention的机制试图解决这个问题。
注意力机制顾名思义,就是模型在预测的时候,对用户不同行为的注意力是不一样的,“相关”的行为历史看重一些,“不相关”的历史甚至可以忽略。即对于不同的特征有不同的权重,这样某些特征就会主导这一次的预测,就好像模型对某些特征pay attention。
这样的思想反应到模型中也是直观的。比如在视频推荐模型中,DIN可以通过增加用户的历史行为feature:用户观看的近20个show_id,近20个video_id,然后使用attention网络,最后与其它非历史行为feature在MLP中汇合。
DIN利用attention机制去更好的建模局部激活。在得到用户兴趣表示时赋予不同的历史行为不同的权重,即通过Embedding Layer -> Pooling Layer+attention
实现局部激活。从最终反向训练的角度来看,就是根据当前的候选广告,来反向的激活用户历史的兴趣爱好,赋予不同历史行为不同的权重。
DIN给出的方案是:不再用一个点来表示用户兴趣,而是通过用一个在不同时刻不一样的分布表示:分布可以是多峰的,可以表达每个人有多个兴趣。一个峰就表示一个兴趣,峰值的大小表示兴趣强度。那么针对不同的候选广告,用户的兴趣强度是不同的,也就是说随着候选广告的变化,用户的兴趣强度不断在变化。 因为用户兴趣是一个多峰的函数,这样即使在低维空间,也可以获得几乎无限强的表达能力。
换句话说:假定用户兴趣表示的Embedding Vector是Vu,候选广告的是Va,那么Vu是Va的函数。 也就是说,同意用户针对不同的广告有不同的用户兴趣表示(嵌入向量不同)。
其中:
DIN中并不能直接用attention机制。因为对于不同的候选广告,用户兴趣表示(embedding vector)应该是不同的。
Local Activation Unit 借鉴了NMT(Neural Machine Translation)中的attention机制,实现了自己的Attention机制。 Local Activation学习候选广告和用户历史行为的关系,并给出候选广告和各个历史行为的相关性程度 (即权重参数),再对历史行为序列进行加权求和,最终得到用户兴趣的特征表达。也就是说用户针对不同的广告表现出不同的兴趣表示,即使历史兴趣行为相同,但是各个行为的权重不同。
DIN 在pooling的时候,与candidate相关的商品权重大一些,与candidate不相关的商品权重小一些,这就是一种Attention的思想。将candidate与点击序列中的每个商品发生交互来计算attention分数。具体计算输入包括商品和candidate的embedding向量,以及两者的外积。对于不同的candidate,得到的用户表示向量也不同,具有更大的灵活性。
DIN中,对于候选广告, 根据local activation unit计算出的用户兴趣向量为:
其中,
在这种计算方式下,最终的用户 U 的兴趣向量会根据不同的广告 A 而变化。这就是 “用户兴趣的千物千面”。比如,一个用户之前买过奶粉与泳衣,当展示给她泳镜时,显然更会唤起她买过的泳衣的记忆;而当展示给她尿不湿时,显然更唤起她买过的奶粉的记忆。
DIN attention机制中,用户兴趣向量 Vu 是历史上接触过的item embedding向量的加权平均,而第 i 个历史 item 的权重 Wi 由该历史 item 的 embedding 向量 Vi 与候选物料的 embedding 向量 Va 共同决定(函数g)。可见同一个用户当面对不同候选物料时,其兴趣向量也不相同,从而实现了“千物千面”。
DIN与base model的主要区别就在于激活单元上,这个结构通过计算广告的embedding与用户表现的embedding之间的相似度得到对应的权重,后对表现序列进行权重求和,取得了不俗的表现。
一般来说,做attention的时候,需要对所有的分数通过softmax做归一化,这样做有两个好处,一是保证权重非负,二是保证权重之和为1。
但是在DIN的论文中强调,不对点击序列的attention分数做归一化,直接将分数与对应商品的embedding向量做加权和,目的在于保留用户的兴趣强度。例如,用户的点击序列中90%是衣服,10%是电子产品,有一件T恤和一部手机需要预测CTR,那么T恤会激活大部分的用户行为,使得根据T恤计算出来的用户行为向量在数值上更大。
评价标准是阿里自己提出的GAUC。并且实践证明了GAUC相比于AUC更加稳定、可靠。
AUC表示正样本得分比负样本得分高的概率。在CTR实际应用场景中,CTR预测常被用于对每个用户候选广告的排序。但是不同用户之间存在差异:有些用户天生就是点击率高。以往的评价指标对样本不区分用户地进行AUC的计算。论文采用的GAUC实现了用户级别的AUC计算,在单个用户AUC的基础上,按照点击次数或展示次数进行加权平均,消除了用户偏差对模型的影响,更准确的描述了模型的表现效果。
由于深度模型比较复杂,输入又非常稀疏,导致参数非常多,非常容易过拟合。
CTR中输入稀疏而且维度高,已有的L1 L2 Dropout防止过拟合的办法,论文中尝试后效果都不是很好。用户数据符合 长尾定律long-tail law
,也就是说很多的feature id只出现了几次,而一小部分feature id出现很多次。这在训练过程中增加了很多噪声,并且加重了过拟合。
对于这个问题一个简单的处理办法就是:人工的去掉出现次数比较少的feature id。缺点是:损失的信息不好评估;阈值的设定非常的粗糙。
DIN给出的解决方案是:
对L2正则化的改进,在进行SGD优化的时候,每个mini-batch都只会输入部分训练数据,反向传播只针对部分非零特征参数进行训练,添加上L2之后,需要对整个网络的参数包括所有特征的embedding向量进行训练,这个计算量非常大且不可接受。论文中提出,在每个mini-batch中只对该batch的特征embedding参数进行L2正则化。
用NumPy手工打造 Wide & Deep
看Google如何实现Wide & Deep模型(1)
看Youtube怎么利用深度学习做推荐
也评Deep Interest Evolution Network
从DIN到DIEN看阿里CTR算法的进化脉络
第七章 人工智能,7.6 DNN在搜索场景中的应用(作者:仁重)
#Paper Reading# Deep Interest Network for Click-Through Rate Prediction
【paper reading】Deep Interest Evolution Network for Click-Through Rate Prediction
也评Deep Interest Evolution Network
论文阅读:《Deep Interest Evolution Network for Click-Through Rate Prediction》
【论文笔记】Deep Interest Evolution Network(AAAI 2019)
【读书笔记】Deep Interest Evolution Network for Click-Through Rate Prediction
DIN(Deep Interest Network):核心思想+源码阅读注释
计算广告CTR预估系列(五)–阿里Deep Interest Network理论
CTR预估之Deep Interest NetWork模型原理详解
人人都能看懂的LSTM
从动图中理解 RNN,LSTM 和 GRU
台大李宏毅机器学习(一)——RNN&LSTM
李宏毅机器学习(2016)
推荐系统遇上深度学习(二十四)–深度兴趣进化网络DIEN原理及实战!
from google.protobuf.pyext import _message,使用tensorflow出现 ImportError: DLL load failed
DIN 深度兴趣网络介绍以及源码浅析
CTR预估 论文精读(八)–Deep Interest Network for Click-Through Rate Prediction
阿里CTR预估三部曲(1):Deep Interest Network for Click-Through Rate Prediction简析
阿里CTR预估三部曲(2):Deep Interest Evolution Network for Click-Through Rate Prediction简析
Deep Interest Network解读
深度兴趣网络(DIN,Deep Interest Network)
DIN论文官方实现解析
阿里DIN源码之如何建模用户序列(1):base方案
阿里DIN源码之如何建模用户序列(2):DIN以及特征工程看法
阿里深度兴趣网络(DIN)论文翻译
推荐系统遇上深度学习(二十四)–深度兴趣进化网络DIEN原理及实战!
推荐系统遇上深度学习(十八)–探秘阿里之深度兴趣网络(DIN)浅析及实现
【论文导读】2018阿里CTR预估模型—DIN(深度兴趣网络),后附TF2.0复现代码
【论文导读】2019阿里CTR预估模型—DIEN(深度兴趣演化网络)
★★★★★★关于生活和技术的思考★★★★★★
微信公众账号:罗西的思考
如果您想及时得到个人撰写文章的消息推送,或者想看看个人推荐的技术资料,可以扫描下面二维码(或者长按识别二维码)关注个人公众号)。