从零手撸Transformer:核心架构与PyTorch代码实战

通过PyTorch代码实现,系统讲解Transformer四大核心组件的原理与工程细节。
本文以Transformer架构为主线,系统介绍了构成现代大模型的四大核心模块:负责存储知识的前馈神经网络(FFN)、负责上下文关联的注意力机制(Attention)、将文字转化为向量的Embedding层,以及提升训练稳定性的层归一化。文章从Token化与位置编码出发,深入剖析QKV三角色设计、Mask机制和Decoder堆叠逻辑,并以文本分类任务为例给出完整PyTorch代码。通过11万参数的演示模型,作者验证了架构有效性,并指出现代大模型(GPT、Claude、LLaMA等)不过是在此基础上做注意力变体、归一化方式、位置编码方案等细节优化,核心结构一脉相承。
Transformer:现代大模型的基石
Transformer架构是当今大模型的核心基础。无论是GPT、Claude还是其他千亿参数模型,95%的结构都基于Transformer。理解这个架构,是深入学习大模型开发的必经之路。
本文将通过完整的PyTorch代码实现,带你从原理到实战,彻底搞懂Transformer的每一个组件。
Transformer的四大核心组件
Transformer整体由四个关键模块构成,各司其职:
前馈神经网络(FFN):知识存储中心
负责存储知识。大模型知道"中国的首都是北京"这类事实,全靠这个模块。它将上下文信息转化为隐式知识,以向量形式存储在网络参数中。在MoE(混合专家)架构中,对知识存储的优化也主要集中在这一层。
注意力机制(Attention):上下文联想器
用于联想上下文。当你说一句话时,模型需要理解前文的语境,Attention就是完成这个任务的关键结构。它让每个token能够"看到"并关联前面的所有token。
词嵌入(Embedding):文本向量化
将文字转换为向量。模型无法直接处理汉字或字母,Embedding层将每个token映射为一个数值向量,作为模型的实际输入。
层归一化(Add & Norm):训练稳定器
提高训练稳定性,加速模型收敛。在每个子模块后添加残差连接和归一化,确保深层网络也能有效训练。

从文字到向量:Token化与位置编码
Token化流程
每个汉字或字母都对应一个唯一的ID。例如,"小"字可能对应75号ID,这个映射关系由词表定义。词表大小决定了模型能处理多少不同的字符。
在PyTorch中,通过nn.Embedding层实现:
embedding = nn.Embedding(vocab_size, d_model)
其中vocab_size是词表大小,d_model是向量维度。初始时,每个ID对应的向量是随机值,通过训练不断优化。
位置编码的必要性
相同的词在不同位置含义可能不同。因此除了词向量,每个位置也对应一个向量。假设序列最长50个token,就有50个位置向量。
最终输入模型的向量 = 词向量 + 位置向量
例如"中国的首都是北京"这7个字,会生成7个词向量和7个位置向量(位置0到6),相加后得到真实输入。
注意力机制深度剖析
三种角色:QKV的本质
Attention的核心在于每个token同时扮演三种角色,这需要通过三个不同的线性变换实现:
- Q(Query):主动匹配者,用来搜索和自己相关的信息
- K(Key):被动匹配者,被别人搜索和匹配
- V(Value):信息提供者,提供实际的语义内容
这就像公司员工的三重身份:面试官(选人)、求职者(被选)、普通员工(干活)。

计算流程详解
以"中国的首都是"中的"是"字为例:
- 计算相似度:当前token的Q向量与前面所有token(包括自己)的K向量做内积,得到注意力分数
- 归一化权重:通过softmax将分数转为概率分布,得到权重w0到w4
- 加权求和:用这些权重对V向量进行加权求和,得到融合了上下文的新向量
- 线性变换:对新向量做线性变换,提取更有效的信息
关键代码:
# 计算注意力权重
scores = torch.matmul(Q, K.transpose(-2, -1))
weights = F.softmax(scores, dim=-1)
# 加权求和
output = torch.matmul(weights, V)
Mask机制:防止信息泄露
训练时,每个token只能看到它之前的内容,不能"偷看"未来。通过上三角mask矩阵实现:
mask = torch.triu(torch.ones(seq_len, seq_len), diagonal=1)
第1个token只看自己,第2个token看前2个,最后一个token能看到所有前文。这符合语言生成的自回归特性。
层层堆叠:Decoder架构

