当前位置: 首页 > backend >正文

Qwen3 - 0.6B与Bert文本分类实验:深度见解与性能剖析

Changelog

  • [25/04/28] 新增Qwen3-0.6BAg_news数据集Zero-Shot的效果。新增Qwen3-0.6B线性层分类方法的效果。调整Bert训练参数(epocheval_steps),以实现更细致的观察,避免严重过拟合的情况。

  • TODO:

    • 利用Qwen3-0.6B pplzero-shot筛选难样本,观察Qwen3-0.6B(SFT分类)在不同数据量级,不同数据难度情况下的性能变化。
    • ppl筛选出的难样本对Qwen33-0.6B(SFT分类)Qwen3-0.6B(线性层分类)影响是否具有同质性。
    • 不同尺寸模型ThinkNo Think状态下Zero-Shot能力变化。
    • 使用大模型蒸馏Think数据,观察ThinkNo Think模式下对Qwen3-0.6BSFT分类)性能的影响。
    • 测试其他难开源分类数据集(更多分类数、多语言、长样本)。

前言

最近在知乎上刷到一个很有意思的提问Qwen3-0.6B这种小模型有什么实际意义和用途。查看了所有回答,有人提到小尺寸模型在边缘设备场景中的优势(低延迟)、也有人提出小模型只是为了开放给其他研究者验证scaling lawQwen2.5系列丰富的模型尺寸为开源社区验证方法有效性提供了基础)、还有人说4B、7B的Few-Shot效果就已经很好了甚至直接调用更大的LLM也能很好的解决问题。让我比较感兴趣的是有大佬提出小模型在向量搜索、命名实体识别(NER)和文本分类领域中很能打,而另一个被拿来对比的就是Bert模型。在中文文本分类中,若对TextCNNFastText效果不满意,可能会尝试Bert系列及其变种(RoBerta等)。但以中文语料为主的类Encoder-Only架构模型其实并不多(近期发布的ModernBERT,也是以英文和Code语料为主),中文文本分类还是大量使用bert-base-chinese为基础模型进行微调,而距Bert发布已经过去了6年。Decoder-Only架构的LLM能在文本分类中击败参数量更小的Bert吗?所以我准备做一个实验来验证一下。

不想看实验细节的,可以直接看最后的结论实验局限性部分。

实验设置

  • GPU:RTX 3090(24G)
  • 模型配置:
模型参数量训练方式
google-bert/bert-base-cased0.1B添加线性层,输出维度为分类数
Qwen/Qwen3-0.6B0.6B构造Prompt,SFT
  • 数据集配置:fancyzhx/ag_news,分类数为4,分别为World(0)、Sports(1)、Business(2)、Sci/Tech(3)。训练样本数120000,测试样本数7600,样本数量绝对均衡。数据集展示:
{"text": "New iPad released Just like every other September, this one is no different. Apple is planning to release a bigger, heavier, fatter iPad that...""label": 3
}
  • 选择该数据集是在Paper with codeText Classification类中看到的榜单,并且该数据集元素基本上不超过510个token(以Bert Tokenizer计算)。因为Bert的最大输入长度是510个token,超过会进行截断,保留前510个token,所以为了进行公平的比较,尽量避免截断。
  • 因为是多分类任务,我们以模型在测试集上的F1指标为标准,F1值越高,模型效果越好。

Bert训练细节

  • Bert的训练比较简单,将文本使用Tokenizer转换成input_ids后,使用Trainer进行正常训练即可。训练参数(若未单独指出,则代表使用Trainer默认值):
参数名称
lr_scheduler_type(学习率衰减策略)cosine
learning_rate(学习率)1.0e-5
per_device_train_batch_size(训练batch_size)64
gradient_accumulation_steps(梯度累积)1
per_device_eval_batch_size(验证batch_size)256
num_train_epochs(epoch)3
weight_decay1e-6
eval_steps(验证频率)0.05
  • 训练过程中模型对测试集的指标变化:
