Synthetic Data
合成数据由模拟、规则或生成模型产生,而非通过测量获得,可为 AI 训练提供精确标签和保护隐私的数据记录。
合成数据是通过模拟、规则集或生成式 AI模型生成的信息,而不是从真实事件中测量得出的;其设计目的是复现所代表的真实数据的统计模式。渲染出的街景、各列之间的相关性与真实记录相似的虚构患者数据表,以及由语言模型编写的数学练习,都属于合成数据。由于生成器会创建每个样本,它也知道每个样本的答案,因此渲染图像无需任何标注成本,就能附带精确的边界框、分割掩码和深度值。合成数据生成是生成这类数据的过程,方式从游戏引擎渲染到扩散模型不等。
合成数据的类型#
统计学家 Donald Rubin 于 1993 年提出了完全合成数据,以便人口普查机构在不公开任何真实受访者答案的情况下发布详细记录;如今,该领域仍区分以下三种类型:
- 完全合成数据:每条记录或每张图像都由生成器创建,例如从 3D 场景渲染的数据集,或从基于真实记录拟合的模型中抽样得到的数据表。
- 部分合成数据:只替换敏感字段,例如用合成收入替换调查文件中的收入,而每条记录的其余部分都是真实数据。
- 混合数据集:真实样本和合成样本共用一个训练集,而验证集和测试集保持真实,以便评估指标反映真实世界的准确率。
合成数据涵盖所有模态:模拟器生成的图像和视频、LiDAR 和雷达流、表格记录、时间序列,以及由大型语言模型编写的文本。
使用合成数据的原因#
合成数据可以弥补真实数据采集无法填补的空缺。碰撞、罕见缺陷和极端天气要么过于危险,要么过于少见,无法大量采集,因此模拟器可以按需生成这些场景,用于汽车感知和机器人。从未属于任何真实个人的记录可以降低患者或客户信息泄露风险,这对医疗和金融领域的数据隐私规则尤为重要。生成器还可以增加代表性不足的类别、肤色或视角的样本,帮助减少数据集偏差。Microsoft 研究人员证明,在某些任务中,合成数据可以完全取代真实图像:他们在 ICCV 2021 论文《先造假,再实现》中,仅使用渲染的人脸训练人脸关键点定位和人脸解析模型,达到了与使用真实照片训练相当的准确率。
稠密几何是使用合成数据的另一个常见原因。Ultralytics YOLO26 深度估计模型基于约 219 万张图像的混合数据集预训练,其中包括三个合成数据源:Apple 使用光线追踪生成的室内场景Hypersim、TartanAir中的 AirSim 环境,以及在Virtual KITTI 2中针对不同天气和光照重新渲染的 KITTI 驾驶场景。每个数据源都为每个像素提供深度值,而同一混合数据集中真实 KITTI LiDAR 扫描只覆盖零散的点。
评估合成数据质量#
合成数据集通常从三个方面评估。保真度衡量数据与真实分布的接近程度,从表格中的列均值和相关性,到衡量图像真实性的弗雷歇 Inception 距离(FID)等分数。效用衡量使用合成数据训练的模型在真实数据上的表现,通常通过在合成数据上训练、在真实数据上测试(TSTR)来评估。隐私衡量真实记录是否泄露,可以使用与最近真实记录之间的距离、成员推断攻击,或针对生成器的正式差分隐私保证来评估。
下面的 TSTR 检查会为真实医疗数据表的每个类别拟合一个高斯分布,并分别使用真实行和合成行训练同一个分类器:
import numpy as np
from sklearn.datasets import load_breast_cancer
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
from sklearn.pipeline import make_pipeline
from sklearn.preprocessing import StandardScaler
# Real breast tumor measurements, split into training rows and a held-out real test set
X, y = load_breast_cancer(return_X_y=True)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=0)
# Fully synthetic training set: 500 rows per class sampled from a Gaussian fit to that class's real rows
rng = np.random.default_rng(0)
classes = [X_train[y_train == c] for c in (0, 1)]
X_syn = np.vstack([rng.multivariate_normal(rows.mean(0), np.cov(rows.T), 500) for rows in classes])
y_syn = np.repeat([0, 1], 500)
# Train the same classifier on real or on synthetic rows, then test both on the same real rows
for name, (X_fit, y_fit) in {"real": (X_train, y_train), "synthetic": (X_syn, y_syn)}.items():
model = make_pipeline(StandardScaler(), LogisticRegression(max_iter=1000)).fit(X_fit, y_fit)
print(f"trained on {name} data: {model.score(X_test, y_test):.1%} accuracy on real test data")使用真实数据行训练的模型得分为 97.7%,使用 1,000 条合成数据行训练的模型得分为 95.9%。1.8 个百分点的差距衡量了简单高斯生成器未能捕捉到的信息,而且没有任何合成数据行是对真实患者记录的复制。
风险与局限#
模型可能学到渲染器的捷径特征,例如完美的边缘或重复纹理,进而无法处理真实图像。可以通过领域随机化、混入真实数据,或使用少量真实数据进行微调,来缩小这种仿真到现实的差距。生成器还会继承训练数据中的盲点,因此除非明确指定,否则它很少会生成最初促使人们使用合成数据的长尾案例。反复使用生成模型自身的输出进行训练会导致模型崩溃;Shumailov 及其同事在2024 年发表于 Nature 的论文中表明,原始分布中罕见的长尾案例会最先消失。










