深入Transformer架构一:Decoder-Only 推理流程深度解析

275 阅读9分钟

引言

在当今大语言模型(LLM)蓬勃发展的时代,我们见证了GPT系列、LLaMA、Mistral等模型的卓越表现。这些模型背后有一个共同的核心架构特征——它们都采用了Decoder-only的设计范式。这种架构与Encoder-only模型(如BERT)有着本质的区别,它不是为了理解文本的深层语义,而是为了生成连贯、合理的文本序列。

理解Decoder-only架构的工作机制,就像是学习一位大师如何创作一首诗:先细细品味已有的灵感(Prompt),然后一字一句地推敲出后续的诗句。这种纯自回归生成架构的推理过程天然地分成两个阶段:

  • Prefill阶段:如同诗人默读已有的诗句,模型会并行处理整个Prompt,为后续生成做好准备
  • Decode阶段:如同诗人逐字推敲新诗句,模型会串行地、一个接一个地生成新的token

这种设计的精妙之处在于几个关键机制的精巧配合:

  • 单向注意力Mask:像遮住右侧文字一样,确保每个位置只能看到它左边的信息
  • KV Cache技术:巧妙地缓存历史信息,避免重复计算
  • 概率分布预测:每一步都预测下一个token的完整概率分布

让我们暂时放下抽象的概念,从真实的Transformer内部计算路径出发,完整地走一遍Decoder-only模型从接收Prompt到生成新token的推理之旅。


1. 输入的表示:从符号到向量的转化

想象一下,当模型接收到Prompt时,它看到的不是我们熟悉的文字,而是一串数字化的token。假设我们的Prompt被tokenize为:

text

T1, T2, T3, T4

模型的目标很明确:基于这个Prompt,生成下一个最合理的token T5。

这个过程的精妙之处在于,模型在生成T5时,并不需要提前知道T5是什么——它完全依靠对前文的理解来"预测"下一个应该出现什么。


2. Prefill阶段:并行处理的艺术与KV Cache的诞生

单向注意力Mask:知识的渐进积累

Decoder-only架构的核心约束是单向性——每个token只能关注它左侧的上下文,就像我们阅读时只能看到已经读过的文字一样。

这种约束通过一个倒三角Mask来实现:

text

        T1  T2  T3  T4
T1      ✔   ✖   ✖   ✖     (T1只能看到自己)
T2      ✔   ✔   ✖   ✖     (T2能看到T1和自身)
T3      ✔   ✔   ✔   ✖     (T3能看到T1、T2和自身)
T4      ✔   ✔   ✔   ✔     (T4能看到所有左侧token)

这种设计体现了语言生成的本质:当我们说出一句话时,每个词都基于前面已经说出的词,而不是后面尚未出现的词。

深入每个token的处理细节

T1的处理:从零开始
  1. 嵌入表示的形成

    python

    h1_pre = Emb(T1) + Pos1  # 词嵌入 + 位置嵌入
    

    这一步将离散的token转化为连续的向量表示,同时注入位置信息。

  2. 注意力机制的准备工作

    python

    Q1 = h1_pre × W_Q  # 查询向量:我要寻找什么
    K1 = h1_pre × W_K  # 键向量:我有什么信息
    V1_pre = h1_pre × W_V  # 值向量:我的原始内容
    
  3. 自注意力的计算

    python

    α1 = softmax(Q1·[K1])  # 注意力权重
    h1 = α1*V1_pre  # 加权求和
    

    由于T1是第一个token,它只能关注自己,因此注意力计算相对简单。

  4. KV Cache的生成

    python

    V1 = Linear(h1)  # 投影到KV Cache空间
    

    这里的V1已经包含了T1的完整上下文信息,它将作为"知识"被缓存起来,供后续token使用。

T2的处理:开始建立联系
  1. 同样先形成嵌入表示:h2_pre = Emb(T2) + Pos2

  2. 生成对应的Q、K、V:

    python

    Q2 = h2_pre × W_Q
    K2 = h2_pre × W_K  
    V2_pre = h2_pre × W_V
    
  3. 关键的一步:注意力融合

    python

    α1, α2 = softmax(Q2 · [K1, K2])  # 与T1和自身的K计算相似度
    h2 = α1*V1 + α2*V2_pre  # 融合T1和T2的信息
    

    现在h2已经包含了T1和T2的联合上下文信息,这是语言理解深化的关键一步。

  4. 同样生成供后续使用的V2:V2 = Linear(h2)

T3和T4的渐进积累

随着处理的token越来越多,每个token能够看到的上下文也越来越丰富:

  • T3能够融合T1、T2和自身的信息
  • T4能够看到完整的Prompt上下文

这个过程就像滚雪球一样,信息在不断地积累和融合。

KV Cache:知识的宝库

经过Prefill阶段,我们得到了一个宝贵的知识库:

text

KV Cache = [
  (K1, V1),  # 包含T1的上下文
  (K2, V2),  # 包含T1+T2的上下文  
  (K3, V3),  # 包含T1+T2+T3的上下文
  (K4, V4)   # 包含完整Prompt的上下文
]