StepTraining LossValidation LossAccuracyPrecisionRecallF1
2820.2747000.2633940.9097370.9103110.9097370.909676
5640.2078000.2222300.9222370.9227010.9222370.922246
8460.1996000.2042220.9315790.9325520.9315790.931510
11280.2156000.1918240.9346050.9352740.9346050.934737
14100.1905000.1928460.9327630.9344210.9327630.932937
16920.1933000.1806650.9378950.9389410.9378950.937849
19740.1430000.1804970.9405260.9409450.9405260.940636
22560.1415000.1776300.9417110.9419880.9417110.941644
25380.1471000.1736020.9439470.9440220.9439470.943908
28200.1316000.1768950.9406580.9417900.9406580.940683
31020.1528000.1709280.9450000.9451400.9450000.944925
33840.1400000.1692150.9444740.9447660.9444740.944399
36660.1499000.1688650.9444740.9445380.9444740.944483
39480.1120000.1724590.9461840.9461420.9461840.946159
42300.1240000.1728260.9450000.9452540.9450000.944924
45120.1223000.1715830.9447370.9449250.9447370.944708
47940.1044000.1719690.9448680.9450590.9448680.944854
50760.1175000.1715040.9453950.9455020.9453950.945363
53580.0998000.1717610.9452630.9455100.9452630.945232

  • 可以看到Bert在测试集上最好结果是:0.945

Qwen3训练细节

  • 使用Qwen3训练文本分类模型有2种方法。第1种是修改模型架构,将模型最后一层替换为输出维度为分类数的线性层。第2种是构造Prompt,以选择题的方式创建问答对,然后进行SFT训练。

线性层分类

  • 与微调Bert类似,将文本使用Tokenizer转换成input_ids后,使用Trainer进行正常训练。训练参数(若未单独指出,则代表使用Trainer默认值):
参数名称
lr_scheduler_type(学习率衰减策略)cosine
learning_rate(学习率)1.0e-5
per_device_train_batch_size(训练batch_size)8
gradient_accumulation_steps(梯度累积)8
per_device_eval_batch_size(验证batch_size)16
num_train_epochs(epoch)1
weight_decay1.0e-6
eval_steps(验证频率)0.05
  • 训练过程中模型对测试集的指标变化:
StepTraining LossValidation LossAccuracyPrecisionRecallF1
940.2818000.2436190.9181580.9181800.9181580.917893
1880.2241000.2200150.9242110.9252160.9242110.924289
2820.1977000.2364050.9192110.9201270.9192110.919257
3760.1828000.2432350.9201320.9253680.9201320.919136
4700.1915000.2078640.9282890.9295630.9282890.928304
5640.2084000.1924140.9356580.9356680.9356580.935647
6580.2019000.1915060.9385530.9386950.9385530.938607
7520.1919000.1798490.9375000.9374170.9375000.937378
8460.1561000.1773190.9386840.9389830.9386840.938653
9400.1599000.1770480.9382890.9394330.9382890.938175
10340.1591000.1722800.9435530.9437250.9435530.943455
11280.1170000.1687420.9430260.9429110.9430260.942949
12220.1515000.1646280.9434210.9443710.9434210.943503
13160.1436000.1586760.9459210.9468560.9459210.945965
14100.1832000.1543560.9461840.9467080.9461840.946221
15040.1594000.1535490.9477630.9478470.9477630.947771
15980.1471000.1525300.9485530.9486090.9485530.948539
16920.1614000.1512990.9490790.9492160.9490790.949029
17860.1505000.1512700.9484210.9485720.9484210.948363

  • 可以看到使用线性层分类的Qwen3-0.6B在测试集上最好结果是:0.949

SFT分类

  • 我们先基于数据集写一个选择题形式的Prompt,Prompt模板为:
