想象你走进一家餐厅。自助餐厅的台面上,今天有什么菜取决于大师傅的心情,你端着盘子绕一圈,想吃的鱼香肉丝恰好没做,也只能将就。另一家私房菜馆则完全不同:你坐下点单——“鱼香肉丝,微辣,不要香菜,少油。”后厨的主厨看一眼订单,就能端出一盘分毫不差的菜。条件表格生成,做的就是让 AI 学会“按订单做菜”。表里的每一行是一道菜,每一列是一种属性:年龄、城市、消费金额,就像菜品的口味、分量、价格。“条件”就是订单上的那几行字——“我要 25 到 35 岁、住在北京、月收入两万以上的用户。”模型要学的,不是把全天下的菜都做一遍,而是读懂订单、精准出菜。这篇文章,就带你走进这位 AI 主厨的后厨,看看订单怎么传、菜怎么炒、怎么试菜,以及怎么守住食客的隐私。
条件表格生成是合成数据领域的“精准制导”能力。掌握它,你就能按业务规则随时产出合规的测试数据与增强数据,显著降低数据获取与标注成本,是数据工程师与算法工程师的实用硬技能。
可视化演示
动态演示想要什么数据就生成什么的核心机制,通过开始/执行/监控/完成四种模式展示关键概念与交互流程。
本节配有交互动效(进入视口后自动加载,约 3KB)。
想要什么数据就生成什么:条件表格 条件表格生成的工程动机与核心问 条件生成模型的架构设计 核心机制可视化 想要什么数据就生成什么整体架构与关键组件
条件生成入门
自助餐的台面上永远只有那几十道菜,大师傅今天做什么,你只能吃什么。可如果你走进一家能点菜的馆子,一切就不同了:“要一份鱼香肉丝,微辣、不要香菜”——订单上的每个字,后厨都会认真对待。随机表格生成就像自助餐,模型把“看起来像数据”的数据大批量端出来;条件表格生成则像点菜,你可以在下单时写明要求,出来的数据必须满足这些要求。
在数据世界里,“要求”被叫作条件(condition)。最常见的条件是列上的约束:年龄在 25 到 35 之间、城市等于北京、活跃标记为 1。可以是单列,也可以是跨若干列的复杂组合。无条件生成模型只学到数据集的整体面貌,就像一个只记得“大众口味”的厨师;条件生成模型则要把“订单”作为输入,额外学习“在某个子集里,数据长什么样”。
形式化地说,条件表格生成的目标是建模条件分布 p_θ(x|c):给定条件 c,采样出表格行 x。模型先要把条件 c 编码成向量(订单翻译成后厨能懂的语言),再在生成过程中始终绑定这个向量,确保产出的每一行都落在条件空间里。训练数据来自真实表中满足该条件的子集,模型的任务就是把这个子集的分布学得像。
点菜式生成的妙处在于“要什么给什么”。你用不着在十万行随机数据里大海捞针,而是直接把订单递给模型,它端出来的每一盘,都忠实回应你写下的每一个字。从风控测试数据到用户画像增强,这套“按单出菜”的能力已经在真实业务里站稳了脚跟。
- 合成样本这一步产出最终表格的一行记录,即“端上桌的菜”。
- 条件变量c 表示业务条件,例如“年龄 25~35、城市=北京”,对应订单上的备注。
- 条件分布竖线表示“给定 c”,模型只在满足条件的数据区域采样,而不是全空间随机。
模型架构设计
一家餐厅的后厨,通常有三个关键角色:负责读单的传菜员、掌勺的主厨、以及把关口味的试菜员。条件生成模型的核心架构,就是这三个角色的化身——条件编码器把订单翻译成机器能懂的向量;生成器拿着条件向量做出候选样本;判别器则一边看着订单,一边品尝样本,判断“这盘菜对不对得上这张单”。
这套架构最常见的形态是条件生成对抗网络(conditional GAN)。普通的 GAN 里,生成器只用随机噪声 z 凭空发挥;条件 GAN 把条件向量 c 拼在噪声后面,写成 [z; c],生成器必须照着条件做菜。判别器也升级了:它不再只看“像不像真实数据”,而是同时接收样本 x 和条件 c,判断“在条件 c 下,这个样本像不像真的”。这样一来,光像不行,还得“对得上单”。
训练过程是一个最小最大博弈:判别器拼命识破生成器端上来的假菜,生成器拼命做出让判别器认不出的菜。两个网络在对抗中共同进步,最终生成器学会在条件约束下还原真实子集的分布。条件向量可以拼接进输入,也可以用特征调制的方式注入网络中间层,后者在高维条件下更稳定。
主厨和试菜员互相较劲,菜越做越地道。判别器手里始终攥着那张订单,生成器便不敢端出“菜单上没有的菜”——这就是条件 GAN 比普通 GAN 更“讲规矩”的原因。
- 最小最大博弈min_G max_D 表示生成器想最小化、判别器想最大化同一个目标,两者交替训练。
- 真实样本评分D(x,c) 输出“样本 x 在条件 c 下有多真”,对真实数据希望输出接近 1。
- 合成样本评分G(z,c) 是生成样本,希望判别器输出接近 0(能识破),取 log(1−D) 让生成器有明确的改进梯度。
- 期望运算E 表示对所有真实样本和所有噪声求平均,训练就是在这些平均损失上做梯度更新。
属性条件控制
常去同一家馆子的老客人会知道,主厨对“辣度、咸度、锅气”有近乎执念的把控。表格数据的“口味维度”就是每一列:类别列像是菜系(川、粤、鲁),数值列像是辣度指数(1 到 5 分)。属性条件控制要做的,就是让模型对这些维度“指哪打哪”:你说要微辣,它就不会端出重辣。
类别条件实现起来直观:把“北京”“上海”这样的取值做成独热编码,或者更进一步,训练一个嵌入向量来表示每个类别,像给每种食材贴上标签。难点在数值列——“收入在两万以上”没法像枚举类别一样穷举,任何边界值都可能出现。CTGAN 提出了模式特定归一化:先对每个数值列拟合一个高斯混合模型,把连续数值映射到某个“模式”上,生成时随机选一个模式再取值。
还有一个隐蔽但致命的坑叫“条件稀疏”:真实数据里“蓝莓炒苦瓜”这种冷门组合可能只有几十行,模型练都练不到。CTGAN 的 training-by-sampling 在每个训练批次里,并不是随机选类,而是按类别出现频率的反比来采样条件——冷门类别反而更容易被选为训练条件,逼着生成器把它们也学会。
客人越多越杂,厨师越要记得给冷门菜品留一席之地。training-by-sampling 保证哪怕“蓝莓炒苦瓜”只有一个人点过,大厨也练过这道菜,下次有人下单时不会手忙脚乱。
- 选择概率P(c_j) 表示训练时选中类别 j 作为本轮条件标签的概率。
- 频率倒数的对数1/p_j 让稀有类别权重更大,log 压缩差距,避免热门类别完全霸占训练。
- 归一化分母把所有类别的权重求和,保证所有 P(c_j) 加起来等于 1。
隐私保护兼容
一位讲究的私房菜主厨,每天接待上百位客人,却能准确地记住“熟客 A 爱吃微辣、客人 B 忌花生”——但他不会去记客人的身份证号。条件生成模型的理想状态正是如此:记住群体的统计规律,而不是背下某一行个体数据。
为什么强调这一点?因为条件生成往往用于替代敏感数据做共享和建模。如果模型过拟合,它可能像“背菜单”一样把原始行原样复述出来,等于变相泄露隐私。差分隐私(Differential Privacy)给这个问题提供了数学上的安全垫:在训练过程中注入经过校准的随机噪声,使得任何一条记录的加入或删除,都不会让模型输出发生可察觉的变化。
差分隐私用相邻数据集来定义:两个只差一条记录的数据集 D 和 D',算法在其上的输出分布必须足够接近。ε 是隐私预算,越小表示保护越强;δ 是允许的极小失效概率。工程上常用 DP-SGD:对梯度做裁剪后加高斯噪声,再按预算累计。条件生成与差分隐私可以兼容——在条件统计和梯度两个层面都加噪,模型学到的是“满足条件的群体画像”,而非任何一张具体面孔。注意,条件组合过细时(如“1990-01-01 出生的北京男性”)仍有单行命中风险,需要在发布前评估脱敏边界。
厨师只记住“多数人喜欢微辣”这类群体印象,才能放心把菜谱分享给别家店。条件生成同样通过差分隐私,让共享出去的模型“记群体、不记个体”,既保留了业务价值,又守住了食客的隐私。
- 随机机制M(D) 表示训练算法在数据集 D 上输出的结果(训练好的模型)。
- 相邻数据集D' 是与 D 只差一条记录的“邻居”,两边输出分布应几乎不可区分。
- 概率比上界e^ε 是两条相邻数据集输出落在同一集合 S 的概率比上限,ε 越小越难判断某条记录是否存在。
- 松弛项δ 允许极小的失效概率,工程上通常取 δ 远小于 1/|D|。
质量验证方法
一道菜能不能上桌,要看三道关卡:后厨先自己尝一口(分布是否正常),称一下分量(是否符合订单),再请熟客试吃(业务上是否过关)。条件生成的数据也一样,必须经过一套“试菜流程”,才能放心交付给业务方。
第一关是业务约束校验:把条件写成断言,逐行检查生成数据是否满足——年龄在区间内吗?城市对吗?这相当于称分量,直接回答“订单有没有被遵守”。第二关是分布相似度:用 KL 散度或 JS 散度比较每一列的真实分布与合成分布,数值越接近 0,说明模型把子集学得越像。第三关是列间关联:对比相关系数矩阵、类别列联表,防止模型“单列像、整表不像”。此外,PCA 或 t-SNE 可视化把真实与合成样本投影到二维平面,肉眼观察重叠程度,是诊断分布差异的直观手段。
最硬核的验收是下游任务评估,业内叫 TSTR(Train on Synthetic, Test on Real):用合成数据训练一个预测模型,再到真实数据上测试。如果合成数据保留了足够信号,模型表现应该接近在真实数据上训练的水平。这好比请最挑剔的熟客盲测——菜做得好不好,不看你自夸,看食客买不买账。
试菜员说“咸了”,主厨立刻回锅。TSTR 就是最挑剔的熟客,用真实业务结果检验合成菜的成色——条件生成能不能上生产,这关过了才算数。
- 真实分布P_real(i) 是真实数据落在第 i 个取值桶里的概率(归一化直方图)。
- 偏差比值取对数log(P_real/P_syn) 衡量每个桶上真实与合成的偏离,偏离越大贡献越大。
- 加权求和按真实概率加权求和得到整体距离,合成分布对高频区域失真的惩罚更重。
场景应用实战
连锁餐厅最头疼的事,是每个门店的客人口味都不一样:川渝门店要重辣,江浙门店要清淡。聪明的总店会按区域条件分别调整菜单。条件表格生成在业务里的价值,正是这种“分店按条件定制”的能力。
最直接的应用是测试数据生成。风控团队要测“单日交易超 100 笔”的异常场景,真实库中这种极端用户寥寥无几,手工造数据又慢又假。用条件生成批量造出满足规则边界值的交易表,测试覆盖率立刻上去。数据增强是另一大战场:信贷违约样本只占 0.8%,直接训练模型会一边倒,把“违约=1”当作条件合成一轮样本,正负比例就能拉回可训练的范围。
缺失值填补也天然是条件生成的主场:用一行里完整的那几列作条件,生成缺失列的条件分布采样值,比全局均值填充合理得多。公平性干预则更进一层:以敏感属性(性别、年龄组)为条件进行重采样,让各群体样本量均衡,缓解模型偏见。四个场景本质上都是同一件事——把“业务约束”翻译成“生成条件”,让模型按单出菜。
总店把各地口味写成订单,厨房按单配菜。业务方把约束写成条件,条件生成模型按条件造数。无论是补测试样本、补少数类,还是补缺失值、补公平性,AI 主厨都能稳稳接住。
流程与展望
从“会做几道拿手菜”到“开出一家连锁店”,中间隔着的不是手艺,而是流程。条件表格生成要真正落地,同样需要一条标准化的产线,否则模型再好,也接不住业务方的批量需求。
标准流程大致四步:数据准备、条件定义、模型训练、质量交付。数据准备要清洗真实表、识别列类型;条件定义建议写成结构化的配置(字典或 DSL),而不是自然语言,方便机器校验;模型训练根据数据类型选择 CTGAN、TVAE 或扩散模型;质量交付则套用上一节的三道关卡,满足率不达标就回炉重训。
方向上正在发生有意思的变化。大语言模型把表格序列化成文本后,条件直接写进 prompt——“给我生成 500 个 30 岁左右北京用户的记录”,灵活性一下子打开;扩散模型通过逐步去噪生成数值列,分布还原更细腻;生成服务化之后,业务方可以像调用 API 一样实时取数,条件随请求动态变化。可控粒度也在变细:从“整表像”到“某几列联合像”,再到“每一行都满足条件”,精度逐级提升。
大厨从靠手感变成靠菜谱和仪表,条件生成从“调参碰运气”走向“平台化按需产数”。未来的数据生产线,会像今天的餐厅后厨一样:订单进来,菜出去,全程标准化、可追溯、有质量门禁。
AI 应用场景
风控测试数据生成
阶段:数据准备与测试
解决的问题:传统方式从生产库脱敏抽取测试数据,但“异地登录+大额转账”这类极端组合样本稀少,手工造数据耗时且覆盖不全。条件生成按风控规则批量造出带边界值的测试行,覆盖规则分支。
具体案例:某支付平台反欺诈团队需要测试“每 10 分钟超 5 笔交易的账号”这一规则,用条件表格生成模型产出 5 万行满足该条件的交易表,冒烟测试用例覆盖率从 60% 提升到 95%,且不再依赖生产库抽数。
少数类数据增强
阶段:模型训练前的数据增强
解决的问题:信贷违约样本仅占 0.8%,直接训练模型会严重偏向多数类。以“违约=1”为条件合成新样本,把少数类扩充到可训练的比例,就像给总店下单“多做一些冷门菜”。
具体案例:某消费金融公司用条件表格生成把违约样本扩充 10 倍,模型召回率从 0.42 提升到 0.67,精准率基本持平,风控模型对真实坏客户的捕捉能力显著增强。
隐私保护下的数据共享
阶段:数据合规与共享建模
解决的问题:保险集团想在子公司间共享客户数据做联合建模,但合规限制禁止直传真实表。用带差分隐私的生成模型,按“城市、年龄段”等条件产出共享合成表,既保留统计规律又降低泄露风险。
具体案例:某保险集团将 3000 万用户表转为带 DP 保障的合成表,供子公司训练理赔预测模型,AUC 比“拒绝共享、各自为政”的方案高 0.11,同时通过了合规审计。
Python 演示
# -*- coding: utf-8 -*-"""条件表格生成演示: 按条件从锚点数据中采样合成新表格"""import numpy as np def make_anchor_data(n=2000, seed=42): """构造一份模拟用户表, 作为学习的真实数据""" rng = np.random.default_rng(seed) age = rng.normal(38, 10, n).astype(int) income = np.clip(4000 + (age - 25) * 800 + rng.normal(0, 3000, n), 3000, 60000).astype(int) city = rng.choice(['北京', '上海', '广州', '深圳'], n, p=[0.4, 0.3, 0.2, 0.1]) active = (age < 45) & (income > 8000) & (rng.random(n) > 0.4) return {'age': age, 'income': income, 'city': city, 'active': active.astype(int)} def filter_rows(data, cond): """筛选满足条件的行(条件用字典表示)""" mask = np.ones(len(data['age']), dtype=bool) for key, value in cond.items(): if isinstance(value, tuple): lo, hi = value mask &= (data[key] >= lo) & (data[key] <= hi) else: mask &= (data[key] == value) idx = np.where(mask)[0] return {k: v[idx] for k, v in data.items()} def generate_rows(data, cond, n, noise=0.03, seed=0): """基于满足条件的行的经验分布, 生成 n 行合成数据""" rng = np.random.default_rng(seed) sub = filter_rows(data, cond) m = len(sub['age']) if m == 0: raise ValueError('条件筛选后没有数据, 请放宽条件') out = {} for key in data: if data[key].dtype.kind in 'if': base = np.array(sub[key], dtype=float) val = base[rng.integers(0, m, n)] + rng.normal(0, noise * base.std() + 1e-6, n) out[key] = np.clip(val, data[key].min(), data[key].max()).astype(int) else: values, counts = np.unique(sub[key], return_counts=True) probs = counts / counts.sum() out[key] = rng.choice(values, n, p=probs) return out def verify(gen, cond): """验证生成数据满足条件的比例""" ok = np.ones(len(gen['age']), dtype=bool) for key, value in cond.items(): if isinstance(value, tuple): lo, hi = value ok &= (gen[key] >= lo) & (gen[key] <= hi) else: ok &= (gen[key] == value) return ok.mean() if __name__ == '__main__': data = make_anchor_data() cond = {'age': (25, 35), 'city': '北京', 'active': 1} gen = generate_rows(data, cond, n=500, seed=7) sub = filter_rows(data, cond) print('条件: age in [25,35], city=北京, active=1') print('生成行数:', len(gen['age'])) print('满足条件比例: {:.1%}'.format(verify(gen, cond))) print('锚点满足条件行数:', len(sub['age'])) print('生成样本 age 均值: {:.1f}, 锚点区间 age 均值: {:.1f}'.format( gen['age'].mean(), sub['age'].mean())) print('生成样本 income 均值: {:.1f}, 锚点区间 income 均值: {:.1f}'.format( gen['income'].mean(), sub['income'].mean()))
mask &= (data[key] >= lo) & (data[key] <= hi)把“年龄在 25 到 35”这类区间条件翻译成布尔掩码,一次作用于整列,向量化筛选。idx = np.where(mask)[0]拿到满足条件的所有行下标,后续生成只从这些行学习,相当于“让厨师只看北京客人的点菜记录”。base[rng.integers(0, m, n)]从条件子集中有放回抽取 n 个值,保证新数据继承真实子集的分布形状。rng.normal(0, noise * base.std() + 1e-6, n)叠加小噪声,避免生成完全相同的行;但噪声会让边界值轻微越界,这正是“要验证”的原因。np.clip(val, data[key].min(), data[key].max())把数值裁回全表合理范围,防止收入出现负数这类荒谬值。np.unique(sub[key], return_counts=True)统计类别列在条件子集中的取值频次,作为经验分布。rng.choice(values, n, p=probs)按条件子集的类别分布采样,例如北京用户里的城市内部比例会被保留。ok.mean()一行代码算出“满足条件比例”,这是质量门禁的第一道关。
常见误区
误区我以为条件表格生成很简单:先让模型随便生成一大堆数据,再按条件筛一遍不就行了?反正生成成本低,筛子一过剩下的就是合规数据。
正解随机生成再筛选(拒绝采样)只在条件宽松时能用。当条件同时约束 6 到 8 个列且取值范围很窄时,通过率是各列概率的乘积——比如每列 1/3 的命中率,6 列只剩约 1/729,生成一万行也筛不出 14 行。条件生成模型是把条件作为输入直接学习条件分布,像名厨按订单做菜,而不是做一百道菜碰运气挑一道。
为何常见:“先生成再筛”在单条件、宽松约束下确实能跑通,且实现不用改模型,初学者最容易上手,所以容易误以为是通用方案。
误区我每次生成完都逐行检查,条件全满足,我就认为数据质量合格了,可以直接交付给业务方使用。
正解满足条件是必要但不充分。模型可能“偷懒”,把所有行都生成成一模一样的值——每一行都合规,但分布完全失真、列间关联全丢。质量评估还要看:KL 散度是否接近 0、相关系数矩阵是否一致、下游模型在合成数据上训练能否达到近似表现。三道关卡缺一不可,相当于菜做熟了还得色香味形俱全才行。
为何常见:业务约束校验最直观、最容易自动化,而分布相似度、下游评估需要额外计算,人们往往先做容易做的事,就误以为完成了全部验证。
误区条件生成模型要按“年龄、城市、收入”生成数据,这些条件都这么细,必然会把原始用户的隐私泄露出去,所以我从来不敢用。
正解条件本身是群体统计特征,不等于个体记录。真正的风险来自模型过拟合后“背数据”。解决方案是把差分隐私引入训练:梯度裁剪加噪声、隐私预算控制,模型学到的是满足条件的分布规律,而不是某一行。当然也需要做成员推断风险评估——条件组合过细(比如“生日精确到天的北京男性”)时,单行命中风险确实存在,需要限制条件粒度。
为何常见:新闻里常有“AI 泄露训练数据”的报道,加上对差分隐私不熟悉,容易把“模型知道条件规律”误解为“模型记住了个人”。
误区为了让数据更符合业务要求,我把能想到的条件都加上:年龄、城市、职业、收入、消费频次、最后登录时间……条件越精确,生成结果应该越专业。
正解条件越多,满足全部条件的真实样本越少,模型可学的子集越稀薄,生成质量会断崖式下跌。这就像点菜时一口气提十个要求,厨师反而不知道该听谁的。实践上要先做条件重要性分析,只保留影响业务目标的核心条件,并检查每个条件下真实数据的支持量(行数阈值),必要时放宽区间或合并类别。
为何常见:人很容易把“精确”等同于“正确”——条件写得细,看起来就很专业,但忘了生成模型依赖的是数据支持度,而不是条件数量。
误区条件不就是 WHERE age BETWEEN 25 AND 35 吗?我直接在数据库里筛不就完了,为什么还要训练一个生成模型?
正解筛出来的是已有记录,生成出来的是新记录。条件表格生成的价值在于:当满足条件的真实样本很少(甚至一条都没有)时,模型能从相关模式外推出新的、合理的行。数值列还需要连续建模——用高斯混合拟合分布、按模式采样,而不是简单区间判断,否则生成的数值会丢失分布形态和列间相关性。筛选是“从库里找菜”,生成是“照单现做”。
为何常见:条件表达上两者确实很像(都是对列的约束),初学者容易把表达形式当成实现方式,忽略了“合成”与“抽取”的本质区别。
面试题
Q1. 条件表格生成与无条件表格生成最本质的区别是什么?
- A.前者生成的表格行数更多
- B.前者按条件约束生成样本← 正确答案
- C.前者不需要真实原始数据
- D.前者只能处理数值类型列
答案:B。条件生成的核心是把约束作为输入,直接学习条件分布 p(x|c),就像按订单做菜;无条件生成只会还原整体分布,像自助餐碰运气。行数多少、是否需要原始数据、能否处理数值列都不是本质区别。
Q2. 在“点菜”比喻中,条件生成模型的“订单”对应的技术概念是什么?
- A.生成器的网络参数
- B.判别器的输出数值
- C.条件编码得到的向量← 正确答案
- D.训练数据集的规模
答案:C。订单在技术实现上会被编码成一个向量,与随机噪声一起喂给生成器。生成器参数是“厨师的手艺”,判别器输出是“试菜员的评价”,训练集规模是“餐厅的客流量”,都不是订单本身。
Q3. 条件生成模型的核心学习目标是什么?
- A.给定条件下的样本分布← 正确答案
- B.全局平均样本分布
- C.训练集的内存索引
- D.判别器的损失曲线
答案:A。条件生成的目标是学习给定条件 c 下的样本分布,即 p(x|c),相当于“满足这张订单的菜该长什么样”。全局平均分布是自助餐的情形,内存索引和损失曲线与生成目标无关。
Q4. CTGAN 的 training-by-sampling 策略主要解决什么问题?
- A.训练速度过于缓慢
- B.少数类别训练不充分← 正确答案
- C.数值列无法归一化
- D.判别器严重过拟合
答案:B。真实数据里热门类别样本多,如果随机选条件,冷门类别几乎练不到,导致生成模型对其欠拟合。training-by-sampling 按频率反比采样条件,让冷门类别也有充分训练机会,就像主厨也要练过冷门菜。它不解决速度、归一化或过拟合问题。
Q5. 下列关于条件生成对抗网络输入设计的说法,正确的有?
- A.生成器输入包含随机噪声向量← 正确答案
- B.生成器输入包含条件编码向量← 正确答案
- C.判别器输入包含真实或生成样本← 正确答案
- D.判别器输入完全不包含条件
答案:ABC。条件 GAN 中,生成器接收噪声 z 与条件向量 c 的拼接 [z;c],判别器接收样本(真实或生成)并同时结合条件来判断真假。选项 D 说判别器不接收条件,恰恰相反——正是不接收条件时,判别器无法判断“对不对得上单”。
Q6. 关于差分隐私参数 ε,下列哪个说法是正确的?
- A.ε 越大表示隐私保护越强
- B.ε 越小表示隐私保护越强← 正确答案
- C.ε 与隐私保护强度无关
- D.ε 表示生成数据的总行数
答案:B。差分隐私通过两个相邻数据集上输出分布的概率比来定义保护强度。ε 越小,两条相邻数据集的输出分布越接近,攻击者越难判断某条记录是否存在,所以保护越强。ε 与生成行数无关。
Q7. 下列哪种方式最能直接验证生成数据的业务约束合规性?
- A.逐行校验每个条件是否成立← 正确答案
- B.仅观察整体均值是否接近
- C.让分类器判断数据真假
- D.随机抽取几行进行目测
答案:A。业务约束合规性最直接的证据是逐行检查条件是否成立(如年龄区间、类别取值),相当于称分量看订单有没有被遵守。均值接近、分类器判断、肉眼抽查都是辅助手段,不能精确回答“每一行是否合规”。
Q8. 在 TSTR 评估中,若合成数据训练的模型在真实测试集上表现与真实数据训练接近,说明什么?
- A.合成数据保留了足够的下游可用信号← 正确答案
- B.合成数据与训练集完全一致
- C.生成模型发生了严重的过拟合
- D.判别器训练过程已经完全失败
答案:A。TSTR 用合成数据训练、真实数据测试,表现接近“真实-真实”基线,说明合成数据保留了足够的下游可用信号,这正是条件生成质量的核心表现。B 是过拟合信号,C、D 与评估结论相反。
Q9. 下列哪些属于条件表格生成的质量验证维度?
- A.分布相似度与 KL 散度← 正确答案
- B.列间关联结构保持← 正确答案
- C.生成速度的快慢程度
- D.下游任务效果表现← 正确答案
答案:ABD。质量验证是多维的:分布相似度(KL 散度)、列间关联结构、下游任务表现都是核心维度。生成速度是工程指标,与数据质量无关,所以不选 C。业务约束校验也重要,但题目问的是“质量验证维度”,A、B、D 覆盖了分布、关联、效用三层。
Q10. 关于将差分隐私引入条件生成训练,下列说法正确的有?
- A.噪声注入会牺牲部分生成质量← 正确答案
- B.隐私预算按迭代累计消耗← 正确答案
- C.ε 越小生成多样性必然越高
- D.差分隐私完全消除成员推断风险
答案:AB。差分隐私训练注入噪声,通常以部分生成质量为代价换取隐私保障(A 对);DP-SGD 中隐私预算随迭代累计消耗(B 对);ε 衡量隐私强度而非多样性,C 混淆了概念;差分隐私显著降低成员推断风险,但“完全消除”过于绝对,D 错。