Attention is All You Need
Abstract
主流的序列转换模型基本上都是基于RNN或CNN的编码器-解码器配置,其中性能最优的模型还通过注意力机制连接编码器-解码器,所以本文提出了一种完全基于注意力机制的模型——Transformer,作者用一系列结果表示其模型更优秀,且可以推广到其他任务。
Introduction
在序列转换问题中,RNN尤其是LSTM和Gated NN,已被确立为最先进的方法。
RNN通常根据输入输出的序列位置进行计算,通常为隐藏状态 h t h_t ht由上一个隐藏状态 h t − 1 h_{t-1} ht−1和 t t t的输入的函数计算得出,这种顺序性极大地阻止了并行化,在处理较长的序列长度时较为吃力(内存限制)。
最近的工作:分解技巧和条件计算提高了性能,但顺序计算的基本约束仍存在。
Background
self-attention是一种将单个序列的不同位置联系起来以计算序列的表示形式的注意力机制。self-attention已成功地应用于各种任务,包括阅读理解、抽象摘要、 文本蕴含和学习任务独立的句子表征。
Transformer是第一个完全依靠自注意来计算其输入和输出表示的转换模型,而不使用序列对齐的RNN或CNN。
Model Architecture
大部分有竞争力的模型还是使用的编码器-解码器结构,Transformer延用这种总体架构,编码器和解码器都使用了堆叠的self-attention层和点式的全连接层。
Encoder and Decoder Stacks
先将上图进行分解,不看输入和输出,就只剩下了左边一个Nx的大块是编码器,右边一个Nx的大块是解码器。
然后我们将这个模型看成是一个黑箱操作。在机器翻译中,就是输入一种语言,输出另一种语言。
拆开这个黑箱,我们可以看到它是由编码器、解码器和它们之间的连接组成。
编码组件部分由一堆编码器(encoder)构成(论文中是将6个编码器叠在一起,并不是特定的,一般会换成12或者24)。
解码组件部分也是由相同数量(与编码器对应)的解码器(decoder)组成的。
**Encoder:**本文中编码器由N=6个相同层堆叠组成。每个层有两个子层。第一层为Multi-head Attention,第二层为简单的位置全连接前馈网络,作者在两个子层周围使用残差连接(residual connection),然后是层归一化。
也就是说,每个子层的输出都是
L
a
y
e
r
N
o
r
m
(
x
+
S
u
b
l
a
y
e
r
(
x
)
)
LayerNorm(x+Sublayer(x))
LayerNorm(x+Sublayer(x))
其中
S
u
b
l
a
y
e
r
(
x
)
Sublayer(x)
Sublayer(x)是该子层实现的函数。为了便于残差连接,模型中所有子层都产生d维的输出
d
m
o
d
e
l
=
512
d_{model}=512
dmodel=512
**Decoder:**解码器也由N = 6个相同的层组成。除每个编码器层中的两个子层外,解码器还插入第三个子层,该子层对编码器堆栈的输出执行多头注意力。与编码器类似,我们在每个子层周围使用残差连接,然后进行层归一化。作者还修改了解码器堆栈中的自注意子层,以防止位置注意到后续位置。这种掩蔽,加上输出嵌入被一个位置偏移的事实,确保了位置 i i i的预测只能依赖于位置小于 i i i的已知输出。
Attention
从编码器输入的句子首先会经过一个自注意力(self-attention)层,这层帮助编码器在对每个单词编码时关注输入句子的其他单词。
自注意力层的输出会传递到前馈(feed-forward)神经网络中。每个位置的单词对应的前馈神经网络都完全一样(一层窗口为一个单词的一维卷积神经网络)。
解码器中也有编码器的自注意力(self-attention)层和前馈(feed-forward)层。除此之外,这两个层之间还有一个注意力层,用来关注输入句子的相关部分(和seq2seq模型的注意力作用相似)。
首先将每个输入单词通过词嵌入算法转换为词向量,每个单词都被嵌入为512维的向量。
词嵌入过程只发生在最底层的编码器中。所有的编码器都有一个相同的特点,即它们接收一个向量列表,列表中的每个向量大小为512维。在底层(最开始)编码器中它就是词向量,但是在其他编码器中,它就是下一层编码器的输出。向量列表大小是我们可以设置的超参数,一般是我们训练集中最长句子的长度。
将输入序列进行词嵌入之后,每个单词都会流经编码器中的两个子层。
**self-attention工作原理:**例如,下列句子是我们想要翻译的输入句子:
The animal didn’t cross the street because it was too tired
当模型处理这个单词“it”的时候,自注意力机制会允许“it”与“animal”建立联系。
RNN会将它已经处理过的前面的所有单词/向量的表示与它正在处理的当前单词/向量结合起来。而自注意力机制会将所有相关单词的理解融入到我们正在处理的单词中。
第一步: 为编码器的每个输入单词创建三个向量,即 Query vector, Key vector, Value vector,也就是经典的Q,K,V。这些向量通过 embedding 和三个矩阵相乘得到
请注意,这些新向量的尺寸小于嵌入向量。它们的维数为64,而嵌入和编码器输入/输出向量的维数为512.它们不一定要小,这是一种架构选择,可以使多头注意力计算(大多数)不变。
待续未完。。。其实是懒得写了
1.论文贡献:
主流的序列转换模型基本上都是基于RNN或CNN的编码器-解码器配置,以往的这些模型顺序性较强,缺乏并行性,所以本文提出了一种全新的完全基于注意力机制的模型——Transformer。
虽然一些最近的工作提高了RNN或CNN的性能,但没有改变顺序计算的约束。而Transformer是第一个完全依靠自注意来计算其输入和输出表示的转换模型。
2.论文方法还可以做什么:
用来建模序列,生成上下文相关的句子表示
Multi-Turn Response Selection for Chatbots with Deep Attention Matching Network
作为预训练语言模型中的特征提取器:OpenAI GPT、BERT等
还可以用于图像识别等领域