Transformer是如何工作的(以GPT2为例)

Transformer是如何工作的(以GPT2为例)

脱离模型直接聊Transformer会感觉很空,本文以GPT-2为例(base版,768维维度、12层Transformer、12头自注意力),介绍一下其训练和推理的核心逻辑,以及推理时的具体执行流程。

一、GPT-2训练时数据处理步骤

训练的核心目标是让模型通过海量文本,自主学习语义、语法和逻辑,最终优化所有可训练参数,全程围绕“前向传播计算损失→反向传播更新参数”循环迭代,具体步骤如下:

步骤1:文本输入与Token化处理
1. 输入原始文本(一段话),例如“猫坐在柔软的垫子上”;
2. 采用BPE(字节对编码)算法进行子词切分,将文本拆分为模型可识别的最小语言单元(Token),避免单个汉字/单词的局限,平衡词汇量与表达能力,例如切分为[“猫”, “坐在”, “柔软”, “的”, “垫子”, “上”];
3. 通过模型内置的词汇表(Vocab),将每个Token映射为唯一的整数ID(如[1001, 2005, 3010, 4002, 5008, 6003]),这是模型能够识别的“数字语言”。

步骤2:嵌入层与位置编码处理
1. 初始化嵌入矩阵(形状为[词汇表大小×768]),训练初期该矩阵为随机小数值,与后续所有模型参数同步参与训练;
2. 根据Token ID,从嵌入矩阵中“查表”,取出每个Token对应的768维向量(即Token嵌入),此时的向量初期无语义,后续通过训练逐步承载语义信息;
3. 加入位置编码(同样为随机初始化后可训练的矩阵),给每个Token的向量添加位置信息,让模型区分Token在句子中的先后顺序(Transformer本身不具备位置感知能力);
4. 最终得到形状为[Token数量×768]的矩阵,作为12层Transformer的初始输入。

步骤3:12层Transformer逐层前向计算

每一层Transformer的处理逻辑完全一致,均遵循“前置归一化→多头自注意力→融合投影→残差连接→前置归一化→FFN前馈网络→残差连接”的流程,具体如下:

1. 前置归一化(LayerNorm):对本层输入的向量进行数值校准,将所有Token的向量分布调整为统一标准(均值、方差固定),避免数值波动影响训练稳定性;
2. 多头自注意力计算:将输入向量分别通过本层独立随机初始化的Wq、Wk、Wv权重矩阵,生成查询(Q)、键(K)、值(V)向量;将Q、K、V按头切分为12份(768维,12头,每头64维),每头独立计算Token间的关联分数(Q与K的点积,缩放后通过Softmax归一化得到注意力权重),再用权重与V进行加权求和,得到单头输出;
3. 多头融合投影:将12个头的输出按列拼接,得到[Token数量×768]的矩阵,再通过本层独立的Wo权重矩阵进行融合投影(这里就是把12个头合成1个头,否则12个头之间就没关系了),打破头与头的孤立性,混合全局特征;
4. 第一次残差连接:将本层的初始输入(未经过注意力计算的向量)与注意力融合后的输出相加,保留原始底层信息,同时为梯度反向传播提供直通通路,避免梯度消失;
5. 第二次前置归一化:对残差连接后的向量再次进行数值校准,为后续FFN计算做准备;
6. FFN前馈网络计算:通过两层线性变换(768维→3072维升维,再3072维→768维降维,通过缩放可以让模型不要太多的关注细节)+ GELU非线性激活,对每个Token的向量进行深度加工,筛选冗余细节、提炼关键语义特征(词与词之间不交互,仅单独提纯);
7. 第二次残差连接:将FFN的输入与FFN的输出相加,避免过度加工丢失核心特征,得到本层的最终输出;
8. 重复上述7个步骤,将第1层的输出作为第2层的输入,依次经过12层Transformer的加工,得到最终的特征矩阵。

步骤4:损失计算与反向传播
1. 输出层处理:将12层Transformer的最终输出,通过线性投影映射到词汇表维度,得到每个Token对应的下一个可能Token的概率分布;
2. 计算损失(Loss):以“预测下一个Token”为目标,对比模型预测的概率分布与文本的真实Token,计算全局唯一的损失值(损失越大,预测越不准);
3. 反向传播更新参数:通过链式法则,将损失值从输出层反向逐层传递,穿透12层Transformer的所有权重(Wq、Wk、Wv、Wo、FFN权重),一直传递到最开头的嵌入矩阵和位置编码矩阵;
4. 优化器迭代:通过Adam优化器,根据反向传播得到的梯度,微调所有可训练参数(包括嵌入矩阵、各层权重、位置编码),降低损失值;
5. 循环迭代:重复步骤1-4,用海量文本持续训练,直到损失值趋于稳定,模型能够准确预测下一个Token,此时嵌入矩阵的向量已具备语义(相似Token的向量距离相近),各层权重也已学会最优的特征提取逻辑。

