资讯动态

Fusion Training:提升大语言模型数学泛化能力的创新训练范式

发布时间:2026/8/15 5:41:22 来源:尧图企业网站定制
如果你正在尝试让大语言模型LLM解决数学问题可能会发现一个令人沮丧的现象模型在训练集上表现优异但面对稍微变化、需要泛化的新题目时却显得束手无策。这不仅仅是“过拟合”那么简单它触及了当前LLM在数学推理能力上的一个核心瓶颈——缺乏真正的数学泛化能力。最近一项名为“Fusion Training”的研究方法引起了广泛关注。它并非一个全新的模型架构而是一种创新的训练范式旨在从根本上提升LLM在数学领域的泛化性能。简单来说它试图教会模型“举一反三”而不是“死记硬背”。这篇文章要解决的核心问题是如何让一个已经具备强大语言理解和代码生成能力的LLM真正学会数学推理的“内核”从而在面对未见过的、结构化的数学问题时依然能够给出正确解答我们将深入拆解Fusion Training的原理、实现步骤并通过一个完整的代码示例展示如何将这一方法应用到你的模型微调实践中。无论你是希望提升现有数学模型的性能还是对LLM的泛化机制感兴趣这篇文章都将提供一条清晰、可落地的技术路径。1. 数学泛化LLM的“阿喀琉斯之踵”为什么数学泛化对LLM如此困难这要从数学问题的本质和LLM的学习方式说起。传统微调的局限当你用大量数学题如GSM8K、MATH数据集去微调一个基础LLM如Llama、Qwen时模型本质上在学习一种“模式匹配”。它记住了“看到问题A应该输出步骤B、C、D最终得到答案E”。这种学习在训练集分布内效果很好但一旦题目换了一种表述方式、改变了数字结构、或者需要组合不同的知识点时模型就容易“卡壳”。例如模型学会了(ab)^2 a^2 2ab b^2的所有例题。但当遇到(x - 1/x)^2时如果训练集中没有完全相同的模式它可能无法正确展开因为它没有理解“完全平方公式”这个抽象概念本身而只是记住了几个具体实例。Fusion Training要解决的核心矛盾记忆 vs. 理解如何让模型超越对具体题目-答案对的记忆去理解背后的数学原理和推理结构孤立知识点 vs. 知识融合数学问题往往是多个知识点的交叉应用。传统训练中知识点被分散在不同的样本里模型难以建立它们之间的联系。表面形式 vs. 深层结构题目表述千变万化但数学推理的深层逻辑结构如归纳、演绎、反证是相对稳定的。如何让模型捕捉到这种稳定结构Fusion Training的提出正是为了直接应对这些挑战。它的核心思想不是增加数据量而是改变数据组织和训练目标引导模型进行“融合学习”。2. Fusion Training 核心原理从“刷题”到“构建知识图谱”我们可以把传统数学微调想象成“题海战术”而Fusion Training则是“专题突破综合演练”的结合。其核心包含两个关键阶段2.1 阶段一分治训练 - 掌握原子技能首先将复杂的数学领域如代数、几何、数论分解为一系列原子技能。例如在代数中原子技能可能包括技能1合并同类项技能2因式分解提取公因式、公式法技能3解一元一次方程技能4解一元二次方程求根公式...在这个阶段使用高度纯净的数据集对模型进行训练。每个数据集只专注于让模型掌握某一个原子技能。目标是让模型对该技能形成深刻、准确的“肌肉记忆”。关键设计此阶段的训练数据会经过精心构建确保题目在形式上具有足够的多样性避免模型记忆固定模板但在核心技能上保持高度一致。2.2 阶段二融合训练 - 学习技能组合与调度这是Fusion Training的精髓。在此阶段我们向模型展示需要多个原子技能按特定顺序组合才能解决的复杂问题。训练数据不再是“单一技能-单一问题”的对应而是“多技能链-复杂问题”的对应。模型需要学会问题分解识别一个复杂问题可以分解为哪几个原子子问题。技能调度决定解决这些子问题的正确顺序。结果整合将各个子步骤的结果正确组合得到最终答案。类比理解这就像教一个机器人做菜。阶段一是教它“切菜”、“开火”、“翻炒”、“调味”等单个动作。阶段二则是给它一份“鱼香肉丝”的菜谱让它自己规划先切肉技能1再切菜技能2然后开火炒肉技能3接着加入菜和调料技能4最后翻炒出锅技能5。Fusion Training就是让模型学会阅读并执行这份“多技能菜谱”。2.3 背后的理论支撑组合泛化Fusion Training的理论基础是组合泛化——人类智能的关键特征。我们能够理解并生成无限多的新句子因为我们掌握了有限的词汇原子技能和语法规则组合方式。同样数学泛化要求模型掌握有限的数学原子技能和将它们组合起来解决新问题的“数学语法”。通过显式地进行分治与融合训练我们迫使模型去学习这种“组合语法”而不仅仅是记忆“句子”具体题目。3. 环境准备与前置条件在开始实践之前你需要准备好以下环境。本文将以开源模型和工具为例进行演示。基础环境操作系统Linux (Ubuntu 20.04) 或 macOSWindows可通过WSL2进行。Python3.8 或 3.9 版本建议3.9。CUDA11.7 或 11.8如果你使用NVIDIA GPU进行训练。内存至少16GB RAM训练时显存需求取决于模型大小例如7B模型全参数微调需要约24GB以上显存。核心Python库我们将使用transformers、datasets、peft(参数高效微调) 和trl(Transformer Reinforcement Learning) 等库。建议使用虚拟环境。# 创建并激活虚拟环境 conda create -n fusion_math python3.9 -y conda activate fusion_math # 安装PyTorch (请根据你的CUDA版本选择) pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118 # 安装核心机器学习库 pip install transformers datasets accelerate peft trl bitsandbytes # 安装训练相关工具 pip install wandb tensorboard scikit-learn pandas模型选择我们选择一个中等规模、数学能力尚可的基础模型作为起点。例如Qwen2.5-7B-Instruct在数学和代码上有不错表现且完全开源。Llama-3-8B-Instruct通用能力强社区支持好。DeepSeek-Math-7B专门针对数学微调过的模型作为起点效果更佳。本文示例将使用Qwen2.5-7B-Instruct你可以从Hugging Face模型库下载。# 可选提前下载模型也可以在代码中自动下载 from huggingface_hub import snapshot_download model_name Qwen/Qwen2.5-7B-Instruct snapshot_download(repo_idmodel_name, local_dir./qwen2.5-7b-instruct)4. 数据准备构建原子技能与融合数据集数据是Fusion Training成功的关键。我们需要构建两类数据4.1 原子技能数据集为每个选定的数学原子技能创建训练集。数据可以来自现有数据集的子集或通过模板生成。示例为“解一元二次方程”技能构建数据我们编写一个脚本生成形式多样但核心技能一致的数据。# generate_atomic_skill_data.py import json import random import sympy as sp def generate_quadratic_equation_samples(num_samples1000): 生成一元二次方程求解的样本 samples [] for _ in range(num_samples): # 随机生成根确保为有理数或简单无理数便于生成整数系数方程 r1 random.randint(-5, 5) r2 random.randint(-5, 5) # 构建方程a*x^2 b*x c 0, 其中 a ! 0 a random.choice([1, 2, 3, -1, -2, -3]) b -a * (r1 r2) c a * r1 * r2 # 生成多种问题表述 templates [ f解方程{a if a !1 else }x² {b if b0 else f({b})}x {c if c0 else f({c})} 0, f求方程 {a if a !1 else }x^2 {b}x {c} 0 的根。, f求解二次方程{a}x² {b}x {c} 0。, fWhat are the solutions to the quadratic equation {a}x² {b}x {c} 0?, ] question random.choice(templates) # 计算答案 if r1 r2: answer f方程有两个相等的实根x {r1} else: answer f方程的两个根为x₁ {r1}, x₂ {r2} # 生成CoT思维链步骤 cot f这是一元二次方程。首先确认方程形式为 ax² bx c 0其中 a{a}, b{b}, c{c}。 判别式 Δ b² - 4ac {b}² - 4*{a}*{c} {b*b - 4*a*c}。 由于判别式大于等于0方程有实根。 根据求根公式x [-b ± √Δ] / (2a)。 计算得x₁ [{-b} √{b*b - 4*a*c}] / {2*a} {r1}x₂ [{-b} - √{b*b - 4*a*c}] / {2*a} {r2}。 所以{answer}。 samples.append({ instruction: 请解决以下数学问题。, input: question, output: cot, skill: solve_quadratic_equation }) return samples # 生成并保存 atomic_data generate_quadratic_equation_samples(500) with open(./data/atomic_solve_quadratic.jsonl, w) as f: for item in atomic_data: f.write(json.dumps(item, ensure_asciiFalse) \n) print(f已生成 {len(atomic_data)} 个原子技能样本。)你需要为每个计划训练的原子技能如simplify_expression,solve_linear_equation,factor_polynomial运行类似的脚本生成数据。4.2 融合技能数据集构建需要多个技能顺序执行的复杂问题。这是Fusion Training效果的核心。示例构建一个需要“因式分解”-“解方程”两个技能的融合数据# generate_fusion_data.py import json import random def generate_fusion_samples(num_samples500): 生成需要多步骤技能的融合样本 samples [] skills_required [factor_polynomial, solve_quadratic_equation] for _ in range(num_samples): # 随机生成一个可因式分解的二次多项式并使其等于0构成方程 # 例如(xp)(xq) x² (pq)x pq 0 p random.randint(-4, 4) q random.randint(-4, 4) b p q c p * q # 生成复杂问题表述 templates [ f求解方程 x² {b}x {c} 0。提示尝试先对左边的二次式进行因式分解。, f找出方程 x² {b}x {c} 0 的所有实数解。请展示你的分解过程。, f解方程x^2 {b}x {c} 0。要求使用因式分解法。, ] question random.choice(templates) # 生成融合了多技能CoT的答案 cot f**步骤1因式分解多项式。** 我们需要对 x² {b}x {c} 进行因式分解。 寻找两个数它们的和是 {b}积是 {c}。 这两个数是 {p} 和 {q}因为 {p} {q} {b}且 {p} * {q} {c}。 因此x² {b}x {c} (x {p})(x {q})。 **步骤2解方程。** 原方程等价于 (x {p})(x {q}) 0。 根据零积性质若两数相乘为零则至少有一个数为零。 所以x {p} 0 或 x {q} 0。 解得x {-p} 或 x {-q}。 **最终答案** 方程的解为 x {-p} 和 x {-q}。 samples.append({ instruction: 请分步骤解决以下数学问题并展示你的推理过程。, input: question, output: cot, required_skills: skills_required, skill_sequence: [factor_polynomial, solve_quadratic_equation] # 显式标注技能序列 }) return samples # 生成并保存 fusion_data generate_fusion_samples(300) with open(./data/fusion_factor_and_solve.jsonl, w) as f: for item in fusion_data: f.write(json.dumps(item, ensure_asciiFalse) \n) print(f已生成 {len(fusion_data)} 个融合技能样本。)数据组织目录建议./data/ ├── atomic_skills/ │ ├── solve_linear_equation.jsonl │ ├── solve_quadratic_equation.jsonl │ ├── factor_polynomial.jsonl │ └── simplify_expression.jsonl ├── fusion_problems/ │ ├── fusion_linear_system.jsonl # 需要解多个线性方程 │ ├── fusion_factor_and_solve.jsonl # 需要因式分解后解方程 │ └── fusion_geometry_algebra.jsonl # 结合几何与代数 └── dataset_info.json # 数据集元信息5. 模型训练分治与融合两阶段实战我们将使用transformers和peft库采用QLoRA进行参数高效微调以节省显存。5.1 第一阶段原子技能分治训练首先我们依次训练每个原子技能。这里以“解一元二次方程”为例。# train_atomic_skill.py from transformers import AutoTokenizer, AutoModelForCausalLM, TrainingArguments, Trainer from peft import LoraConfig, get_peft_model, TaskType from datasets import load_dataset import torch # 1. 加载模型和分词器 model_name Qwen/Qwen2.5-7B-Instruct # 或你的本地路径 tokenizer AutoTokenizer.from_pretrained(model_name, trust_remote_codeTrue) # 设置padding token如果模型没有 if tokenizer.pad_token is None: tokenizer.pad_token tokenizer.eos_token model AutoModelForCausalLM.from_pretrained( model_name, torch_dtypetorch.bfloat16, # 节省显存 device_mapauto, trust_remote_codeTrue ) # 2. 配置LoRA lora_config LoraConfig( task_typeTaskType.CAUSAL_LM, r16, # LoRA秩 lora_alpha32, # 缩放参数 lora_dropout0.05, target_modules[q_proj, v_proj, k_proj, o_proj, gate_proj, up_proj, down_proj], # 针对Qwen2.5的模块名 biasnone, ) model get_peft_model(model, lora_config) model.print_trainable_parameters() # 查看可训练参数占比应很小 # 3. 加载原子技能数据集 dataset load_dataset(json, data_files./data/atomic_skills/solve_quadratic_equation.jsonl, splittrain) # 4. 数据预处理构建提示词模板 def format_instruction(example): # 构建类似Qwen Instruct格式的对话 messages [ {role: system, content: 你是一个专业的数学助手。}, {role: user, content: f{example[instruction]}\n\n问题{example[input]}}, {role: assistant, content: example[output]} ] # 将对话格式化为模型接受的文本 text tokenizer.apply_chat_template(messages, tokenizeFalse, add_generation_promptFalse) return {text: text} tokenized_dataset dataset.map(format_instruction) # 5. 定义数据整理函数 def collate_fn(batch): # 对文本进行分词和填充 inputs tokenizer( [item[text] for item in batch], truncationTrue, paddingTrue, max_length1024, return_tensorspt, ) # 设置标签对于因果语言模型标签就是输入偏移一位 inputs[labels] inputs[input_ids].clone() return inputs # 6. 配置训练参数 training_args TrainingArguments( output_dir./output/atomic_solve_quadratic, num_train_epochs3, # 原子技能训练轮次可以少一些 per_device_train_batch_size4, gradient_accumulation_steps4, warmup_steps100, logging_steps50, save_steps500, eval_strategyno, # 原子技能训练可以暂不验证 save_total_limit2, learning_rate2e-4, fp16True, # 混合精度训练 push_to_hubFalse, report_totensorboard, ) # 7. 创建Trainer并开始训练 trainer Trainer( modelmodel, argstraining_args, train_datasettokenized_dataset, data_collatorcollate_fn, ) trainer.train() trainer.save_model(./output/atomic_solve_quadratic/final) tokenizer.save_pretrained(./output/atomic_solve_quadratic/final) print(原子技能训练完成)你需要为每个原子技能运行类似的训练脚本并保存各自的适配器权重。5.2 第二阶段融合训练在原子技能训练完成后我们加载一个基础模型并将所有原子技能的LoRA适配器合并或同时加载作为起点然后在融合数据集上进行训练。# train_fusion.py from transformers import AutoTokenizer, AutoModelForCausalLM, TrainingArguments, Trainer from peft import PeftModel, PeftConfig, LoraConfig, get_peft_model import torch # 1. 加载基础模型与原子技能训练相同的基础模型 base_model_name Qwen/Qwen2.5-7B-Instruct tokenizer AutoTokenizer.from_pretrained(base_model_name, trust_remote_codeTrue) if tokenizer.pad_token is None: tokenizer.pad_token tokenizer.eos_token base_model AutoModelForCausalLM.from_pretrained( base_model_name, torch_dtypetorch.bfloat16, device_mapauto, trust_remote_codeTrue ) # 2. 加载所有原子技能的LoRA适配器并合并到基础模型 # 方法一顺序加载并合并如果适配器结构完全一致 atomic_adapters [ ./output/atomic_solve_linear/final, ./output/atomic_solve_quadratic/final, ./output/atomic_factor_polynomial/final, # ... 添加其他技能适配器 ] # 注意直接合并多个LoRA适配器可能需要自定义逻辑因为transformers库的PeftModel默认只支持一个活动适配器。 # 一种简化策略先在一个适配器上训练融合数据其权重已蕴含了基础能力。 # 更高级的策略使用自定义模型加载多个适配器或使用MergeKit等工具。 # 本文采用简化策略我们只加载一个“代表性”原子技能适配器作为起点或者直接从基础模型开始。 # 因为融合训练的核心是学习“组合”而非重新学习原子技能。 # 我们假设基础模型已具备一定的原子技能可通过前期SFT获得或我们从一个原子技能适配器开始。 print(从‘解方程’原子技能适配器开始融合训练...) model PeftModel.from_pretrained(base_model, ./output/atomic_solve_quadratic/final) model model.merge_and_unload() # 将LoRA权重合并到基础模型得到一个完整的微调后模型 # 3. 为融合训练创建一个新的LoRA配置在已微调的模型上继续学习组合能力 lora_config_fusion LoraConfig( task_typeTaskType.CAUSAL_LM, r32, # 融合训练可能需要更大的秩来学习复杂组合 lora_alpha64, lora_dropout0.1, target_modules[q_proj, v_proj, k_proj, o_proj, gate_proj, up_proj, down_proj], biasnone, ) model get_peft_model(model, lora_config_fusion) # 在已微调模型上添加新的LoRA层 model.print_trainable_parameters() # 4. 加载融合数据集 from datasets import load_dataset fusion_dataset load_dataset(json, data_files./data/fusion_problems/fusion_factor_and_solve.jsonl, splittrain) def format_fusion_instruction(example): # 在提示词中可考虑加入技能序列的隐式引导可选 skill_hint 本题需要综合运用因式分解和解方程的技能。 messages [ {role: system, content: 你是一个擅长分步骤解决复杂数学问题的助手。}, {role: user, content: f{example[instruction]}\n\n问题{example[input]}\n\n提示{skill_hint}}, {role: assistant, content: example[output]} ] text tokenizer.apply_chat_template(messages, tokenizeFalse, add_generation_promptFalse) return {text: text} tokenized_fusion_dataset fusion_dataset.map(format_fusion_instruction) # 5. 训练参数融合训练可能需要更精细的调参 training_args_fusion TrainingArguments( output_dir./output/fusion_training, num_train_epochs5, # 融合训练轮次可稍多 per_device_train_batch_size2, # 问题可能更复杂减小batch size gradient_accumulation_steps8, warmup_steps150, logging_steps50, save_steps500, eval_strategysteps, eval_steps200, save_total_limit2, learning_rate1e-4, # 使用更小的学习率 fp16True, push_to_hubFalse, report_totensorboard, load_best_model_at_endTrue, metric_for_best_modeleval_loss, ) # 6. 需要定义一个评估函数和数据集此处简化假设有验证集 # train/eval split split_dataset tokenized_fusion_dataset.train_test_split(test_size0.1) train_dataset split_dataset[train] eval_dataset split_dataset[test] def compute_metrics(eval_preds): # 简易评估计算困惑度 (Perplexity) import math import numpy as np logits, labels eval_preds # 忽略padding部分的损失计算 shift_logits logits[..., :-1, :].contiguous() shift_labels labels[..., 1:].contiguous() loss_fct torch.nn.CrossEntropyLoss(reductionnone, ignore_indextokenizer.pad_token_id) loss loss_fct(shift_logits.view(-1, shift_logits.size(-1)), shift_labels.view(-1)) loss loss.view(shift_labels.size()) # 计算每个序列的平均负对数似然 lens (shift_labels ! tokenizer.pad_token_id).sum(-1).cpu().numpy() loss loss.sum(-1).cpu().numpy() / lens perplexity np.exp(np.mean(loss)) return {perplexity: perplexity} trainer Trainer( modelmodel, argstraining_args_fusion, train_datasettrain_dataset, eval_dataseteval_dataset, data_collatorcollate_fn, # 复用之前的collate_fn compute_metricscompute_metrics, ) # 7. 开始融合训练 trainer.train() trainer.save_model(./output/fusion_training/final) tokenizer.save_pretrained(./output/fusion_training/final) print(融合训练完成)6. 推理测试与效果验证训练完成后我们需要验证模型是否真的获得了泛化能力。测试集应包含训练中未出现过的技能组合或问题表述。# inference_and_eval.py from transformers import AutoTokenizer, AutoModelForCausalLM, pipeline from peft import PeftModel import torch # 1. 加载融合训练后的最终模型 model_path ./output/fusion_training/final tokenizer AutoTokenizer.from_pretrained(model_path, trust_remote_codeTrue) model AutoModelForCausalLM.from_pretrained( model_path, torch_dtypetorch.bfloat16, device_mapauto, trust_remote_codeTrue ) # 2. 构建推理管道 pipe pipeline( text-generation, modelmodel, tokenizertokenizer, device_mapauto, ) # 3. 定义测试问题泛化测试 test_questions [ # 类型1技能组合与训练时相同但数字和表述全新 { input: 求解方程2x² - 5x - 3 0。请使用因式分解法。, skills: [factor_polynomial, solve_quadratic_equation] }, # 类型2需要相同技能但问题形式变化如应用题 { input: 一个长方形的面积是12平方米长比宽多1米。求长方形的长和宽。设宽为x米。, skills: [setup_equation, solve_quadratic_equation] # 可能涉及列方程 }, # 类型3需要更多步骤的融合三个技能 { input: 化简表达式 (x² - 4) / (x - 2) 2x然后求解当该表达式等于5时x的值。, skills: [simplify_rational, solve_linear_equation] # 先化简有理式再解方程 }, ] # 4. 进行推理并评估 def generate_answer(question_text): messages [ {role: system, content: 你是一个专业的数学助手请分步骤推理并给出最终答案。}, {role: user, content: question_text} ] prompt tokenizer.apply_chat_template(messages, tokenizeFalse, add_generation_promptTrue) outputs pipe( prompt, max_new_tokens512, do_sampleTrue, temperature0.7, # 较低温度使输出更确定 top_p0.9, repetition_penalty1.1, eos_token_idtokenizer.eos_token_id, ) return outputs[0][generated_text][len(prompt):] # 只返回助手回复 print( 泛化能力测试 ) for i, test in enumerate(test_questions): print(f\n测试问题 {i1}: {test[input]}) print(f所需技能: {test[skills]}) answer generate_answer(test[input]) print(f模型回答:\n{answer}) print(- * 50) # 5. 可选定量评估 # 可以使用数学评测数据集如GSM8K的测试集计算准确率。 # 重点对比仅用原子技能训练的模型 vs. 经过融合训练的模型在需要多步推理的题目上的表现差异。如何判断成功步骤完整性模型是否将复杂问题分解成了合理的子步骤技能调用正确性在每个子步骤中模型是否应用了正确的数学规则如正确因式分解、正确使用求根公式结果准确性最终答案是否正确泛化性对于训练中未出现的数字组合或问题变体模型是否能正确解决7. 常见问题与排查思路在实施Fusion Training过程中你可能会遇到以下问题问题现象可能原因排查方式解决方案原子技能训练不收敛学习率过高/过低数据质量差噪声大或技能不纯批次大小不合适。查看训练损失曲线是否持续下降或震荡。检查数据样本确保每个样本只聚焦一个技能。调整学习率尝试1e-5到5e-4。清洗数据确保原子技能数据集的“纯净度”。尝试不同的优化器如AdamW。融合训练后模型表现反而下降灾难性遗忘融合训练覆盖或干扰了原子技能。融合数据太难或噪声大。在纯原子技能测试集上评估融合后的模型看原子技能是否丢失。检查融合数据中技能链的标注是否正确。采用更小的融合训练学习率。在融合训练数据中混合少量原子技能数据缓解遗忘。尝试Adapter Fusion或LoRA权重合并等更复杂的技术来保留原子技能。模型无法识别复杂问题所需的技能组合提示词设计未引导模型进行问题分解。融合数据中未显式或隐式标注技能序列。分析模型的错误输出看它是卡在哪一步。检查模型在推理时是否“看”到了足够的上下文信息。在推理提示词中加入分步思考的指令如“让我们一步步思考”。在融合数据构建时确保思维链CoT清晰展示了技能分解过程。考虑在输入中引入“技能规划”作为中间监督信号。训练过程显存溢出OOM模型太大批次大小过大序列长度过长。使用nvidia-smi监控显存使用。检查数据集中文本的最大长度。使用QLoRA、4-bit/8-bit量化。减小per_device_train_batch_size增加gradient_accumulation_steps。使用max_length截断过长的序列。启用梯度检查点gradient_checkpointingTrue。生成结果重复或无关推理参数如temperature, top_p设置不当。模型在训练中过拟合了某些模式。尝试不同的生成参数。检查训练数据中是否存在大量重复模式。调整temperature(0.1-0.9) 和top_p(0.8-0.95)。在训练数据中增加多样性。在推理时使用束搜索beam search并设置repetition_penalty。多技能问题中模型跳过中间步骤直接给答案训练数据中的思维链可能被模型“走捷径”学习或者奖励了最终答案而忽略了过程。检查模型输出是否缺少详细的推理步骤。确保训练数据中的思维链是详细且必要的。可以在训练目标中加强对中间步骤正确性的监督例如对每一步的输出计算损失。使用过程监督Process Supervision而非仅仅结果监督。8. 最佳实践与工程建议要让Fusion Training发挥最大效果以下实践建议值得参考原子技能定义要精准且正交技能划分的粒度是关键。太粗如“代数”则失去分治意义太细如“合并同类项中的系数相加”则增加不必要的复杂度。目标是找到一组可以组合成大部分目标问题的、相对独立的子任务。数据质量高于数据数量对于原子技能数据1000个高质量、多样化的样本远胜于10万个重复、模式单一的样本。确保每个原子技能数据集都能全面覆盖该技能的各种应用变体。融合数据的“难度斜坡”构建融合数据集时应从两技能组合开始逐步增加到三技能、四技能组合。形成一个平滑的难度曲线帮助模型逐步学习更复杂的规划。利用模型自身的推理能力在生成融合数据的思维链时可以先用一个强大的教师模型如GPT-4生成详细的步骤分解再经过人工校验。这能保证思维链的质量和多样性。持续评估与迭代建立三个评估集原子技能测试集监控基础能力是否保持。融合技能测试集seen评估对训练见过的技能组合的掌握程度。泛化测试集unseen包含全新的技能组合或问题形式这是检验Fusion Training成败的关键。考虑更高级的架构本文演示了简单的两阶段训练。对于更复杂的场景可以考虑技能感知的提示工程在输入中明确提示可能需要的技能。模块化网络为不同技能设计不同的轻量子网络Adapter在推理时动态组合。强化学习将技能选择和执行视为一个序列决策过程使用RL进行优化。生产环境部署经过Fusion Training的模型其泛化能力更强但可能在某些非常具体的任务上略逊于专门微调的模型。部署前需在真实业务场景中进行A/B测试权衡泛化能力与精准度。Fusion Training为我们提供了一种系统化的思路来破解LLM在数学等需要严谨推理领域的泛化难题。它不再寄希望于模型从海量数据中“顿悟”出组合规律而是通过课程学习的方式先掌握“词汇”原子技能再学习“语法”技能组合。这种思路不仅适用于数学对于代码生成、逻辑推理、多步骤规划等任务都有着广阔的借鉴意义。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价