十问

Q1 论文试图解决什么问题?

​ 该论文旨在解决自然语言处理任务中的序列建模问题。在传统的序列建模方法中,如循环神经网络和卷积神经网络,输入序列被顺序地处理或使用固定大小的窗口处理。这些方法在处理长序列和学习长期依赖性方面存在一些限制。

​ 因此,该论文提出了一种名为Transformer的新型神经网络架构,它使用自注意力机制允许模型同时关注输入序列中的所有位置,并可以更高效地学习长期依赖性。该论文主要用于机器翻译和语言建模等自然语言处理任务,旨在提高这些任务的准确性和效率。

Q2 这是否是一个新的问题?

​ 不是一个新的问题,但是一个新的方法。

Q3 这篇文章要验证一个什么科学假设

​ Transformer是第一个完全依赖于自我注意力来计算其输入和输出表示的转导模型,而不使用序列对齐的RNN或卷积。同时也要验证本文提出的Transformer性能优于其他模型。并且其中的参数大部分是不用进行调整的比如说损失函数。

Q4 有哪些相关研究?如何归类?

​ 使用RNN层来完成Seq2Seq,使用CNN层来完成Seq2Seq,使用attention层来完成Seq2Seq。

​ 减少顺序计算的目标也形成了扩展神经GPU、ByteNet和ConvS2S的基础,所有这些都使用卷积神经网络作为基本构建块,并行计算所有输入和输出位置的隐藏表示。

Q5 论文中提到的解决方案之关键是什么?

​ 提出Transformer,完全基于attention的序列转换模型,用multi-headed self-attention取代了encoder-decoder架构中最常用的recurrent layers。
​ 提出Position Embedding, 能提高准确率、减少过拟合。

Q6 论文中的实验是如何设计的?

​ 首先提出attention概念和定义,因为提出的Transformer是完全基于attention的序列转换模型。然后对attention机制的完善,提出了Multi-Head Attention,即是多做几次相同的事情,参数独立使用,然后把结果拼接。接着提出了Self Attention,即寻找序列内部的联系。Google结合了Self和Multi-Head Attention。又因为序列顺序很重要,所以引入了Position Embedding,将位置编号,每个编号对应一个向量,对每个词引入了位置信息。然后使用数据集来检测提出的模型的性能优越性。

​ 论文中的实验主要是针对机器翻译任务进行的,使用的数据集是 WMT 2014 数据集,包括英语-德语和英语-法语两个方向的翻译任务。具体实验设计如下:

​ 对比实验:首先,论文将 Transformer 模型与基于循环神经网络(RNN)和卷积神经网络(CNN)的序列模型进行了对比实验,以验证 Transformer 模型的性能优势。在这个实验中,论文使用了不同大小的模型进行对比,并分别使用 BLEU 分数和翻译速度作为评价指标。

​ Ablation 实验:然后,论文进行了一系列的 ablation 实验,分别验证了自注意力机制、多头注意力机制、残差连接等关键组件的效果,以进一步说明 Transformer 模型的优势。

​ 可视化实验:最后,论文进行了一些可视化实验,展示了 Transformer 模型在机器翻译任务中对输入序列的关注程度。这些实验可以帮助研究人员更好地理解模型的内部工作原理和表现。

Q7 用于定量评估的数据集是什么?代码有没有开源?

数据集:

  1. WMT2014 Englishto-German
  2. WMT2014 English-to-French

开源代码

  1. https://github.com/huggingface/transformers
  2. https://github.com/tensorflow/tensor2tensor
  3. The Annotated Transformer (harvard.edu)

Q8 论文中的实验及结果有没有很好地支持需要验证的科学假设?

​ 论文中的实验结果很好地支持了需要验证的科学假设,即通过自注意力机制来替代传统的卷积神经网络和循环神经网络,可以取得更好的自然语言处理性能。具体来说,论文在机器翻译任务中使用 Transformer 模型,通过对比传统的序列模型和其他的注意力机制模型,如 RNN 和 CNN,得出了 Transformer 模型在翻译任务上的优越性能。此外,在语言建模任务和句子压缩任务上,Transformer 模型也取得了最先进的性能表现。这些实验结果表明,Transformer 模型在自然语言处理领域中具有广泛的应用前景,并且通过自注意力机制可以实现更好的性能。

