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

news2025/5/20 15:09:55

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/Technology

Answer:/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: 512

overwrite_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.coloradmin.cn/o/2380058.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

UWB定位方案在水力发电站人员安全的应用推荐

一、行业应用背景‌ 水力发电站具有‌环境复杂‌&#xff08;金属设备密集、高温高压区域多&#xff09;、‌安全风险高‌&#xff08;人员误入高危区域易引发事故&#xff09;等特点&#xff0c;传统定位技术难以满足精度与可靠性要求。品铂科技基于UWB的高精度定位系统已在多…

无刷直流水泵构成及工作原理详解--【其利天下技术】

无刷直流水泵是相对于有刷直流泵而言的。 一&#xff1a;无刷直流水泵简介 无刷直流水泵即BLDC PUMP&#xff0c;其中“BL”意为“无刷”&#xff0c;DC即直流电机。 无刷直流水泵(BLDC PUMP)以电子换向器取代了机械换向器&#xff0c;所以无刷直流水泵既具有直流电机良好的调…

大数据:新能源汽车宇宙的未来曲率引擎

** 发布日期&#xff1a;2025-05-14** 关键词&#xff1a;大数据、新能源、机器学习、碳中和、CSDN爆款 1. 大数据科普&#xff1a;定义、特征与技术核心 1.1 什么是大数据&#xff1f; 大数据&#xff08;Big Data&#xff09;指规模巨大、类型多样、生成速度快且价值密度低…

【Java ee】关于抓包软件Fiddler Classic的安装与使用

Web Debugging Proxy Tool | Fiddler Classic 安装网站↑ 下载好安装包之后&#xff0c;双击一路next就可以了 一、抓包软件 电脑上安装了抓包软件之后&#xff0c;抓包软件就可以监听你的网卡上通过的数据。 本来是你的客户端通过网卡&#xff0c;把数据发给目标服务器&a…

C++--内存管理

内存管理 1. C/C内存分布 在C语言阶段&#xff0c;常说局部变量存储在栈区&#xff0c;动态内存中的数据存储在堆区&#xff0c;静态变量存储在静态区&#xff08;数据段&#xff09;&#xff0c;常量存储在常量区&#xff08;代码段&#xff09;&#xff0c;其实这里所说的栈…

TC3xx学习笔记-UCB BMHD使用详解(二)

文章目录 前言Confirmation的定义Dual UCB: Confirmation StatesDual UCB: Errored State or ECC Error in the UCB Confirmation CodesECC Error in the UCB ContentDual Password UCB ORIG and COPY Re-programming UCB_BMHDx_ORIG and UCB_BMHDx_COPY (x 0-3)BMHD Protecti…

用Python实现数据库数据自动化导出PDF报告:从MySQL到个性化文档的全流程实践

本文将介绍如何使用Python构建一个自动化工具&#xff0c;实现从MySQL数据库提取员工数据&#xff0c;并为每位员工生成包含定制化表格的PDF报告。通过该方案&#xff0c;可显著提升数据导出效率&#xff0c;避免手动操作误差&#xff0c;同时支持灵活的格式定制。 需求&#…

实战设计模式之状态模式

概述 作为一种行为设计模式&#xff0c;状态模式允许对象在其内部状态改变时&#xff0c;改变其行为。这种模式通过将状态逻辑从对象中分离出来&#xff0c;并封装到独立的状态类中来实现。每个状态类代表一种特定的状态&#xff0c;拥有自己的一套行为方法。当对象的状态发生变…

什么是着色器 Shader

本人就是图形学结课了&#xff0c;对 OpenGL着色器还有很多疑问嘿嘿 文章目录 为什么要有着色器vshaderfshader 本文围绕 vshader 和 fshader 代码示例讲解。 &#xff08;着色器代码取自本人简单OpenGL项目 https://github.com/DBWGLX/-OpenGL-3D-Lighting-and-Shadow-Modeli…

Redis的主从架构

主从模式 全量同步 首先主从同步过程第一步 会先比较replication id 判断是否是第一次同步假设为第一次同步 那么就会 启动bgsave异步生成RDB 同时fork子进程记录生成期间的新数据发送RDB给从节点 清空本地数据写入RDB 增量同步 对比ReplicationID不同因此选择增量同步在Rep…

