推荐系统之DIN模型原理以及代码实践

简介

本文要介绍的Deep Interest Network(DIN)模型是阿里妈妈精准定向检索及基础算法团队在2017年6月提出的。相比之前很多”学术风“的深度学习模型,DIN模型更加具有业务气息。它的应用场景是阿里巴巴的电商广告推荐,重点针对电子商务领域的CTR预估问题,主要特点是充分利用、挖掘了用户历史行为数据中的信息,并且提出了两项新颖的改进措施来提升大规模稀疏数据下神经网络的训练效率。

论文连接: Deep Interest Network for Click-Through Rate Prediction

背景知识

由于DIN是阿里巴巴针对其具体业务而提出的,所以有必要先介绍一下DIN的具体应用场景。在电商网站中,广告天然就是商品。所以DIN模型其实是根据用户的历史行为数据来向其投放广告。比如在淘宝app中,app向用户推荐的商品或者店铺信息,其实这些都属于广告信息。下面的示意图展示了这一过程:
淘宝推荐过程

在这个过程中,用户的历史行为数据起到很重要的作用。阿里巴巴的广告展示过程可以分为两步:

  1. 在匹配阶段,根据用户的历史行为数据,通过协同过滤等算法等为用户产生一个候选广告列表。
  2. 在排名阶段,对于候选列表中的广告,通过CTR算法来计算其分数,选取分数最高的若干个广告呈现给用户。

对于阿里巴巴而言,每天都有数以百万的用户访问网站,留下了海量的用户行为数据,这些数据可以帮助更好地完善广告展示的匹配排名阶段。值得注意的是,拥有海量行为数据的用户群体的兴趣是多样化的。如何能够从用户行为数据中挖掘出最有价值的信息,并且精准地进行广告展示,投其所好呢?
为此论文提出了DIN网络,对于不同的候选广告,模型需要充分考虑该广告与用户历史行为的相关性,以便自适应地学习用户兴趣的特征表达。下面举个例子详细说明一下。考虑一位年轻的母亲最近浏览了呢子大衣、T恤、耳环、手提袋、皮革手提包、以及孩子的外套等。这些行为数据告诉了我们她的购物兴趣。当她访问电商网站时,系统会展示一些合适的广告给她,比如,一个新的手提包。显然,这个展示的广告只匹配和激活了这个用户的部分历史行为数据,即之前购买过的手提袋、皮革手提包等。
总结一下,有两点需要注意:

  1. 用户可能购买过很多中不同类型的商品,即用户的兴趣是多样化的。
  2. 用户是否会点击系统推荐给她的商品,仅仅取决于其历史行为数据中的部分。

特征表示

CTR预估任务中的数据大部分以一种多分组的类别形式存在。举个例子,[weekday=Friday, gender=Female,visited_cate_ids={Bag,Book}, ad_cate_id=Book],通常的做法是通过embedding技术对这些高维稀疏特征进行编码。常用的方式有one-hot编码和multi-hot编码。前面提到的例子包含了4个组,对每个组进行编码后可以得到:

可以看到这其中既包含了one-hot编码,也包含了multi-hot编码。

下面给出DIN模型的输入数据格式,总共包含4个组,分别是用户画像特征、用户行为特征、广告特征、上下文特征,其中用户行为是multi-hot编码。
这其中并没有组合特征,DIN使用深度神经网络来捕获特征之间的交互。

Base Model

现有的DNN模型大部分遵循Embedding+MLP这一基础架构,即先将原始高维稀疏的离散特征向量通过Embedding网络映射到固定长度的地位稠密向量,再对其进行特征交叉等,并将其作为多个MLP层的输入,来拟合高阶的非线性关系,最后再通过sigmoid函数映射到0~1之间,用来表示CTR。相比传统的LR、GBDT、FM模型等,这类的DNN模型能够大大减少手工特征工程的工作量,并且可以学习到特征之间的非线性关系。Base Model的结构如下:

