DIN

文章目录

  • DIN
    • 提出背景
    • DIN模型的数据集和特征表示
    • 基线模型
      • Embedding layer
      • Pooling layer and Concat layer
      • 损失函数
      • base模型存在的问题 & 改进思路
    • DIN模型架构
    • DIN实现上的细节

提出背景

Deep Interest Network(DIN)是阿里巴巴在2018年提出的,该模型更加具有业务气息。应用场景是阿里巴巴的电商广告推荐业务。DIN这个模型应用了注意力机制来对用户的兴趣动态模拟。这个应用场景的最重要的特点是:有大量的用户历史行为信息。

之前的深度学习模型对于这种推荐任务一般有着差不多的固定处理套路,就是大量稀疏特征先经过embedding层,转成低维稠密的,然后进行拼接,最后喂入到多层神经网络中去。

对于这种用户留下了大量的历史交互行为的业务场景,之前的深度学习模型根本没有考虑之前用户历史行为商品具体是什么,也是没法很好的去表达出用户这广泛多样的兴趣的,更不知道究竟用户历史行为中的哪个会对当前的点击预测带来积极的作用。但实际上对于用户点不点击当前的商品广告,很大程度上是依赖于他的历史行为的。

若想在深度模型中考虑用户历史信息,就得加大隐向量的维度,让每个特征的信息更加丰富, 那这样带来的问题就是计算量上去了,毕竟真实情景尤其是电商广告推荐的场景,特征维度的规模是非常大的。并且根据上面的例子,也并不是用户所有的历史行为特征都会对某个商品广告点击预测起到作用。所以对于当前某个商品广告的点击预测任务,没必要考虑之前所有的用户历史行为。

因此,DIN的动机如下:

  1. 在业务的角度,我们应该自适应的去捕捉用户的兴趣变化,这样才能较为准确的实施广告推荐;
  2. 到模型的角度,我们应该考虑到用户的历史行为商品与当前商品广告的一个关联性,如果用户历史商品中很多与当前商品关联,那么说明该商品可能符合用户的品味,就把该广告推荐给他。

一旦涉及到关联性,就容易想到“注意力”思想,因此把注意力引入到了模型,设计了一个"local activation unit"结构,利用候选商品和历史问题商品之间的相关性计算出权重,这个就代表了对于当前商品广告的预测,用户历史行为的各个商品的重要程度大小。

DIN模型的数据集和特征表示

工业上的CTR预测数据集一般都是multi-group categorial form的形式,就是类别型特征最为常见,这种数据集一般长这样:

各项含义如下:
asin 产品的ID
imUrl 产品图片地址
description 产品描述
categories 产品所属的类别列表
title 产品名称
Price 价格
salesRank 销售排名信息
related 相关产品(也已购买,也已查看,一起购买,已查看后购买)
Brand 品牌

常用数据集如下:

  1. Display Advertising Challenge挑战的criteo数据集
  2. 淘宝数据集
  3. 亚马逊数据集

对于特征编码,举个例子:[weekday=Friday, gender=Female, visited_cate_ids={Bag,Book}, ad_cate_id=Book], 这种情况一般是通过one-hot的形式对其编码, 转成系数的二值特征的形式。但是这里我们发现一个visted_cate_ids,也就是用户的历史商品列表。对于某个用户来讲,这个值是个多值型的特征,而且还要知道这个特征的长度不一样长,也就是用户购买的历史商品个数不一样多,这个显然。这个特征的话,我们一般是用到multi-hot编码,也就是可能不止1个1了,有哪个商品,对应位置就是1.

注意一点 上面的特征里面没有任何的交互组合,也就是没有做特征交叉。这个交互信息交给后面的神经网络去学习。

基线模型

这里的base模型,就是Embedding&MLP的形式,没错,DIN网络的基准也是他,只不过在这个的基础上添加了一个新结构(注意力网络)来学习当前候选广告与用户历史行为特征的相关性,从而动态捕捉用户的兴趣。

基准模型的结构相对比较简单,分为三大模块:Embedding layer,Pooling & Concat layer和MLP,具体的结构如下:

Embedding layer

这个层的作用是把高维稀疏的输入转成低维稠密向量,每个离散特征下面都会对应着一个embedding词典,维度是D×KD \times KD×K,这里的DDD表示的是隐向量的维度,KKK表示的是当前离散特征的取值个数。