​ 需要指出的是,论文中提出的 Transformer 模型虽然在自然语言处理领域取得了很好的效果,但并不一定适用于其他领域。因此,如果将 Transformer 模型应用于其他领域,需要根据具体情况进行调整和优化。

Q9 这篇论文到底有什么贡献?

​ 这篇论文的主要贡献在于提出了一种基于自注意力机制的全新神经网络模型,即 Transformer 模型,该模型在自然语言处理领域中取得了最先进的性能。具体来说,Transformer 模型在机器翻译、语言建模和句子压缩等任务上都取得了优异的性能表现。与传统的循环神经网络和卷积神经网络相比,Transformer 模型具有更好的并行计算性能,能够同时处理输入序列中的所有位置信息,而不需要依次处理序列中的每个位置。此外,Transformer 模型还通过自注意力机制对输入序列中不同位置之间的依赖关系进行建模,能够更好地捕捉序列中的长程依赖关系。

​ 除了提出 Transformer 模型之外,论文还探索了一些与 Transformer 相关的研究问题,如在 Transformer 模型中使用不同的编码器和解码器架构、使用不同的注意力机制等等,这些研究也为自然语言处理领域的进一步发展提供了启示。

​ 总之,这篇论文提出的 Transformer 模型为自然语言处理领域的研究提供了新的思路和方法,为自然语言处理领域的进一步发展做出了重要贡献。

Q10 下一步呢?有什么工作可以继续深入?

​ 计划将基于attention的模型应用于其他任务。 计划将Transformer扩展到除文本之外的涉及输入和输出模式的问题,并研究局部的、受限的attention机制,以有效地处理图像、音频和视频等大型输入和输出。

  1. 由于transformer的出现我们在未来可以实现多模态的搜索,因为这个模型的可移植性很好。

  2. 并非所有问题都需要长程的、全局的依赖的,也有很多问题只依赖于局部结构,这时候用纯 attention 也不大好,之后可以将attention和RNN和CNN结合。

  3. 让生成具有更少的顺序性是我们的另一个研究目标。

摘要翻译

The dominant sequence transduction models are based on complex recurrent orconvolutional neural networks in an encoder and decoder configuration. The best performing such models also connect the encoder and decoder through an attentionm echanisms. We propose a novel, simple network architecture based solely onan attention mechanism, dispensing with recurrence and convolutions entirely.Experiments on two machine translation tasks show these models to be superiorin quality while being more parallelizable and requiring significantly less timeto train. Our single model with 165 million parameters, achieves 27.5 BLEU onEnglish-to-German translation, improving over the existing best ensemble result by over 1 BLEU. On English-to-French translation, we outperform the previoussingle state-of-the-art with model by 0.7 BLEU, achieving a BLEU score of 41.1.

​ 序列翻译模型里面主流的方法是在编码器和解码器配置中使用复杂的循环或者卷积神经网络。这些模型中性能最好的还使用注意力机制讲编码器和解码器连接起来。我们提出了一个新的简单的网络架构,Transformer,该模型仅基于注意力机制,完全摒弃了循环和卷积网络。两个机器翻译的实验显示这些模型达到了相当好的质量,并且能更好的并行、需要明显少的训练时间。在 WMT 2014 英语-德语翻译任务中我们的模型达到了 28.4 BLEU ,该结果改进了现存的最好结果(包括使用集成学习的方法),改进后的结果高了 2 BLEU。在 2014 年 WMT 英法翻译任务中,我们的模型建立了新的单模型 soat ,BLEU 得分为 41.8 分 ,该结果是在八块显卡上训练了 3.5 天的结果,这只是文中最好的模型训练成本的一小部分。我们展示了 Transformer 能够很好的泛化到其他的任务中,这部分我们通过成功的应用该模型到英文组分文法解析展示(大小数据集都使用了)。

结论

