直觉:伪造和检测是同一枚硬币

深度伪造(deepfake)的本质是用生成模型合成或篡改人脸/语音,使其看起来像真实采集的。检测则是反过来:找出合成过程留下的、人眼难察但统计上可分的痕迹(artifacts)。两者天然耦合——任何一种检测特征一旦公开,生成方就会针对它优化,把痕迹抹掉。所以这是一场军备竞赛,理解它要同时看生成端怎么造、检测端抓什么、以及对抗如何让双方互相进化。

机制一:人脸伪造的两条主流技术路线

路线 A:换脸(face swap) / 自编码器路线。早期经典做法用一对共享编码器、分立解码器的自编码器:

1
2
3
4
5
6
encoder(共享)  -->  latent z
z --> decoder_A 重建 A 的脸
z --> decoder_B 重建 B 的脸

推理时: 输入 A 的脸 -> 共享 encoder -> decoder_B
=> 得到"A 的表情/姿态 + B 的身份"

共享编码器学到的是身份无关的表情/姿态/光照表示,解码器负责把它渲染成特定身份。换脸后还要做混合(blending)——把生成的脸贴回原视频帧。这个贴合边界、肤色匹配、分辨率不一致,正是后来检测的重点突破口。

路线 B:生成式路线(GAN / 扩散模型)。用对抗训练或扩散过程直接合成整张脸。GAN 的核心是生成器 GG 与判别器 DD 的极小极大博弈:

minGmaxDExpdata[logD(x)]+Ezpz[log(1D(G(z)))]\min_G \max_D \; \mathbb{E}_{x\sim p_{\text{data}}}[\log D(x)] + \mathbb{E}_{z\sim p_z}[\log(1 - D(G(z)))]

DD 努力区分真假,GG 努力骗过 DD,纳什均衡处 GG 的分布逼近真实分布。扩散模型则用另一种思路:把图像逐步加高斯噪声直到纯噪声,再训练网络学习逆向去噪过程,从噪声采样出图像。两类方法生成质量都很高,但都会在频域、纹理统计上留下与自然图像不同的"指纹"。

机制二:检测端抓什么痕迹

检测特征大致分四层,由浅入深:

  1. 空间/语义层痕迹。混合边界不自然、左右脸不对称、牙齿/头发等高频细节糊、眨眼频率异常、瞳孔反光不一致。早期 deepfake 常"不眨眼"或眨眼不自然,因为训练数据多是睁眼照。
  2. 频域指纹。上采样操作(转置卷积/插值)会在傅里叶谱里留下规则的周期性峰值/网格状伪影。对图像做 FFT 后,合成图的高频谱分布与自然图有系统性差异。
1
2
3
4
5
6
7
import numpy as np
def spectral_signature(gray_img):
f = np.fft.fftshift(np.fft.fft2(gray_img))
mag = np.log1p(np.abs(f))
# 合成图常在高频区出现规则峰值/网格;
# 做径向平均后比较高频段能量分布
return mag
  1. 物理/生理一致性。光照方向与阴影是否自洽、不同帧之间几何是否连贯、远端 PPG 信号(皮肤微小颜色波动反映心跳)在真人视频里有周期性,合成视频往往破坏这种一致性。
  2. 时序一致性。逐帧生成的视频在帧间会有抖动、身份漂移、闪烁。把多帧堆叠送进时序网络(3D 卷积或时序注意力)能抓到单帧看不出的不连贯。

工程上常见的是双流/多模态:一路看 RGB 语义,一路看频域或噪声残差(如用 SRM 滤波器提取的噪声痕迹),再融合。对视频再加时序流。

公式视角:检测就是一个带分布偏移的二分类

把检测形式化为学一个分类器 Cϕ(x)[0,1]C_\phi(x)\in[0,1],最小化交叉熵:

L=E(x,y)[ylogCϕ(x)+(1y)log(1Cϕ(x))]\mathcal{L} = -\,\mathbb{E}_{(x,y)}\big[\,y\log C_\phi(x) + (1-y)\log(1 - C_\phi(x))\,\big]

听起来平平无奇,难点全在泛化:训练时见过的伪造方法(比如某个 GAN)的痕迹,换一个新生成器(比如某个扩散模型)后完全不同。这是典型的 out-of-distribution 问题——检测器极易过拟合到"训练里那种伪造的指纹",对没见过的生成方法掉到接近随机。这也是为什么实验室里 99% 准确率的检测器,到野外常常失效。

对抗:为什么这是军备竞赛

  • 生成方主动消除痕迹。一旦"频域网格"被公开当检测特征,生成方就在训练里加频域损失、换上采样方式、加后处理,把谱抹平。眨眼、PPG 等生理痕迹同理,都可被显式建模补上。
  • 对抗样本攻击检测器。检测器是神经网络,本身可被对抗扰动攻击。对伪造图加一个人眼不可见的微小扰动 δ\delta,使 Cϕ(x+δ)C_\phi(x+\delta) 翻转到"真":

δ=argmaxδϵL(Cϕ(x+δ),real)\delta = \arg\max_{\|\delta\|_\infty \le \epsilon} \mathcal{L}\big(C_\phi(x+\delta),\, \text{real}\big)

即把检测器自己的梯度反过来用(FGSM/PGD 思路)。这意味着即便检测器内部正确,攻击者只要能查询/估计它的梯度,就能定向绕过。

  • 真实世界退化抹掉证据。社交平台的重压缩、缩放、加水印、转码,会破坏精细的频域和噪声痕迹——这对检测是噩梦,对伪造者反而是天然掩护。

工程权衡与落地边界

  • 被动检测 vs 主动溯源。被动检测(事后判真假)永远在追赶生成技术。更稳的方向是主动:在采集端就给真实内容签名(C2PA 类的内容来源与真实性凭证、可信硬件签名)。但它需要全链路支持,且只能证明"有签名的是真的",无法证明"没签名的是假的"。
  • 准确率 vs 鲁棒性 vs 可解释。追高准确率容易过拟合特定生成器;要鲁棒就得在多种伪造、多种压缩、多种对抗扰动上训练,代价是单点准确率下降。司法/新闻场景还要求可解释——给出"哪里不一致"的证据,而非一个黑盒分数。
  • 阈值与误报代价不对称。把真人误判为伪造(false positive)在很多场景代价极高(名誉、法律)。部署时阈值要按误报代价校准,并配合人工复核,而不是裸跑模型分数。
  • 数据失衡与时效。伪造技术迭代极快,检测训练集天然滞后。需要持续收集新伪造样本、定期重训,把它当成需要运营的系统,而非一次性模型。

小结

深度伪造的生成(自编码器换脸、GAN、扩散)与检测(空间语义、频域指纹、生理一致性、时序连贯)是紧耦合的对立面:每一个被公开的检测痕迹,都会被生成方在下一轮训练里针对性抹除,检测器本身又可被对抗样本绕过,真实世界的压缩转码还会顺手销毁证据。因此纯被动检测无法一劳永逸,它的核心难题是对未见生成方法的泛化。务实的防线是分层的:主动来源签名 + 多模态鲁棒检测 + 误报代价感知的阈值 + 人工复核 + 持续重训。把它当成一个需要长期运营、随对手进化而进化的对抗系统,而不是一个能"训完就完"的分类器。