以weekday特征为例:假设某个用户的weekday特征就是周五,化成one-hot编码,就是[0,0,0,0,1,0,0],这里如果再假设隐向量维度是D,那么这个特征对应的embedding词典是一个D×7D \times 7D×7的一个矩阵(每一列代表一个embedding,7列正好7个embedding向量,对应周一到周日)。那么该用户这个one-hot向量经过embedding层之后会得到一个D×1D \times 1D×1的向量,也就是周五对应的那个embedding(就是embeddingmatrix∗[0,0,0,0,1,0,0]Tembedding \quad matrix * [0,0,0,0,1,0,0]^Tembeddingmatrix[0,0,0,0,1,0,0]T,其实也就是直接把embedding矩阵中one-hot向量为1的那个位置的embedding向量拿出来。)这样就得到了稀疏特征的稠密向量了。

其他离散特征也是同理,只不过上面那个multi-hot编码的那个,会得到一个embedding向量的列表,因为他开始的那个multi-hot向量不止有一个是1,这样乘以embedding矩阵,就会得到一个列表了。通过这个层,上面的输入特征都可以拿到相应的稠密embedding向量。

Pooling layer and Concat layer

pooling层的作用是将用户的历史行为embedding这个最终变成一个定长的向量,因为每个用户历史购买的商品数是不一样的,也就是每个用户multi-hot中1的个数不一致。这样经过embedding层,得到的用户历史行为embedding的个数不一样多,也就是上面的embedding列表不一样长,即每个用户的历史行为特征拼起来就不一样长了。而后面如果加全连接网络时,需要定长的特征输入。所以往往用一个pooling layer先把用户历史行为embedding变成固定长度(统一长度):
ei=pooling(ei1,ei2,...eik)e_i=pooling(e_{i1}, e_{i2}, ...e_{ik}) ei=pooling(ei1,ei2,...eik)
这里的eije_{ij}eij是用户历史行为的那些embedding。eie_iei就变成了定长的向量,这里的iii表示第iii个历史特征组(是历史行为,比如历史的商品id,历史的商品类别id等),这里的kkk表示对应历史特种组里面用户购买过的商品数量也就是历史embedding的数量,看上面图里面的user behaviors系列,就是那个过程了。

Concat layer层的作用就是拼接了,就是把这所有的特征embedding向量(如果再有连续特征的话也算上),从特征维度拼接整合,作为MLP的输入。

损失函数

这里是点击率预测任务(二分类的问题),所以这里的损失函数用的负的对数似然(交叉熵):
L=−1N∑(x,y)∈S(ylog⁡p(x)+(1−y)log⁡(1−p(x)))L=-\frac{1}{N} \sum_{(\boldsymbol{x}, y) \in \mathcal{S}}(y \log p(\boldsymbol{x})+(1-y) \log (1-p(\boldsymbol{x}))) L=N1(x,y)S(ylogp(x)+(1y)log(1p(x)))

base模型存在的问题 & 改进思路

存在的问题:

  1. 用户的历史行为特征和当前的候选广告特征在全都拼起来给神经网络之前,是一点交互的过程都没有;
  2. 拼起来之后给神经网络,虽然是有了交互了,但是原来的一些信息(比如每个历史商品的信息)会丢失一部分,因为与当前候选广告商品交互的是池化后的历史特征embedding;
  3. embedding是综合了所有的历史商品信息,但并不是所有历史商品都有用,综合所有的商品信息反而会增加一些噪声性的信息(可以联想上面举得那个键盘鼠标的例子,如果加上了各种洗面奶,衣服啥的反而会起到反作用);
  4. 这样把embedding综合起来,已经没法再看出到底用户历史行为中的哪个商品与当前商品比较相关,也就是丢失了历史行为中各个商品对当前预测的重要性程度;
  5. 如果所有用户浏览过的历史行为商品,最后都通过embedding和pooling转换成了固定长度的embedding,会限制模型学习用户的多样化兴趣。

改进思路:

  1. 加大embedding的维度,增加之前各个商品的表达能力,这样即使综合起来,embedding的表达能力也会加强, 能够蕴涵用户的兴趣信息,但是这个在大规模的真实推荐场景计算量超级大,不可取;
  2. 在当前候选广告和用户的历史行为之间引入注意力的机制,这样在预测当前广告是否点击的时候,让模型更关注于与当前广告相关的那些用户历史产品,也就是说与当前商品更加相关的历史行为更能促进用户的点击行为

第二个思路就是DIN的改进之法了。DIN通过注意与给定候选广告相关的局部兴趣来模拟此过程。 DIN不会通过使用同一向量来表达所有用户的不同兴趣,而是通过考虑历史行为的相关性来自适应地计算用户兴趣的表示向量(对于目标广告)。该表示向量随不同广告而变化。

