第13课:Transformers 架构总结与易错点梳理【夯实核心理论基础】

张开发
2026/4/30 9:30:16 15 分钟阅读

分享文章

第13课:Transformers 架构总结与易错点梳理【夯实核心理论基础】
文章目录写在前面为什么要专门做一次总结一、核心架构知识点总结——一张图串起所有模块1.1 原始 Transformer编码器-解码器全景回顾1.2 三大变体架构速查1.3 注意力机制家族对比1.4 训练优化要点速记二、易错点拆解——从“我以为”到“我确认”2.1 误区一编码器的自注意力是“双向”解码器的自注意力是“单向”但解码器的交叉注意力也是双向的吗2.2 误区二多头注意力就是多次调用单头注意力然后取平均。2.3 误区三MLM 训练时被随机替换成其他词的位置模型预测的目标是那个随机词。2.4 误区四位置编码只加在输入层模型就能记住位置顺序。2.5 误区五解码器的输入就是目标序列训练时直接把整个目标序列喂进去就行。2.6 误区六BERT 只用 MLM 预训练GPT 只用 CLM 预训练两者完全不可互换。2.7 误区七训练时使用 AdamWdropout 和 weight_decay 越大越好。2.8 易错概念速查表三、理论应用思考——如何为新任务设计 Transformer 方案3.1 决策树选择架构和预训练任务3.2 案例实战演练案例1电商评论情感分类正面/负面案例2新闻标题自动生成根据正文生成标题案例3Python 代码补全根据上文预测下文代码3.3 面试中常见的设计问题四、课后延伸任务任务1绘制思维导图任务2为以下任务设计 Transformer 方案任务3代码实践——用 Transformer 实现一个字符级预测玩具 CLM附录任务设计参考答案下节课预告 Transformers模型架构系列课程导航去专栏阅读学完即“无死角”从宏观设计到微观细节一次厘清所有关键概念适合读者初级/中级开发者、AI 爱好者、准备面试或复习 Transformer 核心知识的任何人风格系统性总结 易混淆点对比 实战决策指南写在前面为什么要专门做一次总结前面的 12 节课我们系统学习了 Transformer 从底向上、从内到外的全部核心知识第 2 课数学基础向量、矩阵、Softmax、激活函数第 3 课整体架构编码器-解码器宏观视角第 4 课注意力机制入门Q, K, V基本流程第 5 课自注意力机制Self-Attention第 6 课多头注意力Multi-Head Attention第 7 课编码器深度解析第 8 课解码器深度解析第 9 课输入处理机制分词、位置编码第 10 课预训练-微调范式第 11 课MLM vs CLM第 12 课训练优化梯度、正则、优化器这些知识点就像搭积木单看每一块都很清楚但合在一起就容易混淆。例如编码器和解码器都有自注意力但一个无掩码一个有掩码为什么多头注意力是“把 Q/K/V 切分后分别做注意力再拼接”和“单头做多次”有什么区别MLM 和 CLM 训练出的模型分别适用于什么任务能不能互换本节课的目标就是把所有知识点串成一张网把常见的坑填平并给出选择架构/任务的决策方法。学完这节课你将能够清晰画出 Transformer 完整的数据流图包括张量形状变化。准确回答面试中最常问的 10 个“对比类”问题如区别、优缺点。面对一个新任务如文档摘要、情感分析能合理选择仅编码器/仅解码器/编码器-解码器以及对应的预训练任务。一、核心架构知识点总结——一张图串起所有模块1.1 原始 Transformer编码器-解码器全景回顾我们从输入到输出以机器翻译为例绘制完整数据流文字描述 代码模拟形状源句子中文: 我 爱 你 → 分词 词嵌入 位置编码 ↓ 编码器6 层: 每层: 多头自注意力无掩码 → 残差LN → FFN → 残差LN 输出: encoder_output (batch, src_len, d_model) ↓ 解码器6 层: 输入: 目标句子起始符 SOS 已生成词训练时用 teacher forcing 每层: 1) 掩码多头自注意力因果掩码→ 残差LN 2) 交叉注意力Q 来自解码器K,V 来自 encoder_output→ 残差LN 3) FFN → 残差LN ↓ 输出: 线性层 Softmax → 下一个词的概率分布核心的形状变化批大小为 1方便理解# 伪代码形状src_len,tgt_len5,4d_model512# 输入src_tokens(1,src_len)tgt_tokens(1,tgt_len)# 嵌入后src_emb(1,src_len,512)tgt_emb(1,tgt_len,512)# 加位置编码后形状不变src_input(1,5,512)tgt_input(1,4,512)# 编码器输出encoder_out(1,5,512)# 解码器输出经过线性层前decoder_out(1,4,512)# Logitslogits(1,4,vocab_size)# 每个目标位置预测下一个词1.2 三大变体架构速查架构组件注意力掩码典型预训练任务代表作核心用途仅编码器只堆叠编码器无双向MLM ± NSPBERT, RoBERTa, ALBERT文本理解、分类、序列标注仅解码器只堆叠解码器因果掩码单向CLM自回归GPT, LLaMA, PaLM文本生成、对话、代码生成编码器-解码器编码器 解码器编码器无掩码解码器内部掩码 交叉注意力降噪自编码、Span CorruptionT5, BART,原始Transformer序列到序列翻译、摘要1.3 注意力机制家族对比这是最容易混淆的部分我们用一个表格清晰区分注意力类型Q来源K/V来源掩码用在哪自注意力 (Self-Attention)XX无编码器、解码器的交叉注意力之前解码器内部第一个子层需加因果掩码掩码自注意力 (Masked Self-Attention)XX因果掩码未来屏蔽解码器第一个子层交叉注意力 (Cross-Attention)解码器上一层的输出编码器输出无但 K/V 的 padding 需掩码解码器第二个子层多头注意力 (Multi-Head)上述任意一种但 Q/K/V 先切分再计算同上同上所有注意力子层实际实现时用 MultiHeadAttention 封装关键区分“自注意力”强调 Q/K/V 来自同一序列“多头”强调把特征维度拆成多个头并行计算。“掩码”是附加在注意力得分矩阵上的约束不是独立的注意力类型。1.4 训练优化要点速记问题解决方案常用值/做法梯度爆炸梯度裁剪clip_grad_norm_max_norm1.0过拟合Dropout L2正则化Dropout0.1, weight_decay0.01收敛缓慢自适应优化器 学习率预热AdamW, lr5e-5, warmup 10%训练不稳定学习率预热 合理的初始化预热步数 总步数的 5%~10%二、易错点拆解——从“我以为”到“我确认”2.1 误区一编码器的自注意力是“双向”解码器的自注意力是“单向”但解码器的交叉注意力也是双向的吗正确理解编码器自注意力双向可以看整个输入序列的所有位置。解码器掩码自注意力单向因果只能看当前位置及之前的输出位置。解码器交叉注意力Q 来自解码器K/V 来自编码器。由于编码器的输出已经包含了完整的源序列信息而且没有对未来目标位置的限制所以交叉注意力允许解码器的每个位置看到整个编码器输出。这本质上是“从解码器到编码器”的全双向连接。因此我们说交叉注意力没有因果限制。常见错误认为交叉注意力也要加因果掩码这会导致解码器无法看到后面的源词实际上源词的顺序是固定的不需要掩码。2.2 误区二多头注意力就是多次调用单头注意力然后取平均。正确理解单头注意力将整个 d_model 维度的 Q/K/V 一次性做注意力输出 d_v 维。多头注意力将 d_model 拆成 h 个 d_k 维的子空间每个子空间独立计算注意力然后将 h 个输出拼接再经过一次线性变换得到最终输出。关键区别每个头在不同的子空间学习不同的特征模式拼接后通过W_O融合。这比简单平均多个单头结果要强大得多。代码对比伪# 错误的“平均多头”理解heads[single_head_attention(q,k,v)for_inrange(h)]outputsum(heads)/h# 不对# 正确的多头q_multisplit(q,h)# (batch, h, seq, d_k)k_multisplit(k,h)v_multisplit(v,h)attn_outattention(q_multi,k_multi,v_multi)# (batch, h, seq, d_v)concatreshape(attn_out)# (batch, seq, h*d_v)outputlinear(concat)# (batch, seq, d_model)2.3 误区三MLM 训练时被随机替换成其他词的位置模型预测的目标是那个随机词。正确理解无论该位置被替换成[MASK]、随机词还是保留原词标签始终是原始的真实 token。模型的目标是预测出正确答案而不是预测被替换后的内容。例如原词“爱”被随机替换成“恨”。模型需要输出“爱”而不是“恨”。引入随机词是为了让模型学会即使输入是错误词也要通过上下文纠正。2.4 误区四位置编码只加在输入层模型就能记住位置顺序。正确理解Transformer 的自注意力本身对位置不敏感所以必须在输入嵌入中加入位置信号。但需要注意的是这个位置信号会随着层数加深逐渐被淡化。因此深层的表示中位置信息可能会被语义信息覆盖。对于需要强位置依赖的任务如命名实体识别往往需要额外的手段如相对位置编码、RoPE。正弦编码的局限绝对位置编码无法很好地外推到训练时未见过的序列长度。现代的模型如 GPT-NeoX、LLaMA普遍采用RoPE旋转位置编码或ALiBi来改善外推性。2.5 误区五解码器的输入就是目标序列训练时直接把整个目标序列喂进去就行。正确理解在 teacher forcing 下解码器的输入的确是完整的正确目标序列右移一位开头添加SOS但必须配合因果掩码防止第 i 个位置看到第 i1 及之后的目标词。如果没有掩码模型就会看到未来的答案学不到自回归生成的能力。推理时输入是动态增长的初始只有SOS每生成一个词就追加到输入末尾。2.6 误区六BERT 只用 MLM 预训练GPT 只用 CLM 预训练两者完全不可互换。正确理解BERT 采用 MLM NSP是因为它的目标是为下游理解任务提供双向表示。如果改成 CLMBERT 就变成了一个生成模型但它的架构无因果掩码不合适。GPT 采用 CLM是因为生成任务需要自回归。若改成 MLMGPT 在生成时无法使用双向信息因为未来词不存在。然而有些模型如 UniLM、GLM通过改变注意力掩码可以同时支持双向和单向训练甚至在同一模型上做多种预训练任务。选择原则任务本质是“理解”如分类、匹配 → 优先用双向模型BERT。任务本质是“生成”如写故事、代码 → 优先用自回归模型GPT。需要同时理解输入并生成输出如翻译、摘要 → 编码器-解码器T5或超大 GPT 通过 prompt 也可完成。2.7 误区七训练时使用 AdamWdropout 和 weight_decay 越大越好。正确理解Dropout 和 weight_decay 是正则化手段过大如 dropout0.5, wd0.5会使模型欠拟合训练损失降不下去。预训练阶段数据量巨大正则化可以轻一些dropout0.1, wd0.01。微调阶段数据量小可适当增强正则化dropout0.2~0.3, wd0.05但要关注验证集性能。调试建议如果验证集 loss 不降尝试降低 dropout 和 weight_decay如果训练集 loss 远低于验证集说明过拟合可提高正则化。2.8 易错概念速查表易混淆点正确辨析Self-Attention vs Multi-Head Attention自注意力是一种计算模式多头是一种并行策略多头注意力内部使用了自注意力。编码器 vs 解码器编码器无掩码双向解码器有掩码自注意力 交叉注意力。MLM vs CLMMLM 双向预测随机遮盖词CLM 单向预测下一个词。Q, K, V 的含义Q 是查询K 是被查询的键V 是实际被加权的内容。训练中的 dropout vs 推理中的 dropout训练时启用 dropout推理时关闭或等价于保留所有神经元。LayerNorm vs BatchNormLayerNorm 对每个样本的特征维度归一化BatchNorm 对 batch 内的每个特征通道归一化序列任务中 LayerNorm 更常用。Teacher Forcing vs 自回归Teacher forcing 是训练技巧使用真实标签作为输入自回归是推理方式使用自己生成的词作为输入。三、理论应用思考——如何为新任务设计 Transformer 方案3.1 决策树选择架构和预训练任务1. 任务输出是什么 ├── 一个类别/分数分类/回归 → 仅编码器BERT 类取 [CLS] 或平均池化 ├── 一个与输入等长的标签序列NER, POS → 仅编码器每个 token 独立分类 ├── 一段新文本生成 → 仅解码器GPT 类或编码器-解码器 └── 输入输出是不同序列且长度变化大翻译、摘要 → 编码器-解码器 2. 如果选择了生成类 ├── 输入较短生成较长 → 解码器用 prompt 编码输入 ├── 输入很长生成较短摘要 → 编码器-解码器更佳 └── 输入输出结构相似如代码补全 → 解码器足够 3. 资源限制 ├── 只有少量标注数据1000条 → PEFTLoRA 大模型 ├── 可以接受几小时训练 → 全参数微调 BERT-base/GPT-2 └── 有大规模预算 → 从头预训练极少情况3.2 案例实战演练案例1电商评论情感分类正面/负面选型仅编码器BERT-base。理由输出是固定类别需要深度理解评论文本的语义双向上下文至关重要。预训练任务MLM不涉及生成CLM 不必要。微调在 5000 条标注评论上全参数微调学习率 2e-5dropout0.1。案例2新闻标题自动生成根据正文生成标题选型编码器-解码器T5-small或仅解码器GPT-2 通过 prompt “标题”。理由输入正文较长输出标题较短两者不同结构编码器-解码器天然适配。预训练任务T5 的 span corruption 预训练。微调使用新闻-标题对全参数微调。案例3Python 代码补全根据上文预测下文代码选型仅解码器CodeGPT, StarCoder。理由自回归生成输入输出都是代码且需要长程依赖。预训练任务CLM 在大量代码上预训练。微调在特定仓库代码上微调或直接使用 few-shot prompting。3.3 面试中常见的设计问题问如果我想做一个智能客服对话系统应该用 BERT 还是 GPT答对话系统需要生成回复因此应选用生成式模型GPT 系列。BERT 只能做分类或提取无法生成连贯对话。如果对话是检索式从候选库中选最佳回复BERT 也可以用来计算相似度但端到端生成首选 GPT。问为什么机器翻译可以用仅解码器模型如 GPT-4而不用编码器-解码器答对于大语言模型如 GPT-4可以通过构造 prompt 将翻译任务转化为“给定源语言句子生成目标语言句子”的形式。模型内部的注意力虽然是单向的但在生成过程中源语言句子作为前缀整个序列包括源句都在解码器的自注意力视野内因为源句在前目标词在后。虽然理论上不如交叉注意力灵活但在规模足够大时效果已经超越传统编码器-解码器。四、课后延伸任务任务1绘制思维导图使用 XMind、Obsidian 或纸上手绘画出 Transformer 知识体系至少包括输入处理分词、嵌入、位置编码编码器自注意力、FFN、残差、LN解码器掩码自注意力、交叉注意力、FFN注意力机制Q/K/V、缩放点积、多头预训练任务MLM、CLM、NSP训练优化梯度裁剪、AdamW、预热任务2为以下任务设计 Transformer 方案任务A医学病历命名实体识别识别疾病、药物、症状等。任务B诗歌生成给定关键词生成四行七言绝句。任务C中英文文本相似度计算输出 0~1 相似度。对每个任务回答选什么架构仅编码器/仅解码器/编码器-解码器为什么选择什么预训练模型如 BioBERT、GPT-2-Chinese、Sentence-BERT微调时需要调整哪些关键参数参考答案在文末附录中。任务3代码实践——用 Transformer 实现一个字符级预测玩具 CLM下面代码实现了一个极简的字符级 CLMGPT-like帮你巩固因果掩码和自回归生成的概念importtorchimporttorch.nnasnnimporttorch.nn.functionalasF# 超参数vocablist(abcdefghijklmnopqrstuvwxyz )char_to_id{c:ifori,cinenumerate(vocab)}id_to_char{i:cforc,iinchar_to_id.items()}vocab_sizelen(vocab)d_model32num_layers2num_heads4max_len50classCausalSelfAttention(nn.Module):def__init__(self,d_model,num_heads):super().__init__()self.num_headsnum_heads self.d_kd_model//num_heads self.qkvnn.Linear(d_model,3*d_model)self.projnn.Linear(d_model,d_model)defforward(self,x):B,T,Cx.shape qkvself.qkv(x).reshape(B,T,3,self.num_heads,self.d_k).permute(2,0,3,1,4)q,k,vqkv[0],qkv[1],qkv[2]# 因果掩码masktorch.tril(torch.ones(T,T)).view(1,1,T,T).to(x.device)att(q k.transpose(-2,-1))/(self.d_k**0.5)attatt.masked_fill(mask0,float(-inf))attF.softmax(att,dim-1)y(att v).transpose(1,2).reshape(B,T,C)returnself.proj(y)classDecoderBlock(nn.Module):def__init__(self,d_model,num_heads):super().__init__()self.ln1nn.LayerNorm(d_model)self.attnCausalSelfAttention(d_model,num_heads)self.ln2nn.LayerNorm(d_model)self.ffnn.Sequential(nn.Linear(d_model,4*d_model),nn.GELU(),nn.Linear(4*d_model,d_model))defforward(self,x):xxself.attn(self.ln1(x))xxself.ff(self.ln2(x))returnxclassTinyGPT(nn.Module):def__init__(self,vocab_size,d_model,num_layers,num_heads,max_len):super().__init__()self.token_embednn.Embedding(vocab_size,d_model)self.pos_embednn.Parameter(torch.zeros(1,max_len,d_model))self.blocksnn.ModuleList([DecoderBlock(d_model,num_heads)for_inrange(num_layers)])self.ln_fnn.LayerNorm(d_model)self.headnn.Linear(d_model,vocab_size)defforward(self,idx):B,Tidx.shape tok_embself.token_embed(idx)pos_embself.pos_embed[:,:T,:]xtok_embpos_embforblockinself.blocks:xblock(x)xself.ln_f(x)logitsself.head(x)returnlogits# 生成一个简单的训练数据字符串 the quick brown fox jumps over the lazy dog 重复textthe quick brown fox jumps over the lazy dog *10idstorch.tensor([char_to_id[c]forcintext],dtypetorch.long)modelTinyGPT(vocab_size,d_model,num_layers,num_heads,max_len)optimizertorch.optim.AdamW(model.parameters(),lr1e-3)# 训练简单的 next token predictionepochs5forepochinrange(epochs):foriinrange(0,len(ids)-max_len,max_len):inpids[i:imax_len].unsqueeze(0)tgtids[i1:imax_len1].unsqueeze(0)logitsmodel(inp)# (1, seq, vocab)lossF.cross_entropy(logits.view(-1,vocab_size),tgt.view(-1))optimizer.zero_grad()loss.backward()torch.nn.utils.clip_grad_norm_(model.parameters(),1.0)optimizer.step()print(fEpoch{epoch1}, loss:{loss.item():.4f})# 生成model.eval()starttorch.tensor([[char_to_id[t]]])# 起始字符 tfor_inrange(50):withtorch.no_grad():logitsmodel(start)next_tokentorch.argmax(logits[0,-1,:]).item()starttorch.cat([start,torch.tensor([[next_token]])],dim1)ifnext_tokenchar_to_id[ ]:breakprint(生成的文本:,.join([id_to_char[int(i)]foriinstart[0].tolist()]))运行这段代码你会看到模型学会预测常见的英文单词序列。附录任务设计参考答案任务A医学NER架构仅编码器如 BioBERT。原因NER 是 token 级分类需要双向上下文。预训练模型BioBERT在生物医学语料上预训练。关键参数学习率 2e-5batch size 16max_len 128。任务B诗歌生成架构仅解码器如 GPT-2-Chinese。原因自由生成自回归。预训练模型GPT-2-Chinese 或从头训练一个小型 GPT。关键参数生成时温度 0.8增加多样性top-p0.9。任务C文本相似度架构仅编码器Sentence-BERT 双编码器。原因需要计算两段文本的表示向量再计算余弦相似度。预训练模型BERT 或 RoBERTa使用双塔结构微调。关键参数对比学习损失学习率 2e-5。下节课预告所有基础已铺垫完毕。从下一节课开始我们将进入经典模型解析系列逐个解剖那些改变 NLP 历史的模型。【第14课BERT 模型全解析——预训练与微调的完美实践】BERT 的架构与原始 Transformer 的差异MLM NSP 预训练任务的细节与效果如何进行微调文本分类、问答、NERBERT 的变体RoBERTa、ALBERT、DistilBERT对比你将看到一个“基础模型”如何通过精巧的设计横扫 11 项 NLP 任务纪录。我们第14课见祝贺你完成了 Transformer 核心理论的全部学习现在你已经具备了从零理解、修改、甚至设计新 Transformer 变体的能力。保持动手保持思辨经典模型系列等你来挑战。 Transformers模型架构系列课程导航去专栏阅读模块1Transformers入门基础第1-6课模块核心目标帮助零基础读者快速入门搭建Transformers的基础认知框架了解其起源、发展背景及核心应用场景掌握必备的前置知识为后续核心原理学习奠定基础降低入门门槛。模块2Transformers核心架构与原理第7-13课模块核心目标深入拆解Transformers的核心架构编码器、解码器掌握每个子模块的工作原理、作用及实现逻辑理解各模块之间的协同工作机制突破理论难点为后续模型解析与实战奠定基础。模块3Transformers经典模型解析第14-20节课模块核心目标逐个拆解Transformers领域的经典模型BERT、GPT、T5等分析每个模型的核心改进、预训练任务、适用场景与优缺点让读者掌握不同模型的差异能根据实际任务选择合适的模型兼顾理论深度与应用落地。模块4Transformers实战与优化第21-26课模块核心目标聚焦实战落地从环境搭建、工具使用到具体任务实操让读者掌握Transformers模型的训练、微调、部署方法学习实战中的优化技巧解决实际项目中的常见问题确保每节课都有具体的实操案例让读者“会应用、能落地”。模块5Transformers行业应用与前沿拓展第27-30课模块核心目标结合不同行业的实际应用场景讲解Transformers的落地案例让读者了解其行业应用价值同时覆盖当前Transformers的前沿趋势帮助读者把握技术发展方向提升专栏的前沿性与实用性。 感谢您耐心阅读到这里 如果本文对您有所启发欢迎 点赞 收藏 分享给更多需要的伙伴。️ 期待在评论区看到您的想法, 共同进步。 关注我持续获取更多干货内容 我们下篇文章见

更多文章