From 10% to 96%: Qwen2.5-0.5B 文本分类微调实践
From 10% to 96%: Qwen2.5-0.5B 文本分类微调实践 #
原文链接: https://zhuanlan.zhihu.com/p/2010718456983618357
作者: 钅钅钅
编辑时间: 2026-02-27 14:25・浙江
本文记录了 Qwen2.5-0.5B 在文本分类任务上的 CPU 部署与微调实验过程。从基线准确率 10.59% 提升至最终 95.61%,召回率从 15.34% 提升至 96.18%。
一、CPU 部署方案 #
1.1 部署配置 #
| 配置项 | 内容 |
|---|---|
| 推理框架 | llama.cpp |
| 硬件 | CPU only |
1.2 优化策略 #
| 策略 | 说明 |
|---|---|
| Prompt 优化 | 调整 prompt 使模型只输出 1 个 token 作为分类选项 |
| Prefix Cache | 启用 KV Cache 复用,避免重复计算 prompt 部分 |
1.3 性能指标 #
- Latency: ~300ms / request
- 结论: 满足实时性要求
二、微调实验 #
2.1 Baseline(未微调) #
| Metric | Value |
|---|---|
| Accuracy | 10.59% |
| Recall | 15.34% |
基线指标惨不忍睹,模型对分类任务几乎没有理解。
2.2 数据合成 #
数据来源:
- 收集各类别的标准说法和泛化说法
- 使用 Qwen2.5-32B 进行数据合成
数据质量:
- 合成数据存在不属于任何类别的问题样本
- 经人工标注后,这些数据作为 “other” 类别的训练数据(意外收获)
- 最终得到 2万条数据
2.3 训练策略实验 #
Exp 1: 默认训练策略 #
Config:
- Learning Rate: 3e-5
- LR Scheduler: linear decay
- Batch Size: 2
Result:
| Metric | Value |
|---|---|
| Accuracy | 93.54% |
| Recall | 92.69% |
微调有效,但指标仍有提升空间。
Exp 2: Loss 计算位置 #
尝试不同的 loss 计算策略:
| Loss on | Accuracy | Recall | Note |
|---|---|---|---|
| prompt + answer | 94.74% | 93.78% | ↑~1% |
| prompt only | 10.07% | 13.86% | ↓ 比未训练更差 |
| answer only (default) | 93.54% | 92.69% | baseline |
发现: 在 prompt + answer 上计算 loss 效果更好。
分析:
- Prompt 中包含各选项的含义解释
- 模型可能在 prompt 上学习到了选项语义与答案的映射关系
- 仅在 prompt 上计算 loss 导致过拟合了无答案的信息,指标比未训练还低
跨模型验证: 在 Qwen2.5-3B 上尝试,指标无明显提升。
Exp 3: Warmup + Weight Decay #
Config:
- Warmup Ratio: 20%
- Weight Decay: 0.01
Result:
| Metric | Value |
|---|---|
| Accuracy | 95.11% |
| Recall | 95.08% |
分析:
- 缓解了对微调数据的过拟合
跨模型验证: 在 Qwen2.5-3B 上尝试,指标无明显提升。推测原因:参数量增加后,模型容量更大,对训练技巧敏感度降低。
Exp 4: 调参实验 #
进行多轮超参数调优后,指标稳定在 95% 附近,无明显突破。
Exp 5: 蒸馏数据 #
数据来源: DeepSeek-R1 问答数据
混合比例实验:
| Distill : Original | Accuracy | Recall |
|---|---|---|
| 1 : 4 | 95.61% | 96.18% |
| 1 : 1 | 94.71% | 95.30% |
发现:
- 适量的蒸馏数据(20%)带来 ~1% 提升
- 蒸馏数据比例过高反而导致指标下降
- 蒸馏数据质量 > 数量
跨模型验证: 在 Qwen2.5-3B 上无明显提升。
三、最终结果 #
| Stage | Accuracy | Recall | Δ |
|---|---|---|---|
| Baseline | 10.59% | 15.34% | - |
| + Default FT | 93.54% | 92.69% | +83% |
| + prompt+answer loss | 94.74% | 93.78% | +1.2% |
| + warmup + wd | 95.11% | 95.08% | +0.4% |
| + Distill (1:4) | 95.61% | 96.18% | +0.8% |
四、总结与思考 #
4.1 核心发现 #
1. Loss 计算策略影响显著 #
- 在 prompt + answer 上计算 loss 比仅在 answer 上效果更好
- 推测 prompt 中的选项解释提供了重要的语义信息
- 小模型对此更敏感
2. 训练技巧的有效性因模型而异 #
- Warmup + Weight Decay 在 0.5B 模型上有效
- 在 3B 模型上无明显收益
- 结论:小模型对训练技巧更敏感
3. 蒸馏数据需要控制比例 #
- 20% 蒸馏数据比例最优
- 过多蒸馏数据可能导致分布偏移
4.2 经验教训 #
- 数据质量 > 数据数量
- 小模型微调需要更精细的训练策略
- 跨模型验证很有必要,trick 不一定通用
4.3 后续优化方向 #
- 尝试更大的 teacher model 进行蒸馏
- 数据增强策略优化
五、评论区精选 #
评论 1:关于提示词计算的问题 #
hhh 提问:
你前面所说的对提示词进行给式计算是什么意思呀?这个我不太理解
hhh 提问:
请问你蒸馏数据时候,长出来的数据是什么样子的呀?是在思考过程的吗,这样的话,那你在计算损失函数的时候,需不需要对思考过程的损失函数也进行计算?
作者 钅钅钅 回复:
我微调的这个模型不思考,把 deepseek r1 的思考过程去掉进行蒸馏的
hhh 追问:
那您最终的训练数据中是直接输出分类的名称吗?完全一点分析过程都不要?
评论 2:关于 32B 模型不微调的准确率 #
画枕 提问:
在 qwen32b 不微调,基于提示词分类准确率是多少呢?[思考]
评论 3:关于 CPU 性能 #
codingBug 提问:
cpu 能跑到多少 tps 啊
作者 钅钅钅 回复:
和 cpu 性能有关,我这个 cpu tps 2.1 左右
六、相关信息 #
关于作者 #
- 昵称: 钅钅钅
- 身份: 学生
- 关注者: 21
- 文章数: 2
- 回答数: 5
关注者包括: LAM、美丽新世界 等 20 人赞同了该文章
文章互动数据 #
- 👍 赞同: 20
- 💬 评论: 7 条
- ⭐ 喜欢: 49
- 📤 分享
- 📝 申请转载