一些细节
1. 所有可训练参数(嵌入矩阵、各层Wq/Wk/Wv/Wo、FFN权重、位置编码)均为随机初始化,同步参与反向传播更新;
2. 可复用同领域、同词表的预训练嵌入矩阵,大幅提升训练速度,减少“从零学习语义”的算力消耗;
3. 在GPT-2的12层Transformer中,浅层侧重学习语法、局部搭配,深层侧重学习语义、逻辑推理,均为训练中自动分化形成,无需人工设计;
4. 在GPT-2中,每一头侧重什么并不是人为设计的,而是通过训练自动生成的;
5. 先分别乘Wq、Wk、Wv,再拆分为12个头;先将12个头合并为1个头,再乘Wo;
6. 嵌入矩阵是大模型的一部分,也是通过训练,接收到反向反馈,逐步修正得到的;
7. 词嵌入矩阵和位置嵌入矩阵,也都是随机初始化,然后逐步训练出来的;模型支持的上下文越大,位置嵌入矩阵会不断变长;

二、GPT-2推理时训练步骤

推理的核心目标是利用训练好的模型参数,根据输入的文本(提示词),逐步生成符合语义、逻辑的后续文本,全程只有前向传播,无反向传播和参数更新,具体步骤如下:

步骤1:输入处理
1. 输入推理提示词(一段话),例如“猫坐在柔软的垫子上,它”;
2. 对提示词进行Token化处理(BPE切分→Token ID映射),得到与训练时格式一致的Token ID序列;
3. 从训练好的嵌入矩阵中,根据Token ID取出对应的768维向量,加入训练好的位置编码,得到[Token数量×768]的初始输入矩阵。

步骤2:12层Transformer逐层前向计算
1. 将初始输入矩阵依次传入12层Transformer,每层均执行“前置归一化→多头自注意力→Wo融合→残差连接→前置归一化→FFN→残差连接”的流程,全程使用训练好的固定参数(嵌入矩阵、各层权重、位置编码均不改变),最终得到提示词对应的特征矩阵。

步骤3:Token生成
1. 将12层Transformer的最终输出,通过输出层线性投影,映射到词汇表维度,得到当前最后一个Token对应的下一个Token的概率分布;
2. 按概率筛选(通常取概率最高的Token,或通过采样策略筛选),得到下一个Token的ID,再将其映射为对应的文字(例如筛选出“很”,此时提示词变为“猫坐在柔软的垫子上,它很”);
3. 迭代生成:将新生成的Token ID加入原有的Token ID序列,重新执行步骤2-3,重复该过程,直到生成预设长度的文本,或遇到结束符(EOS),停止生成。

一些细节
1. 推理时仅执行前向传播,速度远快于训练(推理时无需计算损失,也不会更新任何参数,所有权重均为训练好的最优值,仅做特征提取和概率预测)。
2. 推理时,选用不同的tempture,其实就是选用TopX的高概率token,进行随机挑选,从而输出会不完全一致,并影响后续token输出;
3. 生成的文本质量,直接依赖训练时的参数优化效果(嵌入矩阵的语义准确性、各层权重的特征提取能力),所以高水平的语料特别重要,很多时候是宁缺毋滥;
4. 为保证生成的逻辑性,推理时会使用掩码机制,确保模型生成当前Token时,无法看到后续未生成的Token(单向因果掩码);
5. 在生成一个token后,会将这个token补充到本轮输入的末尾,作为下一轮的输入,预测下一个token;
6. 当大模型反馈100个汉字,意味着返回了120~150个token(1 个汉字 ≈ 1.2~1.5 个 Token),也就是进行了120~150次推理,所以服务商需要大量高端计算显卡,支持大模型的运算;
7. 所以当25年初DeepSeek靠压缩注意力(大幅降低注意力计算开销)+ MoE稀疏激活(只计算少部分参数)+ KV量化缓存(大幅降低显存用量)+ 推测解码(一次生成多个token,预测成功保留,大幅提升推理效率)等方法,让推理成本大幅降低,着实让业绩震惊了一把;

Leave a Reply

Your email address will not be published. Required fields are marked *

*