Skip to content

数据与数据工程

本页速览 「模型是水的杯子,数据是水」——数据质量直接决定模型上限。本文覆盖数据管道、三类模态的增强方法、标注与主动学习、数据质量治理(去重/去偏/噪声)、数据泄露防线、分布式加载与数据版本管理。

数据与数据工程

一句话定义:数据工程是把"原始资料"变成"可训练数据"的全流程——采集、清洗、标注、校验、增强、加载与版本管理。深度学习界有一句广为流传的话:"Garbage in, garbage out"——模型的天花板由数据决定,算法只是逼近这个天花板的手段。这也是深度学习评估与实验里一切结论可信度的前提。

一、数据在 DL 中的首要地位

深度学习是"数据驱动的函数拟合"(见神经网络基础),数据决定了四件事:

  1. 可达成的上限:模型再好也学不到数据里没有的信息。
  2. 泛化的边界:数据的覆盖范围(分布)决定模型能泛化到哪(分布外见MLOps 与模型部署)。
  3. 问题是否可解:标注质量差,损失函数再优化也无济于事。
  4. 工程成本:数据管道往往占项目 50%–80% 的时间——这是所有工业项目的共识。

一条铁律:先看一眼数据,再动手建模型。数据可视化的直觉判断(类别分布、坏样本、标注错误)能省下大量盲目调参时间,也是调试与诊断的第一步。

二、数据管道:采集、清洗、标注、校验

一个完整的数据管道包含四个阶段:

  • 采集(Collect):来源包括公开数据集、日志、爬虫、传感器、用户反馈、合成数据。注意版权与隐私合规。
  • 清洗(Clean):去重、去无效样本(空值/损坏文件)、统一格式、修正明显错误。经典教训:图像数据集里混入"文字截图",模型学到的分类依据是"有没有文字"而不是内容。
  • 标注(Annotate):人工或自动给样本打标签。标注规范(annotation guideline)必须写清楚边界情况,否则标注员之间的标准漂移会变成模型噪声。
  • 校验(Validate):抽检标注质量(如 5% 样本双人标注算一致性)、统计分布(类别数、长度分布、异常值)、设置质量阈值(不达标的批次打回重标)。

每个环节都应可追溯——"这批数据是谁、什么时间、用什么规范产的",这在MLOps 与模型部署的实验复现里是硬要求。

三、图像/文本/音频增强

数据增强(data augmentation)在训练时在线制造变换样本,让模型学到不变性——它既是正则化(见过拟合与正则化),也是数据管线的一部分。

  • 图像:几何变换(翻转/旋转/裁剪/缩放)、颜色变换(亮度/对比度/色相)、噪声注入、模糊;高级方法 Mixup/CutMix(见过拟合与正则化);领域特有约束——医学影像不能随意翻转(左右对称但方向有解剖意义)、文档 OCR 不能旋转。
  • 文本:同义词替换、回译(机器翻译到另一语言再翻回来)、随机删除/交换、EDA;用语言模型生成同义改写是最新趋势。文本增强风险最高——改一个词可能反转语义("不"字),必须保语义校验。
  • 音频:时间/速度扰动、音量/音调变化、噪声叠加、SpecAugment(频谱图上时间/频率掩蔽)。语音任务规范见语音与音频章节。

增强的原则

增强要与任务的"不变性"对齐:增强本质是声明"这些变换不该改变语义"。声明错了,等于往训练集里注入错误标签。强度以验证集为准(深度学习评估与实验)。

四、标注策略与主动学习

