⚡ 统一架构 · 推理全景解析(3+1 视角)
图1-3:宏观策略(每个位置独立展示,无缩写) | 图4:微观原理(Logits 矩阵全部展开)

📌 图1:标准串行生成

只取最后一位 · 其余全部丢弃
💬 场景说明:输入为已知上下文“风急天高猿啸”。因每一步都需等待前一个采样结果,本次前向传播虽并行算出全部6个位置 Logits,但前5个(急天高猿啸)无法利用,只能丢弃,仅用位置5的 Logits 采样生成“哀”。
flowchart LR subgraph I1["输入序列 (全部是已知上下文)"] A1["风
上下文"] --> B1["急
上下文"] --> C1["天
上下文"] --> D1["高
上下文"] --> E1["猿
上下文"] --> F1["啸
上下文"] end subgraph M1["因果 Transformer (单次前向传播)"] M1_core["并行计算所有位置 Logits"] end subgraph O1["输出处理 (6个位置全部独立)"] direction LR O1_0["位置0 Logits
预测 急"] --> R1_0["❌ 丢弃"] O1_1["位置1 Logits
预测 天"] --> R1_1["❌ 丢弃"] O1_2["位置2 Logits
预测 高"] --> R1_2["❌ 丢弃"] O1_3["位置3 Logits
预测 猿"] --> R1_3["❌ 丢弃"] O1_4["位置4 Logits
预测 啸"] --> R1_4["❌ 丢弃"] O1_5["位置5 Logits
预测 哀"] --> R1_5["✅ 采样输出
生成 哀"] end I1 --> M1 --> O1 style R1_0 fill:#fee2e2,stroke:#f87171,color:#991b1b 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:#fee2e2,stroke:#f87171,color:#991b1b style R1_5 fill:#dcfce7,stroke:#4ade80,color:#166534

📌 图2:草稿并行验证(全部接受)

草稿到“啸”全接受 · 验证再产出“哀”
💬 场景说明:草稿模型只提前填入“急天高猿啸”(到“啸”为止),消除了因果依赖。本次前向传播算出的全部位置 Logits 同时参与验证,前5个(急天高猿啸)全部命中(概率达标)被接受;与此同时,大模型在同一次前向中直接基于位置5 的 Logits 保底新产出“哀”这一个新 Token。于是一次性拿到“风急天高猿啸哀”,无需回退——这也体现了“一次验证还能额外输出一个新 Token”。
flowchart LR subgraph I2["输入序列 (含外部填入的草稿)"] A2["风
上下文"] --> B2["急
草稿"] --> C2["天
草稿"] --> D2["高
草稿"] --> E2["猿
草稿"] --> F2["啸
草稿"] end subgraph M2["因果 Transformer (单次前向传播)"] M2_core["并行计算所有位置 Logits"] end subgraph O2["验证结果:草稿位接受 + 大模型保底新产出"] direction LR O2_0["位置0 Logits
验证 急"] --> R2_0["✅ 接受"] O2_1["位置1 Logits
验证 天"] --> R2_1["✅ 接受"] O2_2["位置2 Logits
验证 高"] --> R2_2["✅ 接受"] O2_3["位置3 Logits
验证 猿"] --> R2_3["✅ 接受"] O2_4["位置4 Logits
验证 啸"] --> R2_4["✅ 接受"] O2_new["位置5 Logits
大模型新产出 哀"] --> R2_new["✅ 新 Token 输出"] R2_0 --> OUT["🎉 输出完整句子
风急天高猿啸哀"] R2_1 --> OUT R2_2 --> OUT R2_3 --> OUT R2_4 --> OUT R2_new --> OUT end I2 --> M2 --> O2 style R2_0 fill:#dbeafe,stroke:#60a5fa,color:#1e3a8a style R2_1 fill:#dbeafe,stroke:#60a5fa,color:#1e3a8a style R2_2 fill:#dbeafe,stroke:#60a5fa,color:#1e3a8a style R2_3 fill:#dbeafe,stroke:#60a5fa,color:#1e3a8a style R2_4 fill:#dbeafe,stroke:#60a5fa,color:#1e3a8a style R2_new fill:#fef9c3,stroke:#eab308,color:#854d0e style OUT fill:#dcfce7,stroke:#4ade80,color:#166534

📌 图3:草稿并行验证(拒绝“叫”,回退生成“哀”)

前5个接受 · 最后1个回退重采样
💬 场景说明:草稿模型填入“急天高猿啸叫”。验证时前5个(急天高猿啸)命中,最后一个“叫”因概率不达标被拒绝。此时 无需重新计算,直接利用本次已算出的位置5 Logits 重采样,生成正确的“哀”,最终输出“风急天高猿啸哀”。这是投机解码中典型的“部分接受”加速场景。
flowchart LR subgraph I3["输入序列 (含外部填入的草稿)"] A3["风
上下文"] --> B3["急
草稿"] --> C3["天
草稿"] --> D3["高
草稿"] --> E3["猿
草稿"] --> F3["啸
草稿"] --> G3["叫
草稿"] end subgraph M3["因果 Transformer (单次前向传播)"] M3_core["并行计算所有位置 Logits"] end subgraph O3["验证结果 (6个位置全部独立)"] direction LR O3_0["位置0 Logits
验证 急"] --> R3_0["✅ 接受"] O3_1["位置1 Logits
验证 天"] --> R3_1["✅ 接受"] O3_2["位置2 Logits
验证 高"] --> R3_2["✅ 接受"] O3_3["位置3 Logits
验证 猿"] --> R3_3["✅ 接受"] O3_4["位置4 Logits
验证 啸"] --> R3_4["✅ 接受"] O3_5["位置5 Logits
验证 叫"] --> R3_5["❌ 拒绝"] end subgraph O3b["回退重采样 → 生成 哀"] R3_0 --> PART["📝 保留前5个
风急天高猿啸"] R3_5 --> ROLL["⏪ 回退到位置5
丢弃草稿 '叫'"] PART --> RES["🔄 用位置5 Logits 重采样
→ 生成 哀"] ROLL --> RES RES --> FINAL["✅ 最终输出
风急天高猿啸哀"] end I3 --> M3 --> O3 O3 --> O3b style R3_0 fill:#dbeafe,stroke:#60a5fa,color:#1e3a8a style R3_1 fill:#dbeafe,stroke:#60a5fa,color:#1e3a8a style R3_2 fill:#dbeafe,stroke:#60a5fa,color:#1e3a8a style R3_3 fill:#dbeafe,stroke:#60a5fa,color:#1e3a8a style R3_4 fill:#dbeafe,stroke:#60a5fa,color:#1e3a8a style R3_5 fill:#fee2e2,stroke:#f87171,color:#991b1b style ROLL fill:#fef3c7,stroke:#fbbf24,color:#78350f style RES fill:#e0e7ff,stroke:#818cf8,color:#3730a3 style FINAL fill:#dcfce7,stroke:#4ade80,color:#166534

📌 图4:微观视角 · Logits 矩阵的诞生

V=4 · 7行 · 全部展开无省略
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["最终隐藏状态
形状: [7 × d_model]"] end subgraph S4["④ 输出投影 (LM Head) → Logits 矩阵(无省略)"] H --> HEAD["线性层 (权重 W_out)
d_model → |Vocab| (设定 V=4)"] HEAD --> MATRIX["**Logits 矩阵 [7 × 4]**

位置0 (预测'急'): [0.12, -0.34, 0.89, 2.41]
位置1 (预测'天'): [0.55, 1.82, -1.13, 0.22]
位置2 (预测'高'): [2.31, 0.74, 1.55, -0.88]
位置3 (预测'猿'): [-0.44, 1.14, 0.66, 3.22]
位置4 (预测'啸'): [0.92, -0.71, 2.21, 1.33]
位置5 (预测'哀'): [1.12, 2.54, -0.24, 0.95]
位置6 (预测下一个词): [0.78, -0.53, 1.46, 2.12]

⭐ 共7行,每行4个数字,全部逐个写出"] 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
📊 无省略矩阵:固定 V=4,7个位置每行4个数字,全部列明,无 `...`。 ⚡ 并行核心:矩阵乘法一次算出全部 28 个数值。
💡 完整结论(图1-3每个位置独立,图4数字全展开):
1. 微观(图4):模型一次前向算出 [7×4] Logits矩阵,7行数字全部展示。
2. 串行(图1):位置0-4(急天高猿啸)的Logits算完即弃,只取位置5(哀)采样。
3. 全接受(图2):草稿填到“啸”(位置0-4)全部接受,大模型同一次前向再保底产出“哀”,直接出句。
4. 末位拒接(图3):草稿为“急天高猿啸叫”,位置0-4接受,位置5(叫)拒绝,直接用图4第6行 [1.12, 2.54, -0.24, 0.95] 重采样,成功生成“哀”,输出“风急天高猿啸哀”。
华杉的技术博客 · 苏ICP备2026063680号-1
首页