L
O
A
D
I
N
G

神经网络学习笔记Day9——Transformer


Transformer

Attention Is All You Need

参考链接:

如何最简单、通俗地理解Transformer? - 知乎 (zhihu.com)

一、整体结构

Transformer由编码器(Encoder)和解码器(Decoder)组成,其中编码器用于学习输入序列的表示,解码器用于生成输出序列。

img

1.1如何做文本表示

在Transformer模型中,首先会对输入文本进行处理以得到合适的表示,从而使计算机能够理解输入的内容。

这个过程就是编码,具体步骤如下:

  1. 词嵌入(Word Embedding):文本中每个单词都被转换为一个高维向量。这个转换通常是通过预训练的词嵌入模型(如Word2Vec、GloVe等)完成的。

  2. 位置嵌入(Positional Embedding):标准的Transformer模型没有内置的序列顺序感知能力,因此需要添加位置信息。这是通过位置嵌入完成的,它与词嵌入具有相同的维度,并且与词嵌入相加。

    如果没有位置嵌入,输入的句子语序可能会错乱。

  3. 相加(Addition):词嵌入和位置嵌入相加,得到一个包含文本信息和位置信息的新的嵌入表示。最终得到输入的Transformer表示x,这样模型就知道每个单词不仅是什么,还能知道它在序列中的位置。

举个例子:

通过这样一个处理过程,模型就可以认识“扬帆远航”这样的一个输入。

对于Transformer的输入处理部分,从架构图上可以看出编码器和解码器都有输入,why?

这是因为Transformer模型中,编码器和解码器各自有独立的输入。通常,在有监督学习的场景下,编码器负责处理输入样本,而解码器处理与之对应的标签。这些标签在进入解码器之前同样需要经过适当的预处理。这样的设置允许模型在特定任务上进行有针对性的训练。(?或者Decoder输入的是之前预测出来的内容?)

可以通过一个简单的机器翻译任务说明这个概念,假设有以下的英语到法语的翻译对:

  • 英语(输入样本):”Hello, world”
  • 法语(标签):”Bonjour, monde”

在该示例中,编码器会接收”Hello, world”这个句子作为输入。这个句子首先会被转换成一组词向量或字符向量,然后进入编码器进行处理。

与此同时,解码器会接收与”Bonjour, monde”对应的标签作为输入。同样地,这些标签首先会被转换成一种机器可理解的表示,然后进入解码器。

编码器处理完输入样本后,它的输出会与解码器的输入进行某种形式的结合,以生成最终的翻译输出。通过这个机制,模型可以在有监督的学习环境中进行训练,以完成机器翻译等特定任务。

1.2如何理解Encoder

Transformer中的编码器部分,作用是学习输入序列的表示(上下文),如下图所示:

在Transformer模型的编码器部分,数据处理流程如下:

  1. 首先,输入数据会被送入注意力机制进行处理,这里会给数据里的每一个元素(字or词)打分,以决定其重要性,该步骤完成后,会有一些新的数据生成。
  2. 接着,会执行”Add”操作,将注意力机制中产生的新数据和原始输入数据通过简单加法合并。”Add”表示残差连接,这一操作的主要目的是确保数据经过注意力机制处理后的效果至少不逊于直接输入的原始数据。
  3. 下来,数据会经过叫做“层归一化”(Norm)的简单数学处理,主要是为了让数据更稳定。之后,数据将会进入一个双层的前馈神经网络。这里的目标是将经过注意力处理的数据映射回其原始的维度,以便于后续处理。这是因为编码器会被多次折叠,所以需要确保数据的维度在进入下一个编码器前是一致的。简单来说:就是把前面所有处理的数据变回原来的形状和大小。
  4. 最后,为了准备数据进入下一个编码器,数据会再次经过”Add”和”Norm”操作,输出一个经过精细计算和重构的词向量表示。

这样的设计确保了模型在多个编码器层之间能够有效地传递和处理信息,同时也为更复杂的计算和解码阶段做好了准备。简单来说,Transformer的编码器就是通过这些步骤来理解和处理输入数据,然后输出一种新的,更容易理解的数据形式。如图:

1.3如何理解Decoder

Transformer中的解码器部分,作用是用于生成输出序列,位置如下图:

该部分的数据处理流程如下:

  1. 数据首先进入一个带遮罩(masked)的注意力机制网络,这个遮罩的作用是确保解码器只能关注到它之前已经生成的词,而不能看到未来的词。

  2. 然后,这一层输出的信息会与来自Encoder部分的输出进行融合。这两部分的信息会再次经历一个注意力机制的处理,从而综合考虑编码与解码的内容。

  3. 下来,解码器的操作和编码器部分大致相同。数据会经过层归一化、前馈神经网络和第二次层归一化,最终输出一个词向量表示。输出的词向量首先会通过一个线性层,目的是将向量映射到预先定义的词典大小,从而准备词预测。

  4. 最后,使用softmax函数计算每个词的生成概率。最终,选取概率最高的词作为该时刻的输出。

    假设有一个很小的字典,只有三个词:”apple”,”banana”,”cherry”。线性层会将这个三维向量转换成另一个三维向量(对应“词典”大小)。假设转换后的向量是[2.5, 1.0, -0.5]。通过softmax函数,这个向量会转换为概率分布,比如[0.8, 0.18, 0.02]

    这就意味着模型认为下一个词是”apple”的概率为80%。

这样,Decoder不仅考虑了之前解码生成的词,还综合了Encoder的上下文信息,从而更准确地预测下一个词。

二、注意力机制

2.1Attention计算的物理原理?

为何这样得到的$QK^T$表示了词与词之间关系的紧密程度?

