大家好,我最近系统学习了Transformer模型的相关知识,在此做一个总结记录,希望能帮助到同样在学习的朋友。我们先从Transformer诞生的历史背景说起。

一、为什么需要Transformer?

在2017年Google团队发表《Attention Is All You Need》之前,NLP领域的主流架构是RNN和LSTM。虽然LSTM在一定程度上缓解了RNN的梯度消失问题,但它有两个无法回避的硬伤:第一是串行计算,RNN必须等前一个时间步算完才能进入下一步,在大规模数据上训练速度极慢;第二是长距离衰减,即便有LSTM的“记忆门”设计,隔了上千个词之后信息传递依然会严重损耗。

Google团队提出的Transformer架构彻底颠覆了这一局面——它完全抛弃了RNN的循环结构,整个模型仅依赖注意力机制。Transformer带来了两个显著优势:一是能够捕捉间隔较长的语义关联,词与词之间的路径长度被压缩为1;二是可以充分利用分布式GPU进行并行训练,大幅提升模型训练效率。

一句话总结:Transformer的出现,让序列建模从“一个词一个词地串行处理”变成了“一句话一次性并行处理”。

二、整体架构概览

Transformer采用的是经典的编码器-解码器(Encoder-Decoder)架构:

  1. 输入部分:源文本嵌入层+位置编码器;目标文本嵌入层+位置编码器
  2. 编码器部分:由N个编码器层堆叠而成(原论文中使用6层)
  3. 解码器部分:由N个解码器层堆叠而成
  4. 输出部分:线性层+Softmax层

下面我们逐一拆解这些模块。

三、输入部分:词嵌入与位置编码

3.1 词嵌入

输入的文本首先需要转换成模型能够理解的向量形式。这个过程包括:将输入句子按单词切分成token序列、通过填充将不同长度的样本对齐到统一长度、使用独热向量进行初步表达,最后通过一个可学习的映射矩阵将高维独热向量压缩为低维稠密向量。这个映射矩阵是根据训练数据学习得到的,可以通过Word2Vec等方式实现,在PyTorch中直接使用nn.Embedding即可完成。

3.2 位置编码

Transformer本身是不感知序列顺序的。如果直接把“这只狗追赶另一只狗”和“另一只狗追赶这只狗”输入模型,在没有任何位置信息的情况下,模型会把这两个句子视为完全相同的输入,这显然是荒谬的。

位置编码的设计本身也经历了一个演进的过程。最初的想法是直接使用整数编码(1, 2, 3…),但问题在于位置值的大小可能远远超过词嵌入的实际值,导致信噪比过低,模型很难从位置信息中分离出语义信息。进一步尝试了二进制编码,但连续的位置编码后形成的向量数字不连续,产生结果跳跃,违背了直观意义。

最终Transformer采用了正弦位置编码(Sinusoidal Positional Encoding),这是一个极为巧妙的设计。位置(pos)和维度索引(i)满足:

  • PE(pos, 2i) = sin(pos / 10000^(2i/d))
  • PE(pos, 2i+1) = cos(pos / 10000^(2i/d))

这个设计的精髓在于:对于任意固定的偏移量k,PE(pos+k)可以表示为PE(pos)的线性函数。这意味着即使测试集中出现了比训练集更长的句子,模型依然能够通过已有的位置编码组合来“外推”出新位置的编码,保证了泛化能力。

四、自注意力机制:Transformer的核心灵魂

如果说Transformer是一座大厦,那么自注意力机制就是这座大厦的地基。它的核心任务是:将每个词的编码向量“移动”到它真正的语义所在位置,而这个“移动量”由其他词的意义和相关性共同决定

4.1 Q、K、V三兄弟

对于每个输入向量,通过三个可学习的权重矩阵分别生成三个向量:Query(Q)、Key(K)、Value(V)。

我们可以用图书馆找书的场景来理解这三个概念:Query是你心中想找的那本书的描述(比如“一本关于深度学习的书”),Key是每本书封面上的标签(“机器学习”“神经网络”“烹饪”),Value则是书的实际内容。你拿着你的Query去跟每一本书的Key计算相似度,相似度高的书(Key匹配得好),你就多读一点它的Value。

Q and A 1:为什么Q和K不能共用同一个映射矩阵?