红蓝粉三色节点分别表示商品 ID (Goods ID), 店铺 ID (Shop ID), 类目 ID (Cate ID) 三种稀疏特征, 其他的输入特征, 使用白色节点表示 (比如左边的用户特征, 比如用户 ID; 还有右边的上下文特征, 比如广告位之类的特征)。注意 Goods 1 ~ Goods N 用来描述用户的历史行为,候选广告 Candidate Ad 本身也是商品,也具有 Goods / Shop / Cate ID 三种特征。自底向上观察BaseModel模型,可以看到包含3个部分,分别是Embedding层池化层和聚合层以及MLP层。

  • Embedding层
    Embedding层的输入是高维的二值化特征向量,将其转换到低维的稠密特征向量表示。对于t_i中的第i个特征组,令W^i= [w_i^i,...,w_j^i,...w_{K_i}^i] \in \mathbb R^{D \times K_i}代表第i个Embedding字典,其中w_j^i \in \mathbb R^D代表embedding向量,维度为DK_ii代表第i个特征组的维度。其实embedding操作类似有查表操作,就是在W^i中找出对应的embedding向量。这里要注意的是,对于one-hot和multi-hot编码的特征,经过embedding转换之后,输出的特征向量不一样。

    • 如果t_i是one-hot编码,并且第j个元素t_i[j]=1,那么t_i的embedding表示就是一个单个向量w_j^i
    • 如果t_i是multi-hot编码,并且第j个元素t_i[j]=1,并且j \in \{i_1, i_2,...,i_k\},那么t_i的embedding表示就是一个向量列表\{e_{i_1}, e_{i_1}, ...,e_{i_k}\} = \{w_{i_1}^i,w_{i_2}^i,...,w_{i_k}^i\}
  • 池化层和聚合层
    由于不同的用户拥有不同数量的行为数据,而用户行为数据是通过multi-hot进行编码的,这意味着不同用户的历史行为数据产生的Embedding列表\{e_{i_1}, e_{i_1}, ...,e_{i_k}\}长度不同。而MLP层只能处理固定长度的向量,因此通常的做法是将这些向量列表通过池化层来得到固定长度的向量,如上图中蓝色阴影部分所示,具体表达如下:

    pooling
    一般有求和池化和平均池化两种操作,都是通过逐元素的方式来对列表中的向量进行求和或者取平均操作。

    embedding和pooling操作都是以一种分组的形式来讲原始空间的稀疏特征向量转换成多种固定长度的向量表示。然后所有的向量被聚合起来以获得总体的特征表示。这种方式有它本身的缺陷,这也是DIN着重要改进的地方。

  • MLP层
    MLP的作用就是学习这些特征向量之间的高阶非线性关系。

  • 损失函数
    基于深度学习的CTR模型广泛使用的损失函数是 负对数似然函数(the negative log-likelihood function)Loglos,使用标签作为目标项来监督整体的预测。

    log损失函数

DIN

Base Model通过神经网络来拟合高阶非线性关系,减少了人工特征的工作量。但是它也有一些缺点,其中最明显的就是Base Model的池化层和聚合层的操作。在对用户历史行为数据进行处理时, 由于每个用户的历史点击个数是不相等的, 包含了许多兴趣信息,由于MLP层只能接收固定的输入,因此Base Model通过pooling操作将它们编码成一个固定长为K维的向量。而K维度向量最多只能表达K个独立的兴趣,而用户的兴趣可能不止KK的大小会对计算量产生明显影响,一般用大的K效果会更好,即扩展向量的维度,但这样会增加学习的参数和在有限的数据中有过拟合的风险。
为了优雅地解决这个问题,作者提出DIN模型。相比于Base Model,DIN的创新之处在于它引入了一个局部激活单元(local activation unit),即保持了Base Model的整体架构不变,又解决了Base Model针对不同广告,对用户历史行为数据都同等对待的问题。DIN模型如下:

