一个做表面缺陷检测的团队卡在样本上。产线良率高,一个月也攒不出一批像样的坏品照片。于是有人提议:渲染一批“假缺陷”贴上去。模型在验证集上的成绩好看了一些,但上线头一周,漏掉的恰恰是车间里那种沾了油污、光照最差的情形。
这类故事是合成数据讨论的常见起点。它的本意不是凭空造样本,而是把人对场景的理解(几何、材质、光照、遮挡、噪声)写成可执行的生成规则,再从规则里采样。物理仿真和规则渲染是一路,生成模型采样是另一路,还有一路是把已有模型的输出改写扩增。前两路投入的是人的工夫,第三路消耗的是模型已有的偏好,代价不同,风险也不同。
缺的往往不是数量
“数据不够”这句话,十次里有七八次其实是在说“我还没想清楚边界条件在哪”。合成数据的好处之一是它要求团队先回答:缺陷长什么样、在什么条件下出现、和正常样本的差别落在像素的哪一层。如果答不上来,生成出来的东西就是随机噪声加了层外壳。
反过来,能把这些写清楚的场景,合成往往划算。参数可调、因果链条短、几何关系明确的任务,规则生成的可控性甚至高于真实采集;想要多少遮挡、多少反光,调参数就行。
模型吃自己做的饭会怎样
一个被反复提及的担忧是:如果每一代训练都大量依赖上一代模型的输出,数据分布会逐代收窄,尾部的稀有情形最先消失,最后模型对世界的描述越来越像自己。这个推论成立有几个前提:完全替代真实数据、没有外部参照、多代迭代累积。现实里只做一次性增广、并保留真实数据做校验的做法,性质并不相同。但“不容易察觉的疏忽”比“明显错误”更值得警惕:指标在合成验证集上稳步上升,而真实世界的偏差要等到上线才暴露。
怎么判断用在哪
- 生成过程与任务因果一致、参数化得出来的场景,可信度较高;
- 始终留一份真实数据不参与训练,只当参照用;
- 目标偏覆盖度而非精确分布时更合适,比如鲁棒性测试、回归测试集扩充;
- 涉及人的语义判断、微妙行为差异的任务,谨慎为上,合成很难覆盖那种细碎的不一致。
分寸感
实践中有几件事值得先做:给合成样本单独打标,记录来源和生成参数,别和真实数据混在一起;控制混合比例,先小规模验证再放大;把一部分合成数据专门留作压力测试,用来找模型的边界,而不是只用来提高分数。可追溯这件事看着费劲,出事时能减轻损失。
合成数据不是真实采集的替代品,它更像一份明写的假设清单。清单写得越具体,造出来的数据越有用;写不清楚的地方,生成器只会忠实地把盲区放大一遍。