prompt = """Please read the following news article and determine its category from the options below.Article:
{news_article}Question: What is the most appropriate category for this news article?
A. World
B. Sports
C. Business
D. Science/TechnologyAnswer:/no_think"""answer = "<think>\n\n</think>\n\n{answer_text}"
  • news_article为新闻文本,answer_text表示标签。
  • 先测试一下Qwen3-0.6B在测试集上思考和非思考模式下的zero-shot能力(准确率)。为获得稳定的结果,非思考模式使用手动拼接选项计算ppl,ppl最低的选项为模型答案。思考模式取<think>...</think>后的第一个选项。结果如下:
模型思考非思考
Qwen3-0.6B0.79970.7898
  • 训练框架使用LLama FactoryPrompt模板与上文一致。
  • 因为Qwen3为混合推理模型,所以对非推理问答对要在模板最后加上/no_think标识符(以避免失去推理能力),并且回答要在前面加上<think>\n\n</think>\n\n
  • 按照LLama Factory SFT训练数据的格式要求组织数据,如:
{'instruction': "Please read the following news article and determine its category from the options below.\n\nArticle:\nWall St. Bears Claw Back Into the Black (Reuters) Reuters - Short-sellers, Wall Street's dwindling\\band of ultra-cynics, are seeing green again.\n\nQuestion: What is the most appropriate category for this news article?\nA. World\nB. Sports\nC. Business\nD. Science/Technology\n\nAnswer:/no_think",'output': '<think>\n\n</think>\n\nC'
}
  • 训练参数配置文件:
### model
model_name_or_path: model/Qwen3-0.6B### method
stage: sft
do_train: true
finetuning_type: full### dataset
dataset: agnews_train
template: qwen3
cutoff_len: 512overwrite_cache: true
preprocessing_num_workers: 8### output
output_dir: Qwen3-0.6B-Agnews
save_strategy: steps
logging_strategy: steps
logging_steps: 0.01
save_steps: 0.2
plot_loss: true
report_to: tensorboard
overwrite_output_dir: true### train
per_device_train_batch_size: 12
gradient_accumulation_steps: 8
learning_rate: 1.2e-5
warmup_ratio: 0.01
num_train_epochs: 1
lr_scheduler_type: cosine
bf16: true
  • 因为Bert在训练2个epoch后就出现了严重的过拟合,所以对Qwen3模型,只训练1个epoch,每0.2个epoch保存一个检查点。
  • 训练过程中模型对测试集的指标变化(训练结束后加载检查点对测试集进行推理,注意!为保证推理结果稳定,我们选择选项ppl低的作为预测结果):
StepTraining LossAccuracyPrecisionRecallF1
2500.0260.9120.9170.9120.912
5000.0270.9240.9240.9240.924
7500.0220.9370.9370.9370.937
10000.0220.9410.9410.9410.941
12500.0230.9400.9400.9400.940

  • 可以看到Qwen3-0.6B模型Loss在一开始就急速下降,然后开始抖动的缓慢下降,如下图(纵轴范围调整0.05~0.015)。在测试集上最好结果是:0.941。

Bert和Qwen3-0.6B训练耗时

模型Epoch训练耗时推理耗时总耗时
Bert335 min-0.58 h
Qwen3-0.6B(线性层分类)152 min-0.86 h
Qwen3-0.6B(SFT分类)162 min30 min1.5 h

Bert和Qwen3-0.6B RPS测试

  • 为测试BertQwen3-0.6B是否满足实时业务场景,对微调后的BertQwen3-0.6B进行RPS测试,GPURTX 3090(24G):
模型推理引擎最大输出Token数RPS
BertHF-60.3
Qwen3-0.6B(SFT分类)HF813.2
Qwen3-0.6B(SFT分类)VLLM827.1
Qwen3-0.6B(线性层分类)HF-38.1

