标注组把最后一批路采视频归档的那天,算法工程师在群里问了一句:剩下的长尾场景怎么办。雨天逆光下的塑料路障、被压扁的纸箱、只露出半个车轮的侧翻车,这类样本在真实数据里可遇不可求,等它们自然出现,项目周期早就过去了。讨论最后落到一个方案上:用合成数据把缺口补一段。
缺的往往不是数量,是覆盖
把数据量翻一倍,长尾场景的占比并不会跟着翻倍。真实采集受限于路线、天气、时间,还有成本——专门复现某种光照条件的一次采集,从排期到标注,周期不短。更要紧的是标注本身:有些场景连人也要反复确认边界,标注一致性就成了变量。
从这个角度看,合成数据处理的不是「数据不够」,而是「想要的那类数据恰好没有」。它把采样的主动权交回给做数据的人:指定光照、遮挡比例、相机高度,按需生成。
生成方式不同,代价也不同
常见的路子有几条。用物理仿真或渲染引擎生成,参数可控,几何关系清楚,但真实感有差距;用生成模型扩样,观感更接近实拍,可控性却弱一些,还容易带上模型自身的偏好;还有一类是对已有真实样本做规则化扰动,裁剪、拼接、加噪,成本低,改动幅度也小。
- 渲染生成:可控性强,与真实的差距也摆得明白
- 生成模型扩样:观感接近,控制难度上升
- 规则扰动:成本低,改动幅度有限
怎么混,比生成多少更要紧
一种常见的误解是把合成数据当成替代品,以为把量堆上去就行。实际做法更接近配比:真实样本打底,生成样本补覆盖,再在纯真实数据构成的验证集上看效果。如果只在生成数据上评估,指标会很好看,但那只是自己考自己。
我倾向于把它当成「受控的补充」,而不是「廉价的扩容」。补充意味着你知道它补的是哪一类场景,也清楚这批数据在整体里的份额;扩容则容易变成往训练集里倒数据,短期看不出问题,迭代几轮之后才发现模型对某些真实细节变迟钝了。
边界:它会放大自己的偏见
用模型生成的数据再喂给模型,是绕不开的循环。生成器有自己的分布偏好,训练出来的模型会继承这些偏好,再拿去生成下一批数据,偏差可能被逐步放大,这也是被反复讨论的模型退化问题。它不意味着这条路走不通,而是提醒我们,合成链路里得留一个不参与训练的、来自真实世界的检查点。
另一处难点在评估。真实数据的分布会随季节、设备、场景更新而变化,生成数据的分布则取决于设定时的参数。两者之间的偏移很难量化,往往要靠上线后的表现来暴露。这时候,溯源地记录每一批数据的来源和参数,比事后补救有用得多。
回到开头那个问题:合成数据能补上哪一段。我的看法是,它补的是「我已经知道缺什么」的那一段。如果连缺口在哪儿都没搞清楚,生成得再多,也只是把不确定性往后推了一段。