Q和K如果来自同一矩阵,那么序列中每个位置的查询与自身的键计算出的点积将会被系统性地放大,导致模型过度关注自身而削弱与其他位置的交互能力。更重要的是,Q用于“提问”(我要关注什么),K用于“标识”(我包含什么特征),两者分属不同语义空间。将两者解耦后,模型可以灵活学习两种不同的变换策略,大幅提升表达能力。

Q and A 2:为什么Q、K、V不能直接从原始输入X取用,而需要经过线性变换?

设想Q、K、V直接等于X,那么注意力计算的决策空间将完全受限于原始词向量的几何分布,表达自由度极低。引入三个独立的权重矩阵W_Q、W_K、W_V后,模型可以将原始向量投影到三个不同的子空间,分别专注于“查询语义”“键语义”和“值语义”,每个子空间都可以按任务需求独立优化。

4.2 缩放点积注意力的数学原理

自注意力的核心计算公式被称为缩放点积注意力(Scaled Dot-Product Attention):

Attention(Q, K, V) = softmax(QK^T / √d_k) V

整个计算流程可以分为四个步骤:

  • 步骤1:将每个输入向量通过线性变换生成Q、K、V向量
  • 步骤2:计算每个位置的Q与所有位置的K的点积,得到注意力分数矩阵
  • 步骤3:将分数除以√d_k(缩放因子)后进行Softmax归一化——这里引入缩放因子的目的是防止点积结果过大导致Softmax陷入梯度饱和区
  • 步骤4:将归一化后的权重与V相乘并求和,得到最终的上下文表示

Q and A 3:为什么缩放因子恰好是√d_k?

假设Q和K的分量都是均值为0、方差为1的独立随机变量,那么q_i和k_j的点积将服从均值为0、方差为d_k的分布。此时点积的方差会随着d_k增大而线性增长,Softmax函数的梯度在这些高方差数值的区域会趋近于0。为了使点积结果保持稳定(方差约为1),只需除以√d_k即可让方差恢复为1。这个简单的数学变换是Transformer能够稳定训练的关键细节之一。

五、多头注意力:从单一视角到多角度理解

单头注意力机制虽然强大,但它只能从一种视角捕捉语义关系。现实中的自然语言包含语法结构、指代关系、情感倾向等多种维度的信息,单头注意力难以同时兼顾。

多头注意力机制的解决方案很直观:使用多组不同的权重矩阵,每一组独立完成一套注意力计算,最后将所有“头”的结果拼接并通过一个输出矩阵融合。这种设计使模型能够同时从多个语义子空间中捕捉特征,从而获得更加丰富和全面的上下文表示。

例如,在处理“这只狗追赶另一只狗,它跑得很快”这句话时:

  • 第1个头可能聚焦于语法结构(主谓宾关系)
  • 第2个头可能关注指代消解(“它”指的是第一只狗)
  • 第3个头可能捕捉语义相似性(“追赶”和“跑”的动作关联)

正是这种多视角同时并行处理的能力,使Transformer能够深度理解复杂句子的语义结构。

Q and A 4:为什么设置多个头,而不是直接增加模型维度?

如果仅增加模型维度而不引入多头结构,模型仍然只能从单一的语义子空间进行特征提取。多头结构的本质是将高维空间解耦为多个相互正交或独立学习的子空间,每个子空间可以专注于一种特定的注意力模式。这种解耦设计让模型能够以一种模块化的方式学习不同类型的语义关系,同时避免了不同特征模式之间互相干扰。

六、Add & Norm:让深层网络“稳得住、学得动”

在Transformer中,每个注意力子层和前馈网络子层后面都紧跟着“Add & Norm”操作。Add代表残差连接,Norm代表层归一化。

残差连接的核心公式很简单:Output = x + Sublayer(x)。这意味着每一层的输出都是输入x与子层变换F(x)的和。用通俗的话解释:假设你从一个输入开始,想让网络学会一个复杂的映射H(x),传统网络让你直接从x学习到H(x);而残差网络告诉你:“别怕,我已经把原始输入x给你带过来了,你只需要学习H(x)-x这个‘增量’或‘补丁’就行了。”

层归一化(LayerNorm)则是在残差连接之后对数据进行归一化处理。它确保每一层输出的数据分布保持稳定,不会因为前面层的微小波动而导致后面层的数据大起大落。

