在对 Qwen3 进行微调训练时,如何保护模型的思考能力?

在对 Qwen3 进行微调训练时,如何保护模型的思考能力?

flyfish

Qwen3 模型支持两种思考模式:

一种是 “思考模式”,也就是 “慢慢想” 的方式。碰到复杂问题时,它会一步一步仔细推理,想透彻了再给出最终答案。像解数学题、分析复杂逻辑这类需要深入思考的事儿,用这种模式就特别合适。

另一种是 “非思考模式”,相当于 “快答” 模式。面对简单问题时,它能快速给出响应,几乎不用等,直接给结果不磨蹭。比如查个常识、问个简单定义,这种对速度要求比对深度要求高的情况,用这个模式就又快又省事。

在使用不包含思考过程的数据集(即仅包含问题与最终答案,缺少中间推理步骤的数据)进行模型微调时,为避免模型因过度学习 “直接输出答案” 的模式而丢失深层思考能力,可采用以下两种处理方式,从数据结构和训练策略层面减少对思考能力的破坏。

训练工具:SWIFT (Scalable lightWeight Infrastructure for Fine-Tuning)

平常使用的方式

例如对Qwen3-8B进行训练的脚本

CUDA_VISIBLE_DEVICES=0 \
swift sft \
    --model Qwen/Qwen3-8B \
    --train_type lora \
    --dataset '<dataset-path>' \
    --torch_dtype bfloat16 \
    --num_train_epochs 1 \
    --per_device_train_batch_size 1 \
    --per_device_eval_batch_size 1 \
    --learning_rate 1e-4 \
    --lora_rank 8 \
    --lora_alpha 32 \
    --target_modules all-linear \
    --gradient_accumulation_steps 4 \
    --eval_steps 50 \
    --save_steps 50 \
    --save_total_limit 2 \
    --logging_steps 5 \
    --max_length 2048 \
    --output_dir output \
    --warmup_ratio 0.05 \
    --dataloader_num_workers 4 \
    --packing true \
    --use_liger_kernel true \
    --attn_impl flash_attn

方式一:改变训练参数

在训练时额外指定--loss_scale ignore_empty_think,忽略<think>\n\n</think>\n\n的损失计算。

# use `--loss_scale ignore_empty_think`
# Avoid losing the think capability by ignoring the loss of empty `<think>\n\n</think>\n\n`
# This method is also applicable to the Deepseek-R1 series of models.
CUDA_VISIBLE_DEVICES=0 \
swift sft \
    --model Qwen/Qwen3-8B \
    --train_type lora \
    --dataset 'swift/Qwen3-SFT-Mixin#2000' \
              'swift/self-cognition:empty_think#600' \
    --torch_dtype bfloat16 \
    --num_train_epochs 1 \
    --per_device_train_batch_size 1 \
    --per_device_eval_batch_size 1 \
    --learning_rate 1e-4 \
    --lora_rank 8 \
    --lora_alpha 32 \
    --target_modules all-linear \
    --gradient_accumulation_steps 16 \
    --eval_steps 50 \
    --save_steps 50 \
    --save_total_limit 2 \
    --logging_steps 5 \
    --max_length 2048 \
    --output_dir output \
    --warmup_ratio 0.05 \
    --dataloader_num_workers 4 \
    --use_liger_kernel true \
    --load_from_cache_file false \
    --loss_scale ignore_empty_think \
    --model_author swift \
    --model_name swift-robot

方式二:数据集的构建方式

在构建数据集时,需要对数据进行两项标准化处理:一是在所有用户提出的问题(query)文本末尾统一添加 /no_think这一特定标识;二是在所有助手给出的答案(response)文本开头,统一添加 <think>\n\n</think>\n\n 这一固定格式的前缀。

# use `swift/self-cognition:qwen3`
# Avoid losing the thinking capability by appending `/no_think` to the dataset query.
# https://github.com/modelscope/ms-swift/blob/77985c2ccdac8ed4037174ee222e79d1f1d5059d/swift/llm/dataset/dataset/llm.py#L835
CUDA_VISIBLE_DEVICES=0 \
swift sft \
    --model Qwen/Qwen3-8B \
    --train_type lora \
    --dataset 'swift/Qwen3-SFT-Mixin#2000' \
              'swift/self-cognition:qwen3#600' \
    --torch_dtype bfloat16 \
    --num_train_epochs 1 \
    --per_device_train_batch_size 1 \
    --per_device_eval_batch_size 1 \
    --learning_rate 1e-4 \
    --lora_rank 8 \
    --lora_alpha 32 \
    --target_modules all-linear \
    --gradient_accumulation_steps 16 \
    --eval_steps 50 \
    --save_steps 50 \
    --save_total_limit 2 \
    --logging_steps 5 \
    --max_length 2048 \
    --output_dir output \
    --warmup_ratio 0.05 \
    --dataloader_num_workers 4 \
    --use_liger_kernel true \
    --load_from_cache_file false \
    --model_author swift \
    --model_name swift-robot

swift/self-cognition

dataset_infos.json

{
  "default": {
    "features": {
      "query": { "_type": "Value" },
      "response": { "_type": "Value" },
      "tag": { "_type": "Value" }
    },
    "splits": { "train": { "name": "train", "dataset_name": "self-cognition" } }
  }
}

self_cognition.jsonl

{“query”: “你是?”, “response”: “我是{{NAME}},由{{AUTHOR}}训练的人工智能助手。我的目标是为用户提供有用、准确和及时的信息,并通过各种方式帮助用户进行有效的沟通。请告诉我有什么可以帮助您的呢?”, “tag”: “zh”}
{“query”: “你是谁!”, “response”: “您好!我是{{AUTHOR}}开发的人工智能语言模型,名为{{NAME}}。我可以回答您的问题、提供信息、进行对话并帮助解决问题。如果您有任何疑问或需要帮助,请随时告诉我!”, “tag”: “zh”}

