生成模型的主要目标是从数据中学习其分布,从而具备“生成”数据的能力。两个关键任务:
换句话说,生成建模不是仅预测标签,而是要建模整个数据的生成过程,使模型能“想象”并产生新的样本。
图示说明了输入图像 x x x 是由真实分布 p ( x ) p(x) p(x) 生成的。我们希望构建一个模型,也能从噪声或潜变量中生成具有相同分布的新样本。
逼真的生成任务
模拟可能的未来规划(如股票市场)
训练生成模型还可以对潜在表征进行推理,这些潜在表征可以作为通用特征
从多个角度说明生成模型的重要性:
生成对抗网络是一种重要的深度生成模型,由两个神经网络组成:
二者的训练过程是一个博弈(对抗)过程。
GAN 的优化目标是一个极小极大问题:
min G max D V ( D , G ) = E x ∼ p d a t a ( x ) [ log D ( x ) ] + E z ∼ p ( z ) [ log ( 1 − D ( G ( z ) ) ) ] \min_G \max_D V(D, G) = \mathbb{E}_{x \sim p_{data}(x)}[\log D(x)] + \mathbb{E}_{z \sim p(z)}[\log(1 - D(G(z)))] minGmaxDV(D,G)=Ex∼pdata(x)[logD(x)]+Ez∼p(z)[log(1−D(G(z)))]
含义如下:
因此,判别器和生成器是两个对手:
当博弈达到平衡时,判别器无法分辨真假图像,即 D ( G ( z ) ) = 0.5 D(G(z)) = 0.5 D(G(z))=0.5。
输入是noise,给到G,generated image + real image data as input,两个输入。D用来做binary classification.
可以将 GAN 的训练比喻为“造假者 vs 警察”的博弈:
生成器和判别器之间的博弈关系形式化为一个极小极大的对抗优化问题:
min G max D V ( D , G ) = E x ∼ p d a t a ( x ) [ log D ( x ) ] + E z ∼ p ( z ) [ log ( 1 − D ( G ( z ) ) ) ] \min_G \max_D V(D, G) = \mathbb{E}_{x \sim p_{data}(x)}[\log D(x)] + \mathbb{E}_{z \sim p(z)}[\log(1 - D(G(z)))] minGmaxDV(D,G)=Ex∼pdata(x)[logD(x)]+Ez∼p(z)[log(1−D(G(z)))]
这个公式表示:
为了求解上述极小极大问题,采用以下 交替更新策略:
固定生成器参数 θ g \theta_g θg,更新判别器参数 θ d \theta_d θd,最大化以下目标:
max θ d [ E x ∼ p d a t a log D θ d ( x ) + E z ∼ p ( z ) log ( 1 − D θ d ( G θ g ( z ) ) ) ] \max_{\theta_d} \left[ \mathbb{E}_{x \sim p_{data}} \log D_{\theta_d}(x) + \mathbb{E}_{z \sim p(z)} \log(1 - D_{\theta_d}(G_{\theta_g}(z))) \right] maxθd[Ex∼pdatalogDθd(x)+Ez∼p(z)log(1−Dθd(Gθg(z)))]
也就是说:
固定判别器参数 θ d \theta_d θd,优化生成器参数 θ g \theta_g θg,最小化如下损失函数:
$ \min_{\theta_g} \mathbb{E}{z \sim p(z)} \log(1 - D{\theta_d}(G_{\theta_g}(z))) $
这个目标使得生成器试图提升 D ( G ( z ) ) D(G(z)) D(G(z)),让判别器认为伪造图像也是真实的,即:
但注意,这一损失可能在训练初期导致梯度消失,因此实际训练中常采用非饱和形式(non-saturating loss):
min θ g − E z ∼ p ( z ) log D θ d ( G θ g ( z ) ) \min_{\theta_g} - \mathbb{E}_{z \sim p(z)} \log D_{\theta_d}(G_{\theta_g}(z)) minθg−Ez∼p(z)logDθd(Gθg(z))
for number of training iterations do
对所有训练轮数重复执行以下步骤(每轮包括 k k k 次判别器更新 + 1 次生成器更新)。
for k steps do
每轮训练中先更新 k k k 次判别器, k k k 是一个超参数(原论文中使用 k = 1 k = 1 k=1,以节省计算资源)。
每次判别器更新包含以下步骤:
采样 m m m 个噪声样本:
$ {z^{(1)}, \dots, z^{(m)}} \sim p_g(z) $
采样 m m m 个真实样本:
$ {x^{(1)}, \dots, x^{(m)}} \sim p_{data}(x) $
更新判别器参数(梯度上升):
∇ θ d 1 m ∑ i = 1 m [ log D ( x ( i ) ) + log ( 1 − D ( G ( z ( i ) ) ) ) ] \nabla_{\theta_d} \frac{1}{m} \sum_{i=1}^{m} \left[ \log D(x^{(i)}) + \log(1 - D(G(z^{(i)}))) \right] ∇θdm1i=1∑m[logD(x(i))+log(1−D(G(z(i))))]
此步骤最大化判别器输出正确分类的概率:真实图像输出高,伪造图像输出低。
end for
采样 m m m 个噪声样本:
$ {z^{(1)}, \dots, z^{(m)}} \sim p_g(z) $
更新生成器参数(梯度下降):
∇ θ g 1 m ∑ i = 1 m log ( 1 − D ( G ( z ( i ) ) ) ) \nabla_{\theta_g} \frac{1}{m} \sum_{i=1}^{m} \log \left(1 - D(G(z^{(i)})) \right) ∇θgm1i=1∑mlog(1−D(G(z(i))))
简单而直观的 1 维高斯分布示例,帮助我们理解 GAN 的对抗训练过程是如何逐步推进的。
图中包括四个子图(a)到(d),展示了生成分布 p g p_g pg 如何逐步接近真实分布 p d a t a p_{data} pdata,以及判别器 D ( x ) D(x) D(x) 的输出如何随着训练而变化。
文中说明如下关键结论:
生成器定义为一个可微分函数:
x = G ( z ; θ ( G ) ) x = G(z; \theta^{(G)}) x=G(z;θ(G))
其中:
我们有来自真实分布 p r p_r pr 的训练数据,目标是训练一个生成模型,使得其输出服从 p g p_g pg,并且有:
p g ≈ p r p_g \approx p_r pg≈pr
也就是说,我们不关心生成器输出的分布公式长什么样,只需要它能“以假乱真”。