Transformer是目前最流行的大语言模型(LLM)核心建模技术,Transformer由谷歌大脑团队于2017年在论文《Attention is All You Need》中提出,GPT、Deepseek、阿里的千问等都是 Transformer的衍生。Transformer由编码器和解码器构成,编码器和解码器结构在前面介绍的seq2seq、Attention注意力机制中有详细的介绍,当时以傅里叶变换和逆变换来理解编码器和解码器:编码器向解码器传递一个生成中间语义向量,随后在此语义向量的基础上,利用注意力机制生成相应信息内容,在那篇文中将注意力机制与傅里叶变换的‘缩小采样窗口’类比。Transformer核心思想与seq2seq是一致的,最大的区别来是Transformer利用叠加的线性网络取代循环神经网络,利用自我注意力机制、交叉注意力机制解决长依赖问题。本文分析Transformer技术总结AI建模的一些常规手段,并利用Transformer实现法语译英语的功能,从零开始构建一个Transformer网络。
一、编码器实现自我注意力机制
Transformer编码器是一次性输入信息,不能像传统的循环网络那样将信息作为序列处理,循环网络能很好的解决顺序问题。为了解决这个问题,Transformer在处理原始信息时与位置编码混合。假设我们把每个单词(token)以一个6维向量进行embedding编码:

Google详细介绍了位置编码的规则:

原始信息和位置编码混合后效果图:

上面的案例中输入的序列中包含6个单词,则原始的输入信息被处理成一个6*6的矩阵,每一行代表一个混合位置信息的单词,很显然embedding后单词不具备关联性,可以想象在一个6维空间里,这些单词任意的分布着。我们的任务是发现各个单词之间的关联性,处理这些关联性模块称为‘头’:header。每个头处理不同关联性问题,比如有的头负责发现其中文法的关联系,即哪些是主语、谓语、宾语;有的负责语境分析,比如文中出现的it代指前面文字中哪个事物,等等。
Transformer通过将输入信息乘WQ矩阵得到一个新的矩阵Query,可以将Query矩阵理解为每个头处于自身的需要,让每个单词用数字化的方式,构建一个查询。比如你到图书馆想找一本关于西游记的书籍,‘西游记’就是此时的Query;Transformer还会通过将输入信息乘WK矩阵得到一个新的矩阵KEY,仍以借书为例,KEY就是每本书的书名信息、标签,利用Query和Key就能对每本书打分,从而知道这本书和相对于我们的需求契合度。将输入信息乘WV矩阵得到一个新的矩阵VALUE,VALUE代表每个单词的具体含义,相比于在embedding中的编码,在Value空间中各个单词具备一定关联性。可以将Value理解具体图书内容,通过Query和Key打分,再结合Value,我们可以对众多书籍有取舍的阅读。下面的示意图反应出Transformer的头处理数据流程:

按上面处理步骤将,利用6*6输入信息分别与三个权重矩阵相乘

KEY和Value计算

依次得到Query,Key,Value

以本例来分析,Query是一个6*4的矩阵,假设这个头主要负责解析句子结构,则第一行数据3.88,3.8,4.08,3.42代表将一个查询:‘when单词在本句话中是主语吗’数字化。显然每个单词发出查询需求是一样的,但格式不一样。Query产生的过程本质上是通过将查询需求数字化,利用线性映射将不同的单词(原本在6维空间)投射到一个4维空间中,在新的空间里原本不相干的单词有了关联性,'头'的职能决定了Query的形式,或者说不同的'头'代表着不同的线性映射。Key和Value也是同样的作用,只是相比于Query而言,Key和Value在稳定后针对不同‘头’变化不大。这样很好理解,以图书馆借书为例,每个人查找书的目标都不相同,但书籍的标签、内容是客观存在的,不会因为查找目的不同而改变自身的内容。利用这个特性,现代的LLM模型中不是每次计算完key和value就扔掉,而是策略性的缓存Key和Value,利用空间(内存)换效率。
Query 6*4的矩阵乘以Key矩阵的转置矩阵4*6,得到一个6*6的矩阵,暂称这个6*6的矩阵为得分矩阵

该矩阵每一行代表原句中的一个单词,每一列代表在特这个头里,用特定的查询其他单词与当前单词的契合度,这是一个方阵,但不是对称的。我们习惯将每一行‘分数’处理成概率形式,即每一行加起来是1或者说是100%,我们将所有数据除以一个常数,然后利用softmax函数处理