DIN模型
可以看到,DIN跟Base Model的区别不是很大,主要是SUM Pooling层的前面做了些文章。对于用户历史行为数据,DIN不再是对其进行sum pooling或者average pooling操作,而是引入了一个激活单元来学习用户历史行为数据e_j和给定广告v_A之间的关系。用公式表达如下:
其中\{ e_1,e_2,..,e_H\}代表用户U的行为数据的embedding向量列表,v_A是广告A的embedding向量。v_{U}(A)代表用户U对特定广告A的感兴趣程度,可以看到v_{U}(A)因为A的不同而不同。a(\cdot)代表一个前向神经网络,它的输出就是激活权重。如上图右上角所示。
Activation Unit的输入包括用户历史商品和候选广告的embedding向量,将这两者以及它们之间的外积连接起来,再通过激活函数和线性层得到历史商品e_i和候选广告A在embedding空间的关系权重。计算出每个历史行为数据e_i的权重w_i之后,执行一个带权重的sum pooling即可。可知,DIN和Base Model的主要区别就在于是否使用了带权重的poolng操作,而这个改进取得了不俗的表现。

在这种计算方式下,最终的用户U的兴趣向量会根据不同的广告A而变化。这就是“用户兴趣的千物千面”。比如,一个用户之前买过奶粉与泳衣,当展示给她泳镜时,显然更会唤起她买过的泳衣的记忆;而当展示给她尿不湿时,显然更唤起她买过的奶粉的记忆。

这其实就是Attention在DIN中的使用了。一般来说,做Attention的时候,需要对所有的分数通过softmax做归一化,这样做有两个好处,一是保证权重非负,二是保证权重之和为1。但是在DIN的论文中强调,不对点击序列的attention分数做归一化,直接将分数与对应商品的embedding向量做加权和,目的在于保留用户的兴趣强度。例如,用户的点击序列中90%是衣服,10%是电子产品,有一件T恤和一部手机需要预测CTR,那么T恤会激活大部分的用户行为,使得根据T恤计算出来的用户行为向量在数值上更大。

训练技巧

Mini-batch Aware Regularization

考虑有goods_id特征的大规模神经网络容易过拟合,因此加入正则化是必须的。mini-batch中只有输入稀疏特征不为0对应的参数才更新,但加入L2正则就会导致每个mini-batch都会计算全部参数的L2-norm,这是不可接受的。本文提出mini-batch中instance的原始feature第j维不为0,才会计算相应w_j的L2-norm,最后近似为至少有一个instance其j维不为0才计算一次。公式推导如下(主要的参数来自embedding字典,统称为W。下面为在所有sample上的L2正则计算):

有了上式之后,loss的形式就确定了,因此参数更新公式如下:

Data Adaptive Activation Function

作者对传统的激活函数ReLU做了改进,提出了Dice激活函数,过程如下:

  • ReLU和PReLU

    上图左边是ReLU激活函数,其在值大于0时候原样输出,小于0时输出为0。这样可以有效避免梯度消失等问题,但同时也会导致许多网络节点更新缓慢。右边是PReLU激活函数,唯一的区别就是在值小于0时,梯度依然存在,网络的参数可以更新,加快了网络的收敛速度。

  • PReLU和Dice
    尽管对 ReLU进行了修正得到了PRelu,但是仍然有一个问题:即我们认为分割点都是 0。但实际上,分割点应该由数据决定。因此,论文中提出了 Dice 激活函数,Dice 激活函数的全称是 Data Dependent Activation Function,其形式如下:
    其中控制函数p的变化如下:
    论文认为采用 PReLU作为激活函数时,它的rectified point 固定为 0,这在每一层的输入分布发生变化时是不适用的。所以,论文针对该激活函数进行了改进,一方面平滑了激活函数在 rectified point 附近的曲线,另一方面激活函数会根据每层输入数据的分布来自适应调整 rectified point 的位置,从而对模型参数的更新和收敛起到一定的加速作用。

代码实践

待补充

参考

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,015评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,262评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,727评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,986评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,363评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,610评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,871评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,582评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,297评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,551评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,053评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,385评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,035评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,079评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,841评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,648评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,550评论 2 270

推荐阅读更多精彩内容