想象你是一名医生。病人小陈举着体检报告,紧张地问你:“这个药,我到底该不该吃?”你特别想给他一个确定答案,但现实很残酷——你只见过“吃了药的小陈”恢复得如何,永远见不到“没吃药的小陈”在平行世界里是什么状态。人生不是实验室,一片叶子不能落进同一条河两次;一个人只能走一条路,另一条路的结果永远缺失。这就是因果推断的世纪难题:反事实无法观测。 GANITE 给这个问题开了一扇“AI 时光机”的窗。它请来两位搭档:一位是想象力爆棚的“平行人生编剧”(生成器),专门为小陈续写“如果当初没吃药”的故事;另一位是铁面无私的“考据编辑”(判别器),专门检查这些编撰出的平行人生是否符合现实世界的统计规律。编剧每交一稿,编辑就打回一稿,两人在反复博弈中共同进化——剧本越来越真,审稿越来越刁。博弈结束后,用“现实结果”减去“平行人生结果”,就得到小陈个人的处理效应(ITE)。这个差值,也正是营销里做增益建模(uplift)的数学内核。

岗位关联

掌握 GANITE,你就掌握了用深度学习补全“缺失的平行人生”的方法:既能精准回答个体化用药该不该上,也能帮企业省下每一分不该发的优惠券预算。

目录
  1. 可视化演示
  2. 反事实推断难题
  3. GAN 对抗机制
  4. 生成器设计
  5. 判别器设计
  6. 两阶段训练
  7. ITE 预测应用
  8. Uplift 增益建模
  9. AI 应用场景
  10. Python 演示
  11. 常见误区
  12. 面试题

可视化演示

展示边缘设备上传感器数据的AI预处理流程,包括数据采集、滤波降噪、特征提取与轻量推理,直观理解边缘智能的低延迟优势。

本节配有交互动效(进入视口后自动加载,约 3KB)。

边缘传感器AI预处理 数据采集:传感器原始信号实时采集与缓冲 滤波降噪:移动均值/Kalman滤波去除噪声 轻量推理:量化模型在边缘NPU上执行推理 Latency_edge << Latency_cloud; Pwr ∝ Model_Size 边缘AI预处理实现低延迟与低功耗

反事实推断难题

每个人的一生都像不断在岔路口做选择。小陈的病历摊在桌上,服药这条路他已经踏上去,恢复得不错;可“如果当初没吃药”的另一条路,永远无从知晓。医学课本只能告诉他“平均而言这个药有效”,却回答不了“对你这个人,药到底创造了多少改变”。这叫反事实推断的根源一句话总结:一个个体只能走一条路,另一条路的结果永远缺失。

统计学家把“如果当初”翻译成一个严谨框架——潜在结果模型。对任意个体 x,我们定义两个潜在结果:Y1 表示接受干预(吃药)后的结局,Y0 表示不接受干预(不吃药)后的结局。注意,这两个结果是同时存在的“平行人生”,只是现实只亮起一盏灯。而每一个个体的真实因果效应,正是这两个潜在结果之差。

观测到的结果 Y 由下面的开关方程决定,其中 T 是治疗指示变量:

所以因果推断的本质,是跟命运讨要一份“没走上那条路的结局”。传统方法只好在人群里找长得像的替身——倾向得分匹配、分层回归——来近似反事实,但替身终归是替身。GANITE 的野心更大:它要用生成对抗网络,亲手把那一条条缺失的平行人生“写出来”。