因为在计算矩阵乘法的时候,计算的是向量对应元素乘积之和,这种计算方式就是向量内积的计算方式。

考虑向量内积的几何意义:内积越大,两个向量就越趋向平行的关系,也就表示两个向量更加相似;当内积为0时,两个向量就会呈现垂直的关系,表示两个向量毫不相关。

对于Attention机制中这种Q和K一问一答的形式,问的就是两个词关系的紧密程度,所以也就可以通过求内积来衡量。

2.2“自”注意的来源

之所以称为自注意,是因为该机制在询问紧密关系时也对自己进行了询问,并且自己也给出了回答。这样就可以把它自己在句子中的重要性也表现出来,对自己的信息进行重构,从而更容易改变自己原有的意思,找到更加准确的意思。

三、Decoder如何做生成式输出

Transformer的Decoder部分与Encoder部分有许多相似之处,但也存在一些关键的差异。Decoder增加了一个额外的注意力层。此外,它还会整合Encoder的输出信息。

Transformer模型中的解码器,主要任务是预测下一个输出词,所以被称为生成式模型。

我们可以用一个机器翻译任务为例:

假设有一条中英双语训练样本:我是一名学生 -> I am a student

解码器开始工作时,它需要一个初始的输入来启动预测过程。但是,为了预测第一个词”I”,解码器没有之前的上下文。因此,需要为其引入起始符<s>作为初始输入。此时目标序列被调整为<s>, I, am, a, student

解码过程如下:

  • 输入起始符<s>到解码器。
  • 通过Attention机制,解码器对编码器的输出(“我是一名学生”的表示)进行注意,并进行融合。
  • 基于起始符和编码器的融合输出,解码器预测第一个词”I”。
  • 接下来,”I”和<s>都会被用作已知信息,再次输入到解码器。
  • 解码器继续通过Attention机制对编码器的输出进行注意,预测下一个词”am”。
  • 不断重复,直到预测出整个序列。

3.1Decoder中的Attention和Encoder中的Attention之间的不同

首先在名称上就能发现它们的区别。在Decoder中,首先遇到的是“Masked Attention”,那它有什么不同呢?在Transformer的解码阶段,每个词都是逐个生成的。

例如,当预测”am”时,模型不应该提前“知道”或“看到”接下来的”a student”

这就是一条时间线,在预测一个特定的词时,不能预知它之后的词汇,因为在实际情境中,那部分尚未发生。为了确保模型在当前时间点不会受到未来词汇的干扰,解码器采用掩码操作。从而使得模型在处理某个词时,后续所有的词都会被遮挡,确保模型只基于已知的上下文进行预测。

拆解成Decoder内部的计算过程,是这样的:

首先,准备输入数据矩阵(由标签加上起始符组成)和遮挡矩阵(Mask矩阵)。如图:

遮挡矩阵的设计是为了确保在计算时,被遮挡的部分(上半部分)得到的是一个较小的值,使其对结果影响最小。

具体地说:

考虑遮挡矩阵的第一行,它表示预测第一个词时的情况。此时,模型只知道起始符<s>,对于当前预测的词及之后的词是不知道的。这意味着模型预测第一个词时只能依赖于起始符,后面每一行也都类似。

然后经过和Encoder一样的Q,K,V计算过程

得到$QK^T$矩阵后(表示词与词之间的紧密关系),与之前准备的Mask矩阵做按位相乘,如图:

注意这个相乘是按位相乘,也就是每个对应元素进行相乘。

为了直观理解,可以设想mask矩阵的遮挡部分都是0,未遮挡部分都是1。那么,在这种按位相乘之后,被遮挡的部分在结果中对应位置就是0。

举例如下:

在计算得到Mask $QK^T$矩阵后,对其进行Softmax操作。此时,每一行的元素和都会等于1。对于单词0,其在单词1、2、3和4上的Attention Score都是0。

最后,将Softmax的结果与Value矩阵V相乘以获取注意力加权的输出,这个输出Z就是Decoder的Masked Self-Attention部分的结果,如下:

3.2什么是Cross Attention

经过Masked Attention后,要进入第二个Attention,这个Attention不再是单纯的自注意力机制,而是Cross Attention,如下:

为什么需要Cross Attention?因为编码器持有了输入序列的信息(例如“我是一个学生”),而解码器的目标是在给定该输入时产生正确的输出序列。为了实现这一点,解码器需要对编码器输出的所有信息都有所了解,从而知道下一个输出词应该是什么。

Cross Attention的操作方式和普通的注意力机制非常类似,但是Q来自于解码器的输出,而K和V来自于编码器的输出。这确保了解码器可以“询问”编码器有关输入序列的信息。这种“一问一答”的描述非常形象,说明了解码器是如何利用编码器的信息来确定最合适的输出。

例如,在进行“我是一个学生”到”I am a student”的翻译时,解码器可能会询问编码器:“根据你对’我’的理解,接下来我应该输出时什么?”通过这种方式,解码器可以更准确地预测目标序列的下一个词。

可以理解为Masked Self-Attention是“自己对话”的方式,确定应该问什么问题。Cross-Attention则是“交叉对话”的方式,向编码器提问。

在Decoder的这种Cross Attention之后,模型将继续进行与Encoder部分相似的处理流程,包括多次注意力计算和前馈神经网络操作。当Decoder的这些步骤全部完成后,输出会进入一个线性层进行映射。这个映射层的作用是把Decoder的输出转化为与字典大小相同的向量。接着,这个向量会经过Softmax层,转换为概率分布。最后可以根据这个概率分布选择概率最大的词作为输出。

至此,Transformer的工作流程就已经完成。


文章作者: 叁月柒
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 叁月柒 !
评论
  目录