​ 在文章中,提出了 Transformer,这是第一个完全基于注意力的序列转导模型,用多头自注意力替换编码器-解码器架构中最常用的循环层。对于翻译任务,Transformer 可以比基于循环或卷积层的架构快得多。在 WMT 2014 英语到德语和 WMT 2014 英语到法语翻译任务上,我们达到了最新的技术水平。在前一项任务中,我们最好的模型甚至优于所有先前报告的集合。对基于注意力的模型的未来感到兴奋,并计划将它们应用于其他任务。计划将 Transformer 扩展到涉及文本以外的输入和输出模式的问题,并研究本地、受限的注意力机制来有效地处理大型输入和输出,例如图像、音频和视频。使生成不那么顺序是另一个研究目标。

模型架构

​ 模型的整体结构如下图所示。

​ 整个Transformer模型可以分为四个部分:输入层、encode层、decode层和输出层。如下图所示。

工作流程

  1. 获取输入句子的每一个单词的表示向量 XX由单词的 Embedding 和单词位置的 Embedding 相加得到。

  2. 将得到的单词表示向量矩阵 (如上图所示,每一行是一个单词的表示 x) 传入 Encoder 中,经过 6 个 Encoder block 后可以得到句子所有单词的编码信息矩阵 C,如下图。单词向量矩阵用 **X(n×d)**表示, n 是句子中单词个数,d 是表示向量的维度 (论文中 d=512)。每一个 Encoder block 输出的矩阵维度与输入完全一致。

  3. 将 Encoder 输出的编码信息矩阵 C传递到 Decoder 中,Decoder 依次会根据当前翻译过的单词 1~ i 翻译下一个单词 i+1,如下图所示。在使用的过程中,翻译到单词 i+1 的时候需要通过 Mask (掩盖) 操作遮盖住 i+1 之后的单词。

    上图 Decoder 接收了 Encoder 的编码矩阵 C,然后首先输入一个翻译开始符 ““,预测第一个单词 “I”;然后输入翻译开始符 ““ 和单词 “I”,预测单词 “have”,以此类推。

整体理解

从高维度看….

​ 首先将模型看成一个黑盒,再机器翻译应用程序中,它会用一种语言获取一个句子,然后用另一种语言输出翻译结果。

​ 如果打开这个黑盒,将会看到一个编码器和一个解码器,他们之间还有一个连接。

​ 编码器(encoder)由6个编码器堆成(原论文中是6个),解码器(decoder)是一个由具有相同个数解码器的堆组成。

​ 编码器在结构上都是相同的(但它们不共享权重)。每个子层都分为两个子层:

​ 编码器的输入首先经过自注意层(Self-Attention),这个层的作用是,再编码一个特定的单词时,帮助编码器查看输入句子中的其他单词。自注意层的输出送入前馈神经网络(Feed Forward Neural Network),每个位置的前馈神经网络都是完全相同的。解码器也具有这些层,但他们之间有一个注意力层帮助解码器关注输入句子中的相关部分。

图解向量/张量

​ 与一般的NLP应用程序一样,首先使用embedding algorithm嵌入算法将每一个单词都转化为一个向量。

![](embeddings (1).png)

​ 每个单词都嵌入到大小为 512 的向量中。我们将用这些简单的框来表示这些向量。

​ embedding只在最下层的编码器中发生。在每个编码器中都会发生这个抽象的过程,他们都接受512维的向量——也就是说,在最底层的解码器,它接受的是512维的单词embedding,在其他编码器中,它直接接受下层的编码器的输出。这个列表的大小是我们可以设置的超参数——基本上就是我们训练数据集中最长的句子的长度。

​ 在我们对我们输入句子中的单词embedding后,它们都会流经编码器中的两层结构。

​ 现在我们开始关注Transformer的一个关键属性,就是每个位置的单词都只从他自己的路径通过,在自注意层这些路径之间有依赖度,但在前反馈层并没有这些依赖。但是这些路径在经过前反馈层时可以并行处理。

​ 接下来,我们将会将例子变为一个短句子,我们看看在每个子层发生了什么。

Encoding

​ 如同我们上面所介绍的,一个编码器接收一系列向量作为输入。它通过将这些向量传递到自注意层来处理,然后进入前馈神经网络,然后将输出发送到下一个编码器。

​ 每个位置的单词都经过一个自注意的过程。然后,它们各自通过一个前馈神经网络——完全相同的网络,每个向量分别流经它。

大致看一下自注意机制

​ 假设下面的句子是我们想要翻译的输入句子:

1
” The animal didn’t cross the street because it was too tired ”

​ 这个句子中的“it”指的是什么?是指街道还是指动物?这对人类来说是个简单的问题,但对算法来说就没那么简单了。

​ 当模型在处理“it”这个词时,自注意机制让它把“it”和“animal”联系起来。

​ 当模型处理每个单词(输入序列中的每个位置)时,自注意机制允许它查看输入序列中的其他位置,以寻找有助于更好地编码这个单词的线索。

​ 如果你熟悉RNN,想想看如何保持一个隐藏状态使得RNN将它处理过的前一个单词/向量的表示与它正在处理的当前单词/向量结合起来的。Self-attention是Transformer用来将其他相关词汇的“理解”转化为我们当前正在处理的词汇的方法。

​ 当我们在编码器#5中编码单词“it”(堆栈中的顶部编码器)时,注意力机制的一部分关注于“the Animal”,并将其表现形式的一部分整合到“it”的编码中。

​ 一定要去查查 Tensor2Tensor notebook 看看你如何能加载一个Transformer模型,并且利用这个交互式可视化来检验一下它。

详细的看看自注意机制

​ 让我们先看看怎么使用向量计算自注意力,然后看看它是怎样实现的——使用矩阵

​ 计算自注意力的第一步时为编码器的每个输入向量创建三个向量(在本例中为每个单词的嵌入)。因此,对于每个单词,我们创建一个Query向量、一个Key向量和一个Value向量。这些向量是通过将嵌入乘以我们在训练过程中训练的三个矩阵来创建的。

​ 注意这些新的向量比embedding向量的维度要小,他们的维度是64,然后embedding和编码器的输入/输入向量有512个维度。他们没有必要相似,这是一个结构选择,可以使多线程注意力的计算保持不变(大部分)。

​ “query”, “key”, 和“value”向量都是指什么?它们是有助于自注意力的计算与思考的抽像概念。 第二步是计算分数。我们在计算这个例子中的第一个词“Think”的Self-Attention。我们需要将输入句子中的每个单词与这个单词进行评分。当我们在某个位置编码一个单词时,分数决定了对输入句子的其他部分的关注程度。

​ 分数是通过取查询向量与我们评分的各个单词的键向量的点积来计算的。如果我们在处理1号位置的单词的Self-Attention,第一个分数是q1和k1的点积。第二个分数是q1和k2的点积。

第三和第四步是将分数除以8(原论文中使用的关键向量维数64的平方根),这就产生了更稳定的梯度。这里可能有其他可能的值,但这是默认值,然后通过一个softmax操作传递结果。Softmax将分数标准化,所以它们都是正的,加起来等于1。

​ 这个softmax分数决定了在这个位置上每个单词将表达多少。显然,在这个位置的单词将有最高的softmax分数,但有时关注与当前单词相关的另一个单词是有用的。

第五步 将每个值向量乘以 softmax 分数(准备将它们相加)。直觉上来讲,应该保持我们想要关注的单词的值不变,并忽略不相关的单词(例如,将它们乘以像 0.001 这样的小数字)。

第六步将这些加权后的值向量进行求和,这便产生了这个位置的自注意层的输出(对于第一个单词)

​ 这就是自注意计算的结论。这里得到的向量是我们可以发送给前馈神经网络的向量。然而,在实际实现中,这种计算以矩阵形式进行,以获得更快的处理速度。现在我们已经直观地理解了单词层面上的计算,接下来来看一下矩阵层面的计算。

自注意力机制的矩阵计算

第一步是计算Query、Key、Value矩阵。我们将embedding向量组合到一个矩阵X中,然后将其乘以我们训练的权重矩阵(WQ, WK, WV)

​ X 矩阵中的每一行对应于输入句子中的一个单词,可以看到嵌入向量的大小差异

最后,因为我们处理的是矩阵,所以我们可以把上面第2步到第6步的过程压缩到一个公式中,来计算自注意层的输出。

​ 自注意力机制的结构如图所示。

一只有许多只手的野兽(多头机制)

