2017年,Google Brain发表了一篇具有开创意义的论文《Attention is All You Need》,这篇论文提出了Transformer神经网络训练架构。自此之后,这种架构成为大语言模型架构的祖先。虽然现代GPT架构和Transformer已有很大差别,但从第一性原理来看,了解Transformer架构本身仍然具有重大意义。

这篇文章主要讲一下我理解的Transformer架构的流程。在介绍流程之前,得先理清一下Transformer的作用。Transformer相当于一个黑盒子,你可以将大量的文本输入到这个黑盒子中,然后Transformer会识别文本的语义结构,输出新的、流畅的、有语义的文本。

Transformer分两个层面:一层是它的训练过程,当我们说它的架构时,其实更多是在说它的训练过程;另一层是它的使用,比如当我们输入一句话,它会输出相应的回答。

所以这篇文章讲的是Transformer是怎么被训练出来的,怎么通过输入大量的文本,通过不断地调参,最终形成一个像超级复杂的函数。这个函数可以输入一句话,读懂你话里面的语义、关系和含义,然后根据这句话输出上下文相关的、语义连贯的文本。

输入

Transformer的输入就是大量的文本,比如一句话。我们以简单的例子来看。从语言学上来看,文本可以分解成词语、句子和语义,甚至还有语境。

Transformer是在计算机里面训练的一个模型,所以当它接收到输入时,必须将文本量化成计算机可以理解的形式。

计算机可以理解什么呢?最本质的那一层就是0和1的数字。再往上抽象一层,就是数据结构,比如字符串、数字,还有对象。除了数据结构本身,还有算法——程序性的算法。

所以对于文本这类输入,Transformer需要解析文本里面的词语、句法、语义和语境。但问题在于,词语很简单,比如英语可以按空格来分割,但句法和语义,甚至是语境,就是更加抽象的东西了。

当然,Transformer架构也不是凭空而来的。在它之前,已经有RNN(循环神经网络)等比较早期的机器学习自然语言模型。

从之前的模型经验来看,处理这种文本序列的通用方法是先将文本转化成向量。向量就是有不同维度、用数字表示的一种数学表达。

比如一句话”I have a dog”,里面有四个单词。你可以设计一种向量转化的公式,因为是不同维度,我们四个单词就对应四个维度。然后出现”I”的地方,这个维度就是1;如果这个维度里面不是”I”,那就是0。这就是一个最简单的向量转换方式。

但这个只是我们自己理解文本转化成向量的一种最简单的算法,实际上这个方法肯定是有问题的。

因为我们输入的文本不仅只是”I have a dog”这样只有四个单词的固定文本,可能有大量的文本。英语单词可能有几十万个,如果每个独一无二的单词都用一个向量维度去表示,那这个向量的维度会非常大,计算起来就会极其复杂。

所以Transformer有一个将文本转化成向量的方法叫做Embedding(词嵌入)。具体怎么做的我也不太清楚细节,但可以理解为,目前已经有这么一个成熟的方法,它提供了一个接口。你拿来调用一下,通过输入一句话并定义向量的维度和词典的大小,它就能转化成一个向量。

所以对于Transformer来讲,它的输入阶段就是做Embedding这么一个操作。

Encoder(编码器)

到这一步为止,我们已经有了可以计算的向量了。接下来就是从这个向量里面去提取语义,专业来讲,是构建语义空间。Transformer是通过注意力机制(Attention)来实现的。Attention是Transformer的核心创新点,所以这篇论文为什么叫《Attention is All You Need》,关键就在于Encoder里面有Attention和Self-Attention这一层。

比较直观的理解就是,它的输入是一个文本的向量。你可以抽象地理解为,它本质是一串数字,但可以抽象理解为一串连续的Token。

Token相当于一句文本里面的一个单位,比如一个单词可能是一个Token,然后Token用一个数字来表示。

所以Self-Attention这一层处理的是一连串的Token。每一个Token有三个重要的变量:Q(Query,查询)矩阵、K(Key,键)矩阵,还有V(Value,值)矩阵。

那这三个矩阵有什么用呢?Q是Query查询,它可以去找到当前这个Token想要关注的、以及和它向量相似度比较高的其他Token。

这个”找到”是什么意思呢?这个”找到匹配”又是什么意思呢?

其实,向量可以进行一个点积操作。如果两个向量点积的结果比较大,说明这两个向量是比较相似的。所以,向量的相似性是一个比较重要的衡量指标。

Query会拿当前Token的Q去乘以其他Token的K,这样本质上就是在计算这两个向量的相似性。那为什么是用当前Token的Q去乘以其他Token的K呢?这里得说到K的含义——K代表的是当前这个Token的键(Key),可以理解为索引或标识。

Q点积K的话,本质上计算的是这两个Token之间的相似性。回到文本的层次,它其实就是语义的相似性。

为什么呢?因为真正代表语义的是V本身。V是这个Token特征的向量。比如”cat”这个单词,它的特征可能很多:它可能是猫科动物、是动物、不同于植物、它是有生命的等等。

