推荐系统中的常用算法——行为序列Transformer(BST)

推荐系统中的常用算法——行为序列Transformer(BST)

1. 概述

Behavior Sequence Transformer(BST)算法是由阿里在2019年提出的算法,应用于淘宝推荐中的ranking阶段。在目前的推荐系统中,主流的深度学习方案,如WDL,并没有充分利用用户的行为序列(User’s Behavior Sequence),在BST算法中,利用Transformer充分挖掘用户的行为序列,实现对用户行为序列的建模。

2. 算法原理

BST算法的模型结构如下图所示:

www.zeeklog.com  - 推荐系统中的常用算法——行为序列Transformer(BST)


在BST模型结构中,主要包括了三个部分:第一,特征的embedding层;第二,用户行为序列的Transformer层;第三,最终的MLP层。

2.1. Embedding层

Embedding层的结构如下所示:

www.zeeklog.com  - 推荐系统中的常用算法——行为序列Transformer(BST)

从上图可以看出,在特征的Embedding层,主要包括三个部分:第一,其他的特征,主要包括用户画像特征,item特征,上下文特征以及交叉特征;第二,用户行为序列特征;第三,目标item的特征。

2.1.1. 其他特征

在其他特征部分,主要包括了用户画像特征,item特征,上下文特征以及交叉特征,具体特征形式在论文中也给出,如下所示:

www.zeeklog.com  - 推荐系统中的常用算法——行为序列Transformer(BST)


将这些特征的embedding向量concat在一起,得到对应的embedding形式。

2.1.2. 用户行为序列和目标item

假设用户 u u u的行为序列为 S ( u ) = { v 1 , v 2 , ⋯ , v n } S\left ( u \right )=\left \{ v_1,v_2,\cdots ,v_n \right \} S(u)={v1​,v2​,⋯,vn​},同时还包括目标item  v t v_t vt​。对于每一个item(包括行为序列中的item以及目标item),包括两种类别的特征:第一,item的特征,如图中的红色部分;第二,位置特征,如图中的蓝色部分。对于item的特征,文章中指出使用的是item_id和category_id。为了使用Transformer刻画序列的特征,因此需要位置的特征,位置特征的计算方式为:

p o s ( v i ) = t ( v t ) − t ( v i ) pos\left ( v_i \right )=t\left ( v_t \right )-t\left ( v_i \right ) pos(vi​)=t(vt​)−t(vi​)

其中, t ( v i ) t\left ( v_i \right ) t(vi​)表示item  v i v_i vi​被点击的时间戳。

将item特征和位置特征concat在一起,得到对应item的embedding表示。

2.2. Transformer层

在Transformer层中使用Multi-Head Attention来学习目标item与用户行为序列中的item之间的相关关系。完整的Transformer指的是基于Attention机制的经典Encoder-Decoder框架,Transformer的框架结构如下图所示:

www.zeeklog.com  - 推荐系统中的常用算法——行为序列Transformer(BST)


而在BST模型中,使用的是多个Multi-Head Attention结构,即Transformer的Encoding部分。Multi-Head Attention和Scaled Dot-Product Attention结构如下图所示:

www.zeeklog.com  - 推荐系统中的常用算法——行为序列Transformer(BST)


其中,Scaled Dot-Product Attention的值为:

A t t e n t i o n ( Q , K , V ) = s o f t m a x ( Q K T d ) V Attention\left ( \mathbf{Q},\mathbf{K},\mathbf{V} \right )=softmax\left ( \frac{\mathbf{Q}\mathbf{K}^T}{\sqrt{d}} \right )\mathbf{V} Attention(Q,K,V)=softmax(d   ​QKT​)V

其中, Q \mathbf{Q} Q表示的是查询, K \mathbf{K} K和 V \mathbf{V} V分别表示的是键和值,在BST中,  Q \mathbf{Q} Q, K \mathbf{K} K, V \mathbf{V} V由用户行为序列和目标item的embedding的线性映射得到。