标注是数据工程里最贵的一环,策略选择影响成本与质量:

  • 预算分配:先标"最难"的样本收益最大——这就是主动学习(active learning):训练一个初始模型,挑出它最不确定的样本(如预测熵最高、靠近决策边界)让人标注,循环迭代,用更少标注达到目标精度。
  • 预标注 + 人审:用已有模型生成伪标签(pseudo-labeling),人工只修正错误,成本可降一个量级。
  • 标注一致性:多人标注需定义明确的标注规范与分歧仲裁机制;计算标注一致性(如 Cohen's kappa)作为质量门禁。
  • 弱监督/程序化标注:用规则、启发式、远程监督自动打标(如"包含品牌名就标为品牌提及"),适合粗粒度任务,注意噪声率。

五、数据质量:去重、去偏、噪声

去重:训练集里重复/近似重复样本会放大其统计权重,导致模型偏向高频内容。大模型训练语料尤其要大规模去重(按句子 n-gram 相似度、嵌入相似度),否则生成内容明显偏向重复文本。细节见大语言模型(LLM)

去偏:数据里的统计偏差会被模型忠实地学进表征(见表征学习与预训练的偏见讨论)。去偏手段:保证各群体样本代表性、过采样/重加权、去除敏感属性的代理特征。评估与修正见可解释性与公平性

噪声:标签噪声(错标)比特征噪声更致命。对策:置信学习(confident learning)识别错标样本、标签平滑(见损失函数章节)增强对噪声的容忍、按样本难度加权。

六、数据泄露的类型与防线

**数据泄露(data leakage)**是"未来/外部信息渗入训练",是评估虚高的头号来源(见评估章节)。典型类型与防线:

类型例子防线
前处理泄漏在全体数据上拟合归一化统计量只在训练集拟合,再应用到验证/测试
时间泄漏用未来数据预测过去(金融)按时间顺序划分,禁随机切分
同源泄漏同一用户/场景的样本跨集按用户/会话/视频分组划分
重复泄漏去重前切集,重复样本跨集先全局去重再划分
人工泄漏特征含标注信息(如"是否已被治愈")特征溯源审计,特征字典管理

防线自查清单:划分顺序(先预处理再切?先切再预处理?)、分组维度(是否按实体切?)、时间维度(时序任务是否禁未来?)。

七、分布式数据加载:DataLoader、缓存、预取

数据加载是训练吞吐的隐性瓶颈——GPU 等着 CPU 供数就是纯浪费。要点:

  • DataLoader 参数num_workers(多进程读)、pin_memory(固定内存加快 GPU 拷贝)、prefetch_factor(预取)、persistent_workers(复用 worker)。
  • 缓存策略:数据小 → 全量缓存进内存(torch.utils.data 的 MemoryDataset 思路);数据大 → 预处理为高效格式(TFRecord、WebDataset、Safetensors),顺序读取 + 多进程并行解压。
  • 训练/推理吞吐核算GPU 算力 vs 数据 IO 是否匹配;监控 "GPU 利用率低 + CPU 满载"的典型症状。
  • 大规模:分布式训练里每个 rank 只读自己分片,用 torch.utils.data.distributed.DistributedSampler 保证全局不重复、shuffle 正确。

常见坑

跨进程共享随机种子不同步会导致"每个 worker 读到相同增强";固定总随机种子后要记得给每个 worker 派生不同种子。此类问题症状隐蔽,排查见调试与诊断

八、数据版本管理:DVC 与 HF Datasets

模型要可复现,数据就要有版本。两大工具:

  • DVC(Data Version Control):把数据文件的元数据放进 git(内容寻址),数据本体存远端(S3/MinIO/本地),dvc repro 追踪"数据版本 → 处理脚本 → 模型产物"的完整血缘。适合自建管道。
  • Hugging Face Datasetsload_dataset + 缓存 + Arrow 格式,内置数据卡(dataset card)与版本,是开源社区事实标准,也支持流式(streaming)处理超大语料。

数据版本管理与实验追踪(见 MLOps 章节)是配套的:一条完整记录应是"数据 v2.1 + 代码 commit + 超参数 + 种子 → 指标",缺一不可。

九、权衡与取舍

权衡与取舍

数据规模 vs 数据质量:更多噪声数据 vs 更少干净数据——没有绝对答案。通常"用更干净的小数据集把流程跑通,再按收益决定要不要扩量";数据质量问题的性价比远高于盲目加量。

在线增强 vs 离线增强:在线增强不占磁盘、每 epoch 变换不同、与训练并行;离线增强(预先生成)可复现、可审计但占存储、翻倍磁盘。大项目常"在线为主 + 关键变换离线备案"。

标注成本 vs 模型收益:每多标 1 万样本,精度提升多少?用学习曲线(见评估章节)在项目早期测算"数据回报递减点",避免在平台期砸钱。

全量预处理 vs 流式处理:全量预处理(一次转好格式)加载快,但改预处理逻辑要全量重跑;流式处理灵活、改起来便宜,但每 epoch 多花解压/变换时间。数据大到"存不下预处理结果"时只能流式。

数据工程没有炫目的算法,却决定了算法的上限。把数据管道的每一步做成"可复现、可审计、可版本化",深度学习项目就成功了一半。常用公开数据集的档案与选型见数据集与工具档案,从零搭一个小型数据管道的实践见实践栏目。

延伸阅读

参考资料