结论

  • Ag_new数据集上,各模型效果:Qwen3-0.6B(线性层分类)> Bert > Qwen3-0.6B(SFT分类)> Qwen3-0.6B(Think Zero-Shot)> Qwen3-0.6B(No Think Zero-Shot)。
  • 各模型训练推理耗时: Qwen3-0.6B(SFT分类)> Bert > Qwen3-0.6B(线性层分类)。
  • 各模型RPSBert > Qwen3-0.6B(线性层分类) > Qwen3-0.6B(SFT分类)。
  • Think模式下的Qwen3-0.6BNo Think模式下的Qwen3-0.6B准确率仅高出1%,推理时间比No Think慢20倍(HF推理引擎,Batch推理)。
  • 在训练Qwen3-0.6B(线性层分类)时,Loss在前期有点抖动,或许微调一下学习率预热比率会对最终结果有微弱正向效果。

实验局限性

  • 未实验在Think模式下Qwen3-0.6B的效果(使用GRPO直接训练0.6B的模型估计是不太行的,可能还是先使用较大的模型蒸馏出Think数据,然后再进行SFT。或者先拿出一部分数据做SFT,然后再进行GRPO训练(冷启动))。
  • 未考虑到长序列文本如token数(以Bert Tokenizer为标准)超过1024的文本。
  • 也许因为AgNews分类任务比较简单,其实不管是Bert还是Qwen3-0.6BF1超过0.94的情况下,都是可用的状态。Bert(F1:0.945)和Qwen3-0.6B线性层分类(F1:0.949)的差距并不明显。如果大家有更好的开源数据集可以用于测试,也欢迎提出。
  • 未测试两模型在中文文本分类任务中的表现。

来源:https://zhuanlan.zhihu.com/p/1906768058745349565?share_code=KPTadtlbij0m&utm_psn=1907715099319312567

http://www.xdnf.cn/news/7262.html

相关文章:

  • 遨游科普:三防平板是什么?应用在什么场景?
  • Perl数据库测试实战:从基础到高级的完整解决方案
  • 视觉-和-语言导航的综述:任务、方法和未来方向
  • Python编程从入门到实践 PDF 高清版
  • 【深度学习基础】损失函数与优化算法详解:从理论到实践
  • A3B和AWQ 是什么;Safetensors 是什么?
  • 解决 Linux Bash 脚本因换行符问题导致的 “bash^M: No such file or directory“ 错误
  • 在CentOS系统上部署GitLabRunner并配置CICD自动项目集成!
  • ubuntu下配置vscode生成c_cpp_properties.json
  • 【大数据】MapReduce 编程-- PageRank--网页排名算法,用于衡量网页“重要性”-排序网页
  • 展锐Android14及更新版本split_build编译方法
  • 百度OCR:证件识别
  • Python将Excel单元格某一范围生成—截图(进阶版—带样式+批量+多级表头)
  • 《黑马前端ajax+node.js+webpack+git教程》(笔记)——ajax教程(axios教程)
  • 确保高质量的音视频通话,如何最大化利用视频带宽
  • win10 上删除文件夹失败的一个原因:sqlYog 备份/导出关联了该文件夹
  • 【QT】一个界面中嵌入其它界面(二)
  • 星云智控v1.0.0产品发布会圆满举行:以创新技术重构物联网监控新生态
  • 线程池模式与C#中用法
  • 解决服务器重装之后vscode Remote-SSH无法连接的问题
  • Vue百日学习计划Day33-35天详细计划-Gemini版
  • 基于tar包安装,创建两个tomcat实例
  • CLIP:论文阅读 -- 视觉模型
  • 【MySQL成神之路】MySQL常用语法总结
  • Django 项目中,将所有数据表注册到 Django 后台管理系统
  • 从纸质契约到智能契约:AI如何改写信任规则与商业效率?​——从智能合约到监管科技,一场颠覆传统商业逻辑的技术革命
  • Ubuntu 20.04 postgresql
  • 通用简洁工作汇报项目评估营销策划工作总结年终汇报PPT模版8套一组分享
  • 什么是子网委派?
  • 一文了解VR拍摄制作