Attention演进(RNN&LSTM&GRU&Seq2Seq + Attention机制)

LSTM

LSTM是RNN的一种变体,RNN由于梯度消失只有短期记忆,而LSTM网络通过精妙的门控制,一定程度上缓解了梯度消失的问题。

LSTM得神经网络模块具有不同的结构,LSTM包含遗忘门、输入门和输出门,增加了非线性的相互作用。整体结构如图所示:

点击查看公式

遗忘门:\(
f_{t}=\sigma\left(W_{f} \cdot\left[h_{t-1}, x_{t}\right]+b_{f}\right)
\)

输入门:\(
\begin{array}{l}
i_{t}=\sigma\left(W_{i} \cdot\left[h_{t-1}, x_{t}\right]+b_{i}\right)
\end{array}
\)

cell state更新:

\(\tilde{C_t}=\tanh \left(W_{C} \cdot\left[h_{t-1}, x_{t}\right]+b_{C}\right)\)

\(C_{t}=f_{t} * C_{t-1}+i_{t} * \tilde{C}_{t}\)

输出门:\(
\begin{array}{l}
o_{t}=\sigma\left(W_{o}\left[h_{t-1}, x_{t}\right]+b_{o}\right)
\end{array}
\)

当前层输出:\(
\begin{array}{l}
h_{t}=o_{t} * \tanh \left(C_{t}\right)
\end{array}
\)

GRU

GRU是LSTM的一种变体,也是为了解决梯度消失(即长期记忆问题)而提出来的。相较于LSTM,GRU的网络结构更加简单,且效果很好。

Seq2Seq + Attention机制

提出问题:在做机器翻译时,专家学者们发现,在Seq2Seq结构中,Encoder把所有的输入序列都编码成一个统一的语义向量context,然后再由Decoder解码。其中,context自然也就成了限制模型性能的瓶颈,当要翻译的句子较长时,一个 context 可能存不下那么多信息。同时,只使用编码器的最后一个隐藏层状态,似乎不是很合理。

解决方案:因此,引入了Attention机制(将有限的认知资源集中到最重要的地方)。在生成 Target 序列的每个词时,用到的中间语义向量 context 是 Source 序列通过Encoder的隐藏层的加权和,而不是只用Encoder最后一个时刻的输出作为context,这样就能保证在解码不同词的时候,Source 序列对现在解码词的贡献是不一样的。例如,Decoder 在解码”machine”时,”机”和”器”提供的权重要更大一些,同样,在解码”learning”时,”学”和”习”提供的权重相应的会更大一些。

实现步骤:(1)衡量编码中第 j 阶段的隐含层状态和解码时第 i 阶段的相关性(有很多种打分方式,这里不细讲);(2)通过相关性的打分为编码中的不同阶段分配不同的权重;(3)解码中第 i 阶段输入的语义向量context就来自于编码中不同阶段的隐含层状态的加权和。

简单总结下:attention比rnn之类参数更少,速度更快(类似cnn可以并行化),效果更好【1】;因为其过滤掉大部分无用信息,所以可以处理更长的序列;下面看下attention是如何建模完成信息过滤的。

Attention机制(self-attention)

Attention其实就是计算一种相关程度;Attention通常可以进行如下描述,表示为将query(Q)和key-value pairs映射到输出上,其中query、每个key、每个value都是向量,输出是V中所有values的加权,其中权重是由Query和每个key计算出来的,计算方法分为三步:

1)计算比较Q和K的相似度,用f来表示:

\[f\left(Q, K_{i}\right) , i=1,2,3
\]

2)将得到的相似度进行softmax归一化:

\[\alpha_{i}=\frac{e^{f\left(Q, K_{i}\right)}}{\sum_{j=1}^{m} e^{f\left(Q, K_{i}\right)}}, i=1,2,3, . .
\]

3)针对计算出来的权重,对所有的values进行加权求和,得到Attention向量:

\[\sum_{i=1}^m a_i V_i
\]

变种之Memory-based Attention

Q&A 任务中,k 是 question,v 是 answer,q 是新来的 question,看看历史 memory 中 q 和哪个 k 更相似,然后依葫芦画瓢,根据相似 k 对应的 v,合成当前 question 的 answer。

模型的输入是一个稠密特征q,输出是一个特征向量v,向量v的计算是通过对每个embedding vector进行加权求和得到的;【2】

变种之Soft/Hard Attention

hard attention 是一个随机采样,采样集合是输入向量的集合,采样的概率分布即attention weight。因此,hard attention 的输出是某一个特定的输入向量。