DIN模型架构

在base模型的基础上加一个注意力机制local activation unit来学习用户兴趣与当前候选广告间的关联程度。具体来说,local activation unit用在了用户历史行为特征上面, 能够根据用户历史行为特征和当前广告的相关性给用户历史行为特征embedding进行加权

改进的地方已经框出来了,这里会发现相比于base model, 这里加了一个local activation unit. 里面是一个前馈神经网络,输入是用户历史行为商品和当前的候选商品,输出是它俩之间的相关性,这个相关性相当于每个历史商品的权重,把这个权重与原来的历史行为embedding相乘求和就得到了用户的兴趣表示vU(A)\boldsymbol{v}_{U}(A)vU(A),计算公式如下:
vU(A)=f(vA,e1,e2,…,eH)=∑j=1Ha(ej,vA)ej=∑j=1Hwjej\boldsymbol{v}_{U}(A)=f\left(\boldsymbol{v}_{A}, \boldsymbol{e}_{1}, \boldsymbol{e}_{2}, \ldots, \boldsymbol{e}_{H}\right)=\sum_{j=1}^{H} a\left(\boldsymbol{e}_{j}, \boldsymbol{v}_{A}\right) \boldsymbol{e}_{j}=\sum_{j=1}^{H} \boldsymbol{w}_{j} \boldsymbol{e}_{j}vU(A)=f(vA,e1,e2,,eH)=j=1Ha(ej,vA)ej=j=1Hwjej

这里的{vA,e1,e2,…,eH}\{\boldsymbol{v}_{A}, \boldsymbol{e}_{1}, \boldsymbol{e}_{2}, \ldots, \boldsymbol{e}_{H}\}{vA,e1,e2,,eH}是用户UUU的历史行为特征embedding,vAv_{A}vA表示的是候选广告AAA的embedding向量,a(ej,vA)=wja(e_j, v_A)=w_ja(ej,vA)=wj表示的权重或者历史行为商品与当前广告AAA的相关性程度。a(⋅)a(\cdot)a()表示的上面那个前馈神经网络,也就是注意力机制,当然看图里的话,输入除了历史行为向量和候选广告向量外,还加了一个它俩的外积操作,论文原作者说这里是有利于模型相关性建模的显性知识。

注意:这里的权重加和不是1,准确的说这里不是权重,而是直接算的相关性的分数作为了权重,也就是平时的那种scores(softmax之前的那个值),这个是为了保留用户的兴趣强度。

DIN实现上的细节

这个教程中采用的数据集是movielens数据集。在这个数据集中会有用户过去对电影评分的一系列行为。需要说明的是这种历史行为是序列性质的特征,并且不同的用户这种历史行为特征长度会不一样,但是我们的神经网络是要求序列等长的,所以这种情况我们一般会按照最长的序列进行padding的操作(不够长的填0)。具体进行运算的时候,会用mask掩码的方式标记出这些填充的位置,好保证计算的准确性。

DIN模型的输入特征大致上分为了三类: Dense(连续型), Sparse(离散型), VarlenSparse(变长离散型),不同类型的特征处理方式不同:

  • Dense型特征:

    • 由于是数值型了,这里为每个这样的特征建立Input层接收这种输入;
    • 拼接起来先放着,等离散的那边处理好之后,和离散的拼接起来进DNN;
  • Sparse型特征:
    • 为离散型特征建立Input层接收输入;
    • 需要先通过embedding层转成低维稠密向量,然后拼接起来放着,等变长离散那边处理好之后,一块拼起来进DNN;
    • 但是这里面要注意有个特征的embedding向量还得拿出来用,就是候选商品的embedding向量,这个还得和后面的计算相关性,对历史行为序列加权;
  • VarlenSparse型特征(这个一般指的用户的历史行为特征,变长数据):
    • 进行padding操作成等长;
    • 建立Input层接收输入;
    • 通过embedding层得到各自历史行为的embedding向量;
    • 拿着这些向量与上面的候选商品embedding向量进入Attention Pooling Layer去对这些历史行为特征加权合并,最后得到输出;

通过上面的三种处理, 就得到了处理好的连续特征,离散特征和变长离散特征, 接下来把这三种特征拼接,进DNN网络,得到最后的输出结果即可。

