之前的序列到序列模型需要CNN或RNN。本文提出了新的网络架构,免除了递归和卷积。具有并行性,且训练时间更少,在两个机器翻译任务上具有更好的性能,并且证明了可以推广到其他领域。
解释了RNN模型:递归模型通常沿着输入和输出序列的符号位置进行因子计算。在计算时间内将位置与步骤对齐,它们生成一个隐藏状态ht序列,作为前一个隐藏状态ht - 1和位置t输入的函数。这种固有的顺序性限制了训练样本内部的并行化,在序列较长时,这个问题变得更加严重。完全基于注意力机制来得到输入和输出之间的全局依赖。避免了循环,可以并行化计算,在八块P100 GPU 上训练十二小时后在翻译任务上达到了SOTA(State-of-the-Art)。
减少序列计算的目标也成就了 Extended Neural GPU [16],ByteNet[18],和ConvS2S[9]的基础,它们都使用了卷积神经网络作为基础模块,并行计算所有输入和输出位置的隐藏表示。在这些模型中,将来自两个任意输入或输出位置的信号关联起来所需的操作数,随位置间的距离而增长,ConvS2S为线性增长,ByteNet为对数增长。这使得学习远距离位置之间的依赖性变得更加困难[12]. 在Transformer中,这种情况被减少到了常数次操作,虽然代价是由于平均 注意力加权位置信息降低了有效分辨率我们用多头注意力抵消这种影响。
self-attention,有时也叫做内部注意力,是一种注意力机制,它将一个序列的不同位置联系起来,以计算序列的表示。self-attention 已经成功的运用到了很多任务上,包括阅读理解、抽象摘要、语篇蕴涵和学习任务无关的句子表征等。
Transformer是第一个完全依赖于self-attetion来计算其输入和输出表示而不使用序列对齐的RNN或卷积的转换模型,在下面的章节中,我们将描述Transformer,motivate ,self-attention以及其模型的优势
大多数有竞争力的序列转换模型都有encoder-decoder结构构。这里,encoder将符号表示的输入序列映射成一个连续表示的序,然后解码器以一次生成一个字符的方式生成输出序列(单向模型:在生成每个位置的输出时只能依赖于已经生成的左侧部分的内容,而不能直接访问右侧的信息。这是因为在生成序列的过程中,每个位置的输入都是通过先前位置的输出经过自注意力机制和前馈神经网络进行计算得到的。这种从左到右的单向生成方式使得Transformer在解码过程中不能直接访问未生成的部分,因此被称为单向模型。)
Transformer遵循这个总体架构,使用堆叠的self-attention层、point-wise和全连接层,分别用于encoder和decoder,如图1的左半部分和右半部分所示。
Encoder: 由N(N=6)个完全相同的layer堆叠而成.每层有两个子层。第一层是multi-head self-attention机制,第二层 是一个简单的、位置全连接的前馈神经网络。我们在两个子层的每一层后采用残差连接,接着进行layer normalization。也就是说,每个子层的输出是LayerNorm(x + Sublayer(x)),其中Sublayer(x) 是由子层本身实现的函数。为了方便这些残差连接,模型中的所有子层以及embedding层产生的输出维度都为d_{model} = 512.每一层的输出维度都是512。
这样设计的目的是为了保持特征维度的一致性,方便模型的连接和参数共享。
**LN和BN的区别**:LN和BN是指Layer Normalization(层归一化)和Batch Normalization(批归一化),
它们是深度学习中常用的归一化技术,用于加速模型的训练和改善模型的性能
LN(Layer Normalization):对每个样本的同一层的不同特征进行归一化。即在每个样本上,对该层的所有神经元的输出进行归一化处理。
BN(Batch Normalization):对每个特征的同一批次样本进行归一化。即对每个特征在一个批次(batch)的所有样本上进行归一化处理。
计算方式的差异:
LN(Layer Normalization):在每个样本上计算特征维度的均值和方差,然后对该样本的所有特征进行归一化
BN(Batch Normalization):在一个批次上计算每个特征维度的均值和方差,然后对该批次的所有样本的相同特征进行归一化
Decoder:decoder也由N(N=6)个完全相同的layer堆叠而成.除了每个编码器层中的两个子层之外,解码器还插入第三个子层,该子层对编码器堆栈的输出执行multi-head attention操作,与encoder相似,我们在每个子层的后面使用了残差连接,之后采用了layer normalization。我们也修改了decoder stack中的 self-attention 子层,以防止当前位置信息中被添加进后续的位置信息。这种掩码与偏移一个位置的输出embedding相结合, 确保对第i个位置的预测 只能依赖小于i的已知输出
Attention机制可以描述为将一个query和一组key-value对映射到一个输出,其中query,keys,values和输出均是向量。输出是values的加权求和,其中每个value的权重 通过query与相应key的兼容函数来计算
Q、K和V的维度通常相同,且由模型的超参数决定。(通常来自embedding的线性变换)它们的含义如下:
Q矩阵衡量查询序列中的每个元素对其他元素的关注程度。
K矩阵表示被查询序列中的每个元素的重要性。
V矩阵提供每个输入元素的信息,用于生成输出。
通过将Q、K和V矩阵输入到注意力机制中,Transformer能够根据输入序列的相关性和重要性,计算出每个位置的注意力权重,并使用这些权重对输入序列进行加权求和,得到最终的表示。这种机制使得Transformer能够捕捉输入序列中不同元素之间的关联关系,并在生成输出时更加准确和有针对性。
**例如:**这幅图不同的颜色代表不同的head,深浅代表相关性大小,计算完每一个head,将所有的拼接在一起,然后是符合d_model的输出维度。
**注意:**除以根号下 dk 是为了缩放点积的值,避免梯度爆炸问题,并平衡不同维度之间的影响,以提高模型的稳定性和泛化能力。
分成八个分别计算,最后concat 在一起,跟单个的head的输出维度是一摸一样的。
具体来说,多头注意力机制通过将输入进行线性变换得到不同的查询、键和值,然后分别应用注意力机制并进行拼接,最后再经过一个线性变换得到最终的输出。每个注意力头都可以学习不同的注意力权重,从而关注输入的不同局部信息。这样的设计使得模型可以同时关注不同层次和不同角度的信息,提取更全面和多样化的特征表示。
模型不包含循环或卷积,为了让模型利用序列的顺序信息,我们必须加入序列中关于字符相对或者绝对位置的一些信息。 为此,我们在encoder和decoder堆栈底部的输入嵌入中添加“位置编码”。 位置编码和嵌入的维度d_model 相同,所以它们两个可以相加。有多种位置编码可以选择,例如通过学习得到的位置编码和固定的位置编码.
我们考虑三个方面,最后促使我们使用self-attention。
模型采用的数据集和效果就不在此展示,主要展示使用的一些优化器和正则化处理方法
主要采取三种正则化:
词嵌入(Word Embedding):首先,输入的单词或字符会被映射到一个连续的向量空间,这就是词嵌入。词嵌入可以将离散的词或字符转化为连续的向量表示,捕捉到它们的语义信息和相似关系。常用的词嵌入方法有Word2Vec、GloVe和FastText等。
位置编码(Positional Encoding):为了引入输入序列中的位置信息,Transformer在词嵌入之后添加了位置编码。位置编码是一种用于表示单词或字符在序列中相对位置的向量。它使得Transformer能够区分不同位置的单词或字符,并且在自注意力机制中考虑到它们的位置关系。常用的位置编码方法有正弦和余弦函数编码。
类别嵌入(Segment Embedding):对于一些需要处理多个句子或段落的任务,Transformer还可以添加类别嵌入。类别嵌入用于区分不同句子或段落的信息,并将它们作为额外的输入特征引入模型中。类别嵌入可以用于任务如句子对分类和文档级情感分类等。
1. attention is all you need
2, transformer架构