soft attention 是一个带权求和的过程,求和集合是输入向量的集合,对应权重是 相似度function 产出的 attention weight。

soft attention 是更常用的,下面讨论相似度function 【3】

变种之self-attention

定义:Self Attention,指的不是Target和Source之间的Attention机制,而是Source内部元素之间或者Target内部元素之间发生的Attention机制,也可以理解为Target=Source这种特殊情况下的Attention。

Scaled Dot-Product Attention

Dot-Product计算相似度

outputs = tf.matmul(Q,tf.transpose(K,[0,2,1]))
outputs = outputs / (K.get_shape().as_list()[-1] ** 0.5)

Encoder mask(主要是padding value平滑下)

key_masks = tf.sign(tf.abs(tf.reduce_sum(keys,axis=-1)))
key_masks = tf.tile(tf.expand_dims(key_masks,1),[1,tf.shape(queries)[1],1])
paddings = tf.ones_like(outputs) * (-2 ** 32 + 1)
outputs = tf.where(tf.equal(key_masks,0),paddings,outputs)

Decoder mask(padding value平滑+只能利用之前的输入约束)

diag_vals = tf.ones_like(outputs[0,:,:])
tril = tf.contrib.linalg.LinearOperatorTriL(diag_vals).to_dense()
masks = tf.tile(tf.expand_dims(tril,0),[tf.shape(outputs)[0],1,1])
paddings = tf.ones_like(masks) * (-2 ** 32 + 1)
outputs = tf.where(tf.equal(masks,0),paddings,outputs)

计算结果outputs

# scaled
outputs = tf.nn.softmax(outputs)
# Query Mask
query_masks = tf.sign(tf.abs(tf.reduce_sum(queries,axis=-1)))
query_masks = tf.tile(tf.expand_dims(query_masks,-1),[1,1,tf.shape(keys)[1]])
outputs *= query_masks
# Dropout
outputs = tf.layers.dropout(outputs,rate = dropout_rate,training = tf.convert_to_tensor(is_training))
# Weighted sum
outputs = tf.matmul(outputs,V)
# Residual connection
outputs += queries
# Normalize
outputs = normalize(outputs)

Multi-Head Attention



Multi-Head Attention就是把Scaled Dot-Product Attention的过程做H次,然后把输出concat合起来。

序列建模有哪些经典论文?

Next Item Recommendation with Self-Attention

Behavior Sequence Transformer for E-commerce Recommendation in Alibaba

Session-based recommendations with recurrent neural networks

Neural Attentive Session-based Recommendation

Translation-based Recommendation

BERT4Rec: Sequential Recommendation with Bidirectional Encoder Representations from Transformer

SHAN:Sequential Recommender System based on Hierarchical Attention Networks

BINN:Learning from history and present: next-item recommendation via discrimina-tively exploiting user behaviors

SDM论文笔记

回顾与引入(ABSTRACT+1,2两小节)

SDM:SDM: Sequential Deep Matching Model for Online Large-scale Recommender System

在淘宝的场景中,用户的行为主要分为两种,第一个是当前的浏览session,用户在一个session中,需求往往是十分明确的,比如你想买球鞋,往往只会关注球鞋类的商品。另一个是之前的记录,一个用户虽然可能不是每次都来买球鞋,但是也可能提供一定的有用信息,比如用户只买阿迪的鞋子或者只买帆布鞋等等。因此分别建模这两种行为序列来刻画用户的兴趣,是十分有用的。

提出问题:1)CF类方法并未建模用户的兴趣的动态性和兴趣随时间的演化过程(DSIN);2)一个session内也可能存在多种兴趣倾向(feed的多个维度);3)长期偏好和短期偏好没很好融合

我对动态性/静态性的理解:1)icf是取topk相似的item,然后i2i推荐,相当于仅利用了分布的头部部分;2)传统的embedding建模假设用户的兴趣是长久稳定的和集中的,不随时间和context变化;所以相对的就是动态多兴趣的假设

我对多兴趣倾向的理解:文章中主要是提出电商场景下用户会综合商品的多个角度,也就是多兴趣观点;个人在双列feed的关注点基本1)萌宠/美女类型2)订阅科技/影视作者;还有可能关注封面;同时全局类策略一般不看

解决方案:提出multi-head attention和Gate自适应长短期融合

multi-head attention主要有两点原因:

1)用户的行为中存在一些误点击行为,通过self-attention来降低这种影响;

2)用户可能对不同物品的关注点不同。

Gate自适应长短期融合的原因:

之前简单将item concat或者weighted sum的工作,因为用户找了很久才找到和NBA明星相关的球鞋,其他item反而是噪音;本工作对应的模块是类似lstm的长短期向量门融合模块可以避免这种噪音干扰;

建模&模型架构/结构(第3节)

长期序列:相隔一周以内的行为认为是用户的长期行为(不包含短期序列)

短期序列:

1)日志中标记了同样的session ID

2)虽然session ID不相同,但是相邻的行为间隔小于10min

3)最长的session长度为50,超过50的划分到前一个session

这里论文没给出规则2,3的原因,推测还是阿里这边数据分析的经验;

sdk埋点中session_id定义:应用进入前台生成session_id,退至后台10秒以上重新进入前台重新生成session_id

在长期行为中挖掘用户对商品属性的偏好(如类目、品牌、店铺等),在短期行为中结合Multi-Head Self-Attention过滤掉session内部的casual click,并利用Multi-Head挖掘用户在session内的多方面兴趣,最后构造Gate自适应的融合长短期兴趣得到用户兴趣的充分表达。

循环层:

使用LSTM捕获和刻画短期行为数据中的全局时序依赖

Multi-Head Attention:

User Attention层

对于不同的用户,即使是相似的商品集合,用户在偏好方面也可能有所不同。因此使用User Attention层去捕获更细粒度的用户偏好。使用用户的embedding(eu)作为attention的query。

\[\alpha_{k}=\frac{\exp \left(\hat{h}\_{k}^{u T} e_{u}\right)}{\sum_{k=1}^{t} \exp \left(\hat{h}\_{k}^{u T} e_{u}\right)}
\]

\[s_{t}^{u}=\sum_{k=1}^{t} \alpha_{k} \hat{h}\_{k}^{u}
\]

短期行为和长期行为融合:

\[G_{t}^{u}=\operatorname{sigmoid}\left(W^{1} e_{u}+W^{2} s_{t}^{u}+W^{3} p^{u}+b\right)
\]

\[o_t^u=\left(1-G_t^u\right) \odot p^u+G_t^u \odot s_t^u
\]

(线上线下)实验设计&实验分析(第4,5,6小节)

数据集:

1)淘宝数据集:8天内行为物品大于40的活跃用户,但过滤行为超过1000 items的异常用户+过滤出现5次以下的item+过滤长度小于2的session(训练阶段);前7天做训练第8天测试;长期行为限制为20;

2)京东数据机:3周训练1周测试;其余与淘宝数据机相同;

论文中虽然给了代码和数据集链接,但具体的数据处理,模型输入和离线验证都是基于阿里的ODPS和PAI,所以基本不可复现;只能看DeepMatch中关于movielens数据集复现

实现细节:

1)multi-head attention中头个数的实验

2)融合门的实验

代码:

https://github.com/alicogintel/SDM

https://github.com/shenweichen/DeepMatch

附录

【1】一文看懂 Attention(本质原理+3大优点+5大类型)

【2】稠密特征加入CTR预估模型有哪些方法?

【3】一步步解析Attention is All You Need!

【4】使用Excel通俗易懂理解Transformer!

【5】推荐系统遇上深度学习(三十一)--使用自注意力机制进行物品推荐

【6】推荐系统遇上深度学习(四十)-SESSION-BASED RECOMMENDATIONS WITH RECURRENT NEURAL NETWORKS.

【7】推荐系统遇上深度学习(四十八)-BST:将Transformer用于淘宝电商推荐

【8】推荐系统遇上深度学习(五十二)-基于注意力机制的用户行为建模框架ATRank

【9】推荐系统遇上深度学习(五十八)-基于“翻译”的序列推荐方法

【10】推荐系统遇上深度学习(六十一)-[阿里]使用Bert来进行序列推荐

【11】推荐系统遇上深度学习(六十三)-[阿里]大型推荐系统中的深度序列匹配模型SDM

【12】推荐系统遇上深度学习(六十四)-通过自注意力机制来自动学习特征组合

【13】SDM(Sequential Deep Matching Model)的复现之路

【14】深度学习中的序列模型演变及学习笔记(含RNN/LSTM/GRU/Seq2Seq/Attention机制),智能推荐算法演变及学习笔记,数据挖掘比赛/项目全流程介绍!

