Transformer与self-attention间的关系

Transformer 是一种基于 self-attention 机制的深度学习架构,主要用于自然语言处理任务。Transformer 的典型结构包括编码器(Encoder)和解码器(Decoder),其中每个编码器和解码器层都使用了 self-attention 机制。

使用 self-attention 的 Transformer 模型可以比传统的递归神经网络(RNN)并行计算,更加高效,并且能够捕捉到丰富的上下文关系。

什么是Transformer?

Transformer是一种处理seq2seq的模型,并且输出的seq长度未知,由机器自己决定。常用的应用有语音转文字、机器翻译这种

Transformer架构的基本组成:

image-20250110233040630

Encoder

对于编码器而言,其目标是输入一串向量,输出为同样长度的一串向量,能做到这件事的有很多种方式,比如RNN、CNN、self-attention等。在Encoder中,我们使用的是self-attention。


Encoder的基本结构是这样的:

image-20250115150419280

这里的每一个Block里都有多个layer,在transformer中每个Block的具体实现如下:

image-20250115154051379

具体而言是这样的:

image-20250115151036941
  • 每个self-attention层的输出变成了其原先的输出+输入,这种操作称为残差连接(residual connection),随后把这个新输出进行一遍layer norm(与batch norm不同),这样得到的输出导入下面的FC层
  • 在FC层中,同样要进行残差连接和layer norm,最后得到的输出才是该Block的输出

当然上述Encoder的设计是最原版的,并不一定是最优的

Decoder

自回归解码器 Autoregressive-Decoder

首先,对于Decoder的输出而言,首先要确定一个词汇表:

image-20250116135336493
  • 该词汇表是一个长度为V的向量,各元素是我想要输出的东西,右边的数字是每个元素出现的概率。这些数字是经过softmax的,所以其和为1。

    当然概率最大的元素就是最终的输出。

  • 例如要输出的是中文,那这个向量可以是全部的中文字

  • 如果输出的是英文,那这个向量可以是字母、单词、subword等

image-20250116140530631

在运行过程中,首先Encoder会通过某种方式将其输出加载进Decoder中。然后Decoder会被输入一个token叫BEGIN,这个BEGIN代表开始功能。随后,有BEGIN导出的第一个输出又会作为输入:

image-20250116140750904

此时的输入是BEGIN和上一次的输出

循环往复做下去,最终达到的结果是这样的:

image-20250116140956595

下面叙述一下Decoder内部在干什么:

image-20250116225429

实际上Decoder在做的事和Encoder很类似,除了这里的self-attention层用的是masked版本。对于Decoder而言,其某个向量的输出只需要考虑该向量的输入和在该向量之前的所有向量的输入,不需要考虑所有输入向量(其实也没法考虑)


Decoder是如何确定自己的输出长度是多少的?

如果始终保持上面提到的算法,那么在输入“习”字以后,又会产生新的输出;这样就会根本停不下来。为了解决这个问题,我们需要在原来的词汇表中增加一个END字符来表示输出结束。

image-20250117001036346

当输入“习”以后,其输出中END字符的概率应该最大。

非自回归解码 Non-autoregressive Decoder

image-20250117001338578

NAT的Decoder是将一排BEGIN作为输入,一步到位生成输出的句子。


既然AT是通过END字符来控制输出的长度,那NAT是通过什么方式来控制的?

  • 一种方式是再加一个预测器,这个预测器的输入是Encoder的输出,输出是预测的Decoder的输出长度

  • 另一种方式是:首先确定可能是输出最长长度(比如说N),那我就只需要输入N个BEGIN即可。随后观察到哪个BEGIN的输出是END,就把END以后的输出都丢弃即可。

    image-20250117002201609

NAT相比AT而言,有如下优势:

  • AT是后一个的输入依赖前一个的输出,而NAT则不需要,因此可以并行执行
  • NAT还可以方便地控制输出的长度

交叉注意力Cross Attention

Cross Attention是连接Encoder和Decoder的桥梁,下面介绍Encoder的输出是如何传递到Decoder中去的。

image-20250117002845148 image-20250117002916402

在最原版的transformer中,Decoder的每一层所用到的都是Encoder的最终输出。实际上各种变体还是很多的,比如Decoder每层看Encoder对应层、Decoder第一层看Encoder最后一层,Decoder第二层看Encoder倒数第二层······。

如何训练Transformer

transformer的训练实际上与分类问题一致。每一个输出的汉字都是一个one-hot的向量,我们的目标是让这个one-hot向量和Decoder输出的概率分布向量的cross entropy最小。

image-20250117005703194

当多个向量输入时,我们就要使得所有向量的cross entropy的总和最小。

要注意还有END这个特殊字符

image-20250117005911858

在这里Decoder的输入是“正确答案”,这种训练方式叫Teacher forcing