ICML'25 | ASR 微调的数据配比,能不能不再靠人工网格搜索
ICML’25 | ASR 微调的数据配比,能不能不再靠人工网格搜索
涉及三篇工作: Monolingual Data Selection Analysis for English-Mandarin Hybrid Code-Switching Speech Recognition(Interspeech 2020) Data Mixing Optimization for Supervised Fine-Tuning of Large Language Models(ICML 2025) DataFlex: A Unified Framework for Data-Centric Dynamic Training of Large Language Models(arXiv 2026)
1. 前言
现在做 ASR 微调,手上的数据基本不会是单一来源:真实录音、TTS 合成、不同口音、不同领域(客服、医疗、会议)、甚至夹杂着 code-switching(中英混说)——这些数据源混在一起怎么配比,直接决定微调出来的模型在哪些场景好用、在哪些场景拉胯。多试几个配比对比一下效果,听起来是常规操作,但配比的自由度一旦超过两三个数据源,”多试几个”很快就变成没法穷举的组合爆炸,而且这一次训练调好的最优配比,换个数据规模、换个模型大小,很可能又不成立了。
这不是一个新问题。翻到 2020 年一篇 Interspeech 论文才发现,做中英 code-switching 语音识别的团队早就撞上了同一个坑,只是那时候的模型还是 HMM-DNN,不是现在的 SpeechLLM。有意思的是,那篇论文解决这个问题的办法,就是把每个候选配比都真的跑一遍、画曲线看拐点——这基本等于人工做了一遍网格搜索。六年后的今天,这件事已经有了更系统的解法:ICML’25 有一篇论文专门把”数据配比”定义成一个可以求解的优化问题,不用穷举网格就能拿到接近最优的配比;同时 LLaMA-Factory 团队今年也放出了一套叫 DataFlex 的训练框架,把”动态选数据、动态调配比、动态调样本权重”这三件事统一成了可插拔的组件。
这篇想把这三样东西串起来看:先看那个六年前的坑到底长什么样,再看现在的方法论怎么把”跑网格”变成”解方程”,最后看看这套思路要落到 ASR 微调上,还缺什么、要注意什么。
2. 六年前的一篇 Interspeech 论文,把这个坑踩了个底
这篇 2020 年的工作是给一场中英 code-switching 语音识别比赛做的系统。比赛方给了三份数据:200 小时中英混说数据(记作 CS200)、500 小时纯中文数据(Man500,其中约 15 小时其实也带 code-switching,记作 CS15)、960 小时英文 LibriSpeech(Libri)。选手可以自由组合这三份数据去训练一个 HMM-DNN 混合系统。
直觉上,数据越多越好,那就把三份数据全部堆进去。作者试了才发现不对:

MER(Meta-data Error Rate)是这篇论文自定义的一个混合错误率——中文部分按字错率算、英文部分按词错率算,混在一起报一个数,数值越低越好。表里四行都是在 CS200 基础上分别再加一种数据、各自单独训一个模型对比:加上同分布的 CS15 之后几乎全面变好(eval 7.08→6.87);换成加 Man500(纯中文)效果更好,eval 降到 6.63;但换成加 Libri(纯英文),结果反而比什么都不加的基线还差,eval 涨到 7.50。同样是”往 CS200 里加数据”,中文数据加了更好,英文数据加了更差——光看这一张表,已经能确认”数据越多越好”在这里是不成立的。
问题就变成了:中文数据和英文数据分别应该配多少。作者的做法是固定 CS200,把 Man500 从 10 小时开始每次多加一点,一路加到 500 小时,每加一次都重新训一遍模型、测一遍三个测试集:

这四张子图分别是整体 MER、中文部分 CER、英文部分 WER、以及 eval 集上和不加中文数据相比的对照。中文数据加得越多,中文部分的识别效果越好(子图 b 一路走低),英文部分基本没受影响(子图 c 几乎是平的)——但整体效果(子图 d)在大约 400 小时处见底,过了这个点继续加数据,eval MER 反而开始回升。换句话说,”中文数据”这个维度上存在一个具体的最优点,不是越多越好,多出来的那部分反而在拖后腿。同一套流程换到英文数据上,作者发现情况更糟:无论 LibriSpeech 加多少,各个词数分组的识别效果都在变差,不存在一个”加到某个点就够了”的甜蜜区,而是持续负收益——

