Transformer原理与过程详解
Transformer原理与过程详解
本文系统阐述Transformer模型的核心机制,包括自注意力机制、多头注意力机制、掩码注意力机制等关键组件,以及模型的训练和推理全流程。
一、自注意力机制
1.1 核心任务
自注意力机制(Self-Attention)是Transformer的灵魂组件,其核心任务是计算输入数据间的关联程度。通过这一机制,模型能够提取输入数据中的有用信息,并融合输出包含不同注意力分配的信息,使得每个位置的表示能够根据其他位置的重要性进行自适应调整。用 “查字典” 理解上下文
1.2 计算流程
自注意力机制的完整计算流程如下:
第一步:向量化转换
将输入的自然语言数据转换为向量矩阵(通常通过嵌入层完成)。计算机看不懂文字,所以第一步要把 “我”“吃”“苹果” 这些词,变成一张张带数字的 “卡片”—— 这就是 “词嵌入”。比如:
“我” 的卡片:[0.2, 0.5, 0.3](假设是 3 个数字,实际是 512 个,方便理解简化);
“吃” 的卡片:[0.8, 0.1, 0.4];
“苹果” 的卡片:[0.3, 0.7, 0.9]。
这些数字不是乱编的 —— 比如 “猫” 和 “狗” 的卡片数字会很像(因为都是动物),“吃” 和 “喝” 的卡片数字也会很像(都是动作),这样计算机就能通过数字 “感知” 词的意思。给卡片加 “位置标签”(位置编码)
光有 “词的意思” 还不够 ——“我吃苹果” 和 “苹果吃我” 的词是一样的,但意思完全相反。所以要给每张卡片加一个 “位置标签”,告诉计算机 “谁在前、谁在后”。比如:
“我” 在第 1 位,标签是 [0, 1, 0];
“吃” 在第 2 位,标签是 [0.8, 1, 0.1];
“苹果” 在第 3 位,标签是 [0.3, 1, 0.8]。
加标签的方法很简单:把 “词卡片” 的数字和 “位置标签” 的数字直接相加,比如 “我” 的最终卡片就是 [0.2+0, 0.5+1, 0.3+0] = [0.2, 1.5, 0.3]。这样计算机就知道 “我” 在最前面,是动作的发出者。
第二步:获得Q、K、V
输入矩阵分别与三个权重矩阵相乘:
- 与WQ相乘得到Query矩阵(Q)
- 与WK相乘得到Key矩阵(K)
- 与WV相乘得到Value矩阵(V)
Q(查询工具):相当于 “吃” 的 “问题清单”——“我想找和‘吃’相关的词:谁在吃?吃什么?”;
K(关键词工具):相当于 “所有词的标签”——“我” 的标签是 “能做动作的人”,“苹果” 的标签是 “能被吃的东西”;
V(内容工具):相当于 “所有词的核心信息”——“我” 的信息是 “人,动作发出者”,“苹果” 的信息是 “水果,动作接收者”。
第三步:计算注意力分数
将Q与K进行矩阵运算(通常是点积),然后经过softmax函数进行归一化,得到注意力机制得分矩阵。其数学表达为:
Attention(Q,K,V) = softmax(Q*K^T / √d_k) * V
其中d_k是Key的维度,用于缩放防止梯度消失。
第四步:融合信息输出
将得分矩阵与V矩阵相乘,通过加权求和的方式融合各位置的信息,得到最终的自注意力输出。
根据相似度给每个词的 V “打分”,相似度高的分高,然后把这些 V 的信息加起来 —— 这就是 “吃” 最终理解到的 “上下文信息”。比如:
“我” 的 V(90 分) + “吃” 的 V(50 分) + “苹果” 的 V(80 分) → 汇总后,“吃” 就知道:“是‘我’在吃‘苹果’”。
同样,“我” 和 “苹果” 也会做同样的操作:“我” 会找到 “吃” 和 “苹果”,知道 “我在吃苹果”;“苹果” 会找到 “我” 和 “吃”,知道 “我被我吃”。这样一句话里所有词的关系就都理清了。
1.3 参数获取
WQ、WK、WV等参数矩阵并不是预设的,而是在模型训练过程中通过反向传播算法动态获取的。具体过程为:利用标签数据计算模型输出的loss值,然后通过反向传播更新所有参数矩阵,使loss逐步降低,从而学习到最优的参数。
二、多头注意力机制
2.1 机制定义
多头注意力机制(Multi-Head Attention)是自注意力机制的进一步发展。其基本思想是:不仅进行单组注意力机制计算,而是做h组独立的注意力机制,将输入数据进行多组并行的注意力计算,再将所有结果融合输出。这样做能够让模型在多个不同的"子空间"中学习表示。
2.2 计算过程
多头注意力的详细计算步骤如下:
第一步:多组映射
输入数据与多组不同的权重矩阵进行映射:
- 与第i组的WQ^i相乘得到Q_i
- 与第i组的WK^i相乘得到K_i
- 与第i组的WV^i相乘得到V_i
第二步:并行计算
对每一组(i=1,2,…,h)分别计算:
- Q_i与K_i进行矩阵运算,经softmax函数得到注意力得分矩阵
- 注意力得分矩阵与V_i相乘,得到该头的输出
第三步:拼接融合
将所有h组的输出结果在特征维度上进行拼接(concatenation)。
第四步:线性变换
拼接后的结果与前馈神经网络进行矩阵运算,得到最终的多头注意力输出。
就像一个问题,让几个人从不同角度查字典,最后汇总答案会更准确。比如 “吃” 这个词:
头 1(语法角度):查 “谁是主语(我)、谁是宾语(苹果)”;
头 2(语义角度):查 “吃” 是 “动作”,“苹果” 是 “可食用的东西”;
头 3(搭配角度):查 “吃” 常和 “苹果”“米饭” 搭配,不和 “石头” 搭配。
最后把 3 个 “头” 的结果合起来,“吃” 对上下文的理解就更全面了。
2.3 优势特点
多头注意力机制相比单头注意力具有以下优势:
- 多角度建模:不同的注意力机制头可以关注数据的不同领域或特征,相当于从多个角度同时观察问题,提高了模型的表现力。
- 效果提升:多头结构通常能达到比单个头更好的性能。
- 序列长度灵活性:多头注意力机制能够处理不同序列长度的输入数据,无需固定长度。
三、掩码注意力机制
3.1 填充掩码(Padding Mask)
在实际应用中,同一批次的文本序列长度往往不一致。为了充分利用GPU的并行计算能力,需要将所有句子填充(Padding)到相同长度。
填充掩码的作用:在计算注意力得分时,需要对填充部分进行掩盖处理。具体做法是使用填充掩码将填充位置的注意力分数设为一个很大的负数(如-∞),经过softmax函数后,这些位置的注意力权重变为0,从而不对最终结果产生贡献。这样既保证了计算的正确性,又充分利用了GPU的并行性能。
3.2 因果掩码(Causal Mask)
因果掩码用于处理自回归生成任务,确保模型在每个时刻只能看到当前和过去的信息。
训练过程中的因果掩码:
在Transformer的解码器训练阶段,为了防止模型看到未来的正确输出值(这会导致信息泄露,影响loss计算的有效性),采用因果掩码多头注意力机制。具体实现方式是构建一个倒三角形的负无穷矩阵,位置(i,j)处为负无穷当且仅当j>i。通过softmax函数的作用,模型无法获取未来时刻的信息。
推理过程中的因果掩码:
在模型推理(生成)阶段,同样利用因座掩码,使注意力得分矩阵的上三角部分为负无穷,对应的注意力分配为0。这样保证了模型在生成第i个词时,只能依赖第0到第i个已生成的词。
四、层归一化
4.1 归一化目的
层归一化(Layer Normalization, LayerNorm)是Transformer中的重要组件,其主要目的是:使数据输入处于同一起跑线,便于模型在训练时更快速有效地找到最低loss值。
通过归一化,各个特征的数值范围得到统一,避免了某些特征因数值过大而主导梯度更新的现象,从而加速模型收敛。
4.2 与批次归一化的区别
虽然层归一化与批次归一化(Batch Normalization, BN)的计算公式相同,但归一化的对象完全不同:
- 层归一化:针对每个样本的每一层进行归一化,即对单个样本的特征维度进行统计。
- 批次归一化:针对一个批次中所有样本的某一层进行归一化,即对批次维度进行统计。
正因为这一特性差异,层归一化更适合RNN、Transformer等序列任务,因为这类任务中不同序列长度的数据难以统一批处理。
五、前馈神经网络
5.1 网络定义
前馈神经网络(Feed-Forward Neural Network)是一种无循环、信息单向流动的多层神经网络。需要注意的是,"前馈神经网络"描述的是一种网络结构的拓扑方式,而非特定的网络类型。
在Transformer模型中,前馈层通常由两层全连接层组成,中间通过激活函数(如ReLU)进行非线性变换。
5.2 计算过程
Transformer中前馈网络的计算流程如下:
第一步:第一层映射
输入数据经过第一个全连接层,进行升维投影(通常维度从d_model增加到4*d_model)。
第二步:激活函数
升维后的数据通过激活函数(通常为ReLU或GELU)进行非线性变换。
第三步:第二层映射
激活后的数据经过第二个全连接层,进行降维投影(维度从4*d_model降回到d_model)。
设计优势:定义两层结构主要是为了方便进行跳转连接(Skip Connection)和残差连接(Residual Connection),这些技术对于稳定深层网络的训练至关重要。
六、交叉注意力机制
6.1 机制原理
交叉注意力机制(Cross-Attention)本质上与自注意力机制的计算方式相似,但关键区别在于:Q、K、V的输入信息来源不同。
- 在自注意力中,Q、K、V都来自同一输入。
- 在交叉注意力中,Q来自解码器,而K、V来自编码器,这样解码器可以参考编码器提取的上下文信息。
6.2 计算流程
交叉注意力的具体计算步骤为:
第一步:获得Q
解码器的输入经过WQ权重矩阵映射,得到Query矩阵(Q)。
第二步:获得K、V
编码器的输入分别经过WK和WV权重矩阵映射,得到Key矩阵(K)和Value矩阵(V)。
第三步:计算注意力分数
Q与K进行矩阵运算,经softmax函数得到注意力得分矩阵:
CrossAttention(Q,K,V) = softmax(Q*K^T / √d_k) * V
第四步:融合信息输出
注意力得分矩阵与V矩阵相乘,融合编码器提供的信息,得到最终的交叉注意力输出。
七、Transformer模型训练过程
7.1 训练方式
Transformer模型的训练流程采用监督学习范式:
第一步:数据输入
将自然语言输入数据与对应的标签数据同时输入模型。
第二步:前向传播
数据通过编码器和解码器,最终输出预测结果。
第三步:计算损失
将模型的输出结果与标签进行对比,计算损失函数值(通常使用交叉熵损失)。
第四步:反向传播
利用损失值通过反向传播算法计算各参数的梯度。
第五步:参数更新
使用优化算法(如Adam)基于梯度更新所有可训练参数,使损失逐步降低。
7.2 因果掩码在训练中的作用
在训练过程中,因果掩码扮演了至关重要的角色。具体如下:
信息泄露防护:直接输入正确的标签数据会导致模型在计算某个位置的预测时,能够看到未来位置的正确答案。这种"信息泄露"会严重影响loss计算的有效性,使训练过程变得不切实际。
因果掩码的解决方案:通过应用因果掩码多头注意力机制,确保解码器在处理第i个位置时,只能参考位置0到i的信息,看不到位置i+1之后的数据。这样既能充分利用并行计算的效率(整句同时输入),又能保证训练的逻辑正确性。
八、Transformer模型推理过程
8.1 输入处理与生成流程
比如机器翻译(把英语 “我吃苹果” 翻译成汉语 “我吃苹果”),Transformer 分成两部分 “团队”:
编码器(理解团队):专门 “读懂” 输入的英语句子 —— 把 “我 eat apples” 里的词关系理清(我是主语,eat 是谓语,apples 是宾语),然后把这些信息整理成 “信息包”;
解码器(生成团队):专门 “写出” 汉语句子 —— 先从编码器的 “信息包” 里拿信息,然后一步步生成 “我”→“我吃”→“我吃苹果”,同时还要检查 “有没有语法错、意思对不对”。
Transformer的推理(生成)过程采用自回归的方式,逐个生成输出词元。完整流程如下:
第一步:编码
将输入的自然语言文本经过编码器(Encoder)提取和压缩信息,生成编码表示。
第二步:初始化解码
解码器从特殊的开始符号(如<start>或<bos>)开始,接收编码器的信息作为上下文。
第三步:自回归生成
在每个时刻t:
- 解码器基于前t-1个时刻的输出和编码器信息,通过自注意力和交叉注意力机制进行计算。
- 输出第t个时刻词的概率分布。
- 选择概率最大的词作为该时刻的输出,作为下一时刻的输入。
第四步:终止条件
重复第三步,直至模型输出结束符号(如<end>或<eos>),或达到最大长度限制。
8.2 输出方式
推理阶段的输出过程涉及以下关键步骤:
概率计算:通过解码器的前馈神经网络层计算,得到输出词表中每个词的概率。
贪心解码:选取概率最大的词作为当前时刻的输出(这是最简单的策略,称为贪心解码)。
可选策略:在实际应用中,还可以采用波束搜索(Beam Search)、核采样(Nucleus Sampling)等策略来获得更高质量的生成结果。
循环进行:将当前输出作为下一时刻的输入,重复此过程直至生成结束符。
九、总结
Transformer通过多个精心设计的组件相互配合,构建了一个强大且高效的序列处理框架:
- 自注意力机制能够捕捉序列内部的长程依赖关系。
- 多头注意力机制让模型从多个角度同时学习。
- 掩码机制保证了训练的有效性和推理的自回归特性。
- 前馈层提供非线性变换能力。
- 层归一化和残差连接稳定了深层网络的训练。
这些组件的有机结合使得Transformer成为现代深度学习中最重要的架构之一,在机器翻译、文本生成、问答系统等多个领域都取得了优异的成果。
