⚡ 统一架构 · 推理全景解析
图1-2:宏观策略对比(串行依赖 vs 并行验证) | 图3:微观内部原理(Token → Logits 矩阵)

📌 图1:标准串行生成

只取最后一位 Logits
flowchart LR subgraph I1["输入序列 (全部是已知上下文)"] A1["你
上下文"] --> B1["好
上下文"] --> C1["我
上下文"] --> D1["是
上下文"] end subgraph M1["因果 Transformer (单次前向传播)"] M1_core["并行计算所有位置 Logits"] end subgraph O1["输出处理 (受采样依赖限制)"] O1_1["位置0 Logits
预测 好"] --> R1_1["❌ 丢弃"] O1_2["位置1 Logits
预测 我"] --> R1_2["❌ 丢弃"] O1_3["位置2 Logits
预测 是"] --> R1_3["❌ 丢弃"] O1_4["位置3 Logits
预测 苹果"] --> R1_4["✅ 采样输出
生成新词"] end I1 --> M1 --> O1 style R1_1 fill:#fee2e2,stroke:#f87171,color:#991b1b style R1_2 fill:#fee2e2,stroke:#f87171,color:#991b1b style R1_3 fill:#fee2e2,stroke:#f87171,color:#991b1b style R1_4 fill:#dcfce7,stroke:#4ade80,color:#166534
⚠️ 前面位置的 Logits 虽已并行算出,但必须等待采样结果,逻辑依赖导致无法提前使用。

📌 图2:草稿并行验证

全部位置都用上
flowchart LR subgraph I2["输入序列 (含外部填入的草稿)"] A2["你
上下文"] --> B2["好
上下文"] --> C2["我
草稿"] --> D2["是
草稿"] end subgraph M2["因果 Transformer (单次前向传播)"] M2_core["并行计算所有位置 Logits"] end subgraph O2["输出处理 (打破依赖,并行验证)"] O2_1["位置0 Logits
预测 好"] --> R2_1["⏭️ 不用
对应已知上下文"] O2_2["位置1 Logits
预测 我"] --> R2_2["✅ 验证
对比草稿概率"] O2_3["位置2 Logits
预测 是"] --> R2_3["✅ 验证
对比草稿概率"] O2_4["位置3 Logits
预测 苹果"] --> R2_4["🔄 新推理
推测下一个词"] end I2 --> M2 --> O2 style R2_1 fill:#f1f5f9,stroke:#cbd5e1,color:#475569 style R2_2 fill:#dbeafe,stroke:#60a5fa,color:#1e3a8a style R2_3 fill:#dbeafe,stroke:#60a5fa,color:#1e3a8a style R2_4 fill:#fef3c7,stroke:#fbbf24,color:#78350f
✅ 外部草稿提前占位,消除了“等待采样”的串行依赖,本次算出的所有 Logits 全部派上用场。

📌 图3:微观视角 · Logits 矩阵的诞生(QKV/Attention/FFN)

矩阵并行 · 每个位置独立打分
flowchart TD subgraph S1["① 输入表示层"] T["Token IDs
你, 好, 我, 是"] --> E["Embedding 查表
+ 位置编码"] end subgraph S2["② 多头自注意力 (并行核心)"] E --> QKV["三个线性投影层
生成 Q, K, V 矩阵"] QKV --> ATT["缩放点积注意力
Attention = softmax(Q·K^T / √d) · V"] ATT --> CON["拼接多头结果
→ 输出投影层"] end subgraph S3["③ 前馈网络 (FFN) 与残差"] CON --> FFN["两层线性层 + 激活"] FFN --> H["最终隐藏状态
形状: [4 × d_model]"] end subgraph S4["④ 输出投影 (LM Head) → 得到 Logits 矩阵"] H --> HEAD["线性层 (权重 W_out)
维度: d_model → |Vocab|"] HEAD --> MATRIX["Logits 矩阵 (原始分数)
形状: [4 × 词表大小 V]

位置0 (预测'好'): [2.1, -0.5, 0.8, ...]
位置1 (预测'我'): [1.3, 3.2, -1.1, ...]
位置2 (预测'是'): [0.7, 1.8, 2.4, ...]
位置3 (预测'苹果'): [2.5, 0.2, 1.6, ...]"] MATRIX --> PROB["(可选) Softmax
转为概率分布"] end S1 --> S2 --> S3 --> S4 style MATRIX fill:#ede9fe,stroke:#8b5cf6,stroke-width:2px,color:#4c1d95 style PROB fill:#dbeafe,stroke:#60a5fa,color:#1e3a8a style QKV fill:#fef3c7,stroke:#fbbf24 style ATT fill:#fce7f3,stroke:#f472b6 style HEAD fill:#e0e7ff,stroke:#818cf8
📊 Logits 矩阵:每一行对应一个输入位置,每一列对应词表中的一个词。上图展示了 4 个位置各自独立的原始置信分数(未归一化)。 并行奥秘:Attention 中的 Q·K^T 和 FFN 均为矩阵乘法,一次前向传播直接算出整个 [4 × V] 矩阵,无需 for 循环。 🧩 因果掩码:在 Attention 中屏蔽未来位置,保证位置 i 只依赖 i 及之前的信息,但不影响矩阵并行计算
💡 完整结论(策略层 + 原理层):
1. 微观本质(图3):Logits 是 LM Head(线性层) 对每个位置隐藏状态映射出的原始分数矩阵 [4 × V]。自注意力(Q/K/V)和前馈网络(FFN)全是矩阵运算,天然为所有位置同时输出 Logits。
2. 宏观限制(图1):标准推理时,因果依赖(等前一个采样结果)迫使你只能使用 最后一个位置(位置3)的 Logits 来生成新词,其余位置的 Logits 算完即弃。
3. 策略突破(图2):草稿验证时,外部模型提前填入未来 Token 作为占位,消除了因果依赖。因此,同一趟前向传播算出的 所有位置 Logits(整个矩阵) 都能用于并行验证,实现了“一次计算,多处评分”的加速效果。