​ 论文进一步细化了自注意层,增加了一个“多头”注意机制。这从两个方面提高了注意层的性能:

  1. 它拓展了模型注意不同位置的能力。在上面的例子中,z1只包含了其他所有编码的一小部分,但是它可能只是被自己自身完全决定。如果我们要翻译像“The animal didn’t cross the street because it was too tired”这样的句子,它会很有用,因为我们想知道“it”指的是哪个词。
  2. 它给了注意层多个“表征子空间”。如我们接下来将看到的一样,在多头注意力机制下,我们不仅具有一个,而是具有多个Query/Key/Value的权重矩阵(Transformer使用了8个注意力头,所以我们最后对于每个编码器/解码器都具有8组)。每一组都将随机初始化。然后,在训练之后,每一组都被用来将初始输入的嵌入向量(或者是来自更低一层的编码器/解码器)投影到一个不同的表征子空间。

​ 在多头注意力机制下,我们对于每一个head保持完全分离的Q/K/V权重矩阵,最后得到完全不同的Q/K/V矩阵。如我们之前所述,我们通过对X乘以WQ/WK/WV来产生Q/K/V矩阵

​ 如果我们做如上所述的同样的自注意计算,只是用不同的权重矩阵进行8次不同的计算,我们最终得到8个不同的Z矩阵。

​ 这给我们造成了一点挑战。前馈层不需要8个矩阵——它只需要1个矩阵(也就是每个词一个向量)。所以我们需要一个将8个矩阵变为一个的方式。我们怎么办呢?我们可以将这8个矩阵叠放,然后用一个额外的权重矩阵WO来乘以他们。

![](transformer_attention_heads_weight_matrix_o (1).png)

​ 以上全部就是多头注意力机制的全部内容了。我承认,这里面有很多很多的矩阵,我们把他们放在一张图上面在这些我们就可以一次看清了。

​ 多头注意力机制的结构图如下所示。

​ 既然我们现在已经接触过了多头注意力机制,让我们重新回顾一下我们之前的例子,来看看不同的注意力头在关注着什么。

^: 当我们编码"it"的时候,一个注意力头最关注于“the animal”,然而另外一个关注于“tired”——某种意义上来讲,模型对单词“it”的表征同时体了“animal”和“tired”。

​ 如果我们把所有的注意力头都加入,这样就很难解释了。

使用位置编码表示序列的顺序

​ 到目前为止,我们所描述的模型还缺少一种解释输入序列中单词顺序的方法。

​ 为了实现标记序列中的单词顺序,Transformer为每个输入的embedding添加了一个向量。这些向量遵循着一种从模型中学习到的特定的模式,这有助于它确定每一个单词的位置,以及他们在句子之间的远近。直觉上看,可以通过给嵌入向量增加这些向量,在计算Q/K/V向量和点乘注意力机制过程中,提供有意义的嵌入向量的距离。

^: 为了让模型了解单词的顺序,我们添加了位置编码向量 - 其值遵循特定的模式。

​ 如果我们假设embedding有4个维度,实际上的位置编码将如下图所示。

残差

​ 在我们继续之前,编码器结构的一个细节我们需要注意的是,对于每个编码器中的每一个子层(self-attention,ffnn)都具有一个残差连接,这一步是通过 layer-normalization实现的。

如果我们将与自注意力相关的像乱搞与正则层操作可视化,它看起来将如下图所示。

​ 这也适用于解码器的子层。如果我们考虑一个包含2个堆叠的编码器和解码器的Transformer,它看起来应该是这样的:

解码器部分

​ 既然我们已经介绍了编码器方面的大部分概念,我们基本上也知道了解码器的组件是如何工作的。但让我们看看它们是如何一起工作的。

​ 编码器首先处理输入序列。然后,顶部编码器的输出被转换为一组注意向量K和V,这些将被每个解码器在其“编码器-解码器注意”层中使用,帮助解码器关注输入序列中的适当位置:

​ 下面的步骤重复这个过程,直到到达一个特殊的符号,表示Transformer解码器已经完成了它的输出。每个步骤的输出在下一个时间步骤中被提供给底部解码器,解码器冒泡他们的解码结果,就像编码器所做的。就像我们对编码器输入所做的那样,我们在这些解码器输入中嵌入并添加位置编码,以表示每个单词的位置。

​ 解码器中的自注意层与编码器中的自注意层的操作方式略有不同:

