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 系列的区别
- 无子词前缀标记 :Llama BPE 用
_前缀表示词首,Qwen/DeepSeek 的 BPE 无前缀,空格信息直接编码在 token 内部 - BPE 而非 SentencePiece:与 DeepSeek-V3 主模型不同,蒸馏版用 Qwen2 的 BPE tokenizer
- 对话模板内置 :
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 三个维度敏感性
- 对初始值敏感:权重初始化方式、随机种子不同 → 完全不同优化轨迹 → 收敛到不同局部最优
- 对训练过程敏感:学习率调度、warmup、batch size、curriculum、dropout 时机
- 对数据顺序敏感:同一个 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