序列推荐(transformer)的更多相关文章

  1. 推荐系统论文之序列推荐:KERL

    KERL: A Knowledge-Guided Reinforcement Learning Modelfor Sequential Recommendation 摘要 ‍时序推荐是基于用户的顺序行 ...

  2. BERT总结:最先进的NLP预训练技术

    BERT(Bidirectional Encoder Representations from Transformers)是谷歌AI研究人员最近发表的一篇论文:BERT: Pre-training o ...

  3. [Attention Is All You Need]论文笔记

    主流的序列到序列模型都是基于含有encoder和decoder的复杂的循环或者卷积网络.而性能最好的模型在encoder和decoder之间加了attentnion机制.本文提出一种新的网络结构,摒弃 ...

  4. 一个在 Java VM 上使用可观测的序列来组成异步的、基于事件的程序的库 RxJava,相当好

    https://github.com/ReactiveX/RxJava https://github.com/ReactiveX/RxAndroid RX (Reactive Extensions,响 ...

  5. 【译】图解Transformer

    目录 从宏观上看Transformer 把张量画出来 开始编码! 从宏观上看自注意力 自注意力的细节 自注意力的矩阵计算 "多头"自注意力 用位置编码表示序列的顺序 残差 解码器 ...

  6. 三大特征提取器(RNN/CNN/Transformer)

    目录 三大特征提取器 - RNN.CNN和Transformer 简介 循环神经网络RNN 传统RNN 长短期记忆网络(LSTM) 卷积神经网络CNN NLP界CNN模型的进化史 Transforme ...

  7. Transformer模型总结

    Transformer改进了RNN最被人诟病的训练慢的缺点,利用self-attention机制实现快速并行. 它是由编码组件.解码组件和它们之间的连接组成. 编码组件部分由一堆编码器(6个 enco ...

  8. Attention机制在深度学习推荐算法中的应用(转载)

    AFM:Attentional Factorization Machines: Learning the Weight of Feature Interactions via Attention Ne ...

  9. BERT大火却不懂Transformer?读这一篇就够了

    https://zhuanlan.zhihu.com/p/54356280 大数据文摘与百度NLP联合出品 编译:张驰.毅航.Conrad.龙心尘 来源:https://jalammar.github ...

随机推荐

  1. python3 的setter方法及property修饰

    #!/usr/bin/env pthon#coding:utf-8 class person(object): def __init__(self,name,sex,age,surface,heigh ...

  2. OO学习最终总结

    0.前言:本次主要是针对第三阶段的三次作业以及整个课程学习的总结,这三次作业主要是针对对程序进行重构使得程序可以对功能进行扩展的训练以及对类的设计,所以在此阐述在练习过程中的问题以及感悟. 1.作业总 ...

  3. [leetcode] 股票问题

    参考文章: [1] 团灭 LeetCode 股票买卖问题 [2] Most consistent ways of dealing with the series of stock problems 其 ...

  4. CORS跨域漏洞学习

    简介 网站如果存CORS跨域漏洞就会有用户敏感数据被窃取的风险. 跨域资源共享(CORS)是一种浏览器机制,可实现对位于给定域外部的资源的受控访问.它扩展了同源策略(SOP)并增加了灵活性.但是,如果 ...

  5. 别在重复造轮子了,几个值得应用到项目中的 Java 开源库送给你

    我是风筝,公众号「古时的风筝」.文章会收录在 JavaNewBee 中,更有 Java 后端知识图谱,从小白到大牛要走的路都在里面.公众号回复『666』获取高清大图. 风筝我作为一个野路子开发者,直到 ...

  6. 税务ukey如何批量开票

    最近税局开始大力推税务ukey版本,不过目前接口还未开放,就连航信,百旺否还没有对应接口,所以自己研究了下,在之前税控基础上,谁知道搞定了,通过安装插件可以批量开票,包括纸质,电子发票ofd格式. 联 ...

  7. post请求头的常见类型

    1.application/json(JSON数据格式) xhr.setRequestHeader("Content-type","application/json; c ...

  8. [转载] WLAN:BSS,ESS,SSID

    转载地址:http://blog.sina.com.cn/s/blog_71c6e0ea0100l686.html (2010-05-24 15:20:47) SSID(Service Set Ide ...

  9. 成为python程序员,对疫情过后的毕业生来说,真是一个不错的方向吗?

    Python最近几年,一直被炒得很火,这其中有商业因素,但更重要的是即将到来的人工智能时代,而python就恰好是最适合的编程语言. 所以无论是在职的人,还是在校的学生,都想着跟上这一趋势,但,在今年 ...

  10. Charles的介绍,配置与使用

    简介 Charles中文名叫青花瓷 它是一款基于HTTP协议的代理服务器 通过成为客户端或者浏览器的代理 然后截取请求和请求结果达到分析抓包的目的. 特点 跨平台 win linux mac 半免费 ...