V表示的是当前这个单词的语义、含义,可能有各种含义。你可以简单理解为,比如一个英文单词可能有很多种意思,每种意思都可以看作是它的一个特征。

当Q乘以K计算到一个比较高的数值时,Attention就会更多地把注意力分配到这个Token上面。这意味着如果注意力权重比较高,然后最终获取它的V,那就说明这两个Token的语义相似性比较高。

这两个Token大概率是很可能会出现在同一个句子里面,甚至是相邻的词汇。

这个就是Attention这一层的基本原理。

当然,你看《Attention is All You Need》的架构图,在Encoder这一层,它不仅仅只有Attention,还有残差连接(Residual Connection)和层归一化(Layer Normalization)。

残差主要是因为每经过一层的数值转化,本质上都是数字的计算。这得回到最原始的机器学习这一层。在深度神经网络之前,最早有机器学习的基础概念。机器学习最基本的流程包括:输入,然后正向传播——正向传播就是通过一个线性公式去计算,里面有权重W和偏置B这两个参数;然后还有反向传播——反向传播就是你通过这个公式计算到一个数值,这个数值和标准值有差距,你通过这个差距(损失)去反向调节前面的权重和偏置这两个参数。

通过这样不断地迭代训练,不断把公式里面的W和B调到和现实世界模型最相似的状态。但在这个训练过程中,在反向传播的过程中会遇到需要计算梯度的情况,计算梯度过程中可能要进行链式求导。这个时候可能会遇到梯度爆炸和梯度消失这两个极端场景。

这个时候就得考虑做归一化,让数值的波动不会太极端,让数值整体保持在比较均匀的状态,这样不会干扰对权重的判断。因为如果你有一堆数字,很多数字都是1到10之间的,但突然有一个数字是1000,那这个1000就是一个非常极端的异常值,会污染整体的计算。所以进行归一化,让整体的数值均匀地分布在0到1这个范围里面。

残差是指,经过Self-Attention这一层的数值转换后,它可能会相比最原始Embedding之后的向量差距很大。所以为了保持原来的基本状态,它会加上最开始的那个向量,做一个叠加。这样做的好处就是,你可以理解为Encoder这一层相当于在你原有的画面上增加一些细节,而不是完全改变整幅画。

Decoder(解码器)

Decoder这一层也分为几个部分。它也有Attention,但它的Attention是Masked Attention(遮蔽注意力)。它会遮住未来的Token,就是说如果当前处理到第二个Token,它会遮住后面第三、四、五、六等后续的Token。这样做的作用是它要预测未来的Token,比如下一个Token是什么,所以它要保证未来的数据不被看到。

Masked Attention也有残差连接和Layer Norm这两层。

相比于Encoder这一层,Encoder可以简单理解为寻找Embedding后的语义,构建语义空间,Decoder这一层还有一个Cross Attention(交叉注意力),它会拿到Encoder输出的语义空间,然后再次进行计算。

因为Transformer模型和传统的机器学习模型一样,在正向传播过程中通过输入的数据来输出预测结果,所以相当于它已经在做预测了。

所以Decoder这一层实际上是在预测下一个Token。这也是为什么Decoder这一层的Attention需要mask,需要遮掉未来Token的原因,因为它得预测下一个Token是什么。

预测下一个Token时,你得综合前面的语义。你不能只根据当前的这个Token来预测,还得综合前面上下文的语义来判断。这也是为什么Decoder这一层要用Cross Attention的原因。

输出

虽然说Decoder这一层会预测下一个Token,但它本质上预测的并不是一个单一的数字或者单一的单词,它其实输出的也是一个向量。

值得注意的是,Transformer每一层的输出都可以看作是一个隐藏状态(Hidden State)。到了输出这一层,它要做的就是将Decoder输出的Hidden State通过Softmax函数去做一个概率分布上的计算。

概率最大的那一个词就是预测的下一个Token。

所以这里面又要通过Token去映射成实际的单词。

正向传播和反向传播

从输入、Encoder、Decoder到输出,这个过程并不是完全单向的。它包含了整个训练过程,包括正向传播和反向传播。

前面提到的输入、Embedding、Self-Attention、Layer Norm和残差连接等不同层次,就像一个链条或管道一样连接起来。当这个管道最终得到一个输出后,它又会逆向回流,这个逆向过程就是反向传播。

在反向传播过程中,因为正向传播最初的参数都是随机初始化的值,这些初始值大概率是不准确的。所以它需要通过反向传播不断调整这些值。这也是神经网络和机器学习核心训练的精髓——通过这种不断闭环、无限重复的迭代训练去持续调优,最终朝着一个理想的状态前进。

有些情况下的训练会有真实值作为标准答案(监督学习),但有些情况下是没有的。例如Transformer在生成文本时,它其实没有一个固定的标准答案,因为下一句话可能有很多种不同的可能性。所以在某种意义上,这种情况下它属于机器学习里面的无监督学习或自监督学习。