序列建模(九):DIN、ATRank、DUPN、DIEN、BER
主要参考17、18、19年的几篇论文:
发表年月 | 论文链接 | 参考文文大神的简书链接 |
---|---|---|
1706.06978 | DIN | link |
1711.06632 | ATRank | link |
1805.10727 | DUPN | link |
1808.06414 | Next Item | link |
1809.03672 | DIEN | link |
1904.06690 | Bert4Rec | link |
1905.06482 | DSIN | link |
1905.06874 | BST | link |
-1- 推荐精排Base Model
-1.1- 匹配阶段和精排阶段
推荐系统总体上分为匹配阶段
和精排阶段
:
*
匹配阶段,可以看阿里针对十亿级商品的embedding方案,本文不再概述;
*
精排阶段,一些经典、主流的模型有:Wide & Deep
、DIN
点击率预估在电商、在线广告这些业界领域是一项非常基础的任务。目前在该领域,基于Deep Learning的模型已经得到广泛的应用。通常这些深度模型都是以
Embedding & MLP
这样的范式架构的。在这种架构下,大规模稀疏特征首先映射到低维的Embedding Vector,然后这些Vector以Feature组的方式转化(pooling)成一个固定长度的Vector,最后将这些Vector进行Concatenate成一个Vector,输入到MLP(Multi-Layer Perceptron)来学习特征间的非线性关系,得到最终的点击概率。
-1.2-Base Model的模型结构
现在,我们先看一下在这个过程中用到的基准模型:
Base Model
这里element-wise的意思就是元素级别的算术操作,例如:两个向量进行element-wise的加操作时,要求两个向量长度相同,逐位元素相加,加得的结果也是同长度的向量。需要注意的是,当一个标量和一个向量element-wise相乘的时候,相当于是以广播的形式将这个标量逐位乘到向量的各个元素上去。
Base Model中:
*
首先是Embedding层
先把id类的特征转换成embedding-vector的形式,其中:
对于one-hot的ID类特征就直接做embedding操作;
对于multi-hot的ID类特征,在embedding之后,还需要再做一步element-wise +的操作,其实就是sum-pooling,当然也可以选择average-pooling、max-pooling、简单随时间衰减的weighted-sum-pooling这些其他可选的pooling方式。这样一来,不管每条样本中该multi-hot特征中有多少个非0值,经过pooling之后的vector长度都是一样的。
*
然后是Concatenate操作
对embedding-vector进行concatenate操作
*
然后是MLP(Multi-Layer Perceptron)
经过Embedding和Concatenate操作之后,得到特定长度的embedding;将这个特定长度的embedding-vector作为输入,经过一个DNN的part,得到最终的CTR估值。
-1.3-Base Model的问题
经过上面的描述可以看出,Base Model在对用户历史Behavior进行特征处理时,
对Multi-Hot的ID类特征,在Embedding之后,只是简单的pooling操作
*
忽略了目标item与用户先前历史行为序列各item之间的相关性,导致模型无法从用户丰富的历史行为中捕捉用户多样的兴趣
事实是在一个用户浏览购买的过程中:
兴趣是多样的:
比如一个女性用户喜欢买女装,也喜欢化妆品,还可能同时还喜欢母婴用品,那么该女性用户在购买大衣的时候,要把对母婴用品的偏好考虑进来么?所以在对指定item预估CTR的时候,不能只是对历史Behavior进行简单pooling。
*
忽略了用户历史行为各个item背后的在时序性
兴趣是流转的、进化的:
比如
-2- DIN(Deep Interest Network)
-2.1- DIN的Motivation
显然,当考虑用户在目标item上的CTR概率时,不能对用户历史行为中包含的的各个item进行简单pooling。需要对用户的历史行为进行一个加权操作,阿里提出了深度兴趣网络(Deep Interest Network),这里引入Attention机制来计算历史行为中每个item上的权重。
在DIN中,通过设计一个
Local Activation Unit
来应对用户兴趣的多样性,Local Activation Unit
会针对指定的目标item自适应地从用户历史行为中学习用户的兴趣vector。这样,同一用户在不同目标item上计算得到的vector也各不相同,这大大增加了模型的表现力。
-2.2- DIN的模型结构
现在,我们先看一下DIN的模型结构:
DIN
DIN在Base Model的基础上,引入了Activation Unit
来计算目标item和用户历史行为中各item之间的Attention Weight。然后在Sum-Pooling的时候,对各个Embedding-Vector进行有Attention-Weight的加权求和操作。
在加入Activation Unit
之后,用户的兴趣表示计算如下:
其中:
*
N是一条样本中,用户历史行为序列里item的个数
*
是待训练的Activation Unit
,用来计算目标item和历史行为中各item的Attention Weight
*
表示的Emb_Vec,这里是一个item的good_id、shop_id等的Concat
*
是候选item的Emb_Vec
*
是Activation Unit
计算得到的目标item和历史行为中item的Attention Weight
*
最终计算得到的是所有的Emb_Vec的加权和,代表用户针对当前目标item的兴趣向量
-2.3-DIN中的Activation Unit
以上,我们知道待学习的Activation Unit
可以计算目标item和历史行为中各item的Attention-Weight,那在DIN中,Attention-Weight到底是如何计算的呢?
传统的Attention机制中,给定目标item和历史行为item的emb_vec,如、,通常计算它们Attention Weight的方式是:
直接做点积
或者,其中是一个宽高为的权重矩阵
但是在DIN的paper中,阿里做了更进一步的改进:
image.png
着重看上图右上角的activation unit,
*
首先是把u
、v
、u v的element wise差值向量
concat起来作为输入
*
然后fed给全连接层
*
最后得出权重
这样的方法显然损失的信息更少。
但如果你自己想方便的引入attention机制的话,不妨先从点积的方法做起尝试一下,
因为这样根本都不用训练Activation Unit
-2.4-DIN的一些其他细节改进
*2.4.1 Mini-Batch Aware Regularization -- 自适应正则 Adaptive Regularization
CTR中输入稀疏而且维度高,通常的做法是加入L1、L2、Dropout等防止过拟合。但是论文中尝试后效果都不是很好。用户数据符合长尾定律long-tail law,也就是说很多的feature id只出现了几次,而一小部分feature id出现很多次。这在训练过程中增加了很多噪声,并且加重了过拟合。
对于这个问题一个简单的处理办法就是:直接去掉出现次数比较少的feature id。但是这样就人为的丢掉了一些信息,导致模型更加容易过拟合,同时阈值的设定作为一个新的超参数,也是需要大量的实验来选择的。
因此,阿里提出了自适应正则的做法,即:
1.针对feature id出现的频率,来自适应的调整他们正则化的强度;
2.对于出现频率高的,给与较小的正则化强度;
3.对于出现频率低的,给予较大的正则化强度。
计算公式如下:
image.png
*2.4.2 Data-Adaptive Activation Function -- Dice激活函数
Relu
→ PRelu
→ Dice
PRelu
Dice激活函数的全称是Data Dependent Activation Function,形式如下:
Dice
*2.4.3 评价指标GAUC
将每个用户的AUC分开计算,
再根据用户的展示数或者点击数来对每个用户的AUC进行加权处理。
消除了用户本身的偏差对模型的影响
-2.5-DIN的业务效果展示
image.png可以看到,对于候选的广告是一件衣服的时候,用户历史行为中跟衣服相关的权重较高,而非衣服的部分,权重较低。
-2.6-DIN的问题
DIN虽然考虑到了目标item与用户先前历史行为序列各item之间的相关性,但是它
*
忽略了用户历史行为各个item背后的在时序性
-3- BST(Behavior Sequence Transformer)
-3.1- BST的Motivation
上面说到DIN虽然考虑到了目标item与用户先前历史行为序列各item之间的相关性,但是它忽略了用户历史行为各个item背后的在时序性。BST尝试将NLP领域中大放异彩的Transformer模型引入来做推荐任务。
在
RSs(Recommendation Systems)
领域中,基于Deep Learning的方法已经得到了广泛的应用。
之前的工作中普遍采用Embedding & MLP
这样的范式架构:raw的feature首先embedding到低维的emb_vec,然后fed到MLP中得到最终用于推荐的点击概率值。
然而在这些工作中,历史行为中不同item对应的emb_vec只是简单地pooling、concat,而忽略了用户行为背后的时序性。
在本篇BST论文中,我们提出将NLP领域中大放异彩的强大的Transformer应用到模型中,来捕获用户行为序列后的时序信息。
-3.2- BST的模型结构
现在,我们先看一下BST的模型结构:
BST
*3.2.1 other features
other features
由用户特征
、商品特征
、上下文特征
、交叉特征
4部分特征的emb_vec进行concat得到。
特征示例如下:
这里的交叉特征,有部分是基于业务经验提取出的,并非完全通过网络学习得到。
特征通过Embedding Layer来转换为对应的embedding。
*3.2.2 行为序列 & 目标商品feature【Positional Encoding】
行为序列中每一个商品item以及目标商品item通过两部分来表示:
序列item 特征
:红色部分,由item_id 和 category_id的emb_vec进行concat得到
位置特征
:深蓝色部分,
在《Attention is all you need》论文中,作者提出了一种Positional Encoding来捕获句子中的顺序信息。 在进行位置编码时使用的是和函数。
同样,用户的行为序列也是一种时间序列数据。因此,在将历史行为的时序信息构造成低维向量之前,在bottom layer 添加“position”作为每个 item 的输入特征,第i个位置的position value计算方式为:
其中,
*
表示推荐时的时间戳
*
表示用户历史上点击商品时的时间戳
然后再将position value投射为低维向量
至于如何将一个时间戳转化为低维向量,论文里也没有明确说明,可能是进行离散化后转化为embedding吧...
ATRank中行为三元组(a,o,t)中的t,是行为发生时的时间戳,
对时间t的编码时,首先会计算与当前时间的一个时间间隔,但此时仍然是一个连续变量,不好将其转换为embedding表示。
这里文中提到了一种离散化的表示方法,将时间间隔按照如下的区间进行离散化:
image.png
得到position embedding之后:
BST通过item embedding
拼接
position embedding的形式引入时序信息(Transformer原文中使用相加
,而非拼接)
作者实验证明,采用这种方式的效果优于原论文中使用的 和 函数。
*3.2.3 Transformer Layer
Transformer Layer结构上没有做什么优化,基本上和《Attention is all you need》中的Encoder-Block
结构一样。
在这一部分,Transformer Layer通过捕获用户的历史行为序列中每一个item和序列中其他item s之间的relation,来学习计算该item的深层表征(deeper representation)。
*3.2.3.1 Multi-Head Attention
*
h是heads个数
*
E是所有item的Embedding Matrices
*
是上的加权求和
⚠️注意⚠️
模型中设定了序列长度!
对于seq长度,个人理解20对于线上来说恰是比较合理的长度(DIEN用的50;所以20~50即可)。从两个方面来理解:
*在线推理耗时:模型复杂度随着seq长度的增加而显著增加,这个在模型设计上是必须要考虑的现实问题,一般情况下,留给CTR服务的耗时在50ms内,多数会更短;
*特征的侧重点:我理解这样的做法更多还是建模用户短期兴趣,而长期兴趣多数是在用户画像侧已经做好了,所以长序列也显得没那么必要了
其中:
*
计算得到的是上的加权求和
*3.2.3.2 Feed-Forward Networks
其中:
*
是Feed-Forward Networks,前馈神经网络
*
是
*
计算得到的,
*3.2.3.3 Dropout & LeakyReLU
*3.2.3.4 Stacking Blocks
所做的改进主要在于,在Block中Feed Forward时,激活函数使用的是leakyRelu,如下图所示:
leakyRelu
经过上面的Positional Encoding
、transformer
两步,得到的输出中已经有序列信息在里面了:
首先我们把时间戳信息作为位置特征进行了输入,
其次,transformer本身也类似于一个双向的循环神经网络
文文:(我个人感觉是这样的,masked-self attention相当于单向的rnn,不加mask相当于双向的rnn)。
* MLP Layer
接下来,将所有的embedding进行拼接,输入到三层的神经网络中,并最终通过sigmoid函数转换为0-1之间的值,代表用户点击目标商品的概率。
模型通过logloss进行训练:
-3.3-BST的实验结果及展示
* 3.3.1 对比试验
* 3.3.2 Transformer中block层数试验