多模态大模型学习笔记十六——Transformer 学习之 Decoder Only0. 前言Decoder Only仅解码器是当前 GPT、LLaMA、Qwen 等生成式大模型的主流底层架构也是 GPT-4V、Qwen-VL 等多模态大模型的核心底座。相较于传统的 Encoder-Decoder 架构如 T5Decoder Only 去掉了 Encoder 模块和 Cross-Attention 层仅保留带掩码的自注意力层Masked Self-Attention通过自回归生成机制完成文本生成、多模态内容生成等任务是大模型落地最广泛的架构形态。1. Decoder Only 核心定位Transformer 三大主流架构对比架构类型代表模型核心特点适用场景Encoder OnlyBERT、RoBERTa无掩码自注意力擅长理解文本分类、命名实体识别Encoder-DecoderT5、BART编码器解码器交叉注意力机器翻译、文本摘要Decoder OnlyGPT、LLaMA掩码自注意力自回归生成对话、创作、多模态生成Decoder Only 成为生成式大模型主流的核心原因架构极简无 Encoder、无 Cross-Attention工程实现和部署成本低能力统一同一架构同时支持“理解”和“生成”无需拆分模块拓展灵活多模态适配仅需统一 Embedding 维度无需修改核心逻辑。2. Decoder Only 整体架构2.1 架构流程解析输入层将离散的 Token 索引序列维度[B, L]B批次大小、L序列长度转换为连续的 Token Embedding并注入位置编码主流用 RoPE 旋转位置编码输出维度[B, L, d_model]解码器堆叠层将 N 层 Decoder Layer 堆叠LLaMA-7B 为 32 层GPT-3 为 96 层逐层捕捉上下文语义依赖输出层通过 Linear 层将模型隐向量映射到词表空间维度[B, L, vocab_size]经 Softmax 生成下一个 Token 的概率分布生成层基于概率分布自回归逐词生成直到输出结束符eos或达到最大长度。2.2 核心特点仅保留 Decoder 模块无 Encoder 模块仅使用 Masked Self-Attention无 Cross-Attention天然支持自回归生成符合人类语言生成习惯。3. 单层 Decoder 结构Pre-LN 范式现代大模型统一采用Pre-LNLayerNorm 前置设计相较于原始 Transformer 的 Post-LNPre-LN 训练更稳定、收敛更快结构如下3.1 结构流程输入x_{l-1}→ LayerNorm 1 → Masked Multi-Head Attention → 残差连接 → LayerNorm 2 → FFN 前馈网络 → 残差连接 → LayerNorm 3 → 输出x_l3.2 关键组件作用组件核心作用LayerNorm归一化隐向量分布稳定训练过程Pre-LN 设计大幅降低训练难度Masked Self-Attention仅允许当前 Token 关注前文 Token保证自回归生成的逻辑合理性残差连接缓解深层模型的梯度消失问题保证信息在多层传递中不丢失FFN 前馈网络对每个 Token 做非线性变换捕捉复杂语义特征主流用 GELU 激活函数4. Masked Self-AttentionDecoder Only 的核心Decoder Only 的核心是下三角掩码其作用是生成第 i 个 Token 时仅能关注前 i-1 个 Token绝对看不到后续 Token保证自回归生成的逻辑闭环。4.1 下三角掩码矩阵L5图例说明行当前生成的 Token 位置i列可关注的 Token 位置j✓可关注掩码值为 0-不可关注掩码值为-∞Softmax 后权重趋近于 0。4.2 数学公式与参数解释注意力计算核心公式Attention(Q,K,V)Softmax(QKTdkM)V \text{Attention}(Q,K,V) \text{Softmax}\left( \frac{QK^T}{\sqrt{d_k}} M \right) VAttention(Q,K,V)Softmax(dkQKTM)V掩码矩阵定义Mi,j{0,j≤i可关注−∞,ji不可关注 M_{i,j} \begin{cases} 0, j \le i \quad \text{可关注} \\ -\infty, j i \quad \text{不可关注} \end{cases}Mi,j{0,−∞,j≤i可关注ji不可关注参数解释Q/K/V查询/键/值矩阵维度均为[B, n_heads, L, d_k]d_k单个注意力头的维度d_k d_model / n_heads√d_k缩放因子避免高维向量点积结果过大M下三角掩码矩阵维度[L, L]。5. 自回归生成流程Decoder Only 的生成逻辑是“逐词生成、循环拼接”是所有大模型对话、写作、代码生成的核心范式5.1 核心规则每轮仅预测当前输入序列的最后一个 Token新生成的 Token 拼接到输入序列末尾作为下一轮输入终止条件输出eos结束符或达到预设的最大序列长度。5.2 流程示例输入今天天气→ 预测很→ 新输入今天天气很→ 预测好→ 新输入今天天气很好→ … → 输出eos终止。6. 工业级优化KV Cache 推理加速原生自回归生成的时间复杂度为O(L2)O(L^2)O(L2)L 为序列长度长序列生成效率极低。KV CacheKey-Value 缓存是 Decoder Only 推理加速的核心优化可将生成效率提升 10~100 倍。6.1 核心优化逻辑无 KV Cache低效有 KV Cache高效每轮重新计算所有 Token 的 K/V 矩阵仅计算新 Token 的 Q 矩阵复用缓存的历史 K/V 矩阵时间复杂度O(L2)O(L^2)O(L2)时间复杂度降至O(L)O(L)O(L)6.2 一句话总结KV Cache 缓存已生成 Token 的 K/V 矩阵每轮仅计算新 Token 的 Q 矩阵与缓存的 K/V 计算注意力不再重复计算前文的 K/V大幅降低计算量。7. 多模态拓展Decoder Only 的无缝适配GPT-4V、Qwen-VL 等多模态大模型的核心逻辑是将图像/音频等模态的 Embedding 与文本 Embedding 统一维度后拼接为输入序列直接送入 Decoder Only 模型。7.1 核心适配逻辑图像模态通过 ViT视觉Transformer将图像转换为图像块 Embedding维度与文本 Embedding 一致如d_model4096文本模态通过 Tokenizer 转换为文本 Embedding序列拼接[图像块1, 图像块2, ..., bos, 文本Token1, 文本Token2, ...]生成送入 Decoder Only 模型自回归生成多模态相关文本。7.2 核心前提所有模态的 Embedding 维度必须与 Decoder Only 模型的d_model一致保证输入序列的维度统一。8. 完整 PyTorch 实现带关键注释importtorchimporttorch.nnasnnimporttorch.nn.functionalasFclassMaskedMultiHeadAttention(nn.Module):掩码多头注意力层Decoder Only 核心组件def__init__(self,d_model,n_heads):super().__init__()self.n_headsn_heads# 注意力头数self.d_headd_model//n_heads# 单个注意力头的维度self.qkvnn.Linear(d_model,d_model*3)# 合并QKV投影提升效率self.outnn.Linear(d_model,d_model)# 注意力输出投影defforward(self,x):B,L,Dx.shape# B批次大小, L序列长度, Dd_model# 1. QKV投影与维度变换[B,L,3D] → [3,B,n_heads,L,d_head]qkvself.qkv(x).reshape(B,L,3,self.n_heads,self.d_head).permute(2,0,3,1,4)q,k,vqkv[0],qkv[1],qkv[2]# 2. 生成下三角掩码遮挡未来Tokenmasktorch.triu(torch.ones(L,L),diagonal1).bool().to(x.device)# 3. 缩放点积注意力计算 掩码attn_scores(q k.transpose(-2,-1))/(self.d_head**0.5)# 缩放避免数值过大attn_scoresattn_scores.masked_fill(mask,-1e9)# 掩码未来Tokenattn_weightsF.softmax(attn_scores,dim-1)# 注意力权重归一化# 4. 注意力加权求和 输出投影attn_out(attn_weights v).transpose(1,2).reshape(B,L,D)# 合并注意力头returnself.out(attn_out)classDecoderLayer(nn.Module):单层DecoderPre-LN 范式def__init__(self,d_model,n_heads,d_ff):super().__init__()self.norm1nn.LayerNorm(d_model)# 注意力层前置归一化self.masked_attnMaskedMultiHeadAttention(d_model,n_heads)self.norm2nn.LayerNorm(d_model)# FFN层前置归一化# FFN前馈网络GELU为大模型主流激活函数self.ffnnn.Sequential(nn.Linear(d_model,d_ff),nn.GELU(),nn.Linear(d_ff,d_model))self.norm3nn.LayerNorm(d_model)# 最终归一化defforward(self,x):# 注意力分支LayerNorm → MaskedAttn → 残差连接xxself.masked_attn(self.norm1(x))# FFN分支LayerNorm → FFN → 残差连接xxself.ffn(self.norm2(x))returnself.norm3(x)classDecoderOnly(nn.Module):完整的Decoder Only模型def__init__(self,vocab_size,d_model512,n_heads8,n_layers6,d_ff2048):super().__init__()self.embnn.Embedding(vocab_size,d_model)# Token嵌入层# 堆叠多层Decoderself.layersnn.ModuleList([DecoderLayer(d_model,n_heads,d_ff)for_inrange(n_layers)])self.outnn.Linear(d_model,vocab_size)# 输出映射到词表defforward(self,x):xself.emb(x)# Token序列 → Embeddingforlayerinself.layers:xlayer(x)# 逐层计算returnself.out(x)# 输出词表概率分布# 测试代码if__name____main__:# 初始化模型小型演示配置modelDecoderOnly(vocab_size10000)# 模拟输入批次大小2序列长度10xtorch.randint(0,10000,(2,10))# 前向计算logitsmodel(x)print(输出形状:,logits.shape)# 输出[2, 10, 10000]B, L, vocab_size9. 总结与落地建议9.1 核心总结Decoder Only 是生成式大模型的主流架构核心为“掩码自注意力 自回归生成”下三角掩码是自回归生成的核心保障保证仅能关注前文 TokenKV Cache 是工业级推理的必备优化大幅提升长序列生成效率多模态适配仅需统一 Embedding 维度无需修改 Decoder Only 核心逻辑。