multi_head_attention_matrix_example 多头注意力 算例子

DeepSeek-R1-Distill-Qwen-7B 模型分析与讨论

日期:2026-05-11

项目路径:/home/lg/推理/推理引擎/deepseek-r1-7b

基础模型:DeepSeek-R1-Distill-Qwen-7B


一、DeepSeek-R1 编码方式

1.1 核心机制:BPE (Byte Pair Encoding)

该项目(DeepSeek-R1-Distill-Qwen-7B)tokenizer 继承自 Qwen2.5 ,使用标准 BPE 算法。

特性
Tokenizer 类型 BPE (GPT-2 风格)
Tokenizer 类 LlamaTokenizerFast
词表大小 151,643
最大长度 (tokenizer) 16384
最大位置编码 131072
子词前缀 无(既没有 ## 也没有
Byte fallback 关闭
BOS token <|begin▁of▁sentence|> (id=151646)
EOS/PAD token <|end▁of▁sentence|> (id=151643)

1.2 特殊 Token 体系

DeepSeek 使用全角竖线分隔符(<|...|>)的独特命名风格:

text 复制代码
[151643]  <|end▁of▁sentence|>    --- EOS / PAD
[151646]  <|begin▁of▁sentence|>  --- BOS
[151644]  <|User|>               --- 对话角色:用户
[151645]  <|Assistant|>          --- 对话角色:助理
[151647]   secret                     --- 代码填充结束
[151648]  <think>                   --- 推理思考开始
[151649]  </think>                  --- 推理思考结束
[151650]  <|quad_start|>            --- 四元组开始
[151651]  <|quad_end|>              --- 四元组结束
[151652]  <|vision_start|>          --- 视觉输入开始
[151653]  <|vision_end|>            --- 视觉输入结束
[151654]  <|vision_pad|>            --- 视觉填充
[151655]  <|image_pad|>             --- 图像填充
[151656]  <|video_pad|>             --- 视频填充
[151657]  <tool_call>               --- 工具调用开始
[151658]  </tool_call>              --- 工具调用结束
[151659]  <|fim_prefix|>            --- FIM 填充前缀
[151660]  <|fim_middle|>            --- FIM 填充中部
[151661]  <|fim_suffix|>            --- FIM 填充后缀
[151662]  <|fim_pad|>               --- FIM 填充
[151663]  <|repo_name|>             --- 仓库名
[151664]  <|file_sep|>              --- 文件分隔

1.3 中文分词实例

原文 Token 切分 Token 数
你好世界 你好 + 世界 2
今天天气真好 今天 + 天气 + + 4
人工智能正在改变世界 人工智能 + 正在 + 改变 + 世界 4
深度求索 深度 + + 3
DeepSeek是由深度求索公司开发的大语言模型 Deep + Seek + 是由 + 深度 + + + 公司 + 开发 + 的大 + 语言 + 模型 11

规则:常见中文词语("你好"、"世界"、"今天"、"人工智能")以双字/多字词为单位合并为一个 token;不常见组合退化为单字 token。

1.4 与 Llama 系列的区别

  1. 无子词前缀标记 :Llama BPE 用 _ 前缀表示词首,Qwen/DeepSeek 的 BPE 无前缀,空格信息直接编码在 token 内部
  2. BPE 而非 SentencePiece:与 DeepSeek-V3 主模型不同,蒸馏版用 Qwen2 的 BPE tokenizer
  3. 对话模板内置tokenizer_config.json 中的 chat_template 控制完整对话格式,包括 <think> 推理块的嵌套结构

二、大模型推理流程

2.1 完整 pipeline

text 复制代码
输入文字              矩阵运算              输出文字
   │                    │                    ▲
   ▼                    ▼                    │
"你好世界"           向量/矩阵               "你好!"
   │                    │                    │
   ▼                    ▼                    │
┌──────────┐    ┌──────────────┐    ┌──────────┐
│ 分词+BPE   │    │  Transformer │    │ 反查词表   │
│ ID 映射   │───▶│  前向传播     │───▶│ ID→文字   │
└──────────┘    └──────────────┘    └──────────┘
     │                                     ▲
     ▼                                     │
  [108386,       ── 矩阵运算 ──▶       [108386,
   99489]                               108034,
                                          ...]

2.2 分步详解

第1步:分词 + 查词表 → ID 序列

输入 "你好世界" → BPE 拆分 ["你好", "世界"] → 查词表 [108386, 99489]

第2步:ID → Embedding → 矩阵运算

每个 ID 去 embedding 矩阵查一行向量(3584 维),进入 28 层 Transformer 做 attention + FFN。这一步不涉及文字,纯粹浮点矩阵运算。

第3步:输出向量 → ID

模型输出 vocab_size 维 logits 向量(152064 维),每个位置代表一个 token 的分数。取 argmax 或采样得到下一个 token 的 ID。

第4步:ID → token → 文字

用词表反向查:id → token → 拼回文字,确定性查表,不需要模型。

2.3 自回归生成

text 复制代码
输入 [151646, 108386, 99489]          →  模型输出下一个 token id=108034
输入 [151646, 108386, 99489, 108034]  →  模型输出下一个 token id=...
...
直到输出 EOS (151643) 或达到最大长度

每生成一个新 token,拼到序列末尾再跑一次模型,循环进行。


三、不同大模型的架构差异

3.1 各家模型对比

特性 Qwen2/DeepSeek-Distill Llama 3 DeepSeek-V3 (主模型)
注意力 GQA (28Q/4KV) GQA (32Q/8KV) MLA (多头潜在注意力)
FFN 激活 SwiGLU + SiLU SwiGLU + SiLU SwiGLU + SiLU
归一化 RMSNorm RMSNorm RMSNorm
位置编码 RoPE RoPE RoPE
架构 Dense Dense MoE (256专家, top-8)

3.2 自定义层的问题

矩阵乘法的运算规则统一(BLAS 搞定),但层的排列组合、注意力变体、MoE 路由每家不同。遇到自定义层(如 DeepSeek-V3 的 MLA),推理框架必须手写对应 CUDA kernel,无法通用。


四、开源 vs 闭源模型

4.1 差距对比

text 复制代码
已知的(开源模型):               未知的(闭源模型):
┌──────────────────────┐          ┌──────────────────────┐
│  config.json   ← 免费看  │          │  config.json   ← 机密  │
│  model weights  ← 免费下  │          │  model weights  ← 核心壁垒 │
│  代码/数据处理     ← 公开  │          │  训练数据         ← 核心壁垒 │
│  训练脚本         ← 公开  │          │  训练细节/超参    ← 核心壁垒 │
└──────────────────────┘          └──────────────────────┘

4.2 结论

网络结构只是"菜谱",权重是"做好的菜"。开源模型的结构本来就是公开的,不是"暴露"而是"主动开放"。闭源模型的结构虽然不公开,但行业架构在趋同(Transformer + RoPE + RMSNorm + GQA + SwiGLU),真正的护城河是训练数据、训练技巧和最终的权重


五、训练的非线性与敏感性

5.1 训练的本质

大模型训练是在一个极高维非凸损失面上做随机梯度下降:

text 复制代码
Loss = f(数据, 模型参数)

        参数空间
        (3584×28层 → 数十亿维)
            │
    ┌───────┼───────┐
    ▼       ▼       ▼
 初始值   优化器   数据顺序
  (种子)   (AdamW)  (shuffle)

5.2 三个维度敏感性

  1. 对初始值敏感:权重初始化方式、随机种子不同 → 完全不同优化轨迹 → 收敛到不同局部最优
  2. 对训练过程敏感:学习率调度、warmup、batch size、curriculum、dropout 时机
  3. 对数据顺序敏感:同一个 batch 样本组成不同 → 梯度不同 → 路径不同

5.3 同结构不同命

text 复制代码
Qwen2.5-Math-7B          vs          DeepSeek-R1-Distill-Qwen-7B
    同一架构                              同一架构
    不同训练数据                          用 R1 生成的推理链蒸馏
    不同优化策略                          RL 后训练
        │                                    │
        ▼                                    ▼
   数学推理还行                          AIME 55.5%, 强推理能力

六、config.json 参数详解

6.1 模型身份

参数 含义
architectures ["Qwen2ForCausalLM"] HuggingFace 加载时调用的模型类,决定 forward 函数逻辑
model_type "qwen2" 模型家族标识,推理引擎靠此识别架构

6.2 网络骨架

参数 含义
num_hidden_layers 28 Transformer 层数(1层 = Attention + FFN)
hidden_size 3584 每层隐藏向量维度,全模型信息流转的核心维度
intermediate_size 18944 FFN 中间扩张维度。FFN 结构:3584 → 18944 → 3584
vocab_size 152064 词表大小,输出层维度

7B 参数量估算

text 复制代码
Embedding:  152064 × 3584         ≈ 545M
每层 Attention: 4 × 3584²          ≈ 51M × 28 ≈ 1.4B
每层 FFN: 3 × 3584 × 18944         ≈ 204M × 28 ≈ 5.7B
                                                 ≈ 7.6B 参数

6.3 注意力机制

参数 含义
num_attention_heads 28 Q 头数,每头 128 维
num_key_value_heads 4 K/V 头数。28 ≠ 4 → GQA
sliding_window 4096 滑动窗口大小
use_sliding_window false 当前关闭,使用全局注意力
attention_dropout 0.0 注意力 dropout 比率

GQA 效果:28 个 Q 头分成 4 组,每组 7 个 Q 共享同一个 K/V,KV cache 缩小 7 倍。

6.4 位置编码 (RoPE)

参数 含义
rope_theta 10000 RoPE 旋转位置编码基频
max_position_embeddings 131072 理论最大 131K 上下文
use_mrope false 多模态 RoPE 关闭

基频的影响:10000 为标准配置(~4K-8K),更高如 500000(Llama 3)支持更长上下文。

6.5 归一化与激活函数

参数 含义
rms_norm_eps 1e-06 RMSNorm 的 epsilon,防止除零
hidden_act "silu" SiLU 激活函数,配合 SwiGLU 结构

RMSNorm vs LayerNorm:RMSNorm 只除均方根,比 LayerNorm(减均值+除标准差)更快。

6.6 初始化与精度

参数 含义
tie_word_embeddings false 输入 embedding 和输出 lm_head 权重不共享
initializer_range 0.02 权重初始化正态分布标准差 ~N(0, 0.02²)
torch_dtype "bfloat16" 模型存储精度,bf16 范围大精度低
use_cache true 推理时缓存 KV,生成模式必须开

6.7 特殊 Token

参数 备注
bos_token_id 151643 config 中等于 eos,属配置 bug
eos_token_id 151643 <|end▁of▁sentence|>
实际 BOS 151646 <|begin▁of▁sentence|>

6.8 生成参数 (generation_config.json)

参数 含义
temperature 0.6 采样温度,deepseek 推荐 0.5-0.7
top_p 0.95 核采样阈值
do_sample true 开启随机采样

6.9 模型结构全景图

text 复制代码
输入: "你好世界"
  │
  ▼
Token Embedding:  [151646, 108386, 99489] → [3, 3584]
  │
  ▼  ×28层 ──────────────────────────────────────┐
  │                                                │
  │  RMSNorm ─── Attention(GQA, RoPE) ── + ──┐    │
  │       │                                   │    │
  │       └── SiLU ⊗ Linear ─── Linear ── + ─┘    │
  │       (SwiGLU FFN: 3584→18944→3584)           │
  │                                                │
  └────────────────────────────────────────────────┘
  │
  ▼
RMSNorm → Linear(3584→152064)
  │
  ▼
softmax → 下一个 token ID
相关推荐
Bruce_Liuxiaowei2 小时前
OpenAI双杀_40亿部署公司+Daybreak安全AI_博客初稿
人工智能·安全·ai·大模型
洛水水2 小时前
【力扣100题】28. 翻转二叉树
算法·leetcode
次元工程师!2 小时前
LangFlow开发(一)—安装和部署
git·python·大模型·langflow
故事和你912 小时前
洛谷-【数据结构2-2】线段树2
开发语言·数据结构·算法·动态规划·图论
老陈头聊SEO2 小时前
生成引擎优化(GEO)与内容创作融合提升用户体验的实施策略
其他·搜索引擎·seo优化
武超杰2 小时前
ElasticSearch 从入门到实战
大数据·elasticsearch·搜索引擎
ghie90902 小时前
MATLAB 随机蛙跳算法 (SFLA) 优化最小二乘回归
算法·matlab·回归
wuweijianlove2 小时前
算法优化中的缓存层次结构与内存映射的技术7
算法
故事和你912 小时前
洛谷-【数据结构2-2】线段树1
开发语言·javascript·数据结构·算法·动态规划·图论
电科一班林耿超2 小时前
机器学习大师课 第 8 课:端到端项目实战 —— 泰坦尼克号生存预测
人工智能·算法·机器学习