追踪一个 token 的完整旅程:从输入文本到输出概率的深度解析

发布时间:2026/6/4 14:09:15

追踪一个 token 的完整旅程:从输入文本到输出概率的深度解析 本文深入探讨了 Transformer 模型中 token 从输入文本到输出概率的完整处理流程。通过逐层解剖 Decoder Block 的四大组件——Attention、残差连接、FFN 和 LayerNorm揭示了它们的设计原理和参数分配。文章强调了 Decoder-Only 架构的简单性和训练效率并详细解析了每个组件的功能和作用如 Attention 的信息交流、FFN 的非线性变换、残差连接的梯度传播以及 LayerNorm 的数值稳定。此外文章还通过代码实验展示了 token 在模型中的数据流变化并分析了参数量分布和推理成本结构为理解 Transformer 模型的内部机制提供了全面而深入的视角。把前3篇的知识串起来像追踪一个快递包裹一样追踪一个 token 从输入文本到输出概率的完整旅程。逐层解剖 Decoder Block 的四大组件——Attention、残差连接、FFN、LayerNorm——理解它们为什么这样设计以及参数量到底花在哪里。一、引子三个变形金刚Transformer 不是单一模型而是一个家族。2017 年 Google 发表《Attention Is All You Need》时提出的是一个完整的 Encoder-Decoder 架构——左边 6 层 Encoder 读取源语言右边 6 层 Decoder 生成目标语言中间用交叉 Attention 连接。这个设计是为机器翻译量身打造的。但后来的发展出乎所有人意料研究者把这个架构拆开只保留一半反而做出了更强大的模型。Encoder-OnlyBERT 路线只保留左边的 Encoder。每个词都能看到整句话适合理解任务——情感分析、问答、语义搜索。但有个致命缺陷它不会说话只能理解。Decoder-OnlyGPT 路线只保留右边的 Decoder去掉交叉 Attention。每个词只能看过去天生适合生成文本。GPT-11.17 亿参数、GPT-31750 亿、GPT-4估计 1.8 万亿——全部是这个架构。今天的 Llama、Claude、DeepSeek 也无一例外[1]。Encoder-DecoderT5 路线保留完整的两边用在对齐的序列任务上——翻译、摘要。T5 证明了把所有 NLP 任务都看成文本到文本的转换这一统一框架的可行性。三种变体的核心差异只有一个注意力掩码。Encoder 是双向的Decoder 是因果的Encoder-Decoder 则是两者结合。除此之外——Attention 机制、FFN、残差连接、LayerNorm——所有组件完全相同[2]。这就引出了一个深刻洞察Transformer 的通用性来自它的无偏见。 CNN 假设相邻像素相关RNN 假设顺序处理而 Transformer 除了位置编码外对输入结构不做任何预设。这让它能被用于语言、图像、蛋白质、音频——几乎任何可以用一组元素描述的数据[3]。架构对比一张表看懂三种变体特性Encoder-Only (BERT)Decoder-Only (GPT)Encoder-Decoder (T5)注意力方向双向看整句因果只看过去双向 因果 交叉预训练任务Masked LMmask 15%Next Token Prediction100%Span Corruption数据利用率15% token 参与损失100% token 参与损失约 50%生成能力❌ 不能生成✅ 自回归生成✅ 自回归生成代表模型BERT, RoBERTaGPT, Llama, ClaudeT5, BART当前地位理解任务专用现代 LLM 标准翻译/摘要专用上表中最关键的数字是数据利用率——BERT 每轮只监督 15% 的 token意味着 85% 的计算没有直接优化目标。Decoder-Only 的 Next Token Prediction 让每个位置都参与损失计算训练效率是前者的 6~7 倍。这不是 Decoder-Only “更聪明”而是它更勤奋——每轮训练都把数据压榨到极致。另一个常被忽视的点是工程复杂度。Encoder-Decoder 需要维护两套参数、两种 Attention 掩码、两个优化器状态。训练基础设施分布式策略、梯度检查点、推理引擎都要为两套系统做适配。Decoder-Only 把这一切都简化为重复堆叠同一种 block——这对扩展到数千亿参数至关重要。但 Decoder-Only 为什么赢了三个原因简单性单层堆栈比两层更容易扩展和优化。训练基础设施、分布式策略、推理引擎——所有工程优化都只需要针对一种 block。训练效率BERT 的 Masked Language Modeling 每轮只 mask 15% 的 token意味着 85% 的数据没有被直接监督。而 Decoder-Only 的 Next Token Prediction 让每个 token 都参与损失计算数据利用率更高。涌现能力规模超过 100B 后Decoder-Only 模型自发发展出 in-context learning给几个例子就能学会新任务和 chain-of-thought 推理能力。这些能力在 Encoder-Only 或 Encoder-Decoder 模型中未被观察到[4]。一个有趣的反事实如果 2018 年 BERT 的团队选择了 Decoder-Only 架构今天的 LLM 生态会不会完全不同历史没有如果但 Decoder-Only 的胜利告诉我们在深度学习中架构的简单性往往是可扩展性的前提。本文聚焦 Decoder-Only 架构——因为它是现代 LLM 的事实标准。接下来我们会像追踪一个快递包裹一样追踪一个 token 穿越神经网络的全过程。图 1三种 Transformer 变体。Encoder-Only 双向看Decoder-Only 只能看过去Encoder-Decoder 两边都看。Decoder-Only 凭借简单性和训练效率成为现代 LLM 的标准选择。二、Decoder BlockTransformer 的基本单元想象一座现代化的信息加工厂。原料token 向量从一端进入经过多个加工工位最终变成成品上下文表示。每个 Decoder Block 就是这座工厂的一个车间。一个标准的 Decoder BlockPre-Norm 版本包含四个工位按处理顺序排列工位 1Masked Self-Attention分拣中心这是你已经熟悉的组件。每个 token 向所有其他 token 发问你跟我有什么关系然后根据答案重新组合自己的表示。在第3篇中我们用图书馆类比理解了 Q/K/V。这里补充一个物流视角Attention 就像智能分拣系统——每个包裹token根据标签Key匹配自己的目的地然后按优先级注意力权重整合所有相关信息。工位 2残差连接Bypass 高速公路Attention 的输出不是直接传给下一层而是与原始输入相加output input Attention(input)这看起来是个小动作但它决定了 Transformer 能堆多深。下一节会详细解释。工位 3FFN深度加工车间Attention 让 token 之间交流了信息但交流本身不产生新见解。FFN 的作用是对每个 token 的表示做独立的非线性变换——就像每个工人在交流完之后独自深入思考。FFN 的结构极其简单两个线性层夹一个激活函数。但隐藏层维度是输入的 4 倍比如 d_model4096 → d_ff16384这让它的参数量远超 Attention。工位 4LayerNorm质量校准仪深度网络训练时数值会逐层漂移——有的层输出变得极大有的变得极小。LayerNorm 的作用是把每层的输出拉回到合理范围让训练稳定。张量形状的稳定性Decoder Block 的设计有一个绝妙之处输入和输出维度完全相同。无论内部经过多么复杂的变换一个 block 的输入是[batch, seq_len, d_model]输出也是[batch, seq_len, d_model]。这意味着什么层与层之间不需要任何适配。就像 USB-C 接口——所有设备的接口一样你可以随意插拔、任意堆叠。GPT-3 堆了 96 层Llama 3 堆了 126 层每一层都是即插即用。如果没有这个设计深度堆叠将是一场噩梦第 5 层的输出是[2, 10, 768]第 6 层期望[2, 10, 512]——你就需要一个额外的投影矩阵来做适配。这不仅增加参数还引入额外的信息瓶颈。残差连接的input F(input)结构天然保证了同维度输出这让无限堆叠成为可能。两种排列Pre-Norm vs Post-Norm这四个工位有两种排列方式Post-Norm原始 Transformer2017x LayerNorm(x Attention(x))x LayerNorm(x FFN(x))Pre-NormGPT-2 及之后现代标准x x Attention(LayerNorm(x))x x FFN(LayerNorm(x))区别微妙但关键Pre-Norm 把归一化放在子层的输入端让残差连接保持干净——梯度可以直接通过相加操作回传不受 LayerNorm 的缩放影响。这让训练深度模型GPT-3 的 96 层、Llama 3 的 126 层成为可能[5]。现代模型更进一步用 RMSNorm 替代 LayerNorm——去掉减均值步骤只保留除标准差缩放。这快约 20%且 Llama、Mistral、DeepSeek、Qwen 的实践表明没有质量损失[6]。图 2一个标准 Decoder BlockPre-Norm 版本的数据流。输入和输出维度相同这让层间堆叠变得极其简单——就像乐高积木每块接口完全一致。三、残差连接深度网络的高速公路2015 年微软亚洲研究院的何恺明团队发表了一篇改变深度学习历史的论文。他们发现在 ImageNet 上56 层的神经网络训练误差反而比 20 层更高——不是过拟合是训练本身失败了[7]。这个发现被称为 degradation 问题。直觉上更深的网络至少有复制浅层网络的能力——大不了新增的层什么都不做。但实际训练中深层网络连这种保底都做不到。ResNet 的洞察ResNetResidual Network的解决方案出奇地简洁不让网络学习从零开始让它学习改多少。标准网络的层计算output F(input)残差网络的层计算output input F(input)其中 F(input) 是残差——即需要修改的量。如果这层什么都不需要做网络只需要让 F(input) → 0output 就等于 input。这比学习一个完整的映射容易得多。梯度高速公路残差连接的数学魔力在反向传播时显现∂L/∂input ∂L/∂output · (∂F/∂input 1)注意那个 1。即使 ∂F/∂input 很小深层网络常见1 保证梯度不会消失。残差连接创建了一条梯度高速公路让误差信号可以从输出层直接跳回输入层 bypass 中间所有层。这就像一个多层官僚机构没有残差连接时顶层决策要逐级传达到基层每传一层信息就损失一点有了残差连接相当于开通了直达专线——顶层可以直接把指令送到任何一层。一个更具体的直觉假设你要改造一栋 100 层的摩天大楼。没有残差连接时建筑师必须重新设计整栋楼有残差连接时建筑师只需要设计与原来相比改多少——大不了改动了 0%楼还是原来的楼。这让加层变得安全^8。在 Transformer 中的应用Transformer 的每个子层Attention 和 FFN都包裹在残差连接中x x Attention(LayerNorm(x)) # Attention 子层x x FFN(LayerNorm(x)) # FFN 子层这意味着每个子层只需要做微改造。如果 Attention 或 FFN 的变换没有帮助网络可以轻易让它们归零让信息直接流过。没有残差连接GPT-3 的 96 层和 Llama 3 的 126 层根本不可能训练。残差连接不是锦上添花而是深度学习的基石。图 3没有残差连接时梯度在深层网络中逐层衰减有了残差连接1 项创建梯度高速公路让误差信号可以从输出直接跳回输入层。四、FFNAttention 之后的独立思考如果你已经理解了 Attention 的强大可能会问为什么还需要 FFNAttention 不是已经让模型看懂上下文了吗答案是Attention 是线性的而语言不是。Attention 的线性局限Attention 的核心操作是加权平均每个位置的输出是 Value 向量的线性组合。无论多少层 Attention 堆叠只要中间没有非线性操作整体仍然是线性变换——等价于一个单层大矩阵。线性变换能做什么旋转、缩放、平移。但它不能• 区分 “bank”金融机构和 “bank”河岸——需要非线性的决策边界• 理解 “not bad” 实际上是正面评价——需要弯曲的特征交互• 判断 “the cat sat on the cat” 为什么有点奇怪——需要条件关系FFN 引入非线性FFN 的结构极简但有效FFN(x) W₂ · activation(W₁ · x b₁) b₂• W₁ 把输入从 d_model 投影到 4×d_model 的高维空间• 激活函数GeLU 或 SwiGLU引入非线性弯曲• W₂ 把结果投影回 d_model激活函数的演进从 ReLU 到 SwiGLU原始 Transformer 使用 ReLU 作为激活函数ReLU(x) max(0, x)ReLU 简单高效但有个问题负值被完全截断为 0导致神经元死亡——一旦某个神经元输出为负它就永远不再更新。GPT-2 改用 GeLUGaussian Error Linear UnitGeLU(x) x · Φ(x) # Φ 是标准正态分布的 CDFGeLU 没有硬截断而是用概率软过渡——负值会以一定概率保留。这让训练更稳定效果也更好。现代 LLMLlama 2更进一步采用 SwiGLUSwiGLU(x, W, V) Swish(xW) ⊗ xVSwiGLU 把 FFN 变成门控结构——一个分支做非线性变换另一个分支做线性传递两者逐元素相乘。这不仅引入更强的非线性还通过门控机制让网络学习什么时候激活、什么时候静默。Llama 3、Mistral、Qwen 2.5 都使用 SwiGLU它已成为 2024-2025 年的事实标准[19]。为什么需要 4× 扩展这个expand-transform-contract结构让模型能在高维空间中学习复杂的非线性映射再压缩回原始维度。为什么是 4 倍扩展这不是魔法数字而是工程权衡太小则表达能力不足太大则参数量爆炸。4× 在 GPT-2 时代被验证为甜点之后沿用至今[9]。FFN 是知识存储2021 年Geva 等人的研究揭示了一个惊人发现FFN 层本质上是一个巨大的关联记忆。• 第一层线性层 W₁ 的每个神经元像一个 key——匹配输入中的特定模式• 第二层线性层 W₂ 的每个神经元像一个 value——存储对应的知识• 当输入匹配某个 key 时对应的 value 被激活并输出换句话说Transformer 的大部分事实知识——“巴黎是法国首都”、“水在 100°C 沸腾”、“Python 的 print 函数用法”——不是存储在 Attention 矩阵里而是存储在 FFN 的权重中。Attention 负责路由决定查哪本书FFN 负责内容书里的知识[10]。这个发现解释了为什么• 增大 FFN 维度如从 4× 扩展到 8×能显著提升模型知识容量• 某些 FFN 神经元被屏蔽后模型对特定事实的回答会变差• MoEMixture of Experts第11篇的核心思路就是让多个专家 FFN分工存储不同领域知识参数量的大户在大多数 Transformer 中FFN 是参数的绝对主力组件Llama 3 8B 参数量占比Token Embedding~1.3B~16%Attention32层~1.6B~20%FFN32层~6.4B~80%LayerNorm~0.001B0.1%FFN 占每层 2/3 以上参数32 层叠加后占据整个模型的绝大多数。这是理解 LLM 规模的第一个关键——当你听说一个模型有 70B 参数时约 56B 都在 FFN 里。类比会议室 vs 独立思考用第3篇的类比延伸• Attention 是会议室讨论——所有人交流信息形成共识• FFN 是独立思考——每个人带着讨论结果独自深入加工没有会议室每个人活在信息孤岛没有独立思考讨论只停留在表面交换。两者缺一不可。图 4FFN 的扩展-变换-压缩结构。W₁ 把输入投影到 4× 高维空间激活函数引入非线性W₂ 压缩回原维度。下方展示了 Geva 等人发现的 key-value 记忆机制——FFN 本质上是一个巨大的关联记忆网络。五、LayerNorm稳定训练的魔法如果你曾经手动训练过神经网络一定遇到过这种情况训练初期一切正常几轮之后损失突然爆炸loss NaN或者卡在高位死活下不去。根本原因之一是激活值漂移。深层网络中每层的输出分布会逐层变化——有的层输出越来越大有的越来越小。这让后面的层无所适从也让梯度变得不稳定。LayerNorm 做什么LayerNorm 的直觉极其简单把每层的输出拉平到标准正态分布。具体做法计算该层所有特征的均值 μ 和标准差 σ每个特征减去 μ、除以 σ得到标准正态分布再学两个参数 γ缩放和 β偏移让模型能微调分布LayerNorm(x) γ · (x - μ) / σ β这相当于给每层装了一个自动增益控制——无论输入多乱输出都在合理范围内[11]。为什么不用 BatchNorm计算机视觉常用的 BatchNorm 是沿着批次维度归一化。但 NLP 中• 序列长度变化大batch 统计不稳定• 推理时 batch size 可能为 1统计量不可靠LayerNorm 沿着特征维度归一化——对每个样本独立计算。它不依赖 batch size训练和推理行为一致。Pre-Norm vs Post-Norm一场安静的技术革命原始 Transformer2017用 Post-Normx LayerNorm(x Attention(x)) # 归一化在残差之后GPT-22019改用 Pre-Normx x Attention(LayerNorm(x)) # 归一化在子层之前这个改动看起来只是交换顺序但影响巨大配置梯度路径训练稳定性是否需要 warmupPost-Norm梯度必须穿过 LayerNorm容易发散必须Pre-Norm梯度直接通过残差连接稳定不需要Xiong 等人2020的理论分析证明Post-Norm 在初始化时最后一层的梯度范数会主导整个网络导致深层梯度极不稳定。Pre-Norm 的梯度分布更均匀让训练深层模型96 层成为可能[12]。RMSNorm去繁就简现代 LLM 更进一步。研究者发现 LayerNorm 的减均值步骤其实不必要——模型自己能学到等价的表示。于是 RMSNorm 应运而生RMSNorm(x) x / √(mean(x²)) · γ去掉均值减法只做缩放。这快约 20%少一次 reduce 操作且所有现代 LLMLlama、Mistral、DeepSeek、Qwen都用它[13]。最近还有新趋势Post-Norm 正在回归。OLMo 2 和 Gemma 3 发现如果用 QK-Norm在 Attention 的 Q 和 K 上额外归一化配合 Post-Norm可以兼顾 Post-Norm 的略高质量和 Pre-Norm 的稳定性。配置训练稳定性最终质量代表模型Pre-Norm高良好GPT-2~4, Llama 1/2Post-Norm QK-Norm高略好OLMo 2PrePost-Norm很高良好Gemma 3这个 pendulum 还在摆动。对普通工程师来说Pre-Norm RMSNorm 仍是 2026 年最稳妥的选择[14]。图 5Post-Norm左把 LayerNorm 放在残差之后梯度必须穿过归一化层Pre-Norm右把 LayerNorm 放在子层之前残差连接保持干净梯度可以直接 bypass。这是训练深度模型96 层的关键。六、输出层从向量到概率经过 N 个 Decoder Block 的层层加工token 已经从原始的整数索引变成了丰富的上下文向量。但神经网络最终需要输出一个人类可理解的东西——下一个词是什么这就是输出层的任务把d_model维的向量翻译成词汇表上的概率分布。LM Head最后的投影LM HeadLanguage Model Head本质上是一个线性层logits W_lm_head · h_final # [d_model] → [vocab_size]h_final是最后一个 Decoder Block 输出的隐藏状态经过 Final LayerNormW_lm_head是一个[vocab_size, d_model]的矩阵。注意这个投影的方向如果把词汇表想象成一个巨大的词向量空间LM Head 的作用就是在里面找到与当前上下文向量最相近的那些词。数学上这就是点积相似度——logits[i]越大表示第 i 个词与当前上下文越匹配。权重共享LM Head 的权重矩阵通常与 Token Embedding 矩阵共享tie weights。这在数学上非常优雅——输入时把 token ID 映射到向量空间输出时又在同一个空间里找最近的词。共享不仅节省vocab_size × d_model参数约 1.3B for Llama 3 8B还强制输入和输出表示在同一语义空间中[20]。Softmax变成概率原始 logits 可以是任意实数但概率需要满足两个条件每个值在 0~1 之间且总和为 1。Softmax 完成这个转换P(i) exp(logit_i) / Σ_j exp(logit_j)这个公式有个微妙之处它放大了差异。如果两个 logits 相差 1Softmax 后它们的概率比约为 e¹ ≈ 2.7 倍相差 2比值约为 e² ≈ 7.4 倍。这意味着 Softmax 天然倾向于选出一个赢家——概率分布会趋向尖锐。温度缩放控制创造力如果你用过 ChatGPT 的温度参数这里就是它工作的数学原理。温度 T 是一个超参数在 Softmax 之前缩放 logitsP(i) exp(logit_i / T) / Σ_j exp(logit_j / T)• T 1标准 Softmax模型按真实信心输出概率• T 1如 0.7logits 被放大差异更显著 → 分布更尖锐 → 模型更自信、更少变化• T 1如 1.5logits 被缩小差异被抹平 → 分布更平坦 → 模型更随机、更有创造力直觉上低温让模型像严谨的学者——只选最有把握的高温让模型像醉酒的诗人——愿意尝试小概率选项。生产中T0.7~0.8 是通用设置T0argmax用于需要确定性的场景如代码生成T1.2 用于创意写作[21]。Top-k 与 Top-p避免胡说八道即使温度调得合适模型偶尔也会给一些荒谬的词分配非零概率。Top-k 和 Top-p 是两种安全阀Top-k只保留概率最高的 k 个词其余设为 0。例如 k50 时模型只在最可能的前 50 个词中选择。这简单有效但有个问题不同上下文的合理候选数不同——“The capital of France is” 的候选很少而Once upon a time 的候选很多。固定 k 不够灵活。Top-pNucleus Sampling按概率从高到低累加直到和超过 p如 0.9只保留这些词。这自动适应上下文的复杂度——简单上下文可能只保留 3 个词复杂上下文可能保留 100 个。GPT-4 默认使用 top-p0.9 配合 temperature1.0[22]。至此一个 token 的完整旅程结束了Token ID → Embedding → [N × Decoder Block] → Final LayerNorm → LM Head → Logits → Softmax → 概率分布 → 采样 → 下一个 Token从离散到连续从局部到全局从向量到概率——这就是 Transformer 做下一个词预测的完整流水线。七、亲手实验追踪一个 token 的完整旅程理论讲完了让我们用代码追踪一个 token 的真实旅程。实验 1搭建简化 Transformer逐层打印张量形状下面是一个 nanoGPT 级别的简化实现。我们不训练只看数据流import torchimport torch.nn as nnclassSimplifiedDecoderBlock(nn.Module): def__init__(self, d_model512, n_heads8, d_ff2048): super().__init__() self.ln1 nn.LayerNorm(d_model) self.attn nn.MultiheadAttention(d_model, n_heads, batch_firstTrue) self.ln2 nn.LayerNorm(d_model) self.ffn nn.Sequential( nn.Linear(d_model, d_ff), nn.GELU(), nn.Linear(d_ff, d_model), ) defforward(self, x, maskNone): # Self-Attention with residual (Pre-Norm) attn_out, _ self.attn(self.ln1(x), self.ln1(x), self.ln1(x), attn_maskmask) x x attn_out # FFN with residual (Pre-Norm) x x self.ffn(self.ln2(x)) return xclassNanoTransformer(nn.Module): def__init__(self, vocab_size10000, d_model512, n_layers6, n_heads8): super().__init__() self.embedding nn.Embedding(vocab_size, d_model) self.blocks nn.ModuleList([ SimplifiedDecoderBlock(d_model, n_heads) for _ inrange(n_layers) ]) self.ln_final nn.LayerNorm(d_model) self.lm_head nn.Linear(d_model, vocab_size, biasFalse) defforward(self, x): # x: [batch, seq_len] print(f输入 token IDs: {list(x.shape)}) x self.embedding(x) print(fEmbedding 后: {list(x.shape)}) # Causal mask seq_len x.size(1) mask torch.triu(torch.ones(seq_len, seq_len), diagonal1).bool() for i, block inenumerate(self.blocks): x block(x, mask) print(fBlock {i1} 输出: {list(x.shape)}) x self.ln_final(x) logits self.lm_head(x) print(fLM Head 输出: {list(logits.shape)}) return logits# 运行model NanoTransformer(vocab_size10000, d_model512, n_layers6, n_heads8)input_ids torch.randint(0, 10000, (2, 10)) # batch2, seq_len10output model(input_ids)运行后会输出输入 token IDs: [2, 10]Embedding 后: [2, 10, 512]Block 1 输出: [2, 10, 512]Block 2 输出: [2, 10, 512]Block 3 输出: [2, 10, 512]Block 4 输出: [2, 10, 512]Block 5 输出: [2, 10, 512]Block 6 输出: [2, 10, 512]LM Head 输出: [2, 10, 10000]注意关键规律所有中间层的形状都是 [batch, seq_len, d_model]只有最后输出变成 vocab_size。这意味着• 每层的接口完全一致——输入和输出同维度• 这让你可以无限堆叠层残差连接保证梯度不消失• 最后的 Linear 投影把 d_model 维翻译成词汇表的概率空间[15]实验 2观察层间表示的变化下面代码计算相邻层输出之间的余弦相似度观察信息如何逐层变换import torch.nn.functional as Fmodel.eval()with torch.no_grad(): x model.embedding(input_ids) mask torch.triu(torch.ones(10, 10), diagonal1).bool() prev x[0, 0, :] # 第一个样本的第一个 token similarities [] for i, block inenumerate(model.blocks): x block(x, mask) curr x[0, 0, :] sim F.cosine_similarity(prev.unsqueeze(0), curr.unsqueeze(0)) similarities.append(sim.item()) prev curr print(fBlock {i1} 变化度: {1 - sim.item():.4f}) print(f\n平均变化度: {sum(1-s for s in similarities)/len(similarities):.4f})典型的输出模式是早期层变化大信息重组剧烈后期层趋于稳定微调表示。这符合观察——早期层学习局部语法后期层学习语义[16]。有趣的是这种先剧烈后平稳的模式与神经科学中的层级处理理论相呼应。大脑皮层也是先提取低级特征边缘、颜色再逐步组合成高级概念物体、场景。Transformer 的层堆叠似乎在无意间复现了这个生物学规律[23]。实验 3推理时的偷懒技巧实际部署 LLM 时有一个重要的工程优化KV Cache。在自回归生成中每个新 token 都需要重新计算所有历史 token 的 Attention。但历史 token 的 Key 和 Value 向量是不变的——为什么不把它们缓存起来# 伪代码KV Cache 的核心思想kv_cache {} # 每层缓存 K 和 Vfor new_token in generate(): # 只计算新 token 的 Q/K/V q W_q(new_token) k W_k(new_token) v W_v(new_token) # 从缓存读取历史 K/V cached_k kv_cache[layer][K] # [seq_len-1, d_head] cached_v kv_cache[layer][V] # [seq_len-1, d_head] # 拼接新 token 的 K/V 历史的 K/V all_k torch.cat([cached_k, k], dim0) all_v torch.cat([cached_v, v], dim0) # 只对新 token 做 Attention不是全序列重算 scores q all_k.T attn softmax(scores) all_v # 更新缓存 kv_cache[layer][K] all_k kv_cache[layer][V] all_v这个优化把长序列生成的复杂度从 O(n²) 降到 O(n)——因为每个新 token 只需和缓存的历史做 Attention而不需要重算所有历史。KV Cache 是现代 LLM 推理引擎vLLM、TensorRT-LLM的核心优化之一[24]。实验 4FFN 的知识存储验证这个实验验证 Geva 等人的发现——屏蔽 FFN 的某些维度会影响特定知识# 简化演示观察 FFN 的激活模式x torch.randn(1, 1, 512) # 单个 token# 提取 FFN 的第一层W1 model.blocks[0].ffn[0].weight # [2048, 512]b1 model.blocks[0].ffn[0].bias# 计算 FFN 第一层输出激活前hidden x W1.T b1 # [1, 1, 2048]# 看有多少神经元被激活GeLU 0activated (hidden 0).float().mean()print(fFFN 第一层激活率: {activated:.2%})# 典型值10-30% 的神经元被激活# 这说明 FFN 是稀疏激活的——每次只有部分知识被调用这个稀疏性正是 MoE 的设计基础如果每次只用 10-20% 的 FFN 神经元为什么不训练多个专家 FFN每次只激活一两个这就是第11篇要讲的内容[17]。图 6一个 token 从输入到输出的完整旅程中张量形状的变化规律。所有中间层保持 [batch, seq_len, d_model] 不变只有最后的 LM Head 把维度投影到 vocab_size。这个同维接口是 Transformer 可堆叠的数学基础。八、工程连接参数量花在哪里理解 Transformer 的组件后一个自然的问题是训练一个 LLM 到底需要多少钱钱花在哪儿8.1 参数量分布以 Llama 3 8B 为例参数分布如下组件计算方式参数量占比Token Embeddingvocab_size × d_model~1.3B~16%Attention32 层4 × (d_model × d_head × n_heads) × n_layers~1.6B~20%FFN32 层2 × d_model × d_ff × n_layers~6.4B~80%LayerNorm2 × d_model × 2 × n_layers~0.001B0.1%总计~8B100%注若使用 tie weightsEmbedding 和 LM Head 共享总参数量减少约 1.3B关键洞察FFN 是绝对的大头。当你听说 Llama 3 70B 时约 56B 参数在 FFN 里。这也是为什么• 增大 FFN 维度比增大 Attention 头数更有效提升模型能力• MoE 的核心优化对象是 FFN用稀疏专家替代密集 FFN• 量化第10篇对 FFN 的收益最大——因为参数量最多8.2 推理成本结构参数量不等于推理成本。实际推理时Attention 和 FFN 的占比随序列长度变化场景主导组件原因短序列 1KFFN参数多计算密集长序列 8KAttentionO(n²) 复杂度反超极长序列 64KKV Cache 读取内存带宽瓶颈这意味着优化策略要分场景• 短文本服务 → 优化 FFNMoE、量化• 长文档处理 → 优化 AttentionFlashAttention、GQA• 高并发部署 → 优化 KV Cache压缩、分页8.3 归一化配置的工程选择Pre-Norm、Post-Norm 与各种变体的选择直接影响训练稳定性和最终质量配置稳定性质量计算开销代表模型Pre-Norm RMSNorm⭐⭐⭐⭐⭐⭐低Llama 3、Mistral、QwenPost-Norm QK-Norm⭐⭐⭐⭐⭐⭐⭐中OLMo 2PrePost-Norm⭐⭐⭐⭐⭐⭐⭐⭐高Gemma 3对于新模型训练Pre-Norm RMSNorm 仍是 2026 年的保守选择——稳定、快、验证充分。如果你追求极致性能且有资源调优可以尝试 Post-Norm QK-Norm[18]。8.4 一个真实的成本估算假设你要部署一个 Llama 3 70B 模型 serving 1000 并发用户成本项估算说明GPU 显存~140GB (FP16)70B 参数 × 2 字节KV Cache8K 上下文~40GB32 层 × 8K × 8 头 × 128 维 × 2 (KV) × 2 字节单 token 推理时间~50msA100batch1吞吐量batch64~800 tokens/s批处理摊平开销月运行成本$15K30K8×A100 实例AWS/GCPKV Cache 的内存开销在长序列时甚至超过模型参数本身。这也是长上下文128K技术的核心挑战——不是算不过来是存不下。第10篇会详细讨论量化、压缩和分页策略如何解决这个问题。图 7Llama 3 8B 的参数量分布。FFN 是绝对大户占约 80%。这意味着优化 FFN如 MoE、量化对整个模型的压缩效果最大。九、结语旅程的终点是下一个起点让我们用一个表格回顾一个 token 的完整旅程阶段组件做什么类比输入Tokenizer Embedding把文字变成向量给包裹贴地址标签layer 1-NAttention让 token 互相交流分拣中心的分发layer 1-N残差连接保留原始信息 梯度高速公路保留原始单据layer 1-NFFN非线性深度加工独立思考室layer 1-NLayerNorm稳定数值范围质量校准输出LM Head Softmax变成词汇表概率送达目的地三个核心洞察第一模块化设计的胜利。 Attention 负责交流、FFN 负责思考、残差连接负责保护、LayerNorm 负责稳定——四个组件职责分明组合在一起构成了可训练任意深度的网络。这不是某个天才的灵光一现而是工程师们对什么让深度网络可训练这一问题的系统性回答。第二Decoder-Only 的胜利不是因为它最强而是因为它最简单。 单层堆栈比双层更易扩展每个 token 都参与训练比 15% mask 更高效自回归生成比 seq2seq 更通用。在工程世界里“足够好且简单往往打败理论上最优但复杂”。第三参数量 ≠ 智能。 FFN 占了 80% 的参数但它只是知识仓库。真正决定模型如何思考的是 Attention——它决定了什么信息被关注、什么被忽略。一个 70B 参数的模型和一个 7B 参数的模型如果 Attention 模式相同它们的思维方式是相似的——只是前者记得更多事实。这个流水线的美妙之处在于它的正交性每个组件解决一个独立的问题组合在一起却产生了远超各部分之和的能力。你可以单独改进 Attention如 Multi-Query Attention、单独改进 FFN如 SwiGLU、单独改进归一化如 RMSNorm——任何一个改进都能直接叠加到现有架构上不需要重新设计其他部分。这种模块化设计让 Transformer 成为深度学习的瑞士军刀同样的架构换一组权重就能从英语翻译到法语、从代码补全到蛋白质结构预测。2017 年的那篇论文标题叫Attention Is All You Need但回头看真正让 Transformer 无处不在的不仅是 Attention而是整个模块化设计哲学。AI行业迎来前所未有的爆发式增长从DeepSeek百万年薪招聘AI研究员到百度、阿里、腾讯等大厂疯狂布局AI Agent再到国家政策大力扶持数字经济和AI人才培养所有信号都在告诉我们AI的黄金十年真的来了在行业火爆之下AI人才争夺战也日趋白热化其就业前景一片蓝海我给大家准备了一份全套的《AI大模型零基础入门进阶学习资源包》包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。有需要的小伙伴可以V扫描下方二维码免费领取人才缺口巨大人力资源社会保障部有关报告显示据测算当前****我国人工智能人才缺口超过500万****供求比例达1∶10。脉脉最新数据也显示AI新发岗位量较去年初暴增29倍超1000家AI企业释放7.2万岗位……单拿今年的秋招来说各互联网大厂释放出来的招聘信息中我们就能感受到AI浪潮比如百度90%的技术岗都与AI相关就业薪资超高在旺盛的市场需求下AI岗位不仅招聘量大薪资待遇更是“一骑绝尘”。企业为抢AI核心人才薪资给的非常慷慨过去一年懂AI的人才普遍涨薪40%脉脉高聘发布的《2025年度人才迁徙报告》显示在2025年1月-10月的高薪岗位Top20排行中AI相关岗位占了绝大多数并且平均薪资月薪都超过6w在去年的秋招中小红书给算法相关岗位的薪资为50k起字节开出228万元的超高年薪据《2025年秋季校园招聘白皮书》AI算法类平均年薪达36.9万遥遥领先其他行业总结来说当前人工智能岗位需求多薪资高前景好。在职场里选对赛道就能赢在起跑线。抓住AI风口轻松实现高薪就业但现实却是仍有很多同学不知道如何抓住AI机遇会遇到很多就业难题比如❌ 技术过时只会CRUD的开发者在AI浪潮中沦为“职场裸奔者”❌ 薪资停滞初级岗位内卷到白菜价传统开发3年经验薪资涨幅不足15%❌ 转型无门想学AI却找不到系统路径83%自学党中途放弃。他们的就业难题解决问题的关键在于不仅要选对赛道更要跟对老师我给大家准备了一份全套的《AI大模型零基础入门进阶学习资源包》包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。有需要的小伙伴可以V扫描下方二维码免费领取

相关新闻