KV Cache的精妙之处在于:每个V_i都不是原始token的简单表示,而是经过层层计算、融合了左侧所有token上下文的丰富表示。这就像是一个经过深度思考后形成的知识体系,而不是零散的事实堆积。


3. Decode阶段:从理解到创造的飞跃

现在进入最神奇的部分——模型如何基于已有的知识生成全新的内容。

生成T5的完整过程

  1. 初始化隐藏状态

    python

    h5_pre = PosEmbedding(5) + TokenEmbedding(placeholder)
    

    这里有一个重要的insight:模型在生成T5时,并不需要知道T5的具体内容。它使用位置嵌入来标识这是第5个位置,加上一个占位符的嵌入,形成一个"待填充"的初始状态。

  2. 生成查询向量

    python

    Q5 = h5_pre × W_Q
    

    Q5本质上是在问:"基于我当前的位置和状态,我应该关注历史中的哪些相关信息?"

  3. 在知识库中寻找答案

    python

    α1..α4 = softmax(Q5 · [K1, K2, K3, K4])  # 计算与历史各位置的关联程度
    C5 = Σ αi * Vi  # 基于关联程度融合历史信息
    

    这个过程就像是在已有的知识库中进行检索,找出与当前生成位置最相关的历史信息。

  4. 深度思考与信息整合

    python

    h5 = TransformerBlock(C5, h5_pre)
    

    通过Transformer的多层前向网络,模型对检索到的信息进行深度加工和整合。

  5. 生成概率分布

    python

    logits = h5 × W_vocab^T
    P(token_i) = softmax(logits_i)
    

    这一步将深层的隐藏状态映射到整个词表空间,形成下一个token的概率分布。

  6. 做出选择
    根据概率分布选择概率最高的token作为T5。这个选择可以是确定性的(总是选最高概率),也可以是带有随机性的(如top-p采样)。

  7. 更新知识库

    python

    K5 = h5 × W_K
    V5 = Linear(h5)  # 融合了完整上下文的新知识
    KV Cache.append((K5, V5))
    

    新生成的token也会贡献自己的知识,被加入到KV Cache中,影响后续的生成。

循环生成的艺术

生成T5后,整个过程会循环进行:

  • 用同样的方法生成T6,此时KV Cache中已经有5个(K,V)对
  • 然后生成T7,依此类推...

这种循环生成的过程就像是一个不断自我扩展的知识体系,每个新生成的内容都基于之前的所有内容,同时又为后续生成提供上下文。


4. 整体架构的直观理解

如果我们用一张图来概括整个流程:

text

Prefill阶段(并行处理,建立基础)
T1 → T2 → T3 → T4 → 得到 [h1,h2,h3,h4] 和 {(K1,V1)...(K4,V4)}
                    ↓
                 KV Cache(知识库)
                    ↓
Decode阶段(串行生成,逐步创造)
h5_pre(待填充状态)
    ↓
   Q5(我要找什么?)
    ↓
Q5·[K1..K4] → 注意力权重 → C5(找到的相关知识)
    ↓
h5(深度思考结果) → LM head → 概率分布 → T5(生成结果)
    ↓
(K5,V5) → 加入KV Cache(丰富知识库)

这个流程体现了人工智能生成的本质:它不是简单的模式匹配,而是基于深度理解的创造性过程。


5. 深度思考与总结

通过深入分析Decoder-only架构的完整推理流程,我们可以得出几个重要的insight:

  1. 知识的分层构建
    Decoder-only模型不是一次性理解整个Prompt,而是通过单向注意力的方式渐进地构建知识体系。每个位置的理解都基于它之前的所有内容,这种设计完美契合了语言生成的时序特性。
  2. 计算效率的精妙平衡
    Prefill阶段的并行处理和Decode阶段的KV Cache技术,在计算效率和生成质量之间找到了优雅的平衡。Prefill充分利用并行计算能力快速建立上下文,Decode则通过缓存避免重复计算。
  3. 生成的本质是条件概率的链式分解
    整个生成过程可以看作是P(T5|T1,T2,T3,T4)的条件概率计算,这种链式分解是自回归生成的核心数学基础。
  4. 从理解到创造的平滑过渡
    模型在Prefill阶段主要进行"理解",在Decode阶段主要进行"创造",但这两个阶段使用的是相同的神经网络结构和参数。这表明在Transformer架构中,理解和创造本质上是同一套机制在不同阶段的表现。
  5. 上下文窗口的动态扩展
    KV Cache机制使得模型能够处理很长的生成序列,每个新生成的token都会扩展模型的"记忆",这种动态扩展的能力是大模型处理长文本的关键。

理解Decoder-only架构的完整推理流程,不仅有助于我们更好地使用这些强大的AI工具,更能让我们欣赏到深度学习模型设计中的精妙思想。这种从简单构建块(注意力、前向网络)组合出复杂智能行为的能力,正是现代AI最令人惊叹的地方。

当我们下次与ChatGPT对话或者使用其他大语言模型时,不妨想象一下背后这个精妙的生成过程:它正在默默地执行着Prefill和Decode的舞蹈,将我们的Prompt转化为连贯、有意义的回应。