Y=T×Y1+(1−T)×Y0={Y1,T=1Y0,T=0\displaystyle Y = T \times Y_1 + (1 - T) \times Y_0 = \begin{cases} Y_1, & T = 1 \\ Y_0, & T = 0 \end{cases}
一句话:T 像一盏路灯,只照亮两个平行结果中的一个,另一个隐没在黑暗里。
  1. T 指示是否干预T=1 表示吃了药,T=0 表示没吃药,它是我们唯一能看到的“道路选择”标签。
    T∈{0,1}\displaystyle T \in \{0, 1\}
  2. 一对潜在结果Y1 是吃药后的结局,Y0 是不吃药后的结局,二者都是同一个体“本来可能”出现的结果。
    Y1=Y1(x),Y0=Y0(x)\displaystyle Y_1 = Y_1(x), \quad Y_0 = Y_0(x)
  3. 开关方程合并T 只让对应的那个结果生效,(1-T) 让另一个乘积归零,于是 Y 永远只等于其中一个潜在结果。
    Y=T⋅Y1+(1−T)⋅Y0\displaystyle Y = T \cdot Y_1 + (1 - T) \cdot Y_0

GAN 对抗机制

编剧虽然想象力丰富,但也不能信口开河。现实中要有品控:一位考据编辑专门审查剧本里的平行人生是否符合现实世界的统计规律。编剧每写一个“如果没吃药,小陈会怎样”,编辑就把它与真实档案比对,要么盖章“真实”,要么打回“可疑”。GANITE 的“GAN”就是这套编剧与编辑的组合——生成对抗网络。

生成器 G 负责写剧本,输入病人的全部档案 x、已走的道路 t、已知结局 y,以及要查询的“另一条路”t*,输出反事实结果 ŷ。判别器 D 负责审稿,吃下“特征+处理+结果”三元组,输出一个 0 到 1 的真实概率。编辑想让真实样本得高分、生成样本得低分;编剧却想让生成样本蒙混过关。两人目标相反,形成零和博弈:

当博弈推进到纳什均衡,编剧就学走了真实数据里的“人生规律”:它写出的平行人生,在考据编辑眼里已经分辨不出真假。这时候,编辑审稿的分数便不再重要,重要的是编剧笔下那套可信的反事实剧本库——它是下一步估计因果效应的重要素材。

min⁡Gmax⁡D  E[log⁡D(x,t,y)]+E[log⁡(1−D(x,t∗,y^))]\displaystyle \min_{G} \max_{D} \; \mathbb{E}[\log D(x, t, y)] + \mathbb{E}[\log (1 - D(x, t^{*}, \hat{y}))]
一句话:一个拼命想赢的项目,恰好是另一个拼命想输的项目——两人拉锯直到谁也骗不了谁。
  1. 真实样本请盖章判别器对真实记录 (x,t,y) 的输出越接近 1,编辑赢得越多。
    D(x,t,y)→1\displaystyle D(x, t, y) \to 1
  2. 生成样本请打回判别器对生成的反事实 (x,t*,ŷ) 的输出越接近 0,编辑赢得越多。
    D(x,t∗,y^)→0\displaystyle D(x, t^{*}, \hat{y}) \to 0
  3. 生成器反向拆台G 努力让第二项变小,骗过 D,于是形成 min-max 攻防。
    min⁡Gmax⁡D  V(D,G)\displaystyle \min_{G} \max_{D} \; V(D, G)

生成器设计

编剧写稿也要有素材清单:病人的完整档案(x)、已经走的路(t)、已知的结局(y),以及老板交办的新命题——“如果当初走了另一条路(t*),结局是什么?”生成器把这些零散素材拼成一个向量,通过多层感知机(一堆带激活函数的线性层堆叠,能拟合任意复杂函数)输出一个数值:平行人生的结局。

为了让剧本既逼真又不脱缰,生成器背上两个损失。对抗损失要求它骗过判别器;重构损失则像“抽查剧本里的过去”——当要求写的路 t* 恰好等于真实走过的路 t 时,生成器必须还原已经发生的结果 y,防止编剧为了骗人而满口胡诌:

重构损失就像编剧的“信誉账本”:连已经发生的事都写不对的编剧,没资格写平行人生。有了这根锚,生成器在对抗中就不会走火入魔,反事实剧本的起点永远是现实。

LG=−E[log⁡D(x,t∗,y^)]+λ⋅E[(G(x,t,y,t)−y)2]\displaystyle \mathcal{L}_{G} = -\mathbb{E}[\log D(x, t^{*}, \hat{y})] + \lambda \cdot \mathbb{E}\big[(G(x, t, y, t) - y)^2\big]
一句话:先看编剧能不能准确复述既成事实,再看它写的平行人生像不像真的。
  1. 拼接素材生成器把特征、真实处理、真实结果、目标处理拼成一个输入向量。
    z=[x;  t;  y;  t∗]\displaystyle z = [x; \; t; \; y; \; t^{*}]
  2. 产出平行结果多层感知机把 z 映射成反事实结果 ŷ。
    y^=G(x,t,y,t∗)\displaystyle \hat{y} = G(x, t, y, t^{*})
  3. 重构约束拴住想象力当目标处理与真实处理相同时,输出必须逼近真实观测 y。
    G(x,t,y,t)≈y\displaystyle G(x, t, y, t) \approx y

判别器设计

考据编辑的审稿标准很简单也很严格:真实档案必须盖章“真”,编剧交上来的平行人生必须打回“假”。编辑把“特征+处理+结果”三元组作为审稿材料,输出真实概率。它每给出一个判断,都构成对生成器的反向压力——这就是对抗训练的灵魂。

判别器的损失函数同时惩罚两种失职:把真实样本误判为假,把生成样本误判为真。它要做的是双向夹击,把两类样本彻底分开:

注意,编辑不能太苛刻也不能太放松:太苛刻会把编剧逼成复读机,太放松会让剧本全是空话。真正的 GAN 训练讲究棋逢对手——编辑与编剧同步进化,最后到达谁也骗不了谁的平衡点,这也是理解 GANITE 训练节奏的关键。

LD=−E[log⁡D(x,t,y)]−E[log⁡(1−D(x,t∗,y^))]\displaystyle \mathcal{L}_{D} = -\mathbb{E}\big[\log D(x, t, y)\big] - \mathbb{E}\big[\log\big(1 - D(x, t^{*}, \hat{y})\big)\big]
一句话:编辑的 KPI 只有一个——真实放行、造假退稿,两条都做到才算合格。
  1. 提升真实分编辑要尽量让真实样本的 D 输出接近 1,令第一项损失变小。
    D(x,t,y)→1\displaystyle D(x, t, y) \to 1
  2. 压低生成分编辑要尽量让生成样本的 D 输出接近 0,令第二项损失变小。
    D(x,t∗,y^)→0\displaystyle D(x, t^{*}, \hat{y}) \to 0
  3. 整体最小化对判别器而言,两项都是需要最小化的损失,直接求和优化。
    min⁡D  LD\displaystyle \min_{D} \; \mathcal{L}_{D}

两阶段训练

一场完整的“平行人生编纂工程”分两轮。第一轮是编剧与编辑的攻防演练,核心产出是一套高仿真反事实剧本库;第二轮请来一位“因果摘要员”——ITE 推断网络 I,它读入个人档案 x,直接吐出两份摘要:若服药的结果和若不服药的结果,供医生快速查阅。

第一轮对抗结束后,我们把每一条真实记录和它对应的反事实剧本拼在一起,得到完整的潜在结果标签:对 T=1 的人,Y1 已知、Y0 用剧本补;对 T=0 的人则反过来。然后让摘要员监督学习这些标签,损失函数是均方误差(预测与标签之差的平方再求平均):

分两阶段的好处是各司其职:生成器负责把缺失信息补全,推断网络负责把补全后的信息提炼成稳定可用的因果效应估计。摘要员一旦上岗,就再也不需要每次预测都现场调用编剧了——纯前向计算,速度飞快。

LI=E[(I0(x)−Y^0)2+(I1(x)−Y^1)2]\displaystyle \mathcal{L}_{I} = \mathbb{E}\Big[ \big(I_0(x) - \hat{Y}_0\big)^{2} + \big(I_1(x) - \hat{Y}_1\big)^{2} \Big]
一句话:先让编剧批量生产“平行人生”,再让摘要员把两份人生压缩成一句因果结论。
  1. 合成潜在结果标签用真实观测与生成反事实拼出完整的 (Ŷ0, Ŷ1) 标签对。
    Y^1=T⋅Y+(1−T)⋅y^t∗=1,Y^0=(1−T)⋅Y+T⋅y^t∗=0\displaystyle \hat{Y}_1 = T \cdot Y + (1 - T) \cdot \hat{y}_{t^{*}=1}, \quad \hat{Y}_0 = (1 - T) \cdot Y + T \cdot \hat{y}_{t^{*}=0}
  2. 推断网络双头输出I 网络同时估计两个潜在结果,结构上是双输出的回归头。
    I(x)=[I0(x),  I1(x)]\displaystyle I(x) = \big[I_0(x), \; I_1(x)\big]
  3. 均方误差监督让网络输出尽量贴近合成标签,误差反向传播更新 I 的参数。
    min⁡I  (It(x)−Y^t)2\displaystyle \min_{I} \; \big(I_t(x) - \hat{Y}_t\big)^{2}

ITE 预测应用

“因果摘要员”上岗后,问诊流程被彻底改变了。医生输入小陈的个人档案,摘要员立刻吐出两张平行人生的结局:吃了药的血压值和没吃药的血压值。两者相减,就是小陈这个具体个体因为吃药获得的改变——这就是个体处理效应(ITE,Individual Treatment Effect)。

以前医生只能依赖群体平均疗效,现在有了个体化的差值,决策就从“指南推荐”升级为“为你定制”。ITE 的数学定义简洁得近乎优雅:

ITE 还天然刻画了人群异质性:有的人 τ=0.1 受益微弱,有的人 τ=2.1 效果显著。把全人群的 ITE 画成直方图,就能看见“谁获益、谁无感、谁受伤害”——这正是个体化决策与精准营销共同依赖的地基。

τ^(x)=Y^1(x)−Y^0(x)=I1(x)−I0(x)\displaystyle \hat{\tau}(x) = \hat{Y}_1(x) - \hat{Y}_0(x) = I_1(x) - I_0(x)
一句话:同一个人的两份人生逐项相减,剩下的就是干预真正带来的贡献。
  1. 个体处理效应定义真实 ITE 是同一个体两个潜在结果之差。
    τ(x)=Y1(x)−Y0(x)\displaystyle \tau(x) = Y_1(x) - Y_0(x)
  2. 用推断网络近似真实潜在结果永远缺失,用摘要员 I 的输出代替。
    τ^(x)=I1(x)−I0(x)\displaystyle \hat{\tau}(x) = I_1(x) - I_0(x)
  3. 符号决定方向τ 大于 0 说明干预有利,小于 0 说明有害,绝对值大小代表获益程度。
    τ^(x)>0⇒倾向采用干预\displaystyle \hat{\tau}(x) > 0 \Rightarrow \text{倾向采用干预}

Uplift 增益建模

营销经理手里攥着一叠优惠券。老经验是把券发给最可能下单的人——可这些人本来就买,券等于白送。真正该发的是“收到券才买、不发券不买”的边际敏感人群。这群人的特征就是 Uplift 为正。所谓增益建模(uplift modeling),本质就是把上一节算出的 ITE 从医学搬进商业:干预是“发券”,结局是“是否转化”。

在营销场景里,结局 Y 常常是二值的(买/不买)。对每个用户 x,发券后的转化概率减去不发券的转化概率,就是这张券对这个用户的增益:

把 GANITE 的 ITE 输出接到决策规则上,营销就从“撒网捕鱼”变成“精确垂钓”:预算不变,转化增量翻倍。回看整条链路,从反事实难题到对抗博弈,再到 ITE 与 uplift,本质都是同一件事——给每个个体补全那条没走过的路,然后比较两条路的终点。

Uplift(x)=E^[Y1∣x]−E^[Y0∣x]=τ^(x)\displaystyle \mathrm{Uplift}(x) = \hat{\mathbb{E}}[Y_1 \mid x] - \hat{\mathbb{E}}[Y_0 \mid x] = \hat{\tau}(x)
一句话:Uplift 不看用户有多爱买,只看这张券能“多撬动”多少购买。
  1. 增益就是 ITE转化场景下,uplift 就是发券与否两个潜在结果的期望之差。
    Uplift(x)=P(转化∣x,T=1)−P(转化∣x,T=0)\displaystyle \mathrm{Uplift}(x) = P(\text{转化} \mid x, T=1) - P(\text{转化} \mid x, T=0)
  2. 只对正增益人群干预当增益超过阈值 c 才发券,否则省下预算。
    发券  ⟺  τ^(x)>c\displaystyle \text{发券} \iff \hat{\tau}(x) > c
  3. 阈值由成本收益决定c 取优惠券成本与单用户带来的边际毛利之比,保证 ROI 为正。
    c=优惠券成本带动毛利\displaystyle c = \frac{\text{优惠券成本}}{\text{带动毛利}}

AI 应用场景

精准医疗:个体化用药推荐

阶段:反事实结果估计 / ITE 预测

解决的问题:传统随机临床试验给出的是平均疗效,回答不了“这个患者个体吃这个药到底获益多少”。医生只能靠经验猜;而 GANITE 用历史电子病历为每位患者生成“用药/不用药”两条平行轨迹,把效应量化到个人。

具体案例:某三甲医院积累五年糖尿病诊疗数据(血糖、年龄、并发症、用药史、随访血糖变化),用 GANITE 训练后,对新患者直接输出 ITE:若某个患者的 τ 显著为正则推荐加药,否则建议生活方式干预。临床决策从“按指南平均用药”升级为“按个体效应用药”。

电商优惠券:增益营销与预算优化

阶段:Uplift 建模 / 干预策略优化

解决的问题:传统响应模型把券发给“最可能购买”的高价值用户,但这些用户本来就买,券打了水漂;真正被券打动的“价格敏感型”用户反而被漏掉。

具体案例:某电商对 200 万用户做“发券 vs 不发券”的历史实验,记录用户特征、是否发券、是否转化。用 GANITE 训练后,每个用户的 uplift 就是“发券带来的转化增量”。运营只给 uplift 高于成本阈值的 20% 用户发券,同等预算下 ROI 提升约 35%。

内容平台:新用户激活策略评估

阶段:反事实生成 / ITE 预测

解决的问题:产品经理想评估“新人礼包”对新用户 7 日留存的影响,但直接对比收到与未收到礼包的两组用户会受自选择偏差干扰——活跃用户更容易领取礼包。

具体案例:平台用 GANITE 为新用户生成“有礼包 vs 无礼包”的平行留存结果,发现礼包对低活跃新用户留存提升 12%,对高活跃用户接近 0。于是把礼包资源集中到前者,激活成本下降 28%。

Python 演示

python78 行
import numpy as np  def sig(x):    return 1 / (1 + np.exp(-x))  def make_data(n=1500):    r = np.random.RandomState(1)    x = r.randn(n, 4)    t = (r.rand(n) > 0.5).astype(float).reshape(-1, 1)    y0 = 0.4 * x[:, 1:2] - 0.2 * x[:, 2:3]    y1 = y0 + 1 + 0.6 * x[:, 3:4]    y = t * y1 + (1 - t) * y0    return x, t, y, y1 - y0  class Net:    """单隐层MLP: forward保存隐层, update做梯度下降"""     def __init__(self, ni, nh, no):        r = np.random.RandomState(0)        self.w1 = r.randn(ni, nh) * 0.3        self.b1 = np.zeros(nh)        self.w2 = r.randn(nh, no) * 0.3        self.b2 = np.zeros(no)     def forward(self, z):        self.h = np.tanh(z.dot(self.w1) + self.b1)        return self.h.dot(self.w2) + self.b2     def update(self, z, h, dz, lr):        m = len(z)        w2o = self.w2        self.w2 -= lr * h.T.dot(dz) / m        self.b2 -= lr * dz.mean(0)        dh = dz.dot(w2o.T) * (1 - h ** 2)        self.w1 -= lr * z.T.dot(dh) / m        self.b1 -= lr * dh.mean(0)  def train(x, t, y, ep=80, bs=64, lr=0.2):    n = len(x)    g = Net(7, 16, 1)     # 生成器: x,t,y,t* -> 反事实结果    d = Net(6, 16, 1)     # 判别器: x,t,y -> 为真logit    inf = Net(4, 16, 2)   # ITE推断网络: x -> [Y0,Y1]    for _ in range(ep):        o = np.random.permutation(n)        for i in range(0, n, bs):            xb, tb, yb = x[o[i:i+bs]], t[o[i:i+bs]], y[o[i:i+bs]]            ts = 1 - tb  # 反事实处理            zg = np.c_[xb, tb, yb, ts]            yrec, h1 = g.forward(np.c_[xb, tb, yb, tb])  # 同处理应还原            ycf, h2 = g.forward(zg)                      # 异处理编平行人生            zr = np.c_[xb, tb, yb]            zf = np.c_[xb, ts, ycf]            lr_, hr = d.forward(zr)            lf, hf = d.forward(zf)            dadv = (sig(lf) - 1) * (d.w2.T * (1 - hf ** 2)).dot(d.w1[-1:].T)            d.update(zr, hr, sig(lr_) - 1, lr)   # 真样本判真            d.update(zf, hf, sig(lf), lr)        # 假样本判假            g.update(zg, h2, dadv, lr)           # 对抗梯度            g.update(np.c_[xb, tb, yb, tb], h1, 2 * (yrec - yb), lr)  # 重构约束    cf = g.forward(np.c_[x, t, y, 1 - t])[0]    v0 = np.where(t == 1, cf, y)   # 潜在结果Y0标签    v1 = np.where(t == 1, y, cf)   # 潜在结果Y1标签    for _ in range(200):        out, hi = inf.forward(x)        dz = np.c_[2 * (out[:, :1] - v0), 2 * (out[:, 1:] - v1)]        inf.update(x, hi, dz, lr)    return inf  x, t, y, true_ite = make_data()inf = train(x, t, y)out = inf.forward(x)[0]ite_pred = out[:, 1] - out[:, 0]print('ITE预测与真实效应相关系数:', round(float(np.corrcoef(ite_pred, true_ite.ravel())[0, 1]), 3))
目的:从零实现一个微型 GANITE,在合成数据上完成“对抗补全反事实 + 监督训练 ITE 推断网络”两阶段流程,并输出个体处理效应预测与真实效应的相关性。
  1. g = Net(7, 16, 1)生成器输入 [x,t,y,t*] 共 7 维,输出一维反事实结果。
  2. yrec, h1 = g.forward(np.c_[xb, tb, yb, tb])用真实处理 tb 当目标处理:生成器必须还原观测结果。
  3. ycf, h2 = g.forward(zg)用翻转处理 ts 查询平行人生:生成器编出反事实结果。
  4. d.update(zr, hr, sig(lr_) - 1, lr)真实样本的判别梯度:让 D(real) 逼近 1。
  5. d.update(zf, hf, sig(lf), lr)生成样本的判别梯度:让 D(fake) 逼近 0。
  6. dadv = (sig(lf) - 1) * (d.w2.T * (1 - hf ** 2)).dot(d.w1[-1:].T)把判别器的“退稿意见”沿网络反传回生成器输出。
  7. g.update(zg, h2, dadv, lr)生成器按退稿意见调整参数,学写更逼真的平行人生。
  8. g.update(np.c_[xb, tb, yb, tb], h1, 2 * (yrec - yb), lr)重构损失:同处理下必须还原真实 y。
  9. cf = g.forward(np.c_[x, t, y, 1 - t])[0]用训练好的生成器为全量数据补齐反事实结果。
  10. v1 = np.where(t == 1, y, cf)拼出潜在结果 Y1 的完整标签:T=1 用真实,否则用生成。
  11. ite_pred = out[:, 1] - out[:, 0]推断网络两个输出相减,即个体处理效应 ITE。

常见误区

误区GANITE 不是把反事实结果生成出来了吗?那直接把生成结果当成真实观测用不就行了,它一定是对的。

正解生成器输出的是统计意义上可信的模拟值,不是真实观测。它只是在给定数据分布下“补全”缺失值,误差不可避免。需要用量化指标(如 PEHE,即个体处理效应预测的平均误差)评估生成质量,并做敏感性检验。就像编剧写出了精彩的平行人生,但你不能把小说当史记。

为何常见:GAN 生成图像的惊艳效果,让人误以为生成器产出的就是事实本身。

误区传统因果推断要随机对照试验,GANITE 用生成对抗网络直接从观测数据里挖因果,可以完全替代实验了。

正解GANITE 仍然依赖标准因果假设:可忽略性(给定特征后,处理分配与潜在结果独立)、共同支撑、稳定单元假设。如果存在未观测混杂——“身体状况好的人更爱吃药”,生成器只会把这套选择偏差原样学进去。观测数据能省的是实验成本,不能省的是假设。

为何常见:深度学习的“万能拟合”光环,让人误以为它能识别出数据里根本没有的信息。

误区判别器一上来就能 100% 分清真假,说明模型非常强大。

正解判别器秒判真假恰恰说明生成器太弱、两者失衡。GAN 训练的本质是博弈:编辑太苛刻会把编剧逼成复读机,编剧太强又会把编辑玩坏。理想状态是双方在对抗中同步进化,最终判别器只能靠“猜”——那才是高质量反事实剧本诞生的时刻。

为何常见:把判别器当成独立分类器来评估,忽略了它与生成器耦合的对抗关系。

误区给 uplift 最高的用户发券,因为这些人转化率最高、最值得营销。

正解高转化率用户往往是“不发券也会买”的人,他们的 uplift 接近 0。真正值得发券的是 uplift 高的人——被券从“不买”推向“买”的边际敏感人群。模型要优化的目标是干预带来的增量,而不是绝对水位。

为何常见:传统响应模型(预测转化率 P(Y=1|x))用得太久,把“预测结果”与“预测因果增量”混为一谈。

面试题

Q1. GANITE 要解决的“反事实难题”是指什么?

单选题 · easy

  • A.个体只能观测一种结果← 正确答案
  • B.样本数据量过于庞大
  • C.生成器的损失难收敛
  • D.判别器的训练不稳定

答案:A。反事实难题的本质是“一只脚不能同时踏进两条河”:同一个人要么吃药要么不吃药,另一条路的结果永远观测不到。B/C/D 都是工程实现上的麻烦,不是反事实难题本身。

Q2. GANITE 中“生成器”的核心角色是什么?

单选题 · easy

  • A.判断样本的真实程度
  • B.编写反事实平行人生← 正确答案
  • C.直接计算平均因果效应
  • D.压缩高维特征向量

答案:B。生成器在 GANITE 里是“平行人生编剧”,专门为每个个体续写吃了药/没吃药的另一个版本结局。判断真假是判别器的职责,计算平均效应也不是生成器的工作。

Q3. 观测方程 Y = T×Y1 + (1-T)×Y0 中,当 T=1 时 Y 的值来自哪里?

单选题 · mid

  • A.潜在结果中的 Y0
  • B.两组结果的混合均值
  • C.潜在结果中的 Y1← 正确答案
  • D.生成器的随机输出

答案:C。开关方程像一个二选一开关:T=1 时第一个乘积项生效,Y 就等于 Y1;T=0 时第二个生效。求均值或随机输出都与观测方程的定义不符。

Q4. 生成器损失中的“重构损失”(t*=t 时还原 Y)主要起什么作用?

单选题 · mid

  • A.让生成器输出更加多样
  • B.防止编造剧本时脱离现实← 正确答案
  • C.提升判别器的辨别准确率
  • D.消除数据里的混杂偏差

答案:B。重构损失像编辑抽查“剧本里的过去”:当目标处理与真实处理相同时,生成器必须还原已经发生的真实结果 y。这个约束把编剧的想象力拴在现实锚点上,防止它满口胡诌。它不直接提升判别器,也消除不了混杂。

Q5. 判别器在训练中输出的“真实概率”可以被用来做什么?

多选题 · mid

  • A.反向传播指导生成器改进← 正确答案
  • B.直接输出个体处理效应
  • C.区分真实与生成样本← 正确答案
  • D.替代重构损失的监督信号

答案:AC。判别器是考据编辑:它输出“这条记录像不像真实档案”的概率,并把该信号反传回去指导生成器改进,同时自身就是真假分类器。它不直接算 ITE,也不提供回归监督标签。

Q6. GANITE 第二阶段训练 ITE 推断网络的标签来自哪里?

单选题 · mid

  • A.只有真实标注样本
  • B.真实加生成合成集← 正确答案
  • C.纯随机高斯噪声
  • D.判别器的输出概率

答案:B。第二阶段把真实观测 y 和生成器产出的反事实 ŷ 拼成完整的潜在结果标签,再监督训练推断网络 I。只有真实样本、纯噪声或判别器概率,都无法提供完整的 Y0/Y1 监督信号。

Q7. 以下关于 GANITE 局限性的说法,正确的有哪些?

多选题 · hard

  • A.依赖无未观测混杂假设← 正确答案
  • B.生成结果并非真实观测← 正确答案
  • C.可完全替代随机对照试验
  • D.必然消除个体异质性

答案:AB。GANITE 的生成结果再逼真也只是统计模拟,依赖可忽略性假设;当存在未观测混杂时估计会有偏,也不能替代真随机对照试验,更不会消除个体异质性。

Q8. 若真实 ITE 为 0.5,而生成器严重过拟合训练集,ITE 估计最可能出现什么问题?

单选题 · hard

  • A.依然恰好等于零点五
  • B.方差减小但保持无偏
  • C.系统性偏离真实效应← 正确答案
  • D.得到负数反而更可靠

答案:C。过拟合会让编剧“背剧本”而不是“学规律”,在训练集外的新个体上,反事实估计会系统性偏离真实效应。这时无偏性、恰好正确或符号反转的说法都不成立。

Q9. 对“本来就会购买”的用户发优惠券,其 Uplift 最可能接近什么值?

单选题 · easy

  • A.一个较大的正值
  • B.零甚至为负← 正确答案
  • C.一定等于转化率
  • D.与发放成本无关

答案:B。本来就下单的用户属于“转化已经发生”,发不发券都会买,增量贡献接近 0,甚至可能因打扰产生负向体验。这类人正是 uplift 建模要识别出来、省下预算的对象。

Q10. 以下哪些属于 GANITE 的典型应用场景?

多选题 · mid

  • A.个体化用药疗效评估← 正确答案
  • B.优惠券发放增益优化← 正确答案
  • C.图片素材风格迁移
  • D.客服策略增量评估← 正确答案

答案:ABD。GANITE 的核心是估计个体层面的反事实差值:用药疗效评估用 ITE,优惠券发放是 uplift 建模,客服策略评估同样是干预效果增量分析。图片风格迁移与因果推断无关。