通过将Scaled Dot-Product Attention的结果concat在一起并通过线性变换得到最终的Multi-Head Attention结果:

S = C o n c a t ( h e a d 1 , h e a d 2 , ⋯ , h e a d h ) W H \mathbf{S}=Concat\left ( head_1,head_2,\cdots ,head_h \right )\mathbf{W}^H S=Concat(head1​,head2​,⋯,headh​)WH

其中, h e a d i = A t t e n t i o n ( E W Q , E W K , E W V ) head_i=Attention\left ( \mathbf{EW}^Q,\mathbf{EW}^K,\mathbf{EW}^V \right ) headi​=Attention(EWQ,EWK,EWV)。除了上述的Multi-Head Attention部分,在Transformer的Encoding部分,还包括了Point-wise Feed-Forward Networks(FFN)部分,FFN的目的是增加模型的非线性。为了防止模型的过拟合,在self-attention和FFN中都使用dropout和LeakyReLU,最终的self-attention和FFN为:

S ′ = L a y e r N o r m ( S + D r o p o u t ( M H ( S ) ) ) {\mathbf{S}}'=LayerNorm\left ( \mathbf{S}+Dropout\left ( MH\left ( \mathbf{S} \right ) \right ) \right ) S′=LayerNorm(S+Dropout(MH(S)))

F = L a y e r N o r m ( S ′ + D r o p o u t ( L e a k y R e L U ( S ′ W ( 1 ) + b ( 1 ) ) W ( 2 ) + b ( 2 ) ) ) \mathbf{F}=LayerNorm\left ( {\mathbf{S}}'+Dropout\left ( LeakyReLU\left ( {\mathbf{S}}'\mathbf{W}^{\left ( 1 \right )}+b^{\left ( 1 \right )} \right )\mathbf{W}^{\left ( 2 \right )}+b^{\left ( 2 \right )} \right ) \right ) F=LayerNorm(S′+Dropout(LeakyReLU(S′W(1)+b(1))W(2)+b(2)))

通过堆叠多个上述的self-attention block,得到最终的多层结构,通过论文中的实验可知,只需要一层上述结构就能获得最好的结果,其可能的原因是用户行为序列间的依赖关系没有那么强。

2.3. MLP层以及损失函数

最终将其他特征的embedding以及Transformer的结果concat在一起,并通过三层的MLP得到最终的CTR预测。最终的损失函数为:

L = − 1 N ∑ ( x , y ) ∈ D ( y log ⁡ p ( x ) + ( 1 − y ) l o g ( 1 − p ( x ) ) ) L=-\frac{1}{N}\sum _{\left ( x,y \right )\in D}\left ( y\log\; p\left ( x \right ) +\left ( 1-y \right )log\left ( 1-p\left ( x \right ) \right )\right ) L=−N1​(x,y)∈D∑​(ylogp(x)+(1−y)log(1−p(x)))

其中, N N N表示样本个数, D D D表示所有的样本, y ∈ { 0 , 1 } y\in \left \{ 0,1 \right \} y∈{0,1}表示的是label, p ( x ) p\left ( x \right ) p(x)为模型的输出。

参考文献

  • Chen Q , Zhao H , Li W , et al. Behavior Sequence Transformer for E-commerce Recommendation in Alibaba[J]. 2019.
  • Vaswani A , Shazeer N , Parmar N , et al. Attention Is All You Need[J]. arXiv, 2017.

Read more

戏说云计算之PaaS,IaaS,SaaS

戏说云计算之PaaS,IaaS,SaaS