利用得分矩阵乘以Value矩阵,就得到一个能反映各个单词关联性的上下文矩阵:

用线性映射的方式来看上面的计算过程。Value代表内容空间,在一个4维空间里表示一个6维的单词,或者说Value空间有4个基。Value每一行代表原句中一个单词,而每一列代表一个基,即代表一种属性。得分矩阵的每一行的得分,分别与value的每一列(基)数据相乘,就得到在value空间中、在这个基中,原单词融合其他单词后的综合信息。而得分矩阵的每一行将4个列都运算完将得到一个Value空间的4维向量,该向量反映了原单词在Value空间里关联所有其他单词的上下文信息。这个上下文信息很重要,不妨用大写的C来表示。上下文信息C是编码器和解码器的桥梁,在反向传递中,也是通过上下文信息C来优化编码器参数。
最后,编码器利用一个全连接的神经网络,论文称之为前馈神经网络,将上下文信息C做变换和非线性处理后传递给解码器,一般称该张量为momery。Google的论文里说编码器将Key和Value传递给解码器的交叉注意力头里,实际上编码器只是将momery传递给解码器,用编码器的momery生成解码器交叉注意力的Key和Value,甚至有时momery不做修改(恒等变换),直接作为Key和Value传递给解码器的交叉注意力头。
基于Query、Key和Value注意力机制是Transfomer的核心技术,这样的设计使用了一个常用的技巧,一种‘无中生有’的技巧:先大胆假设这种模型是有益的,利用随机参数初始化模型后正向传播数据,先运行起来!随后利用反向传播优化模型参数。在逻辑推理中,如果这个领域有存在客观规律,我们可以利用这个规律通过演绎法推导出所有结论,这称为第一性原理。第一性原理让我们可以把假设放在前面,如果坚信假设是正确的,那么接下来推理论证都会是正向的,且能够得到自洽的结论。形而上学来说,如果坚信我们目标是正确的,那么在达到目标之前所有困难都是可以迎刃而解。第一性原理设计思想、哲学理念,几乎在所有的模型中都有体现。
二、解码器:自我注意力、交叉注意力机制
编码器和解码器都可以是多层结构,每层也可以有多个头,每个头的关注点不同,Transformer通过参数随机初始化,让多个头自行决定各自的关注点,常见的头有:
位置头:主要关注相邻的 token(比如动词关注其前面的名词),捕捉局部语法结构。
长距离头:关注相隔很远的 token,捕捉全局依赖。
特定关系头:关注某种具体语义关系(如主谓、指代、同一实体等)。
句法结构头:有些头甚至会学习到类似依存句法树的结构。
一个实现法译英语的多层Transformer结构如下图所示:

编码器将momery输入到解码器的交叉注意力头中,解码器的单层结构如下图所示:

解码器也有自我注意力头,其原理和功能与编码器是一样的,实际上一些自回归LLM模型只用了解码器,比如GPT。相比起编码器,解码器在自我注意力层后加了一层‘交叉注意力头’:解码器在生成内容时,利用交叉注意力头对编码器输入信息实现动态的关注。这很好理解,以法语翻译为英语为例,在翻译的过程中时得随时知道当前正在翻译哪一个词、当前词在源语言法语中关联哪些内容。具体实现是:自我注意力层从解码器的输入信息中计算出Query,Key,Value,解码器计算出memory输入到交叉注意力头,用此memory计算出Query;再利用编码器的输入的memory计算Key和Value,注意,此时由编码器memory在交叉注意力头里计算出来的Key和Value,不是原来在编码器的Key和Value,即这不是一个还原的逆运算。以图书馆借书为例,交叉注意力头此刻的工作是把原来是法语书名和内容书翻译成英语,以便英语人士可以Query到。
解码器通过前馈网络输出一个上下文矩阵,本例中是一个6行6列矩阵,每一行代表解码器输入的每一个单词,在利用注意力学习机制,融合其他单词相关性得到上下文信息。

这个矩阵的列数量代表在内容空间的基个数,本例中内容空间是一个6维空间,实际可以是任意维度的。而6行数据代表在这个6维空间中利用6个向量固定了一个超平面。就像2个点可以固定一条直线,3个点可以确定一个平面:在一个固定维度空间可以用几个向量定义出一个约束的子空间,离这个超平面最近的点就是要生成的下一个单词,前面所有的工作都是为了这一步。

向量到平面的距离要用到内积。
| 上一篇 LSTM-循环神经网络(下) | 下一篇 生成对抗网络 |
| 评论区 | |