Transformer_Attention Is All You Need
代码: https://github.com/tensorflow/tensor2tensor
摘要
主要的序列转导模型基于复杂的循环或卷积神经网络,包括编码器和解码器。性能最好的模型还通过注意力机制连接编码器和解码器
Transformer,它完全基于注意力机制,完全摒弃了递归和卷积
结论
- Transformer是第一个完全基于注意力的序列转导模型,用多头自注意力取代了编码器-解码器架构中最常用的循环层
- 机器翻译,在 WMT 2014 English-to-German 和 WMT 2014 English-to-French 的翻译任务上效果更好
- 计划将 Transformer 扩展到涉及文本以外的输入和输出模式的问题,并研究局部的受限注意力机制,以有效处理图像、音频和视频等大型输入和输出
- 减少生成的顺序是另一个研究目标
导言
-
RNN、LSTM [12] 和GRNN [7] 神经网络,尤其是在语言建模和机器翻译等序列建模和转导问题中被确立为最先进的方法
-
RNN通常沿输入和输出序列的符号位置考虑计算。假设输入的是序列,RNN计算是把这个序列从左往右移一步一步往前走
-
将位置与计算时间的步骤对齐,它们生成一系列隐藏状态 h t h_t ht,作为先前隐藏状态 h t − 1 h_{t-1} ht−1 和位置 t 的输入的函数。
- h t h_t ht由 h t − 1 h_{t-1} ht−1 和位置 t 决定,将前面学习的历史信息一步步往后传递,通过 h t − 1 h_{t-1} ht−1 放到当前做计算,然后输出
-
这种固有的顺序性质排除了训练示例中的并行化
-
因式分解技巧 (Factorization tricks for LSTM networks.[18] )和条件计算 (Outrageously large neural networks: The sparsely-gated mixture-of-experts layer.) 实现了计算效率的显着提高,但 顺序计算的基本约束仍然存在
-
-
注意机制已成为的序列建模和转导模型的组成部分,允许对依赖项进行建模,而无需考虑它们在输入或输出序列中的距离
- 但这种注意力机制大多与循环网络结合使用。
-
Transformer,这是一种避免重复的模型架构,而是完全依赖注意力机制来绘制输入和输出之间的全局依赖关系,可以并行
背景
-
减少顺序计算的目标也构成了 扩展神经 GPU [20]、ByteNet [15] 和 ConvS2S [8] 的基础,所有这些都使用卷积神经网络作为基本构建块,并行计算所有输入的隐藏表示和输出位置
- 这些模型中,关联来自两个任意输入或输出位置的信号所需的操作数量随着位置之间的距离而增长
- 对于 ConvS2S 呈线性增长,而对于 ByteNet 则呈对数增长。这使得学习远距离位置之间的依赖关系变得更加困难
-
在 Transformer 中,这被减少到恒定数量的操作,尽管由于平均注意力加权位置而降低了有效分辨率,使用多头注意力来抵消影响
- 卷积中可以做多个输出通道,一个输出通道可以识别不一样的模式
- Transformer也想有多个输出通道的效果,因此提出多头的注意力
-
self-attention,自注意力,有时称为内部注意力,是一种将单个序列的不同位置关联起来以计算序列表示的注意力机制
-
端到端记忆网络基于循环注意机制而不是序列对齐循环,并且已被证明在简单语言问答和语言建模任务中表现良好
模型架构
-
神经序列转导模型具有编码器-解码器结构
- 编码器将符号表示的输入序列 ( x 1 , . . . , x n x_1, ..., x_n x1,...,xn) 映射到连续表示的序列 z = ( z 1 , . . . , z n z_1, ..., z_n z1,...,zn)
- z t z_t zt 是 x t x_t xt 的一个向量表示
- 给定 z,然后解码器一次生成一个元素的符号输出序列 ( y 1 , . . . , y m y_1, ..., y_m y1,...,ym)
- 在每个步骤中,模型都是自回归的
- 自回归:编码器中是一次性看见所有序列,而在解码器中,序列是一个一个生成的
- 在过去时刻的输出,会作为当前时刻的输入
- 在每个步骤中,模型都是自回归的
- 编码器将符号表示的输入序列 ( x 1 , . . . , x n x_1, ..., x_n x1,...,xn) 映射到连续表示的序列 z = ( z 1 , . . . , z n z_1, ..., z_n z1,...,zn)
-
Transformer 遵循这种整体架构,对编码器和解码器使用堆叠的 自注意力 和 逐点全连接层
- 左图为编码器,右图为解码器
- 输入进来是一个个的嵌入层,将其表示为一个个向量,Nx代表层有N个
-
编码器和解码器层
-
编码器
- 编码器由 N = 6 个相同的层组成。每层有两个子层。
- 第一个是多头自注意力机制
- 第二个是简单的、按位置的全连接前馈网络
- 在两个子层中的每一个周围使用残差连接 ,然后进行层归一化
-
每个子层的输出为 LayerNorm (x + Sublayer(x)) ,其中Sublayer(x)是子层自己实现的函数
- 在一个二维输入中,每一行是一个样本,每一列是一个特征
- batchNorm:把每一个列(特征),在一个小的minibatch中将其均值变为0,方差变为1
- LayerNorm:把每一个样本做归一化,相当于是把数据转置,放在batchNorm中,得到结果再转置就可以得到
- 在Transformer中,是三维的相当于(batch,feature(维度为d),seq(维度为n))
- 在时序的序列模型中,每个样本的长度可能发生变化,用layerNorm是每个样本自己计算均值和方差,不论样本长度,相对较稳定
- 用batchNorm时,会计算一个全局的均值和方差,假设样本长度变化比较大,做小批量时计算出的均值和方差抖动相对较大,
- 在一个二维输入中,每一行是一个样本,每一列是一个特征
-
为了促进这些残差连接,模型中的 所有子层以及嵌入层 都会产生维度 d m o d e l d_{model} dmodel= 512 的输出
-
- 编码器由 N = 6 个相同的层组成。每层有两个子层。
-
解码器
- 解码器也由一堆 N = 6 个相同的层组成,除了每个编码器层中的两个子层之外,解码器还插入了第三个子层
- 第三个子层对编码器堆栈的输出执行多头注意力
- 我们在每个子层周围使用残差连接,然后进行层归一化
- 还修改了解码器堆栈中的自注意力子层,以防止位置关注后续位置(做了一个带掩码的注意力机制)
- 这种带掩码的注意力与输出嵌入偏移一个位置的事实相结合,确保对位置 i 的预测只能依赖于位置小于 i 的已知输出
- 解码器也由一堆 N = 6 个相同的层组成,除了每个编码器层中的两个子层之外,解码器还插入了第三个子层
-
-
注意力
-
注意力函数可以描述为将查询和一组键值对映射到输出
- 其中查询、键、值和输出都是向量。
- 输出 计算为值的加权和,其中分配给每个值的权重 由 查询与相应键 的 相似度 函数计算。
-
缩放点积注意力(Scaled Dot-Product Attention)
-
输入由维度 d k d_k dk 的 查询和键 以及维度 d v d_v dv 的 值 组成
-
使用所有键和 查询 做内积 ,将每个键除以 d k \sqrt{dk} dk,并应用 softmax 函数来获得值的权重
-
同时计算一组查询的注意力函数,并打包到矩阵 Q 中。键和值也打包到矩阵 K 和 V 中。我们将输出矩阵计算为:
- A t t e n t i o n ( Q , K , V ) = s o f t m a x ( Q K T d k ) V \large Attention(Q,K,V) = softmax(\frac {QK^T}{\sqrt {d_k}})V Attention(Q,K,V)=softmax(dkQKT
-
-