深度推荐模型 - DIN相关推荐

  1. 深度推荐模型-DIN

    DIN 1.背景     Deep Interest Network(DIIN)是2018年阿里巴巴提出来的模型,该模型基于业务的观察,从实际应用的角度进行改进,相比于之前很多"学术风&qu ...

  2. 深度学习推荐模型-DIN

    深度学习推荐模型-DIN 本文参考链接,仅供个人学习: https://github.com/datawhalechina/team-learning-rs/tree/master/DeepRecom ...

  3. 【组队学习】【23期】Datawhale深度推荐模型

    深度推荐模型 开源内容:https://github.com/datawhalechina/team-learning-rs/tree/master/DeepRecommendationModel 基 ...

  4. 谷歌引入自动网络设计,高效解决大规模深度推荐模型的特征嵌入问题

    来源 | 深度传送门(ID:gh_5faae7b50fc5) 导读:本文主要介绍Google在大规模深度推荐模型上关于特征嵌入的最新论文. 一.背景 大部分的深度学习模型主要包含如下的两大模块:输入模 ...

  5. Google最新论文:大规模深度推荐模型的特征嵌入问题有解了!

    转载自深度传送门(ID: gh_5faae7b50fc5) 导读:本文主要介绍下Google在大规模深度推荐模型上关于特征嵌入的最新论文. 一.背景 大部分的深度学习模型主要包含如下的两大模块:输入模 ...

  6. 深度推荐模型(EDRMs):面向Web级应用的基于二进制码的Hash Embedding

    猜你喜欢 0.如果你想参与进元宇宙,究竟应该采取怎样的策略?1.如何搭建一套个性化推荐系统?2.从零开始搭建创业公司后台技术栈3.全民K歌推荐系统架构.算法及后台设计4.微博推荐算法实践与机器学习平台 ...

  7. 手搭深度推荐模型(四) NFM

    本文是笔者参与datawhale组织的深度推荐模型组队学习的分享,学习内容见本链接 ,本文中所指的教程即该链接中的相应文件. 一.概念 为了在稀疏条件下有更好的预测性能,2017年何向南教授等人在SI ...

  8. 深度推荐模型之NFM模型

    NFM 背景 今天学习深度推荐模型中的NFM(Neural Factorization Machines)模型,该模型是由2017年在SIGIR会议上提出的.CTR预估中,为了解决稀疏特征的问题,学者 ...

  9. RS笔记:深度推荐模型之多任务学习PLE模型 [RecSys 2020 最佳论文 腾讯]

    RS笔记:深度推荐模型之多任务学习ESMM模型(多目标优化模型,同时优化CTR和CVR) [SIGIR 2018 阿里妈妈] RS笔记:深度推荐模型之多任务学习MMoE模型 [KDD 2018 谷歌] ...

最新文章

  1. 【廖雪峰python入门笔记】break和continue
  2. 为什么铝基板无线接受电路板将信号源烧了?
  3. eureka 集群失败的原因_Eureka集群的那些坑
  4. 两篇 Spring 总结(一)
  5. 450g带盖吐司配方_食谱 | 直接法北海道吐司,一起get柔软的秘密!
  6. js使用const的好处_let和const命令
  7. 设置mysql表名不区分大小写
  8. 6 年成为 AIoT 独角兽,这位 17 年连续创业者是如何做到的?
  9. ReentrantLock可重入锁的使用
  10. (转)cocos2d-x学习笔记(五)仿真树叶飘落效果的实现(精灵旋转、翻转、钟摆运动等综合运用)
  11. java手机 最新版本_JAVA手机模拟器安卓版
  12. HDU 4889 Scary Path Finding Algorithm
  13. (五十七)方差分析与相关分析
  14. 要了命了,我亲自包了20000个红包送你
  15. 【TextView】Android TextView显示省略号的问题(关于TextView maxLength 和maxEms的学习)
  16. QPainterPath
  17. JavaScript 当前时间显示(js)
  18. 彻底搞懂equals以及hashCode方法(源码级分析)
  19. 2006年最受瞩目的七大IT技术(1)
  20. IP地址转化(学习笔记)

热门文章

  1. Scrapy图片下载,自定义图片名字
  2. 2019应届生平均月薪6000左右!
  3. 成功将log4cpp升级到了vs2005版本,总结下编译时报错及相应的解决方法
  4. epoll EPOLLOUT事件未触发
  5. STM32基于正点原子ALIENTEK探索者开发板的跑马灯实验
  6. win10 Easy Sysprep 5.19封装失败
  7. android app底部菜单栏,材料设计指南·组件篇(一):AppBars: Bottom 底部栏
  8. 12月5日:thinkphp模板
  9. Java并发编程笔记(1)基础知识
  10. dp和sp的区别 以及字体