最近我们聊到“ CRM系统PAAS化 ”,有些可能就不了解,到底什么是PAAS。云计算还有IaaS,SaaS概念,这三者之间有什么区别?今天智云通CRM系统小编用通俗易懂的例子跟大家分享Paas,IaaS,SaaS。   “你懂得泡妞,就应该懂得这三个啥意思了。”   要理解IaaS,SaaS,PaaS的区别,首先要懂得什么是“云计算”,最近云计算的概念被炒得火热,这几个词经常看到,有的朋友可能觉得很深奥,其实理解并不难。   就像IT宅男一直觉得泡妞是一件很难的事情一样,其实对于懂得泡妞的人来说,泡妞就跟吃饭一样简单。   当然,这里并不是要教大家怎么泡妞,只是想借泡妞这件事来形象比喻这三个英文单词的意思,让大家更形象理解他们代表的意思。   “云”其实是互联网的一个隐喻,“云计算”其实就是使用互联网来接入存储或者运行在远程服务器端的应用,数据,或者服务。   任何一个使用基于互联网的方法来计算,存储和开发的公司,都可以从技术上叫做从事云的公司。   那么从事这些云的公司也是有分层的哦,就跟泡妞也分不同层次一样。这些从事云服务的公司,就分成:   Iaas(基础设施即服务In

By Ne0inhk
JNA两篇Blog的完整源代码

JNA两篇Blog的完整源代码

贴上JNA—JNI终结者、深入解析JNA—模拟C语言结构体两篇文章的完整源代码 C语言源代码: 头文件 #define MYLIBAPI  extern   "C"     __declspec( dllexport ) MYLIBAPI void say(wchar_t* pValue); struct UserStruct{ long id; wchar_t*  name; int age; }; MYLIBAPI void sayUser(UserStruct* pUserStruct); struct CompanyStruct{ long id; wchar_t*  name; //  UserStruct*  users[100]; UserStruct   users[100]; int count; }; struct

By Ne0inhk
我也来晒Flex编写的工作流编辑器

我也来晒Flex编写的工作流编辑器

我也来晒Flex编写的工作流编辑器 胡长城兄用flex做了一个工作流编辑器。  我也为公司写了一个,也拿出来晒晒。 最初想用JS画一个。但发现IE还不能画线。只得作罢。 然后想用JavaFX写的。因为我们公司原来的工作流编辑器是用Swing写的。 后来发现Flex比JavaFX更好,所以最后决定使用Flex写。基于AIR写桌面应用。 这还是一个原型系统,因此肯定会有一些不完善的地方。界面也没有经过美工美化。 ActionScript是非常易学的。我看了一个星期就开始动笔了,写了2个星期。Flex的文档大部分都还没来得及看呢。 编写过程中,由于Flex没有提供大小缩放的控件,因此实现这一部分功能破费了点时间。 最后呢:“我已进入Flex的世界,感觉良好!” 废话少说,给大家看看界面吧。 实现了Tab和鼠标的焦点管理。  替换掉了默认的焦点效果。 那个黑色的框框就是用来缩放和变形的。 也可以这样 缩成一条线了。 最后生成的结果是xml文件。这是工作流引擎需要的定义文件。

By Ne0inhk
从自己实现Ruby单例模式揭秘Ruby模块内幕

从自己实现Ruby单例模式揭秘Ruby模块内幕

从自己实现Ruby单例模式揭秘Ruby模块内幕 缘起 整个故事要从某一天开始说起,那天,我看到一篇文章介绍了Ruby中实现单例模式的模块。Singleton模块,只要include  Singleton模块,就可以为一个Ruby类添加单例功能。 我颇为惊奇,于是查看Singleton.rb源码,洋洋洒洒几百行,看不懂。做技术的都知道,遇到不理解的东西我们总是想探究清楚,否则必茶不思饭不想,夜不能寐。 于是,我就想到CSDN论坛问问Ruby高人,不料Ruby论坛总是系统维护中这个状态,想到其他Ruby社区问问,但一想还是算了。我平常都不逛其他社区的。 于是,继续钻研,费了一晚上的时间,终有所获。虽然没有完全看懂Ruby核心库中的Singleton模块的源码,但自己也鼓捣出了一个Singleton模块出来。 并且对Ruby模块和Ruby语言的本质有了更深的认识。 使用模块类载入方法实现的单例模块! 源代码: 下面请大家直接看看我的简单版的Singleton模块的源代码。 单例模块,存在的意义就是在模块被载入类时,给类添加类方法和创建对象实例等 module

By Ne0inhk