七、前馈网络(Feed-Forward Network)

每个编码器和解码器层中还包含一个前馈网络,它是一个两层的全连接网络:max(0, XW₁ + b₁)W₂ + b₂。第一层使用ReLU激活函数,第二层不使用激活函数。虽然其结构简单,但前馈网络承担着对注意力输出进行非线性变换、提取更高阶特征的关键任务。

八、解码器的特殊设计

解码器的整体结构与编码器类似,但在以下两个关键点上有所不同:

(1)掩码多头注意力(Masked Multi-Head Attention)

在自回归生成任务中,预测第t个词时不能看到“未来”的词,否则就相当于考试作弊——模型会直接看到后面的答案,训练就失去了意义。解码器的第一个多头注意力层引入了掩码操作,确保注意力计算时每个位置只能关注到当前位置及其之前的位置。

(2)交叉注意力(Cross-Attention)

解码器的第二个注意力层是编码器-解码器注意力(即交叉注意力):这里Q来自解码器上一个子层的输出,但K和V都来自编码器的输出。通过这种方式,解码器能够将编码器提取的源语言语义信息与当前已生成的目标语言序列进行对齐,从而实现从源语言到目标语言的语义映射。

九、输出部分与训练过程

输出部分由线性层和Softmax层串联而成:线性层将解码器的输出向量映射到目标语言词汇表大小的维度;Softmax层则将该维度上的数值转化为概率分布,概率最高的词即为模型预测的下一个词。

以机器翻译为例,训练过程如下图所示:

编码器:输入源语言句子(如英文“I am going to buy a new car”),经过位置编码和多层编码器,得到一个包含完整语义信息的特征表示。

解码器自回归生成:解码器的生成是一个逐步推进的过程:

  • Step 1:输入起始符<SOS>(Start of Sequence),编码器输出的K、V与解码器的Q进行交叉注意力计算,预测第一个词(如“我要”)
  • Step 2:将起始符和预测的第一个词作为新的输入,编码器的K、V保持不变,继续预测下一个词
  • Step 3:重复上述过程,直到预测出结束符<EOS>为止

损失计算:将每个位置的预测概率分布与真实目标词向量计算交叉熵损失,误差通过反向传播逐层传递,更新模型中所有可学习的参数矩阵。

十、训练配置与实验结果

在原始的《Attention Is All You Need》论文中,Transformer的训练配置为:

  • 数据集:WMT 2014英德数据集(约450万句子对),采用BPE编码
  • 硬件:8块NVIDIA P100 GPU
  • 训练时长:基本模型训练约12小时(10万步),大模型训练约3.5天(30万步)

实验结果令人惊艳:

  • WMT 2014英德翻译任务:BLEU分数28.4
  • WMT 2014英法翻译任务:BLEU分数41.0

这一成绩大幅超越当时基于RNN和CNN的各类模型,验证了纯注意力架构的有效性。

十一、总结与延伸思考

Transformer模型的核心思想可以概括为:

摒弃循环与卷积,仅靠注意力机制完成序列建模,通过并行化设计实现高效训练,借助多头注意力捕捉多层次语义,利用Add & Norm保证深层网络的稳定训练。

Transformer不仅彻底改变了NLP领域的面貌,也为后来GPT、BERT等大语言模型的蓬勃发展奠定了基石。值得一提的是,视觉大模型(Vision Transformer, ViT)也直接借鉴了Transformer的架构思路——将图像切分成固定大小的图像块(Patch),将这些Patch序列视为NLP中的词序列,再用相同的编码器结构进行处理。这充分说明了Transformer架构的通用性和强大生命力。

掌握Transformer的原理,也就掌握了理解大模型世界的钥匙。希望这篇总结能对大家有所帮助,欢迎在评论区交流讨论!


参考资料:

  • Vaswani et al. “Attention Is All You Need.” NeurIPS 2017.
  • 相关CSDN博客文章及技术文档

个人学习笔记,如有理解不当之处,欢迎指正。

Logo

中国智能体开发者社区,聚焦智能体与大模型开发,提供前沿资讯、实用工具链、开源项目及行业案例。通过技术沙龙、开发者大赛等活动,促进经验交流与协作,助力开发者快速构建创新智能应用。

更多推荐