最近想研究序列推荐的内容,刚好看到行为序列建模的BST[1]序列模型运用了Transformer[2]结构,并且美团博客中也提到了“Transformer 在美团搜索排序中的实践”[3]。因此学习了Transformer模型内容,并记录了笔记。本篇文章并没有什么创新,因为基本参考了对Jay Alammar的博客[4],想要具体了解,可以查看原博客(点击原文链接)。但由于下一篇是想对Transformer中遇到的问题进行汇总与解答(Q&A),所以先将自己整理的内容堆上来,方便参考。
本文约2.7k字,预计阅读15分钟。
Transformer,是一个sequence-to-sequence模型,2017年提出。与其他Seq2Seq模型不同的是,它抛弃了传统的RNN与CNN,完全依赖注意机制来构成整个网络的架构,广泛的应用于机器翻译、语音识别等领域,当然也有在序列推荐中有具体的应用。Transformer也是一个encoder-decoder的结构,由自注意力机制(self attention)和前馈神经网络(Feed Forward)堆叠而成。论文中整体的结构如下所示:
由于注意力机制是整个网络的核心,因此先由它展开。
注意力机制作为一种资源分配方案,将有限的计算资源用来处理更重要的信息,是解决信息超载问题的主要手段。
当神经网络来处理大量的输入信息时,也可以借助注意力机制,选择一些关键的信息输入进行处理,提高神经网络的效率。
用 表示 组输入信息,其中 维向量 表示一组输入的信息(向量)。注意力机制的计算可以分为两步:
在所有输入信息上计算「注意力分布」;
根据注意力分布来计算输入信息的加权平均;
「注意力分布:」
为了从 个输入向量 中选择出和某个特定任务相关的信息,需要引入一个和任务相关的表示,即「查询向量 」,通过一个打分函数来计算「每个输入向量和查询向量之间的相关性」。给定一个和任务相关的查询量量 ,用注意力变量 来表示被选择信息的索引位置,即 表示选择了第 个输入向量。首先计算在给定 和 下,选择第 个输入向量的概率 ,
称为「注意力分布」,也可以说是在给定任务相关的查询 时,第 个输入向量受关注的程度。 为注意力打分函数,主要包括:
加性模型:
点积模型:
缩放点积模型:
双线性模型:
其中 为可学习的参数, 为输入向量的维度。
在Transformer中,注意力打分函数选择「缩放点积模型」。文章先解释了使用点击模型的「原因」:
❝Additive attention computes the compatibility function using a feed-forward network with a single hidden layer. While the two are similar in theoretical complexity, dot-product attention is much faster and more space-efficient in practice, since it can be implemented using highly optimized matrix multiplication code.
❞简单来说,就是点积模型可以使用矩阵乘法进行计算(GPU)。
然后在点积的基础上加入缩放是因为:当输入维度 较高时,点击模型的值通常有较大的方差,从而导致Softmax函数的梯度比较小,而缩放点击模型可以很好的解决这个问题。
❝We suspect that for large values of , the dot products grow large in magnitude, pushing the softmax function into regions where it has extremely small gradients. To counteract this effect, we scale the dot products by .
❞「加权平均:」
使用加权平均对所有的输入信息进行汇总:
以上便称为注意力机制。
以上是比较直观的注意力机制的解释,但在大部分论文中,都会使用key-value的格式来表示「输入信息」,即计算注意力分布时使用键key,而值value则用来计算聚合的信息,因此上述内容就是key=value。
注意力函数为:
如下图所示(图来源于博客):
论文中具体结构如下所示:
多头注意力(Multi-Head Attention)就是将查询向量 扩展为多个查询 来并行地从输入中选取多组信息,每个注意力关注输入信息的不同部分:
其中,,为学习的参数矩阵, 为最后所需的维度。
「引入自注意力机制的原因:」
❝神经网络处理一个变长的向量序列时,通常可以使用CNN或RNN编码得到一个相同长度的向量输出序列。但CNN与RNN都是一种局部编码方式,只建模了输入信息的局部依赖关系。RNN由于信息传递的容量以及梯度消失问题,实际也只能建立短距离依赖关系。
建立输入序列之间的长距离依赖关系,可以使用两种方法:1、增加网络层数;2、使用全连接网络;
但全连接网络无法处理变长的输入序列。因此可以引入注意力机制来“动态”地生成不同连接的权重,这就是自注意力机制。---《神经网络与深度学习》
❞「自注意力机制是整个Transformer的核心」。具体步骤如下:
定义输入序列为 ,输出序列为 ;
对于整个输入序列 ,生成三个向量序列:
其中,且,分别为查询向量、键向量、值向量构成的矩阵(「通过输入序列产生」)。
使用缩放点积作为注意力打分函数,那么输出向量序列为:
,自注意力机制如下所示:
论文中,Transformer内部具体使用的是一个「多头自注意力机制」,即多头注意力机制的概念+自注意力机制:
以上便是注意力机制的所有内容。
Transformer是一个Encoder-Decoder结构。
论文中提到,Transformer的编码层由6个相同的层(dentical layers)堆叠而成,解码层同样由6个相同的层堆叠而成,如下所示:
「总体结构:」
编码层由六个相同的层构成,而每一个又则由两个子层构成:第一个便是上述提到的「多头自注意力机制层」,第二个便是简单的「全连接的前向网络」,如下所示:
「全连接网络:」
多头自注意力机制在Attention部分已经提到,而全连接网络部分比较简单,即有两个带有Relu激活函数的线性转换构成:
其中 为自注意力层的输出。
「残差连接:」
观察论文给出的整体模型,我们发现在每一层中,还引入了一个「残差连接」(residual connection),之后通过了一个「层的Normalization」。最终编码层每一层的结构如下:
解码层也是与编码层一样,具有相同的6层。但每一层的结构却与编码层不一样,是由三个子层所构成:「多头自注意力机制层、Encoder-Decoder的注意力层和全联接的前向网络层」。相比于编码层,Encoder-Decoder的注意力层主要是为了关注输入的相关部分。
在解码层,我们重点应该关注的是Encoder-Decoder Attention。
通过模型结构图,「发现编码层最后的输出作为了中间层的两个输入(Key-Value)」,而在「第一个子层多头自注意力机制的输出作为Query」。该部分就是编码层与解码层的「本质区别」。
因此两者的总体结构为:
自注意力机制的权重计算都是依赖于 与 的相关性的,并没有考虑到「输入的位置信息」。即输入序列不管怎么打乱,那么最后Transformer都是得到类似的结果。
为了解决上述问题,Transformer在输入与编码层之间引入「位置编码」进行修正。
对于一个输入序列 ,经过embedding、位置编码,最后输出为:
其中 表示embedding的结构, 为位置 的向量表示,即位置编码。其中 可以作为可学习的参数,也可以通过预定义的方式,论文中定义如下:
其中 表示第 位置的编码向量的第 维, 表示编码向量的维度。
论文中指定的参数如下:
为了「方便残差连接」,Embedding输出、每个子层的输出维度都为: ;
Query与Key的维度: ;
多头注意力机制,Query的个数为: ;
Value的维度: ;
因此多头自注意力机制的输出维度为:
Transformer模型是一个值得研究的Seq2Seq模型,BERT核心内容也是Transformer。接下来会对Transformer中一些常见的疑问进行梳理,以Q&A的形式记录。
【题外话】:学习Transformer最好的方式是阅读原文[3]+博客[4]。
[1] Chen Q, Zhao H, Li W, et al. Behavior sequence transformer for e-commerce recommendation in Alibaba[C]//Proceedings of the 1st International Workshop on Deep Learning Practice for High-Dimensional Sparse Data. 2019: 1-4.[2] https://tech.meituan.com/2020/04/16/transformer-in-meituan.html[3] Vaswani A, Shazeer N, Parmar N, et al. Attention is all you need[C]//Advances in neural information processing systems. 2017: 5998-6008.[4] https://jalammar.github.io/illustrated-transformer/?spm=ata.13261165.0.0.34fb48aaFxc8Jt[5] 神经网络与深度学习
往期精彩回顾
【论文导读】浅谈胶囊网络与动态路由算法
【论文导读】KDD2018|xDeepFM---采用显式的高阶特征交互网络CIN
【论文导读】KDD2020|阿里团队最新的多元兴趣推荐模型---ComiRec
【论文导读】NFM---FM与DNN相结合,附TF2.0复现代码
Github开源项目2.0---使用TF2.0对经典推荐论文进行复现【持续更新中...】
扫码关注更多精彩
点分享
点点赞
点在看