博客系统功能测试

博客系统网址&#xff1a;http://8.137.19.140:9090/blog_list.html 主要测试内容 功能测试、界面测试、性能测试、易用性测试、安全测试、兼容性测试、弱网测试、安装卸载测试、压力测试… 测试方法及目的 利用selenium和python编写测试脚本&#xff0c;对博客系统进行的相关…

【深度学习新浪潮】什么是多模态大模型?

多模态大模型是人工智能领域的前沿技术方向,它融合了多种数据模态(如文本、图像、语音、视频、传感器数据等),并通过大规模参数模型实现跨模态的联合理解与生成。简单来说,这类模型就像人类一样,能同时“看”“听”“读”“说”,并将不同信息关联起来,完成复杂任务。 …

机器学习前言2

1.机器学习 2.机器学习模型 3.模型评价方法 4.如何选择合适的模型 介绍 机器学习&#xff08;Machine Learning, ML&#xff09;是人工智能&#xff08;AI&#xff09;的核心分支&#xff0c;致力于通过数据和算法让计算机系统自动“学习”并改进性能&#xff0c;而无需显式编…

【成品设计】基于Arduino的自动化农业灌溉系统

《基于STM32的单相瞬时值反馈逆变器》 硬件设计&#xff1a; ESP-C3最小系统板&#xff1a;主控芯片&#xff0c;内部集成wifi。土壤湿度传感器&#xff1a;采集土壤湿度。温度传感器&#xff1a;采集土壤温度。水泵模块&#xff1a;水泵继电器软管。按键3个&#xff1a;参数…

前端页面 JavaScript数据交互

前言&#xff1a;学习JavaScript为前端设置动态效果&#xff0c;实现交互。JavaScript是一种广泛应用于网页开发的脚本语言&#xff0c;它能够使网页变得更加动态和交互性。作为一种客户端脚本语言&#xff0c;JavaScript可以被嵌入到HTML中&#xff0c;并且可以被所有现代的网…

esp32课设记录(三)mqtt通信记录 附mqtt介绍

目录 安装mqttx&#xff08;云端部署&#xff09; 安装mosquitto&#xff08;本地部署&#xff09; 编程&#xff0c;连接wifi 编程&#xff0c;连接mqtt&#xff0c;实现数据接收 实际效果展示&#xff1a; 附录&#xff1a;mqtt介绍 工作流程简述&#xff1a; 工作流…

string类(详解)

【本节目标】 1. 为什么要学习string类 2. 标准库中的string类 3. string类的模拟实现 4. 扩展阅读 1. 为什么学习string类&#xff1f; 1.1 C语言中的字符串 C 语言中&#xff0c;字符串是以 \0 结尾的一些字符的集合&#xff0c;为了操作方便&#xff0c; C 标准库中提供…

MATLAB | R2025a 更新了哪些有趣的东西?

千呼万唤始出来&#xff0c;MATLAB R2025A 来见面&#xff0c;这次更新比往常晚了两个月&#xff0c;让我们看看更了哪些好玩的新东西叭&#xff1a;首先下载更新启动一气呵成&#xff0c;映入眼帘的是&#xff1a; 1 基本界面 基本界面变得和 MATLAB 网页版一模一样了&#…

前缀和——和为K的子数组

作者感觉本题稍稍有点难度&#xff0c;看了题解也思考了有一会TWT 显然&#xff0c;暴力我们是不可取的&#xff0c;但这里我们可以采取一种新的遍历数组形式&#xff0c;从后向前&#xff0c;也就是以i位置为结尾的所有子数组&#xff0c;这个子数组只统计i位置之前的。 然后…

深入理解 ZAB:ZooKeeper 原子广播协议的工作原理

目录 ZAB 协议&#xff1a;ZooKeeper 如何做到高可用和强一致&#xff1f;&#x1f512;ZAB 协议的核心目标 &#x1f3af;ZAB 协议的关键概念 &#x1f4a1;ZAB 协议的运行阶段 &#x1f3ac;阶段一&#xff1a;Leader 选举 (Leader Election) &#x1f5f3;️阶段二&#xff…