这四张子图是按句子里含 1、2、3、4+ 个英文词分组之后,各自随英文数据量变化的 MER 曲线,可以看到不管哪一组,曲线基本都是往上走的。作者把这归因于数据不匹配:LibriSpeech 是美式英语朗读语料,跟中国大陆说话人夹在中文里说的英文单词,口音和说话方式完全是两回事,”英文数据”这四个字底下其实盖着一个分布差异很大的子问题,加了不但没用,反而把模型往错误的方向拉。
这篇论文自己给出的结论是三句话:数据匹配比数据量更重要;存在一个配比的平衡点,过了会伤性能;不同的 code-switching 模式(句子里到底混了几个外语词)对配比的敏感度还不一样。这三句话放到 2026 年的 ASR 微调场景里,一个字都不用改。差别只在于,六年前找这个平衡点的办法是老老实实地跑一条配比扫描曲线——每加一档数据就重训一次、测一次——这在算力紧张、模型只有 HMM-DNN 规模的年代还能忍,换到今天动辄要微调一个数十亿参数的 SpeechLLM,同样的”扫一遍再看拐点”就顶不住了。
3. 换个思路:把数据配比当成一个可以求解的优化问题
ICML 2025 的这篇工作瞄准的正是这件事,只不过场景是文本 LLM 的 SFT(supervised fine-tuning,即指令微调阶段),不是 ASR。它的出发点很直接:给定 $K$ 个数据域(论文里是 IF 通用指令、数学、代码三个域)和一个总的数据预算 $N_0$,要找一个配比向量 $w=(w_1,\dots,w_K)$(每个 $w_i\ge0$,加起来等于 1),使得训完之后模型在各个验证集上的总损失最小。这本身没有闭式解,直接按网格枚举 $w$ 再逐个训练验证,就是上一节那种”扫一遍看拐点”的做法——只是维度从 1 维(中文数据量)变成了 $K-1$ 维单纯形,枚举成本指数级增长。
论文绕开枚举的办法,是先给每个域的验证损失建一个可以外推的函数,再对这个函数求最优解,而不是对真实训练过程求最优解。具体分两步走:
| 第一步借用了”有效迁移数据量”(effective data from transfer)的概念:域 $i$ 的表现,不只取决于域 $i$ 自己有多少数据 $N_i$,其他域的数据 $ | D_{\setminus i} | $ 也会通过跨域迁移间接帮到域 $i$,这部分贡献换算成”相当于多少域 $i$ 自己的数据”,记作 $ | D_i^T | = k_i \cdot | D_{\setminus i} | ^{\alpha_i}$。第二步套用了微调阶段的 scaling law:损失随数据量近似服从幂律 $L(D) \approx C \cdot | D | ^{-\beta} + E$,$E$ 是不可约损失。把两者拼起来,域 $i$ 的验证损失就被参数化成: |
每个域有 5 个待拟合参数 ${C_i, k_i, \alpha_i, \beta_i, E_i}$。拟合这 5 个参数不需要跑真正预算规模的训练——论文的做法是每个域只用一个很小的样本量 $n$(实验里是 66 万 token),固定其他域数据不变,把当前域的数据量按 4 个扰动比例(1/3、1/2、2、3 倍)分别训一个小模型、测一次损失,5 个点(含原始比例)拟合 5 个参数,用 Trust Region 方法配 Huber loss 求解。完整流程写成了 Algorithm 1:

拟合完参数之后,第二步才是真正的优化:把 $\tilde{L}_i$ 代入目标函数,对真实的数据预算 $N_0$ 求解
\[\min_{w}\ \sum_{i=1}^K \Big[C_i\big(w_iN_0+k_i(N_0-w_iN_0)^{\alpha_i}\big)^{-\beta_i}+E_i\Big]\quad \text{s.t. } 0\le w_i\le1,\ \sum_i w_i=1\]这是一个可以证明是凸函数、但没有闭式解的约束优化问题,论文用 SLSQP(一种支持等式和不等式约束的梯度法)求解,一次求解只需要几秒钟,不需要额外训练任何模型。也就是说,真正花训练成本的只有”拟合参数”这一步——3 个域、4 个扰动比例,一共只需要 12 次小规模训练加上 1 次初始训练,合计 13 次;求最优配比这一步是纯数值优化,而且这一套参数可以直接套用到任意目标预算 $N_0$ 上,不需要为每个预算重新拟合。论文图里画的就是同一套参数在 $N_0$ 从几百万到 5 亿 token 之间求出的最优权重曲线:

三条线分别是指令、数学、代码三个域的权重随预算变化的走势——注意权重并不是持续单调地涨或跌,而是很快趋于一个平台。论文管这个现象叫”没有域被落下”(no domains left behind):因为幂律本身自带边际收益递减,一个域数据加得越多,它自己的偏导数越小,自然就不会无限制地挤占其他域的份额,这也是这套方法在数学上被证明”不会让某个域彻底吃亏”的原因。
效果怎么样,论文拿网格搜索的结果直接对比。在 21 组网格搜索配比(网格取 ${0.125,0.25,\dots,0.75}^3$ 里加和等于 1 的组合)里挑出效果最好的那组,跟自己方法求出的配比训出来的模型比困惑度(PPL,语言模型下一词预测的不确定度,越低越好):

