论文原文:
论文:《Behavior Sequence Transformer for E-commerce Recommendation in Alibaba》
地址:https://arxiv.org/pdf/1905.06874.pdf
一 、背景
深度学习已经大规模用到推荐系统中了,先前的工作主要是运用embedding技术和MLPs,这种方法将原始特征映射成低维的embedding向量并把它送到MLPs进行推荐任务。但是这些之前的方法只是将不同的特征组合到一起,并没有考虑到用户的点击序列,比如DeepFM,wide&deep这样的模型,我们知道,用户的点击序列下面往往隐藏着用户的兴趣,忽视这个信息会损失很多兴趣信息。因此,阿里巴巴提出了用Transformer对用户的点击序列进行建模并进行推荐。
在阿里的推荐系统中也是分为match跟rank阶段,即召回和排序两个阶段,召回阶段选取用户可能该兴趣的候选集,在排序阶段运用精确的模型进行排序并展示给用户。
阿里巴巴之前采用的排序模型是wide&deep(WDL)和DIN模型,我们在WDL之上构建排序模型,在Embedding和MLP中使用了各种特征,例如,商品的类别和品牌,商品的统计数据或用户个人资料特征。尽管该框架取得了成功,但由于它实际上忽略了一种非常重要的信号类型,即用户行为序列(即用户的点击物品顺序)背后的顺序信号,因此它本质上并不能令人满意的。
实际上,顺序对于预测用户的未来点击至关重要。例如,用户在淘宝网购买了iphone后倾向于点击手机的外壳,或者在购买一条裤子后试图找到合适的鞋子。从这个意义上讲,在淘宝网的排名阶段部署预测模型时,如果不考虑这一因素,就会出现问题。
DIN考虑了用户的行为序列信息,模型使用注意力机制来捕获目标商品与用户先前行为序列中商品之间的相似性,但未考虑用户行为序列背后的序列性质。
基于以上的种种考虑,阿里提出了用Transformer来对用户的点击序列进行建模,并在精排的任务中取得了很好的推荐效果。
二、Transformer结构
在介绍这篇论文之前,先完整的介绍一下Transformer结构吧
和大多数seq2seq模型一样,transformer的结构也是由encoder和decoder组成,我们先介绍encoder结构和decoder结构,最后重点讲一下输入的结构。
2.1 Encoder
Encoder由N=6个相同的layer组成,layer指的就是上图左侧的单元,最左边有个“Nx”,这里是x6个。每个Layer由两个sub-layer组成,分别是multi-head self-attention mechanism和fully connected feed-forward network。其中每个sub-layer都加了residual connection和normalization,因此可以将sub-layer的输出表示为:
接下来按顺序解释一下这两个sub-layer:
2.1.1 sub-layer 1
Multi-head self-attention
熟悉attention原理的都知道,attention可由以下形式表示:
multi-head attention则是通过h个不同的线性变换对Q,K,V进行投影,最后将不同的attention结果拼接起来:
这里可以用一张图形象的说明:
也就是上面的公式中的QKV其实都是X,只是写成了QKV,不同的是W矩阵,将输入X分别乘以不同的矩阵分别得到QKV。
而Attention则采用了scale dot-product方法:
Attention的计算过程可以用下面的图来形象的表示:
这里Z就是attention(Q, K, V)。
(1) 其中为/ h,是输入层Embedding的维度大小
(2) 为什么要用对 进行缩放呢?
𝑑𝑘实际上是Q/K/V的最后一个维度,当𝑑𝑘越大,就越大,可能会将softmax函数推入梯度极小的区域。
2.1.2 sub-layer 2
Add & Norm
x 序列经过multi-head-self-attention 之后实际经过一个“add+norm”层,再进入feed-forward network(后面简称FFN),在FFN之后又经过一个norm再输入下一个encoder layer。
Position-wise feed-forward networks
这层主要是提供非线性变换。Attention输出的维度是[bsz*seq_len, num_heads*head_size],第二个sub-layer是个全连接层,之所以是position-wise是因为过线性层时每个位置i的变换参数是一样的。
Feed-Forward Network可以细分为有两层,第一层是一个线性激活函数,第二层是激活函数是ReLU.
2.1.3 encoder总结
总的来说Encoder 是由上述小encoder layer 6个串行叠加组成。encoder sub layer主要包含两个部分:
SubLayer-1 做 Multi-Headed Attention
SubLayer-2 做 Feed Forward Neural Network
2.2 Decoder
Decoder和Encoder的结构差不多,但是多了一个attention的sub-layer,这里先明确一下decoder的输入输出和解码过程:
输出:对应i位置的输出词的概率分布
输入:encoder的输出 & 对应i-1位置decoder的输出。所以中间的attention不是self-attention,它的K,V来自encoder,Q来自上一位置decoder的输出
解码:这里要特别注意一下,编码可以并行计算,一次性全部encoding出来,但解码不是一次把所有序列解出来的,而是像rnn一样一个一个解出来的,因为要用上一个位置的输入当作attention的query
明确了解码过程之后最上面的图就很好懂了,这里主要的不同就是新加的另外要说一下新加的attention多加了一个mask,因为训练时的output都是ground truth,这样可以确保预测第i个位置时不会接触到未来的信息:
可以看到,Mask 的目的是防止 Decoder “seeing the future”,就像防止考生偷看考试答案一样。这里mask是一个下三角矩阵,对角线以及对角线左下都是1,其余都是0。
2.3 input
transformer的输入是Word Embedding + Position Embedding。
2.3.1 Word Embedding
这个没什么好说的,就是简单的进行embedding
2.3.2 Position Embedding
在RNN中,对句子的处理是一个个word按顺序输入的。但在 Transformer 中,输入句子的所有word是同时处理的,没有考虑词的排序和位置信息。因此,Transformer 的作者提出了加入 “positional encoding” 的方法来解决这个问题。“positional encoding“”使得 Transformer 可以衡量 word 位置有关的信息。
如何实现具有位置信息的encoding呢?作者提供了两种思路:
通过训练学习 positional encoding 向量;
使用公式来计算 positional encoding向量。
试验后发现两种选择的结果是相似的,所以采用了第2种方法,优点是不需要训练参数,而且即使在训练集中没有出现过的句子长度上也能用。
Positional Encoding的公式如下:
其中,pos指的是这个 word 在这个句子中的位置;2i指的是 embedding 词向量的偶数维度,2i+1指的是embedding 词向量的奇数维度。
三 、BST模型结构
看到这个模型是不是很熟悉?跟我们之前介绍的DIN(https://www.jianshu.com/writer#/notebooks/41708179/notes/67109487)是不是很像?
DIN模型:
3.1 其他特征的处理
可以看到BST跟DIN整体的结构很像,主要体现在除了用户的系列特征处理不一样意外,其他特征的处理方式是一样的,只是在BST中我们用other feature来表示来,实际上这些feature跟DIN中的特征是一样的:
我们用item_id 和 category_id来表示item本身的特征,可以看到不管是在target item还是sequence item中都是用item_id 和 category_id构成。
其他特征的处理方式跟DIN中一样,举个例子,比如Context特征,就是将match_type,display position等特征分别取embedding,然后concat。BST跟DIN有一个不同的地方是,other feature中不同的特征是进行sum操作的,而不是跟DIN一样concat在一起,从图中也是可以看出来的。
3.2 Position Embedding
在前面我们提到了PE的计算方式,在原始的Transformer中是根据position信息来构建的,正如我们上面介绍transformer中所述。但是由于业务的需要,阿里巴巴团队在这里进行的创新,可能这也是这篇论文能work的原因吧,下面说一下PE的构建过程。
其中pos(vi)表示vi这个位置的pos-value, t(vt)表示要进行推荐的时间,t(vi)表示用户点击的时间,这里每个位置的value都得到了一个连续特征,怎么把连续的时间特征转化为离散特征呢?文中没说,但是估计是分桶离散化,或者是用这个value去乘一个PE向量。
有了PE后,我们就得到了transformer层的输入了,也就是PE+Sequence Item feature Embedding
3.3 模型的输出和损失函数
transformer结构大体跟我们上面介绍的模型一样,有个不同的地方就是在BST的Transformer的FFN中,激活函数从relu改成了leakyRelu。
模型的输出部分还是一个MLP,这个MLP的输入是将other feature得到的vector和transformer得到的vector concat,后面依然就进行sigmoid进行二分类:
四 、实验结果
b代表transformer的encoder中的sub-layer数,也就是多少个block,这里只用到了encoder部分,因为不是seq2seq的任务,所以只用了encoder就够了。
看上面的实验结果,其实在离线的任务中,这几个模型相差不大,但是在online中,BST的效果是好过WDL和DIN的。
网友评论