BST: Behavior Sequence Transfor
用户历史行为中包含了丰富的信息,是刻画用户心智的重点特征。在推荐广告领域,如何挖掘用户行为序列中的有效信息是CTR预估等任务的重点。笔者在上一篇文章中介绍了DIN(Deep Interest Network),其抓住了用户行为序列与目标广告/商品之间的关系。在这篇文章中将介绍阿里团队的另外一项重要的工作:BST(Behavior Sequence Transformer) ,将NLP中的transformer模型运用到了CTR预估中,更好地挖掘用户行为序列内部的时序关系。
文章地址:Behavior Sequence Transformer for E-commerce Recommendation in Alibaba
Transformer论文地址:Attention Is All You Need,想对transformer有详细了解的同学们可以参考
transformer的tensorflow代码可以参考tf官方的github:地址
我自己试了一下,简洁直观,容易实现。
1. BST网络简介
BST的网络结构如下图所示:
1.1 核心思想
WDL 和 DIN没有考虑到用户序列的时序性,即用户序列中不同商品间的关系。本论文使用了transformer的结构,来捕捉这种关系。
1.2 输入特征
网络的输入特征有两部分:用户行为序列(User Behavior Sequence)和其他特征(user, item, context, cross等)。其中用户序列中的每一个item有两部分组成:sequence item feature 和positional feature,如图1所示。这里的用户序列也包含了target item及其position,见图1的右下角。
- sequence item feature:使用item_id和category_id
- positional feature: 用户序列中商品的位置信息,目的是为用户序列引入时序信息。商品的位置特征计算如下:
即商品的点击时间与当前target item 的推荐时间之间的gap。这里加入的position feature相当于<<attention is all you need>>里的postitional encoding,只是本论文中没有使用sin/cos的编码方法,而是更直接地将postional feature与item feature进行了concat.
1.3 transformer layer
-
transformer layer主要实现了<<attention is all you need>>里的multi-head self attention + Point-wised FFN 结构(即encoder结构)
-
multi-head self attention:
其中即Query, Key 和Value,是同一个item与不同的权值矩阵相乘得到,权值矩阵为可学习参数;为embedding size。此处的attention抽象为对Value中的每个item进行加权,而加权所用到的weight就是式(3)所计算得到的,即用Query和Key来决定注意力应该放到value中的哪个item上。Query之所以叫query(查询),是因为每次都用一个embedding vector去查询其与其他的embedding vector的match程度。一共要做n轮这种操作,n为1个batch中的序列个数。multi-head:将Q, K 和V在embedding size维度上投影h次,分别进行学习,最后concat起来作为attention的最终输出。使用multi head是为了使模型能够自适应地学到不同子空间下的序列信息。这里与CNN的feature map思想有些类似,使用相同形状的多个feature map,以期待模型能够自动学习到不同子空间下的特征。
注:这里论文的公式写法有些混乱,我的理解就是把分成了h等份(源码中使用的是tf.split()
函数),分别做公式(2)中的变换,再concat起来。详细分析见后面的图解。 -
Point-Wised Feed-Forward Networks(FFN)
FFN中应用了normalization和residual blocks。self attention和FFN中都应用了dropout和LeakyReLU来避免过拟合。 -
叠加多层self attention和FFN模块:
叠加多层模块是为了模型能够更好地学习序列间的复杂关系。但论文的实验中证明时的效果最好。
2. self attention过程详解
图2 self attention 图3 multi-head self attention在图2中, 首先经过embedding得到向量, 其中为序列长度,为embedding size. 然后与3个相同形状的权重矩阵点乘,将自身映射为3个不同的矩阵。接下来这三个矩阵会完成self attention的基本操作,即式(2)。与得到的attention score 作为权重,与点乘,作为self attention的输出。
图3在图2的基础上加入了multi head 操作,即将在embedding size 的维度拆分为个矩阵(图中h=3),分别进行self attention 操作,得到的结果再concat起来作为最终的输出。
参考文献:
[1] multi-head attention
[2] 推荐系统遇上深度学习(四十八)-BST:将Transformer用于淘宝电商推荐
[3] 论文笔记:Attention is all you need