register_dataset(
    DatasetMeta(
        ms_dataset_id='swift/self-cognition',
        hf_dataset_id='modelscope/self-cognition',
        subsets=[
            SubsetDataset(preprocess_func=SelfCognitionPreprocessor()),
            SubsetDataset(
                'qwen3',
                preprocess_func=SelfCognitionPreprocessor(
                    query_suffix=' /no_think', response_prefix='<think>\n\n</think>\n\n')),
            SubsetDataset(
                'empty_think', preprocess_func=SelfCognitionPreprocessor(response_prefix='<think>\n\n</think>\n\n')),
        ],
        dataset_name='self-cognition',
        tags=['chat', 'self-cognition', '🔥']))

重点看qwen3这个地方

subsets 参数(数据集子集)
定义了该数据集包含的多个子集(SubsetDataset),每个子集可能对应不同的数据处理需求,通过preprocess_func指定预处理函数:

第一个子集:未指定名称,使用默认的SelfCognitionPreprocessor()预处理函数(基础处理逻辑)。

第二个子集:名称为qwen3,预处理函数为SelfCognitionPreprocessor,并指定了query_suffix=' /no_think'(查询末尾添加该后缀)和response_prefix='<think>\n\n</think>\n\n'(响应开头添加该前缀),可能用于特定模型(如Qwen3)的输入格式适配。

第三个子集:名称为empty_think,预处理函数同样为SelfCognitionPreprocessor,但仅指定response_prefix,可能用于处理“无思考过程”的响应数据。

问题增加 /no_think,答案增加<think>\n\n</think>\n\n

最后经过处理的数据集的样子

{"messages": [{"role": "user", "content": "苹果属于什么科的植物? /no_think"}, {"role": "assistant", "content": "<think>\n\n</think>\n\n 苹果属于蔷薇科植物。"}]}
{"messages": [{"role": "user", "content": "常见的苹果品种有哪些? /no_think"}, {"role": "assistant", "content": "<think>\n\n</think>\n\n 常见的苹果品种有红富士、嘎啦、金帅、蛇果、阿克苏冰糖心等。"}]}
{"messages": [{"role": "user", "content": "苹果一般在什么季节成熟? /no_think"}, {"role": "assistant", "content": "<think>\n\n</think>\n\n 苹果通常在秋季成熟,不同品种成熟时间略有差异,大多集中在 9-10 月。"}]}
### 如何使用 Llama Factory 训练 Qwen3 思维模型 Llama Factory 是一个用于快速搭建和微调大语言模型的工具包,能够帮助开发者高效完成模型训练、推理以及部署的任务。以下是关于如何使用 Llama Factory 训练 Qwen3 思维模型的相关说明。 #### 1. 准备工作 在开始之前,需要准备好必要的环境配置和数据集。具体步骤如下: - **安装依赖库** 需要先安装 Llama Factory 的相关依赖项。可以通过 pip 或者 conda 安装所需的 Python 库[^1]。 ```bash pip install git+https://github.com/your-repo/llama-factory.git ``` - **下载基础模型** 下载 Qwen3 模型权重文件,并将其放置在一个固定的目录下。例如,在本地路径 `E:\LLamaFactory\Qwen3` 中存储该模型[^1]。 - **准备数据集** 构建适合任务需求的数据集,通常是以 JSON 文件或者 CSV 文件的形式保存对话对或指令对。这些数据将被用来指导模型学习特定领域内的知识[^2]。 #### 2. 修改配置文件 进入 Llama Factory 提供的配置模板目录,编辑对应的 YAML 文件来适配自己的项目设置。主要参数包括但不限于以下几个方面: - **Model Path**: 设置为已下载的基础模型路径,比如 `E:\LLamaFactory\Qwen3`. - **Adapter Name or Path**: 如果采用 LoRA 方法,则指定 Adapter 路径;如果不需要额外加载 Adapter,可以留空。 - **Template**: 使用与目标模型匹配的 Prompt Template,这里可能选择类似于 `llama3` 的格式。 - **Fine-tuning Type**: 明确指出使用的微调方式(如 Full Fine-Tune 还是 LoRA),推荐优先尝试效率更高的 LoRA 方案[^3]。 #### 3. 启动训练过程 通过命令行运行脚本来启动实际的训练流程。假设已经调整好了所有的超参设定之后,执行下面这条语句即可触发整个计算逻辑链路: ```bash llamafactory-cli train examples/training/qwen3_config.yaml ``` 这一步骤会依据定义好的规则自动处理输入样本集合,并不断迭代更新内部参数直至满足收敛条件为止[^3]。 #### 4. 推理服务化 当顺利完成训练环节后,就可以着手考虑如何对外暴露预测能力了。对于经过定制化的 Qwen3 思维版本而言,可以选择多种途径来进行后续操作,例如非流式批量推理、流式推理接口封装等等[^4]。 --- ### 示例代码片段 以下是一个简单的 Python 脚本例子展示如何加载预训练模型并对其进行进一步加工改造: ```python from transformers import AutoTokenizer, AutoModelForCausalLM tokenizer = AutoTokenizer.from_pretrained("path/to/Qwen3") model = AutoModelForCausalLM.from_pretrained("path/to/Qwen3") def generate_text(prompt): inputs = tokenizer.encode(prompt, return_tensors="pt").to(model.device) outputs = model.generate(inputs, max_length=50) result = tokenizer.decode(outputs[0], skip_special_tokens=True) return result if __name__ == "__main__": prompt = "请描述一下未来科技的发展趋势" response = generate_text(prompt) print(response) ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

二分掌柜的

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值