​ 在解码器中,自注意层只允许关注输出序列中较早的位置。这是通过在self-attention计算的softmax步骤之前屏蔽未来的位置(将它们设置为-inf)来实现的。

​ “编码器-解码器注意”层的工作方式就像多头自注意一样,除了它从下面的层创建队列矩阵,并从编码器堆栈的输出中获取键和值矩阵。

第一个 Multi-Head Attention

​ Decoder block 的第一个 Multi-Head Attention 采用了 Masked 操作,因为在翻译的过程中是顺序翻译的,即翻译完第 i 个单词,才可以翻译第 i+1 个单词。通过 Masked 操作可以防止第 i 个单词知道 i+1 个单词之后的信息。下面以 “我有一只猫” 翻译成 “I have a cat” 为例,了解一下 Masked 操作。

​ 下面的描述中使用了类似 Teacher Forcing 的概念,不熟悉 Teacher Forcing 的童鞋可以参考一下Seq2Seq 模型详解。在 Decoder 的时候,是需要根据之前的翻译,求解当前最有可能的翻译,如下图所示。首先根据输入 ““ 预测出第一个单词为 “I”,然后根据输入 “ I” 预测下一个单词 “have”。

​ Decoder 可以在训练的过程中使用 Teacher Forcing 并且并行化训练,即将正确的单词序列 ( I have a cat) 和对应输出 (I have a cat ) 传递到 Decoder。那么在预测第 i 个输出时,就要将第 i+1 之后的单词掩盖住,**注意 Mask 操作是在 Self-Attention 的 Softmax 之前使用的,下面用 0 1 2 3 4 5 分别表示 “ I have a cat “**。

第一步:是 Decoder 的输入矩阵和 Mask 矩阵,输入矩阵包含 “ I have a cat” (0, 1, 2, 3, 4) 五个单词的表示向量,Mask 是一个 5×5 的矩阵。在 Mask 可以发现单词 0 只能使用单词 0 的信息,而单词 1 可以使用单词 0, 1 的信息,即只能使用之前的信息。

第二步:接下来的操作和之前的 Self-Attention 一样,通过输入矩阵 X计算得到 Q, K, V 矩阵。然后计算 QKT 的乘积 QKT。

第三步:在得到 QKT 之后需要进行 Softmax,计算 attention score,我们在 Softmax 之前需要使用 Mask矩阵遮挡住每一个单词之后的信息,遮挡操作如下:

​ 得到 Mask QKT 之后在 Mask QKT 上进行 Softmax,每一行的和都为 1。但是单词 0 在单词 1, 2, 3, 4 上的 attention score 都为 0。

第四步:使用 Mask QKT 与矩阵 V相乘,得到输出 Z,则单词 1 的输出向量 Z1 是只包含单词 1 信息的。

第五步:通过上述步骤就可以得到一个 Mask Self-Attention 的输出矩阵 Zi,然后和 Encoder 类似,通过 Multi-Head Attention 拼接多个输出 Zi 然后计算得到第一个 Multi-Head Attention 的输出 ZZ与输入 X 维度一样。

第二个 Multi-Head Attention

​ Decoder block 第二个 Multi-Head Attention 变化不大, 主要的区别在于其中 Self-Attention 的 K, V矩阵不是使用 上一个 Decoder block 的输出计算的,而是使用 Encoder 的编码信息矩阵 C 计算的。

​ 根据 Encoder 的输出 C计算得到 K, V,根据上一个 Decoder block 的输出 Z 计算 Q (如果是第一个 Decoder block 则使用输入矩阵 X 进行计算),后续的计算方法与之前描述的一致。

​ 这样做的好处是在 Decoder 的时候,每一位单词都可以利用到 Encoder 所有单词的信息 (这些信息无需 Mask)。

最后的线性与Softmax层

​ 解码器堆最终输出的是一个浮点数向量,该如何将其变成一个单词?这就是最后一个Linear层的工作,后面是一个Softmax层。

​ 线性层是一个简单的完全连接的神经网络,它将解码器堆产生的向量投射到一个更大的向量中,称为logits向量。

​ Softmax层再将这些分数化为概率(都是正的。所有概率相加得1)。选择概率最高的单元格,并生成与之相关的单词作为这个时间步长的输出。