四个不同规模的模型(Qwen2.5-0.5B/1.5B、Llama3.2-3B、Llama3.1-8B),黄色柱子(本方法)和深蓝柱子(网格搜索最优)几乎贴在一起,平均只高 0.66%。换句话说,13 次小规模训练 + 一次数值求解,换来了跟 21 组网格搜索几乎打平的效果——网格搜索本身还只是三个域、四种模型规模里的一个切片,真要覆盖更多域或者更细的网格,枚举成本会继续爬。这正是上一节里 code-switching 论文没有的东西:不用真的把每个候选配比都训一遍,就能定位到平衡点附近。
4. 光有公式不够,还得有地方能插进去跑
上面这套方法要落地,还差一层工程基础设施:怎么把”拟合参数、求解权重、按权重重新混数据”这套流程,接进一次真实的训练里,而不是每次都手写脚本现改现跑。DataFlex 这份技术报告解决的正是这一层。
它的定位是 LLaMA-Factory(目前最常用的开源 LLM 微调框架之一)的一个训练层替换插件,把”数据”从一份训练开始前就定好的静态文件,变成训练过程中可以被观察、被调整的一等变量。它把数据驱动的动态训练归纳成三种范式:动态选样本(哪些样本该被训练,比如按梯度相似度挑高价值样本)、动态调配比(不同数据源该占多少比例,比如上一节的场景)、动态调权重(每个样本对梯度更新的贡献强度该乘多大的系数)。对应到系统设计上,就是三种 Trainer 抽象:

最底下的 Base Layer 直接继承自 LLaMA-Factory,负责模型管理、数据处理、优化器这些通用能力,不重新发明轮子;中间的 Trainer Layer 是三个可以互相替换 LLaMA-Factory 原生 Trainer 的抽象——Select Trainer、Mix Trainer、Weight Trainer;最上面的 Component Layer 才是具体算法,每种 Trainer 配一组可插拔的组件:Select Trainer 配 Selector(比如 LESS、NICE、Loss-based 方法),Mix Trainer 配 Mixer(比如 DoReMi、ODM),Weight Trainer 配 Weighter。新算法只要按接口实现成一个组件、用装饰器注册进去,就能被对应的 Trainer 在训练时自动调用,不用改训练主循环的代码。
目前已经接进去的方法,论文列了一张表:

数据选择这一栏有 7 种方法,按打分方式分成基于梯度(LESS、NICE)、基于损失(Loss、Delta Loss)、基于分布(NEAR、TSDS)三类;数据配比这一栏是 DoReMi(离线:先用小模型算出每个域相对参考模型的”超额损失”,再据此更新配比,最后把配比定死去训真正的目标模型)和 ODM(在线:训练过程中用多臂老虎机算法根据实时 batch loss 动态调整配比,不需要额外的参考模型);数据重加权这一栏是基于损失的样本级加权。切换到某种动态训练范式,配置文件里只需要多加几行:
### dataflex
train_type: dynamic_mix
component_name: doremi
init_mixture_proportions: [0.5, 0.5]
warmup_step: 100
update_step: 200
update_times: 3
train_type 选范式,component_name 选具体算法,剩下几个字段控制什么时候开始更新、每隔多少步更新一次、总共更新几次——除了这一小段,模型、数据集、学习率这些字段和原生 LLaMA-Factory 的配置文件完全一样。DataFlex 自己在 SlimPajama(英文预训练语料)上验证了 DoReMi 和 ODM:6B token 规模下,两种动态配比方法的 MMLU 准确率都超过了默认配比的静态基线(ODM 26.04%、DoReMi 25.84%,基线 25.27%),整体困惑度上 DoReMi 最低(4.134)。但拆到七个子域去看,没有一种方法通吃:DoReMi 在数据量最大的两个域 CommonCrawl、C4 上最低,ODM 在 StackExchange、ArXiv 上最低,反而是什么都没调的默认配比在 Wikipedia、GitHub 这两个相对小的域上意外地更低——这和第 2 节里”配比效果在不同子群体上并不一致”是同一个现象,只是这里的”子群体”换成了文本域,而且 DataFlex 跑的是真实的预训练规模训练,不是第 3 节那种小规模拟合。
DoReMi、ODM 都是给预训练场景设计的方法,论文里也提到 SFT 阶段的数据配比”remains under-explored”(还没被充分研究)——这恰好是第 3 节那篇 ICML 论文补的空。DataFlex 的 Mixer 接口本身是通用的:只要按同样的接口实现一个新组件,理论上可以把第 3 节这套”小规模扰动实验拟合参数、SLSQP 求解权重”的流程也注册成一个 Mixer,接进 Mix Trainer 里跑——但目前论文列出来的两种方法都不是这个思路,这是一个现成但还没被填的位置。
5. 落到 ASR 微调上,这套思路要怎么搬
把前面三节拼起来看,会发现一件挺清楚的事:第 2 节的问题在 ASR 领域一直存在,第 3 节的方法论是文本 LLM 那边刚补上的解法,第 4 节的基础设施也刚刚成型——三块拼图基本都齐了,但没有一块是直接为 ASR 微调准备的。要真的搬过来用,至少有三个地方需要落地:
配比的”域”要重新定义。 li25bh 里的域是 IF/数学/代码,DataFlex 的 Mixer 也是照着文本预训练的域设计的;ASR 微调场景下,第 2 节那篇论文已经给出了具体的坐标:语言/方言、口音、领域(客服/医疗/会议)、真实录音 vs TTS 合成、甚至像 code-switching 这种”句子内部混合模式”本身都可以是一个独立的轴——第 2 节里”英文词数越多,加英文数据的效果越不一样”这个发现,说明域的划分粒度可能要比”哪个数据集来的”更细,切到”某种说话模式”这一层。
验证损失要换成能反映子群体差异的指标。 li25bh 用的是 token 级困惑度,一个数就能代表一个域;ASR 场景下更自然的是 WER/CER,但第 2 节那组按句子里外语词数分组的曲线已经说明,同一个数据源在不同子群体上的收益可能完全不同方向——如果只看整体 WER 去拟合 scaling law,很可能把”对某个子群体是负收益”这个信号平均掉。这意味着搬这套方法过来,第一步得先老老实实按第 2 节的方式,切分出几个关心的子群体分别算验证指标,再决定要不要把子群体也当成域来分别建模。
扰动实验的成本结构不一样,可能反而更划算。 li25bh 需要真的训一个模型(哪怕是小规模)才能拿到一个验证损失点,这也是它要控制在 13 次小规模训练的原因;ASR 微调如果用的是在预训练 SpeechLLM 上做 LoRA 这类轻量微调,一次”扰动实验”的成本本来就远低于从零训练,13 次量级的小规模微调加验证,在预算上可能比文本 LLM 场景更容易接受,不需要像 DoReMi 那样专门引入一个更小的代理模型来降成本。
先验证 scaling law 是否成立,再信配比公式。 第 3 节整套优化建立在”损失(或者错误率)随数据量呈幂律衰减”这个假设上,这个假设在文本 PPL 上有实证支持,但 WER/CER 是否也服从同样的幂律形状——尤其是像第 2 节里”过了平衡点反而变差”这种非单调现象——目前没有证据说明能被这套单调递减的幂律公式直接套用。比较扎实的做法是先把 Algorithm 1 里的扰动实验单独跑一遍,把拟合出来的曲线和真实测出来的点画在一起看看像不像幂律,而不是直接假设它成立就去解优化问题。
综合起来,一个可以落地的路径大概是:借 DataFlex 的 Mix Trainer 抽象接口,把”小规模扰动微调 → 按子群体拟合每个域的 scaling law 参数 → SLSQP 求解配比”这套流程实现成一个新的 Mixer 组件,先在几个候选域和几个关心的子群体(比如按语言、按口音、按是否 code-switching)上跑一遍验证曲线,确认幂律假设站得住,再把这个 Mixer 接进真正的微调流程——这条路径目前看下来是缺人去做,不是缺积木。
6. 结论
数据配比不是一个新问题,2020 年做 HMM-DNN 的团队已经用最笨的方式——把每个候选配比都跑一遍、画曲线找拐点——证明了”数据不是越多越好”这件事,也顺手发现了配比效果在不同子群体上并不一致。六年后,文本 LLM 那边把这件事系统化成了一个可以用小规模扰动实验加数值优化求解的问题,效果接近网格搜索、成本却低了一个量级;同时期的训练框架也把”动态选数据、动态调配比、动态调权重”统一成了可插拔组件。这三块东西现在都摆在桌面上了,缺的是把它们按 ASR 微调的实际情况——重新定义域、按子群体验证、先验证幂律假设再信公式——拼到一起跑一遍。这也是接下来我想动手试的方向。
顺带说一句,这篇聊的数据配比优化,本质上和 AutoML 里”用搜索/优化代替人工调参”是同一套方法论,只是这次的搜索空间是数据配比而不是网络结构或超参数。《动手学 AutoML:从 NAS 到大语言模型优化实战》里专门有一章讲数据增强和代理数据集搜索,思路上和这篇的”小规模代理实验 + 外推到真实预算”是相通的,感兴趣可以翻一下。
