文章

04 使用来自不同分布的数据进行训练和测试(Training and testing on different distributions)

04 使用来自不同分布的数据进行训练和测试(Training and testing on different distributions)

04 使用来自不同分布的数据进行训练和测试(Training and testing on different distributions)

一、核心问题:训练集与开发/测试集分布不一致

在深度学习实践中,常常面临以下困境:

  • 目标分布(Target Distribution) :模型最终需要部署的真实场景数据(如用户手机上传的模糊照片、车载语音指令)。
  • 辅助数据(Auxiliary Data) :容易获取但分布不同的大规模数据(如网络爬取的高清猫图、通用语音识别语料)。

当目标分布的数据量有限(如仅 10,000 张),而辅助数据量巨大(如 200,000 张)时,是否应将两者混合使用?如何划分训练集、开发集和测试集?


二、错误做法:混合后随机划分(不推荐)

做法描述:

将所有数据(目标 + 辅助)合并为 210,000 张,然后随机划分为:

  • 训练集:205,000
  • 开发集:2,500
  • 测试集:2,500

问题分析:

由于辅助数据占比极高(约 95.2%),开发/测试集中绝大多数样本也来自辅助分布。

数学期望计算如下:

设总数据量 $N = 210{,}000$,其中:

  • 目标分布数据:$N_{\text{target}} = 10{,}000$
  • 辅助分布数据:$N_{\text{aux}} = 200{,}000$

则开发集中来自目标分布的期望数量为:

\[\mathbb{E}[n_{\text{target in dev}}] = 2500 \times \frac{10{,}000}{210{,}000} \approx 119\]

仅约 119 张 是真实关心的手机图片,其余 2381 张是网络高清图。

后果:

  • 开发集不再反映真实性能目标;
  • 团队优化方向偏离实际应用场景;
  • 强烈不推荐此方法

三、正确做法:开发/测试集严格来自目标分布

推荐策略:

  • 训练集:包含全部辅助数据 + 部分目标数据(如 200,000 网络图 + 5,000 手机图);
  • 开发集 & 测试集100% 来自目标分布(如各 2,500 张手机图)。

优点:

  • 开发集明确反映模型在真实场景下的表现;
  • 团队优化目标与产品需求一致;
  • 虽然训练集与开发集分布不同,但可通过后续技巧缓解(见下文)。

缺点:

  • 训练分布 ≠ 开发/测试分布 → 可能导致训练-评估不匹配(train-dev mismatch)
  • 长期来看,系统整体性能更优

四、另一案例:语音激活车载后视镜

场景描述:

  • 目标分布:用户对车载后视镜发出的语音指令(含大量街道地址、导航请求);
  • 辅助数据:已有的通用语音识别数据(如智能音箱、语音键盘等),共 500,000 段。

数据划分建议:

方案 A(保守):

  • 训练集:500,000(通用语音)
  • 开发集:10,000(车载语音)
  • 测试集:10,000(车载语音)

方案 B(更优):

若共有 20,000 段车载语音数据,可分配为:

  • 训练集:500,000(通用) + 10,000(车载)
  • 开发集:5,000(车载)
  • 测试集:5,000(车载)

关键原则:开发/测试集必须代表产品最终面对的真实用户输入


五、核心原则总结

原则说明
1. 开发集和测试集必须来自目标分布它们定义了你要优化的目标,必须反映真实使用场景。
2. 训练集可以包含辅助数据以扩大数据规模、提升泛化能力,即使分布不同。
3. 不要为了“同分布”而牺牲目标代表性随机混合会导致开发集失真,误导整个团队。
4. 分布不一致是可管理的后续可通过“偏差分析”、“领域自适应”、“重要性采样”等技术缓解。

六、后续待解决问题(预告)

虽然训练集与开发集分布不同是可行的,但仍需处理以下问题:

  • 如何诊断模型在目标分布上表现差的原因?
  • 欠拟合(训练误差高)?还是分布偏移(训练误差低但开发误差高)?
  • 是否需要对辅助数据加权?是否引入合成数据数据增强

这些将在后续课程中通过 “Bias-Variance 分析扩展到分布偏移场景” 加以解决。


七、关键公式回顾(KaTeX 兼容)

  1. 开发集中目标分布样本期望数量

    \[\mathbb{E}[n_{\text{target}}] = n_{\text{dev}} \cdot \frac{N_{\text{target}}}{N_{\text{total}}}\]
  2. 训练集构成(推荐)

    \[\mathcal{D}_{\text{train}} = \mathcal{D}_{\text{aux}} \cup \mathcal{D}_{\text{target}}^{\text{(subset)}}\] \[\mathcal{D}_{\text{dev}}, \mathcal{D}_{\text{test}} \subseteq \mathcal{D}_{\text{target}}\]

八、学习建议

  • 在实际项目中,优先保证开发/测试集的真实性
  • 若目标数据极少,可考虑主动学习(Active Learning)半监督学习
  • 使用多任务学习迁移学习来桥接辅助数据与目标分布之间的鸿沟。

结论

“宁可训练集与开发集分布不同,也不让开发集失去对真实场景的代表性。”

这是现代深度学习工程中的一个重要范式转变——数据划分服务于产品目标,而非统计便利性

本文由作者按照 CC BY 4.0 进行授权