单个Decoder层的计算流程:
- 输入向量 → Self-Attention → Add & Norm
- → 前馈神经网络(FFN)→ Add & Norm
- 输出向量
因为输入和输出都是向量序列,所以可以无限堆叠。GPT-3这类大模型有几十层,参数量达到数百亿,但核心结构就是这个模式的重复。
代码实现:
for layer in self.decoder_layers:
x = layer(x, mask) # 每层参数不同
注意:虽然计算方法相同,但每层的参数是独立的。浅层提取直接特征,深层捕捉复杂语义。
训练目标:Next Token Prediction
大模型的训练方式
核心任务是预测下一个token。输入"中"时预测"国",输入"中国"时预测"首"。每个位置都在预测它的下一个字符。
这种训练方式让模型具备"接龙"能力。能准确预测下文,说明模型真正理解了当前语境——就像炒股高手能预测明天涨跌,前提是对历史数据有深刻理解。
文本分类实战案例

本文演示的是更简单的文本分类任务。假设有5个类别,模型输出5维向量表示每个类别的概率,取最大值对应的类别作为预测结果。
关键点:只需要最后一个token的输出向量进行分类,因为它能看到全部前文。前面的token输出都不需要。
完整代码实战
模型定义
class TransformerClassifier(nn.Module):
def __init__(self, vocab_size, d_model, n_layers, n_classes):
super().__init__()
self.token_embedding = nn.Embedding(vocab_size, d_model)
self.position_embedding = nn.Embedding(max_len, d_model)
self.decoder_layers = nn.ModuleList([
DecoderLayer(d_model) for _ in range(n_layers)
])
self.classifier = nn.Linear(d_model, n_classes)
训练技巧:Padding处理
句子长度不一,但GPU要求输入长度统一。解决方案:
- 短句子:后面补0(padding)
- 长句子:直接截断
代码中通过寻找真实的最后一个非0位置,获取有效的最终向量进行分类。
训练效果
在演示数据集上训练15轮,准确率达到99%。虽然数据量较小,但充分验证了架构的有效性。
模型参数分布:
- 总参数:11万
- Attention:1.6万(获取上下文)
- FFN:3.3万(存储知识)
- Embedding:其余(token和位置编码)
随着模型层数增加,Attention和FFN的参数占比会大幅上升,而Embedding占比逐渐降低。
关键要点总结
面试中被问到Attention机制,不能只画图,必须说清楚每个模块的作用:
- Attention参数:用于获取上下文,建立token之间的关联
- FFN参数:用于存储知识,将上下文信息转化为可预测的输出
- QKV分离:一个向量通过三种变换扮演三种角色,是Attention的精髓
- 层层堆叠:重复的Decoder层逐步提取更高层次的语义特征
从Transformer到大模型
现代大模型(GPT、Claude、LLaMA等)都基于这个核心架构,区别只是细节优化:
- 注意力变体(Multi-Head、Grouped-Query等)
- 归一化方式(LayerNorm、RMSNorm等)
- 位置编码方案(RoPE、ALiBi等)
- 激活函数选择(GeLU、SwiGLU等)
但万变不离其宗,掌握了本文的基础架构,你就拥有了理解任何大模型的钥匙。建议收藏本文,对照代码反复实践,真正做到不仅听得懂,还能敲得出。
相关推荐

AI代码注释检测器:如何精准识别AI生成的代码内容
探讨AI代码注释检测器的技术原理与应用场景,涵盖语言模式识别、上下文一致性分析等检测方法,帮助开发团队识别代码库中AI生成的注释内容,提升代码审查透明度与质量管理。

FDE实战:一句话需求秒变可上线AI页面全流程拆解
深度拆解FDE(前沿部署工程师)实战全流程:从一句话模糊需求到公网可访问页面,涵盖需求澄清、脏数据处理、AI工具协作与部署上线,解析FDE岗位核心能力与适合人群。

DSH开源方案实测:手机电脑云端三端互通远程控制
实测开源DSH三端互通方案,实现手机、电脑与云端服务器的AI工作流无缝协作。支持跨设备文件同步、远程运维容灾、双实例互为备份,附架构解析与部署思路。