训练的回顾

​ 既然我们已经通过一个经过训练的Transformer介绍了整个前向传递过程,那么接下来我们看看如何对这个模型进行训练

​ 在训练期间,未经训练的模型将经历完全相同的向前传递。但是因为我们是在一个标记的训练数据集上训练它,所以我们可以将它的输出与实际正确的输出进行比较。

​ 为了将这个过程可视化,我们假设输出词汇只包含六个词(“a”, “am”, “i”, “thanks”, “student”, and “” (short for ‘end of sentence’)))

​ 一旦定义了输出词汇表,就可以使用相同宽度的向量来表示词汇表中的每个单词。这也被称为一次性编码(one-hot encoding)。例如,我们可以用下面的向量来表示单词“am”:

​ 接下来,让我们讨论模型的损失函数——我们在训练阶段优化的度量,以形成一个经过训练的、希望非常精确的模型。

损失函数

​ 假设我们正在训练模型。说这是我们训练阶段的第一步,我们用一个简单的例子来训练——把“merci”翻译成“thanks”。

​ 这意味着,我们希望输出是一个表示“谢谢”这个词的概率分布。但由于这种模式尚未经过训练,目前还不太可能实现。

​ 如何比较两种概率分布?我们只需要把一个和另一个相减。要了解更多细节,请查看交叉熵 cross-entropy和Kullback-Leibler散度Kullback–Leibler divergence

​ 但请注意,这是一个过于简化的示例。更实际的是,我们会使用比一个词更长的句子。例如-输入:” je suis étudiant “,期望输出:” i am a student “。这真正的意思是,我们想要我们的模型连续输出概率分布如下:

  • 每个概率分布都由一个宽度为vocab_size的向量表示(在我们的简单示例中是6,但更实际的数字是30,000或50,000)

  • 第一个概率分布在与单词“i”相关的细胞中具有最高的概率

  • 第二个概率分布在细胞中与” am “相关的概率最高

  • 以此类推,直到第5个输出分布表示“<句子结束>”符号,该符号还具有10,000个元素词汇表中与之相关联的单元格。

​ 在一个足够大的数据集上训练模型足够长的时间后,我们希望产生的概率分布会像这样。

^: 希望经过训练,模型将输出我们期望的正确翻译。当然,这并不能真正表明这个短语是否是训练数据集的一部分(参见:交叉验证)。请注意,每个位置都有一点概率,即使它不太可能是该时间步的输出 - 这是softmax的一个非常有用的属性,有助于训练过程。

​ 现在,因为模型每次产生一个输出,我们可以假设模型从概率分布中选择概率最高的单词,然后扔掉其他的。这是一种方法(称为贪婪解码greedy decoding)。另一种方法是保留最上面的两个单词(例如,‘I’和‘a’),然后在下一步中,运行模型两次:一次假设第一个输出位置是单词“I”,另一次假设第一个输出位置是单词“a”,考虑到位置#1和#2,哪个版本产生的误差较小就保留哪个版本。我们对第2和第3个位置重复这一点。这种方法称为“beam search”,在我们的示例中,beam_size是2(意味着在内存中始终保存两个部分假设(未完成的翻译)),top_beams也是2(意味着我们将返回两个翻译)。这些都是可以实验的超参数。

总结

  • Transformer 与 RNN 不同,可以比较好地并行训练。
  • Transformer 本身是不能利用单词的顺序信息的,因此需要在输入中添加位置 Embedding,否则 Transformer 就是一个词袋模型了。
  • Transformer 的重点是 Self-Attention 结构,其中用到的 Q, K, V矩阵通过输出进行线性变换得到。
  • Transformer 中 Multi-Head Attention 中有多个 Self-Attention,可以捕获单词之间多种维度上的相关系数 attention score。

参考文献与资料

  1. The Illustrated Transformer – Jay Alammar – Visualizing machine learning one concept at a time. (jalammar.github.io)
  2. Transformer 模型详解 (baidu.com)
  3. The Annotated Transformer (harvard.edu)
  4. 史上最小白之Transformer详解_Stink1995的博客-CSDN博客
  5. https://arxiv.org/abs/1706.03762