在《机器学习方法》中,我们已经对机器学习的生成模型(如朴素贝叶斯,GMM,HMM等)有了基本的认识。而随着神经网络与深度学习的发展,基于神经网络的深度生成模型逐渐兴起,其中的代表便是GAN、VAE与扩散模型。它们也是如今生成式人工智能的重要基石。

当然,神经网络与生成模型的结合最早可以追溯到1986年的RBM(受限玻尔兹曼机)和2006年的DBN(深度信念网络),只不过直到2014年左右GAN与VAE的出现才让深度生成模型为人所熟知。

生成对抗网络(GAN)

生成对抗网络于2014年由Ian Goodfellow等人提出。在其后的十余年里,各种变体不断涌现,成为深度生成模型中的一大家族。

  • 那么什么是GAN?顾名思义,GAN是一种特殊的神经网络,其通过一种称为对抗的方法进行训练,最终目标是生成数据。
    • 具体而言,给定随机向量X∼pX(x)\mathbf{X}\sim p_{\mathbf{X}}(\mathbf{x}),以及随机噪音向量Z∼pZ(z)\mathbf{Z}\sim p_{\mathbf{Z}}(\mathbf{z}), GAN的目标是找到函数GG,使得X~=G(Z)∼pX(x)\tilde{\mathbf{X}}=G(\mathbf{Z})\sim p_{\mathbf{X}}(\mathbf{x})。
    • GAN生成数据可用于生成图片、图片风格转换、图片修补、语音和文本生成等。

模型与算法

  • GAN的具体结构如下:GAN
    其中生成器与判别器都是神经网络,其网络结构属于超参数。

  • 生成器G的任务: 输入随机噪音Z\mathbf{Z}(一个向量,维度为超参),输出假图片G(Z)G(\mathbf{Z}),G(Z)G(\mathbf{Z})的维度和真图片X\mathbf{X}一致。

  • 判别器D的任务: 输入图片(真或假),输出一个00到11之间的标量,判断图片X\mathbf{X}为真图片的概率

  • GAN的优化目标公式为:

    min⁡Gmax⁡DV(G,D)=Ex∼pX(x)[log⁡D(x)]+Ez∼pZ(z)[log⁡(1−D(G(z)))]\min_G \max_D V(G, D) = \mathbb{E}_{\mathbf{x} \sim p_{\mathbf{X}}(\mathbf{x})}[\log D(\mathbf{x})] + \mathbb{E}_{\mathbf{z} \sim p_{\mathbf{Z}}(\mathbf{z})}[\log(1 - D(G(\mathbf{z})))]
    • 对于判别器DD而言:如果输入的图片为真(x∼pX(x)\mathbf{x} \sim p_{\mathbf{X}}(\mathbf{x})),则要求 D(x)D(\mathbf{x}) 越大越好;如果输入的图片为假(G(z)G(\mathbf{z}), z∼pZ(z)\mathbf{z} \sim p_{\mathbf{Z}}(\mathbf{z})),则要求 D(G(z))D(G(\mathbf{z})) 越小越好。
    • 对于生成器GG而言:它的目标是骗过判别器DD,因此优化方向正好与DD相反。
  • 实际上,GAN的优化目标与交叉熵损失函数具有密切联系:

    • 设判别器输入图片X~\tilde{\mathbf{X}}为真图片与生成图片的概率各为12\frac12,并用二元标签YY表示是否为真图片。那么判别器的输出可看作二分类概率预测P(Y=1∣X~)P(Y=1|\tilde{\mathbf{X}}),其对应的交叉熵损失为 H(Y,D(X~))=−E(X~,Y)[Ylog⁡D(X~)+(1−Y)log⁡(1−D(X~))]=−P(Y=1)EX~∼pX(x)[log⁡D(X~)]−P(Y=0)EX~∼pG(x)[log⁡(1−D(X~))]=−12V(G,D)\begin{aligned} H(Y, D(\tilde{\mathbf{X}})) &= -\mathbb{E}_{(\tilde{\mathbf{X}}, Y)} [ Y \log D(\tilde{\mathbf{X}}) + (1 - Y) \log(1 - D(\tilde{\mathbf{X}})) ]\\ &=-P(Y=1)\mathbb{E}_{\tilde{\mathbf{X}} \sim p_{\mathbf{X}}(\mathbf{x})}[\log D(\tilde{\mathbf{X}})]-P(Y=0)\mathbb{E}_{\tilde{\mathbf{X}} \sim p_{G}(\mathbf{x})}[\log(1 - D(\tilde{\mathbf{X}}))]\\ &=-\frac12 V(G,D) \end{aligned}
  • GAN的优化算法步骤如下:

    1. 初始化GG和DD的参数θg\theta_g和θd\theta_d。
    2. 固定GG,利用小批量梯度上升训练DD的参数θd\theta_d。尝试最大化函数 Ex∼pX(x)[log⁡D(x)]+Ez∼pZ(z)[log⁡(1−D(G(z)))]\mathbb{E}_{\mathbf{x} \sim p_\mathbf{X}(\mathbf{x})}[\log D(\mathbf{x})] + \mathbb{E}_{\mathbf{z} \sim p_\mathbf{Z}(\mathbf{z})}[\log(1 - D(G(\mathbf{z})))]
    3. 固定DD,利用小批量梯度上升训练GG的参数θg\theta_g。尝试最大化函数 Ez∼pZ(z)[log⁡D(G(z))]\mathbb{E}_{\mathbf{z} \sim p_\mathbf{Z}(\mathbf{z})}[\log D(G(\mathbf{z}))]
    4. 重复前两步,直到得到满意的结果。

    注意上面第三步中生成器的目标函数里采用了log⁡D(G(z))\log D(G(\mathbf{z}))而不是log⁡(1−D(G(z)))\log(1 - D(G(\mathbf{z}))),这是因为训练开始时,生成的图片质量肯定很差,因G(z)G(\mathbf{z})的取值会接近00。如果用1−log⁡D1-\log D,其在零点附近的梯度比较小,参数更新会比较慢;而log⁡D\log D在零点附近的梯度比较大,参数更新效率更高。

    • 在实际训练中,上述前两步的具体实现如下:
      1. 从真实图片里随机抽取样本{x1,x2,⋯ ,xm}∼pX(x)\{x_1, x_2, \cdots, x_m\} \sim p_\mathbf{X}(\mathbf{x});
        随机抽取噪音样本{z1,z2,⋯ ,zm}∼pZ(z)\{z_1, z_2, \cdots, z_m\} \sim p_\mathbf{Z}(\mathbf{z});
        利用当前固定的生成器GG生成假图片{x~1,x~2,⋯ ,x~m},x~i=G(zi)\{\tilde{x}_1, \tilde{x}_2, \cdots, \tilde{x}_m\}, \tilde{x}_i = G(z_i);
        更新判别器DD的参数θd\theta_d: θd←θd+η×∇θd1m∑i=1m[log⁡D(xi)+log⁡(1−D(x~i))]\theta_d \leftarrow \theta_d + \eta \times \nabla_{\theta_d} \frac{1}{m} \sum_{i=1}^m [\log D(x_i) + \log(1 - D(\tilde{x}_i))] 将上述过程重复kk次。
      2. 随机抽取噪音样本{z1,z2,⋯ ,zm}∼pZ(z)\{z_1, z_2, \cdots, z_m\} \sim p_\mathbf{Z}(\mathbf{z});
        更新生成器GG的参数θg\theta_g: θg←θg+η×∇θg1m∑i=1mlog⁡D(G(zi))\theta_g \leftarrow \theta_g + \eta \times \nabla_{\theta_g} \frac{1}{m} \sum_{i=1}^m \log D(G(z_i))
  • 另外,GAN在训练时会让DD迭代kk次后再迭代GG一次,其具体原因如下:

    • 给定GG情况下确定最优DD:记X~=G(z)\tilde{\mathbf{X}} = G(\mathbf{z})的分布为pG(x)p_G(\mathbf{x}),则

      V(G,D)=∫x[pX(x)log⁡D(x)+pG(x)log⁡(1−D(x))]dxV(G, D) = \int_{\mathbf{x}} [p_{\mathbf{X}}(\mathbf{x})\log D(\mathbf{x}) + p_G(\mathbf{x})\log(1 - D(\mathbf{x}))]\mathrm{d}\mathbf{x}

      为了最大化V(G,D)V(G, D),我们只需要对每个给定的x\mathbf{x},找到D=D(x)D = D(\mathbf{x})使

      f(D)=pX(x)log⁡(D)+pG(x)log⁡(1−D)f(D) = p_{\mathbf{X}}(\mathbf{x})\log(D) + p_G(\mathbf{x})\log(1 - D)

      最大。对f(D)f(D)求一阶导数:

      df(D)dD=pX(x)D−pG(x)1−D=0⇒最优的D∗(x)=pX(x)pX(x)+pG(x)\frac{\mathrm{d}f(D)}{\mathrm{d}D} = \frac{p_{\mathbf{X}}(\mathbf{x})}{D} - \frac{p_G(\mathbf{x})}{1-D} = 0 \Rightarrow \text{最优的} D^*(\mathbf{x}) = \frac{p_{\mathbf{X}}(\mathbf{x})}{p_{\mathbf{X}}(\mathbf{x})+p_G(\mathbf{x})}
    • 在给定D∗D^*的情况下确定最优GG:

      V(G,D∗)=∫x[pX(x)log⁡pX(x)pX(x)+pG(x)+pG(x)log⁡pG(x)pX(x)+pG(x)]dx=∫xpX(x)log⁡pX(x)(pX(x)+pG(x))/2dx+∫xpG(x)log⁡pG(x)(pX(x)+pG(x))/2dx−2log⁡2=KL(pX∥pX+pG2)+KL(pG∥pX+pG2)−2log⁡2=2×JSD(pX∣∣pG)−2log⁡2≥−2log⁡2\begin{aligned} V(G, D^*) &= \int_{\mathbf{x}} \left[ p_{\mathbf{X}}(\mathbf{x})\log \frac{p_{\mathbf{X}}(\mathbf{x})}{p_{\mathbf{X}}(\mathbf{x})+p_G(\mathbf{x})} + p_G(\mathbf{x})\log \frac{p_G(\mathbf{x})}{p_{\mathbf{X}}(\mathbf{x})+p_G(\mathbf{x})} \right]\mathrm{d}\mathbf{x} \\ &= \int_{\mathbf{x}} p_{\mathbf{X}}(\mathbf{x})\log \frac{p_{\mathbf{X}}(\mathbf{x})}{(p_{\mathbf{X}}(\mathbf{x})+p_G(\mathbf{x}))/2}\mathrm{d}\mathbf{x} + \int_{\mathbf{x}} p_G(\mathbf{x})\log \frac{p_G(\mathbf{x})}{(p_{\mathbf{X}}(\mathbf{x})+p_G(\mathbf{x}))/2}\mathrm{d}\mathbf{x} - 2\log 2 \\ &= KL\left(p_{\mathbf{X}} \left\| \frac{p_{\mathbf{X}}+p_G}{2}\right.\right) + KL\left(p_G\left\| \frac{p_{\mathbf{X}}+p_G}{2}\right.\right) - 2\log 2 \\ &= 2 \times JSD(p_{\mathbf{X}} || p_G) - 2\log 2 \ge -2\log 2 \end{aligned}

      等号成立当且仅当pX=pGp_{\mathbf{X}} = p_G,即生成数据的分布恰好等于真实数据的分布。

    • 关于优化顺序:因为我们最终希望生成数据分布与真实数据分布尽量接近,所以最终我们还是希望最小化目标函数,于是算法会先优化DD,再优化GG。

    • 而在实际训练中,在一轮迭代里:

      1. 固定初值G=G0G = G_0,找到D0∗D_0^*使得V(G0,D)V(G_0, D)最大;
      2. 固定D0∗D_0^*,以G0G_0为初值,升级GG:θG←θG−η×∇θgV(G,D0∗)\theta_G \leftarrow \theta_G - \eta \times \nabla_{\theta_g} V(G, D_0^*),得到G1G_1;
      3. 固定G=G1G = G_1,找到D1∗D_1^*使得V(G1,D)V(G_1, D)最大;

      会出现一个问题:V(G1,D1∗)V(G_1,D_1^*)不一定比V(G0,D0∗)V(G_0,D_0^*)小。不过,当G1≈G0G_1\approx G_0时(只作小幅更新),D1∗≈D0∗D_1^*\approx D_0^*,这样基本可以保证V(G1,D1∗)≤V(G0,D0∗)V(G_1,D_1^*)\leq V(G_0,D_0^*)。这便是每轮迭代中DD升级次数比GG多的原因。

GAN的经典变体

上述V(G,D∗)V(G,D^*)计算中涉及到JSJS散度,而当pXp_\mathbf{X}和pGp_G完全分开时:

2×JSD(pX∣∣pG)=∫x:pX(x)>0pX(x)log⁡pX(x)(pX(x)+0)/2dx+∫x:pX(x)>0pG(x)log⁡pG(x)(0+pG(x))/2dx=∫x:pX(x)>0pX(x)log⁡2 dx+∫x:pX(x)>0pG(x)log⁡2 dx=2log⁡2\begin{aligned} 2\times JSD(p_{\mathbf{X}} || p_G)&=\int_{\mathbf{x}:p_{\mathbf{X}}(\mathbf{x})>0} p_{\mathbf{X}}(\mathbf{x})\log \frac{p_{\mathbf{X}}(\mathbf{x})}{(p_{\mathbf{X}}(\mathbf{x})+0)/2}\mathrm{d}\mathbf{x} + \int_{\mathbf{x}:p_{\mathbf{X}}(\mathbf{x})>0} p_G(\mathbf{x})\log \frac{p_G(\mathbf{x})}{(0+p_G(\mathbf{x}))/2}\mathrm{d}\mathbf{x}\\ &=\int_{\mathbf{x}:p_{\mathbf{X}}(\mathbf{x})>0} p_{\mathbf{X}}(\mathbf{x})\log 2\ \mathrm{d}\mathbf{x} + \int_{\mathbf{x}:p_{\mathbf{X}}(\mathbf{x})>0} p_G(\mathbf{x})\log 2\ \mathrm{d}\mathbf{x}\\ &=2\log 2 \end{aligned}

而在训练初期生成分布pGp_G与pXp_{\mathbf{X}}往往基本没有交集,这会导致训练GG时梯度倾向00,训练效率低。

  • 那么将生成器目标函数改回最大化Ez∼pZ(z)[log⁡D(G(z))]\mathbb{E}_{\mathbf{z} \sim p_\mathbf{Z}(\mathbf{z})}[\log D(G(\mathbf{z}))]是否能解决这个问题?此时代入D∗D^*得到

    Ez∼pZ(z)[log⁡D∗(G(z))]=Ex∼pG(x)[log⁡pX(x)pX(x)+pG(x)]=−Ex∼pG(x)[log⁡pG(x)pX(x)]+Ex∼pG(x)[log⁡pG(x)pX(x)+pG(x)]=−KL(pG∥pX)+Ex∼pG(x)[1−D∗(x)]=−KL(pG∥pX)+2×JSD(pX∥pG)−2log⁡2−Ex∼pX(x)[log⁡D∗(x)]\begin{aligned} \mathbb{E}_{\mathbf{z}\sim p_\mathbf{Z}(\mathbf{z})}[\log {D^*}(G(\mathbf{z}))]&= \mathbb{E}_{\mathbf{x}\sim p_G(\mathbf{x})}\left[\log \frac{p_X(\mathbf{x})}{p_X(\mathbf{x}) + p_G(\mathbf{x})}\right] \\ &= -\mathbb{E}_{\mathbf{x}\sim p_G(\mathbf{x})}\left[\log \frac{p_G(\mathbf{x})}{p_X(\mathbf{x})}\right] + \mathbb{E}_{\mathbf{x}\sim p_G(\mathbf{x})}\left[\log \frac{p_G(\mathbf{x})}{p_X(\mathbf{x}) + p_G(\mathbf{x})}\right] \\ &= -KL(p_G \| p_X) + \mathbb{E}_{\mathbf{x}\sim p_G(\mathbf{x})}[1 - D^*(\mathbf{x})] \\ &= -KL(p_G \| p_X) + 2 \times JSD(p_X \| p_G) - 2\log 2 - \mathbb{E}_{\mathbf{x}\sim p_X(\mathbf{x})}[\log \color{green}{D^*}(\mathbf{x})] \end{aligned}

    后面两项与GG无关,因此最大化Ez∼pZ(z)[log⁡D(G(z))]\mathbb{E}_{\mathbf{z} \sim p_\mathbf{Z}(\mathbf{z})}[\log D(G(\mathbf{z}))]等价于最小化

    KL(pG∥pX)−2×JSD(pX∥pG)=∫pG(x)log⁡pG(x)pX(x)dx−2×JSD(pX∥pG)KL(p_G \| p_X) - 2 \times JSD(p_X \| p_G)=\int p_G(\mathbf{x})\log\frac{p_G(\mathbf{x})}{p_{\mathbf{X}}(\mathbf{x})}\mathrm{d}\mathbf{x}- 2 \times JSD(p_X \| p_G) JSJS散度取值范围在00和log⁡2\log 2之间,因此主要考虑KLKL散度。可以发现:$
    • 当pX(x)→0p_\mathbf{X}(\mathbf{x}) \to 0,而pG(x)>0p_G(\mathbf{x}) > 0 时, pG(x)log⁡pG(x)pX(x)→∞\displaystyle p_G(\mathbf{x})\log\frac{p_G(\mathbf{x})}{p_\mathbf{X}(\mathbf{x})} \to \infty。
    • 当pG(x)→0p_G(\mathbf{x}) \to 0 时,pG(x)log⁡pG(x)pX(x)→0\displaystyle p_G(\mathbf{x})\log\frac{p_G(\mathbf{x})}{p_\mathbf{X}(\mathbf{x})} \to 0。

    由此可见,在真实分布接近00的地方,GG生成的分布倾向于也为00(否则KLKL散度会很大);而在真实分布大于00的地方,GG生成的分布就算为00也不会导致KLKL散度很大。也就是说,该目标函数会使得GG倾向于生成一些更保守的样本,而不用管是否覆盖了所有真实分布大于00的点,从而造成模型坍塌的问题。

fGAN

2016年Sebastian Nowozin等人提出fGAN,其核心是用一般的ff-散度代替JSJS散度。ff-散度定义如下:

Df(p∥q)=∫xq(x)f(p(x)q(x))dxD_f(p\| q)=\int_xq(x)f\left(\frac{p(x)}{q(x)}\right)\mathrm{d}x

其中f:R+→Rf:\R^+\to\R是连续凸函数,且f(1)=0f(1)=0。这样其就满足散度的基本性质:

Df(p∥q)=f(∫xq(x)p(x)q(x)dx)=f(1)=0D_f(p\| q)=f\left(\int_xq(x)\frac{p(x)}{q(x)}\mathrm{d}x\right)=f(1)=0

等号成立当且仅当p(x)=q(x)p(x)=q(x)。特别地,

  • 当f(x)=xlog⁡xf(x)=x\log x时,就对应KLKL散度;
  • 当f(x)=−(x+1)log⁡(1+x2)+xlog⁡x\displaystyle f(x)=-(x+1)\log\left(\frac{1+x}{2}\right)+x\log x时,就对应2×JS2\times JS散度。

接下来我们就基于ff-散度从理论上对GAN优化目标进行泛化:【涉及一些凸优化的知识】

  • 首先引入Fenchel共轭概念:对于上述函数ff,其Fenchel共轭函数定义为 f∗(t)=sup⁡x∈dom(f){xt−f(x)}f^*(t) = \sup_{x \in \text{dom}(f)} \{xt - f(x)\} 它也是凸函数,且f(x)=sup⁡t∈dom(f∗){xt−f∗(t)}\displaystyle f(x) = \sup_{t \in dom(f^*)} \{xt - f^*(t)\}(即f∗∗=ff^{**}=f)。将共轭函数代入ff-散度得到: Df(p∥q)=∫xq(x)f(p(x)q(x))dx=∫xq(x)sup⁡t∈dom(f∗){p(x)q(x)t−f∗(t)}dx≥∫xq(x)(p(x)q(x)D(x)−f∗(D(x)))dx∀D(x)=∫xp(x)D(x)−∫xq(x)f∗(D(x))dx=Ex∼p(x)[D(x)]−Ex∼q(x)[f∗(D(x))]\begin{aligned} \mathrm{D}_f(p \| q) &= \int_x q(x)f\left(\frac{p(x)}{q(x)}\right)\mathrm{d}x \\ &= \int_x q(x) \sup_{t \in \text{dom}(f^*)} \left\{ \frac{p(x)}{q(x)}t - f^*(t) \right\} \mathrm{d}x \\ &\ge \int_x q(x) \left( \frac{p(x)}{q(x)}D(x) - f^*(D(x)) \right) \mathrm{d}x \quad \forall D(x) \\ &= \int_x p(x)D(x) - \int_x q(x)f^*(D(x))\mathrm{d}x \\ &= \mathbb{E}_{x \sim p(x)}[D(x)] - \mathbb{E}_{x \sim q(x)}[f^*(D(x))] \end{aligned} 于是我们就得到fGAN的泛化目标函数: min⁡Gmax⁡DV(G,D)=Ex∼pX(x)[D(x)]−Ez∼pZ(z)[f∗(D(G(z)))]\min_{G} \max_{D} V(G, D) = \mathbb{E}_{\mathbf{x} \sim p_\mathbf{X}(\mathbf{x})}[D(\mathbf{x})] - \mathbb{E}_{\mathbf{z} \sim p_\mathbf{Z}(\mathbf{z})}[f^*(D(G(\mathbf{z})))] 对此同样先确定最优的D∗D^*: V(G,D)=∫x[pX(x)D(x)−pG(x)f∗(D(x))]dx=∫xpG(x)[pX(x)pG(x)D(x)−f∗(D(x))]dx\begin{aligned} V(G, D) &= \int_\mathbf{x} [p_\mathbf{X}(\mathbf{x})D(\mathbf{x}) - p_G(\mathbf{x})f^*(D(\mathbf{x}))]\mathrm{d}\mathbf{x} \\ &= \int_\mathbf{x} p_G(\mathbf{x}) \left[ \frac{p_\mathbf{X}(\mathbf{x})}{p_G(\mathbf{x})}D(\mathbf{x}) - f^*(D(\mathbf{x})) \right] \mathrm{d}\mathbf{x} \end{aligned} 在给定x\mathbf{x}时,pX(x)pG(x)D(x)−f∗(D(x))\displaystyle \frac{p_\mathbf{X}(\mathbf{x})}{p_G(\mathbf{x})}D(\mathbf{x}) - f^*(D(\mathbf{x}))的最大值为f(pX(x)pG(x))f\left(\dfrac{p_\mathbf{X}(\mathbf{x})}{p_G(\mathbf{x})}\right),此时D∗(x)=f′(pX(x)pG(x))D^*(\mathbf{x})=f'\left(\dfrac{p_\mathbf{X}(\mathbf{x})}{p_G(\mathbf{x})}\right)。
    因此 ∫xpG(x)f(pX(x)pG(x))dx=Df(pX(x)∣∣pG(x))≥0\int_{\mathbf{x}} p_G(\mathbf{x}) f\left(\frac{p_\mathbf{X}(\mathbf{x})}{p_G(\mathbf{x})}\right) \mathrm{d}\mathbf{x} = \mathrm{D}_f(p_\mathbf{X}(\mathbf{x}) || p_G(\mathbf{x})) \geq 0 等号成立当且仅当pX(x)=pG(x)p_\mathbf{X}(\mathbf{x}) = p_G(\mathbf{x})。
  • fGAN原始论文给出了部分散度的对应的ff-散度函数形式:
    名称 Df(P∣Q)D_f(P | Q) 生成函数 f(u)f(u)
    Kullback-Leibler ∫p(x)log⁡p(x)q(x)dx\displaystyle\int p(x) \log \frac{p(x)}{q(x)} \mathrm{d}x ulog⁡uu \log u
    Reverse KL ∫q(x)log⁡q(x)p(x)dx\displaystyle\int q(x) \log \frac{q(x)}{p(x)} \mathrm{d}x −log⁡u-\log u
    Pearson χ2\chi^2 ∫(q(x)−p(x))2p(x)dx\displaystyle\int \frac{(q(x)-p(x))^2}{p(x)} \mathrm{d}x (u−1)2(u-1)^2
    Squared Hellinger ∫(p(x)−q(x))2dx\displaystyle\int \left(\sqrt{p(x)} - \sqrt{q(x)}\right)^2 \mathrm{d}x (u−1)2(\sqrt{u}-1)^2
    Jensen-Shannon 12∫p(x)log⁡2p(x)p(x)+q(x)+q(x)log⁡2q(x)p(x)+q(x)dx\displaystyle\frac{1}{2} \int p(x) \log \frac{2p(x)}{p(x)+q(x)} + q(x) \log \frac{2q(x)}{p(x)+q(x)} \mathrm{d}x −(u+1)log⁡1+u2+ulog⁡u\displaystyle -(u+1) \log \frac{1+u}{2} + u \log u
    GAN ∫p(x)log⁡2p(x)p(x)+q(x)+q(x)log⁡2q(x)p(x)+q(x)dx−log⁡(4)\displaystyle\int p(x) \log \frac{2p(x)}{p(x)+q(x)} + q(x) \log \frac{2q(x)}{p(x)+q(x)} \mathrm{d}x - \log(4) ulog⁡u−(u+1)log⁡(u+1)u \log u - (u+1) \log(u+1)

Wasserstein GAN(WGAN)

2017年Martin Arjovsky等人提出的Wasserstein GAN则通过定义一种新的分布距离来替代JSJS散度。

  • 具体而言,其提出Wasserstein距离(对于离散分布,也称为推土机距离),其示意图如下:WGAN histogram
    也就是说,Wasserstein距离就是让生成分布通过“移土”转换为真实分布需要的最小(距离加权)移土量。

    • 那么这个最小移土量如何计算呢?实际上,可以使用一个矩阵γ\gamma表示一个移土方案,其中位置(p,q)(p,q)的元素表示从位置xpx_p向位置xqx_q移动的土量。这样,总移土量可以表示为 B(γ)=∑xp,xqγ(xp,xq)∥xp−xq∥B(\gamma)=\sum_{x_p,x_q}\gamma(x_p,x_q)\|x_p-x_q\| 而最小移土量(Wasserstein距离)则定义为 W(P,Q)=min⁡γ∈ΠB(γ)W(P,Q)=\min_{\gamma\in\Pi}B(\gamma) 其中Π\Pi表示所有移土方案。
  • Wasserstein距离相比JSJS散度的好处在于它对分布差异更敏感,在训练初期可以更有效地引导生成分布向真实分布靠近。

  • 那么在WGAN中到底是如何计算pGp_G和pXp_\mathbf{X}的Wasserstein距离的呢?通过一些理论推导(主要是Kantorovich-Rubinstein 对偶定理),我们可以得到下述判别器的目标函数(GG的目标函数就是基于此对GG的最小化):

    max⁡D∈1-Lipschitz{Ex∼PX[D(x)]−Ex∼PG[D(x)]}\max_{D \in 1\text{-Lipschitz}} \{ \mathbb{E}_{\mathbf{x} \sim P_\mathbf{X}}[D(\mathbf{x})] - \mathbb{E}_{\mathbf{x} \sim P_G}[D(\mathbf{x})] \}

    这里的1-Lipschitz1\text{-Lipschitz}表示一阶利普希茨条件,即∥D(x1)−D(x2)∥≤∥x1−x2∥\|D(\mathbf{x}_1)-D(\mathbf{x}_2)\|\leq\|\mathbf{x}_1-\mathbf{x}_2\|。这可以让函数更平滑,变化不那么快。

    比较直观的理解:如果没有这个利普希茨条件,对上述函数的优化可能会让DD在真实分布上趋向正无穷,而在生成分布上趋于负无穷,导致收敛失败。

    那么这个利普希茨条件具体如何实现呢?WGAN原始论文中的方法比较直接:使用权重截断,当参数绝对值超过阈值时就收缩到阈值。

    • 而随后另一篇论文(WGAN-GP)提出使用梯度惩罚实现这个条件: max⁡D{Ex∼PX[D(x)]−Ex∼PG[D(x)]−λEx∼Ppenalty[max⁡(0,∥∇xD(x)∥−1)]}\max_{D} \{ \mathbb{E}_{\mathbf{x} \sim P_{\mathbf{X}}}[D(\mathbf{x})] - \mathbb{E}_{\mathbf{x} \sim P_G}[D(\mathbf{x})] - \lambda \mathbb{E}_{\mathbf{x} \sim P_{\text{penalty}}} [\max(0, \|\nabla_{\mathbf{x}} D(\mathbf{x})\| - 1)] \} 这里的PpenaltyP_{\text{penalty}}分布设定为PGP_G波峰与PXP_{\mathbf{X}}波峰之间的区域(即DD变化较剧烈的区域)。

      当然原始WGAN-GP论文里惩罚项用的是λEx∼Ppenalty[(∥∇xD(x)∥−1)2]\lambda \mathbb{E}_{\mathbf{x} \sim P_{\text{penalty}}} [(\|\nabla_{\mathbf{x}} D(\mathbf{x})\| - 1)^2],不过上面的Hinge惩罚相比这个平方项会让模型收敛更快,能够得到更好的最优解;另一方面,2018年又有人提出SNGAN,其效果通常比WGAN-GP更好。

DCGAN

上述变体都是对目标损失函数进行改进,而早在2015年,Alec Radford等人提出的DCGAN给出了另一个改进方向:优化GG和DD的网络结构。具体而言,DCGAN中生成器和判别器都使用卷积神经网络,而生成器GG使用一种称为“分数阶卷积”(也称为反卷积或转置卷积)层代替池化层。下面详细解释反卷积层的原理:

  • 在常规卷积中,输出尺寸ii与输入尺寸oo间的转换公式为:o=i+2p−ks+1o=\dfrac{i+2p-k}{s}+1(pp为填充,kk为卷积核大小,ss为步长),而反卷积就是将ii与oo进行调换:o=s(i−1)−2p+ko=s(i-1)-2p+k
  • 下面我们用矩阵对卷积进行表示:设输入与卷积核矩阵如下 input=[x1x2x3x4x5x6x7x8x9x10x11x12x13x14x15x16]kernel=[w0,0w0,1w0,2w1,0w1,1w1,2w2,0w2,1w2,2]\text{input} = \begin{bmatrix} x_1 & x_2 & x_3 & x_4 \\ x_5 & x_6 & x_7 & x_8 \\ x_9 & x_{10} & x_{11} & x_{12} \\ x_{13} & x_{14} & x_{15} & x_{16} \end{bmatrix} \qquad \text{kernel} = \begin{bmatrix} w_{0,0} & w_{0,1} & w_{0,2} \\ w_{1,0} & w_{1,1} & w_{1,2} \\ w_{2,0} & w_{2,1} & w_{2,2} \end{bmatrix} 那么输出就是一个2×22\times 2矩阵。现在将输入与输出矩阵展平为向量: X=input=[x1x2x3x4x5x6x7x8x9x10x11x12x13x14x15x16]⊤Y=output=[y1y2y3y4]⊤\begin{aligned} X=\text{input} &= [x_1 \quad x_2 \quad x_3 \quad x_4 \quad x_5 \quad x_6 \quad x_7 \quad x_8 \quad x_9 \quad x_{10} \quad x_{11} \quad x_{12} \quad x_{13} \quad x_{14} \quad x_{15} \quad x_{16}]^\top\\ Y=\text{output} &= [y_1 \quad y_2 \quad y_3 \quad y_4]^\top \end{aligned} 这样输出向量与输入向量的关系可以用Y=CXY=CX表示,其中 C=[w0,0w0,1w0,20w1,0w1,1w1,20w2,0w2,1w2,2000000w0,0w0,1w0,20w1,0w1,1w1,20w2,0w2,1w2,200000000w0,0w0,1w0,20w1,0w1,1w1,20w2,0w2,1w2,2000000w0,0w0,1w0,20w1,0w1,1w1,20w2,0w2,1w2,2]C = \begin{bmatrix} w_{0,0} & w_{0,1} & w_{0,2} & 0 & w_{1,0} & w_{1,1} & w_{1,2} & 0 & w_{2,0} & w_{2,1} & w_{2,2} & 0 & 0 & 0 & 0 & 0 \\ 0 & w_{0,0} & w_{0,1} & w_{0,2} & 0 & w_{1,0} & w_{1,1} & w_{1,2} & 0 & w_{2,0} & w_{2,1} & w_{2,2} & 0 & 0 & 0 & 0 \\ 0 & 0 & 0 & 0 & w_{0,0} & w_{0,1} & w_{0,2} & 0 & w_{1,0} & w_{1,1} & w_{1,2} & 0 & w_{2,0} & w_{2,1} & w_{2,2} & 0 \\ 0 & 0 & 0 & 0 & 0 & w_{0,0} & w_{0,1} & w_{0,2} & 0 & w_{1,0} & w_{1,1} & w_{1,2} & 0 & w_{2,0} & w_{2,1} & w_{2,2} \end{bmatrix} 而反卷积的关系就可以用X=C⊤YX=C^\top Y表示。
  • 当然,反卷积还可以直接通过常规卷积表示:将输出矩阵进行填充,并将卷积核矩阵中心旋转得到 input=[00000000000000y1y20000y3y400000000000000]kernel=[w2,2w2,1w2,0w1,2w1,1w1,0w0,2w0,1w0,0]\text{input} = \begin{bmatrix} 0 & 0 & 0 & 0 & 0 & 0 \\ 0 & 0 & 0 & 0 & 0 & 0 \\ 0 & 0 & y_1 & y_2 & 0 & 0 \\ 0 & 0 & y_3 & y_4 & 0 & 0 \\ 0 & 0 & 0 & 0 & 0 & 0 \\ 0 & 0 & 0 & 0 & 0 & 0 \end{bmatrix} \qquad \text{kernel} = \begin{bmatrix} w_{2,2} & w_{2,1} & w_{2,0} \\ w_{1,2} & w_{1,1} & w_{1,0} \\ w_{0,2} & w_{0,1} & w_{0,0} \end{bmatrix} 这样再进行卷积就得到反卷积的结果。
  • DCGAN里生成器的实际架构图如下:DCGAN
    每一层参数分别为:
    • CONV1:i=4,o=8,k=5,s=2,p=2i=4,o=8,k=5,s=2,p=2
    • CONV2:i=8,o=16,k=5,s=2,p=2i=8,o=16,k=5,s=2,p=2
    • CONV3:i=16,o=32,k=5,s=2,p=2i=16,o=32,k=5,s=2,p=2
    • CONV4:i=32,o=64,k=5,s=2,p=2i=32,o=64,k=5,s=2,p=2

Cycle GAN

上面我们提到的GAN及其变体都主要用于生成与指定目标近似的数据(如图片),这本质可看作一种监督学习。那么GAN是否能够用于无监督学习任务,比如图像风格转换呢?2017年朱俊彦等人提出的Cycle GAN就解决了这个问题。

  • 对于图像风格转换任务,如果直接沿用GAN结构,让替换生成器输入为原始图片样本,而目标风格图片集合作为真实样本,那么训练后生成器往往无法保留原始图片的信息。
  • Cycle GAN提出的方案可以用论文的这张图表示:CycleGAN
    具体而言,就是在原有GAN的基础上再加入一个生成器,负责将生成的图片转换为原始风格图片。这样训练目标就是让两次生成后的图片与原始图片尽量接近(即图中的cycle-consistency)。
  • Cycle GAN训练的优化目标函数如下: min⁡GX→Y,GY→Xmax⁡DX,DY{LGAN(GX→Y,DY,X,Y)+LGAN(GY→X,DX,X,Y)+λLcyc(GX→Y,GY→X)}\min_{G_{X \to Y}, G_{Y \to X}} \max_{D_X, D_Y} \{ L_{GAN}(G_{X \to Y}, D_Y, X, Y) + L_{GAN}(G_{Y \to X}, D_X, X, Y) + \lambda L_{cyc}(G_{X \to Y}, G_{Y \to X}) \} 其中 LGAN(GX→Y,DY,X,Y)=Ey∼pY(y)[log⁡DY(y)]+Ex∼pX(x)[log⁡(1−DY(GX→Y(x)))]LGAN(GY→X,DX,X,Y)=Ex∼pX(x)[log⁡DX(x)]+Ey∼pY(y)[log⁡(1−DX(GY→X(y)))]Lcyc(GX→Y,GY→X)=Ex∼pX(x)[∥GY→X(GX→Y(x))−x∥1]+Ey∼pY(y)[∥GX→Y(GY→X(y))−y∥1]\begin{aligned} L_{GAN}(G_{X \to Y}, D_Y, X, Y) &= \mathbb{E}_{y \sim p_Y(y)}[\log D_Y(y)] + \mathbb{E}_{x \sim p_X(x)}[\log(1 - D_Y(G_{X \to Y}(x)))] \\ L_{GAN}(G_{Y \to X}, D_X, X, Y) &= \mathbb{E}_{x \sim p_X(x)}[\log D_X(x)] + \mathbb{E}_{y \sim p_Y(y)}[\log(1 - D_X(G_{Y \to X}(y)))] \\ L_{cyc}(G_{X \to Y}, G_{Y \to X}) &= \mathbb{E}_{x \sim p_X(x)}[\|G_{Y \to X}(G_{X \to Y}(x)) - x\|_1] + \mathbb{E}_{y \sim p_Y(y)}[\|G_{X \to Y}(G_{Y \to X}(y)) - y\|_1] \end{aligned}

条件GAN(CGAN)

那么GAN能否用于生成指定内容的图片呢(如Text-to-image任务)?2014年(在GAN提出仅仅5个月后)Mehdi Mirza等提出的CGAN就实现了这一点。具体而言,

  • CGAN在GAN的生成器与判别器输入上分别加上条件(生成目标文字)数据cc,同时获取真实的文字-图片配对数据样本。
  • 生成的图片x=G(c,z)\mathbf{x}=G(c,\mathbf{z})与真实的文字-图片对送入判别器时,判别器会同时判断生成图片与真实图片是否有明显差异,以及生成图片和输入标签是否对应。只有真实且匹配的图片判别器才应该打高分。
    • 判别器训练的目标函数可以表示为 V~=1m∑i=1mlog⁡D(ci,xi)+1m∑i=1mlog⁡(1−D(ci,x~i))+1m∑i=1mlog⁡(1−D(ci,x^i))\tilde{V} = \frac{1}{m} \sum_{i=1}^{m} \log D(c^i, x^i) + \frac{1}{m} \sum_{i=1}^{m} \log (1 - D(c^i, \tilde{x}^i)) + \frac{1}{m} \sum_{i=1}^{m} \log (1 - D(c^i, \hat{x}^i)) 相应地,生成器训练目标函数则可表示为 V~=1m∑i=1mlog⁡(D(G(ci,zi)))\tilde{V} = \frac{1}{m} \sum_{i=1}^{m} \log \left( D \left( G(c^i, z^i) \right) \right)

SGAN与Triple GAN

  • 当然,CGAN需要大量有标注的图像数据,这在现实中成本较高。因此在现实中往往是采用半监督学习的方法,即只有一部分图像数据有标注。这便是SGAN(2016年由Augustus Odena提出),其损失函数为 L=Lsupervised+Lunsupervised=−Ex,y∼pdata(x,y)log⁡pmodel(y∣x,y<K+1)−{Ex∼pdata(x)log⁡D(x)+Ez∼noiselog⁡(1−D(G(z)))}\begin{aligned} L &= L_{\text{supervised}} + L_{\text{unsupervised}}\\ &=-\mathbb{E}_{\boldsymbol{x}, y \sim p_{\text{data}}(\boldsymbol{x}, y)} \log p_{\text{model}}(y|\boldsymbol{x}, y < K + 1)-\left\{ \mathbb{E}_{\boldsymbol{x} \sim p_{\text{data}}(\boldsymbol{x})} \log D(\boldsymbol{x}) + \mathbb{E}_{\boldsymbol{z} \sim \text{noise}} \log(1 - D(G(\boldsymbol{z}))) \right\} \end{aligned} 其中D(x)=1−pmodel(y=K+1∣x)D(\boldsymbol{x}) = 1 - p_{\text{model}}(y = K + 1|\boldsymbol{x})。
  • 上述原始SGAN结构实际上无法进行条件生成(它主要用于图像多分类任务),李崇轩等人与2017提出的Triple GAN就解决了这一问题。其具体架构如下:TripleGAN
    其中(Xl,YL)∼p(X,Y)(X_l,Y_L)\sim p(X,Y)表示标注数据(数据与label均为真),XC∼p(X)X_C\sim p(X)表示无标注数据,pc(X,Y)p_c(X,Y)表示真图片、假label的分布,pg(X,Y)p_g(X,Y)则表示图片与label均为假的分布。
    • 可以看到,相比GAN,Triple GAN引入了一个新的对抗方:分类器CC,它的目标是基于图片XX尽量预测出准确的标签,让判别器DD无法区分。【这与生成器GG基于类别生成图片形成对照】
    • Triple GAN的训练目标函数如下: min⁡C,Gmax⁡DU(C,G,D)=E(x,y)∼p(x,y)[log⁡D(x,y)]+αE(x,y)∼pc(x,y)[log⁡(1−D(x,y))]+(1−α)E(x,y)∼pg(x,y)[log⁡(1−D(G(y,z),y))]\min_{C,G} \max_{D} U(C, G, D) = \mathbb{E}_{(x,y)\sim p(x,y)}[\log D(x,y)] + \alpha \mathbb{E}_{(x,y)\sim p_c(x,y)}[\log(1 - D(x,y))] + (1 - \alpha)\mathbb{E}_{(x,y)\sim p_g(x,y)}[\log(1 - D(G(y,z), y))] 简单解释:第一项是让判别器把真实数据判为真,第二项是判别器要对带假label的真图片判为假,第三项是对生成器构造的假label假图片判为假。
    • 对于上述目标函数,在给定CC和GG的条件下,可以考虑将pcp_c和pGp_G合并为一个混合分布pα≜(1−α)pg+αpcp_\alpha\triangleq(1-\alpha)p_g+\alpha p_c,那么目标函数可以转化为 U(C,G,D)=∬p(x,y)log⁡D(x,y)dydx+(1−α)∬p(y)pz(z)log⁡(1−D(G(z,y),y))dydz+α∬p(x)pc(y∣x)log⁡(1−D(x,y))dydx=∬p(x,y)log⁡D(x,y)dydx+∬pα(x,y)log⁡(1−D(x,y))dydx\begin{aligned} U(C, G, D) &= \iint p(x,y) \log D(x,y)\mathrm{d}y\mathrm{d}x + (1 - \alpha) \iint p(y)p_z(z) \log(1 - D(G(z,y),y))\mathrm{d}y\mathrm{d}z \\ &\quad + \alpha \iint p(x)p_c(y|x) \log(1 - D(x,y))\mathrm{d}y\mathrm{d}x \\ &= \iint p(x,y) \log D(x,y)\mathrm{d}y\mathrm{d}x + \iint p_\alpha(x,y) \log(1 - D(x,y))\mathrm{d}y\mathrm{d}x \end{aligned} 这与GAN的形式类似,于是得到DC,G∗(x,y)=p(x,y)p(x,y)+pα(x,y)D^*_{C,G}(x,y) = \dfrac{p(x,y)}{p(x,y) + p_\alpha(x,y)}。将其代回U(C,G,D)U(C,G,D)会发现只剩下p(x,y)p(x,y)和pα(x,y)p_\alpha(x,y)间的散度,因此无法保证pc(x,y)=pg(x,y)p_c(x,y)=p_g(x,y)。
      • 为解决这一问题,考虑在目标函数上增加一项RL=E(x,y)∼p(x,y)[−log⁡pc(y∣x)]\mathcal{R}_\mathcal{L}=\mathbb{E}_{(x,y)\sim p(x,y)}[-\log p_c(y|x)]。可以证明,最小化RL\mathcal{R}_\mathcal{L}等价于最小化KL(p(x,y)∥pc(x,y))KL(p(x,y)\|p_c(x,y)),且RL\mathcal{R}_\mathcal{L}与DD无关,所以这样就能让最优解满足p(x,y)=pc(x,y)=pg(x,y)p(x,y)=p_c(x,y)=p_g(x,y)。
      • 当然,在实际的Triple GAN训练中,还会另外增加一项αPRP=αPEpg[−log⁡pc(y∣x)]\alpha_\mathcal{P}\mathcal{R}_{\mathcal{P}}=\alpha_\mathcal{P}\mathbb{E}_{p_g}[-\log p_c(y|x)],这可以防止生成器GG出现模型坍塌。

变分自编码器(VAE)

生成模型的另一个方向是先将数据编码为潜空间分布(作为近似后验),再从先验分布采样,经过解码器生成数据。这一思想可以最早追溯到1986年Hinton团队提出的反向传播论文,在2006年通过Deep AE基本确定架构,最终到2013~14年由Kingma与Welling提出变分自编码器VAE,在深度生成模型里占据一席之地。

  • 自编码器的本质是一种自监督学习方法,通过一个编码器和一个解码器(通常为神经网络),将数据转化为向量(一般为低维),再从向量重建数据。【这里的向量也可看作数据的嵌入或表示】
    • 自编码器的训练目标是让输出x^\hat{x}与原始输入xx尽量接近,损失函数可表示为

      L(x,x^)=∥x−x^∥22=∥x−dϕ(z)∥22=∥x−dϕ(eθ(x))∥22L(x,\hat{x})=\|x-\hat{x}\|_2^2=\|x-d_{\phi}(z)\|_2^2=\|x-d_{\phi}(e_{\theta}(x))\|_2^2
    • 自编码器存在的问题包括:

      • AE模型容易过拟合,泛化性能不好。
      • 对于一个训练好的AE,输入某个图片,只会将其编码成某个固定嵌入向量;而输入某个确定的嵌入向量,只会输出确定的图片。
      • 如果某隐向量来自于训练集没有见过的图片,那么生成的图片可能不好。

      实际上,在VAE提出之前,自编码器只要还是用于数据的压缩(降维)与恢复,并不适用于生成数据。

  • VAE在自编码器的基础上还吸收了EM算法与变分推断的思想。关于EM算法和变分推断的基本概念可以参见机器学习方法 Ch.15 概率模型估计方法,这里不再赘述。
    • VAE的基本架构图如下(图源蒲公英书):VAE
      其中编码器用于估计变分分布q(z∣x;ϕ)q(\mathbf{z}|\mathbf{x};\phi),解码器则基于变分分布中采样的z\mathbf{z}估计条件分布p(x∣z;θ)p(\mathbf{x}|\mathbf{z};\theta)。
    • 推断网络(编码器)的目标函数为: ϕ∗=arg min⁡ϕKL(q(z∣x;ϕ)∣∣p(z∣x;θ))=arg max⁡ϕL(q,x;θ,ϕ)\phi^* = \argmin_{\phi} KL(q(\mathbf{z}|x; \phi) || p(\mathbf{z}|x; \theta)) = \argmax_{\phi} L(q, x; \theta, \phi) 推导提示: log⁡p(x)=L(q,x;θ,ϕ)+KL(q(z∣x;ϕ)∣∣p(z∣x;θ))L(q,x;θ,ϕ)=Ez∼q(z∣x;ϕ)[log⁡p(x,z;θ)q(z∣x;ϕ)]\begin{aligned} \log p(\mathbf{x}) &= L(q, \mathbf{x}; \theta, \phi) + KL(q(\mathbf{z}|\mathbf{x}; \phi) || p(\mathbf{z}|\mathbf{x}; \theta))\\ L(q, \mathbf{x}; \theta, \phi)&= \mathbb{E}_{\mathbf{z} \sim q(\mathbf{z}|\mathbf{x}; \phi)} \left[ \log \frac{p(\mathbf{x}, \mathbf{z}; \theta)}{q(\mathbf{z}|\mathbf{x}; \phi)} \right] \end{aligned}
    • 同理,生成网络(解码器)的目标(极大似然估计): θ∗=arg max⁡θEz∼q(z∣x;ϕ)[log⁡p(x,z;θ)]=arg max⁡θL(q,x;θ,ϕ)\theta^* = \argmax_{\theta} \mathbb{E}_{\mathbf{z} \sim q(\mathbf{z}|\mathbf{x}; \phi)} [\log p(\mathbf{x}, \mathbf{z}; \theta)] = \argmax_{\theta} L(q, \mathbf{x}; \theta, \phi) 实际上,上述优化编码器与解码器的过程恰好对应EM算法的E步与M步。由此可得VAE的总目标函数为 max⁡θ,ϕL(q,x;θ,ϕ)=max⁡θ,ϕEz∼q(z∣x;ϕ)[log⁡p(x∣z;θ)p(z)q(z∣x;ϕ)]=max⁡θ,ϕEz∼q(z∣x;ϕ)[log⁡p(x∣z;θ)]−KL(q(z∣x;ϕ)∣∣p(z))\begin{aligned} \max_{\theta,\phi} L(q, \mathbf{x}; \theta, \phi) &= \max_{\theta,\phi}\mathbb{E}_{\mathbf{z}\sim q(\mathbf{z}|\mathbf{x};\phi)} \left[ \log \frac{p(\mathbf{x}|\mathbf{z};\theta)p(\mathbf{z})}{q(\mathbf{z}|\mathbf{x};\phi)} \right] \\ &= \max_{\theta,\phi} \mathbb{E}_{\mathbf{z}\sim q(\mathbf{z}|\mathbf{x};\phi)}[\log p(\mathbf{x}|\mathbf{z};\theta)] - KL(q(\mathbf{z}|\mathbf{x};\phi)||p(\mathbf{z})) \end{aligned}
    • 注意到上述目标函数里涉及到对z\mathbf{z}的随机采样,这导致解码器梯度难以反向传播到编码器。对此,VAE的解决方案是进行重参数化:
      • 令z=μz+σz⊙ϵ,ϵ∼N(0,I)\mathbf{z} = \mu_{\mathbf{z}} + \sigma_{\mathbf{z}} \odot \epsilon, \quad \epsilon \sim N(0, I),这样z∼q(z∣x;ϕ)=N(μz,diag(σz2))\mathbf{z} \sim q(\mathbf{z}|\mathbf{x}; \phi) = N(\mu_\mathbf{z}, \text{diag}(\sigma_\mathbf{z}^2)),其中[μzσz2]=fI(x,ϕ)\begin{bmatrix} \mu_\mathbf{z} \\ \sigma_\mathbf{z}^2 \end{bmatrix} = f_I(\mathbf{x}, \phi) 由推断网络(编码器)来进行建模。
      • 另外假设先验分布p(z)=N(0,I)p(\mathbf{z}) = N(0, I),这样我们就能将KL散度重新写为 −KL(q(z∣x;ϕ)∣∣p(z))=−KL(N(μz,diag(σz2))∣∣N(0,I))=12∑j=1J(1+log⁡σzj2−μzj2−σzj2)\begin{aligned} -KL(q(\mathbf{z}|\mathbf{x}; \phi) || p(\mathbf{z}))&=-KL\left(N\left(\mu_\mathbf{z}, \text{diag}(\sigma_\mathbf{z}^2)\right) || N(0, I)\right)\\ &=\frac{1}{2} \sum_{j=1}^J \left(1 + \log \sigma_{\mathbf{z}j}^2 - \mu_{\mathbf{z}j}^2 - \sigma_{\mathbf{z}j}^2\right) \end{aligned} 其中JJ为z\mathbf{z}的维度,μzj\mu_{\mathbf{z}j}和σzj2\sigma_{\mathbf{z}j}^2分别为μz\mu_\mathbf{z}和σz2\sigma_\mathbf{z}^2的第jj个分量。
  • 最终我们得到VAE的训练过程:
    1. 从N(0,I)N(\mathbf{0}, \mathbf{I})中随机抽出样本ϵ1,ϵ2,⋯ ,ϵM\boldsymbol{\epsilon}_1, \boldsymbol{\epsilon}_2, \cdots, \boldsymbol{\epsilon}_M

    2. 计算zm=μz+σz⊙ϵm\mathbf{z}_m = \boldsymbol{\mu}_\mathbf{z} + \boldsymbol{\sigma}_\mathbf{z} \odot \boldsymbol{\epsilon}_m

    3. 计算Ez∼q(z∣x;ϕ)[log⁡p(x∣z;θ)]≈1M∑m=1Mlog⁡p(x∣zm;θ)\displaystyle\mathbb{E}_{\mathbf{z} \sim q(\mathbf{z}|\mathbf{x};\phi)}[\log p(\mathbf{x}|\mathbf{z}; \theta)] \approx \frac{1}{M} \sum_{m=1}^M \log p(\mathbf{x}|\mathbf{z}_m; \theta)

    4. 目标函数近似表达为

      1M∑m=1Mlog⁡p(x∣zm;θ)+12∑j=1J(1+log⁡σzj2−μzj2−σzj2)\frac{1}{M} \sum_{m=1}^M \log p(\mathbf{x}|\mathbf{z}_m; \theta) + \frac{1}{2} \sum_{j=1}^J (1 + \log \sigma_{\mathbf{z}j}^2 - \mu_{\mathbf{z}j}^2 - \sigma_{\mathbf{z}j}^2)

      其中[μzσz2]=fI(x,ϕ)\begin{bmatrix} \mu_\mathbf{z} \\ \sigma_\mathbf{z}^2 \end{bmatrix} = f_I(\mathbf{x}, \phi)来自于编码器,p(x∣zm;θ)p(\mathbf{x}|\mathbf{z}_m; \theta)为解码器。

    5. 给定样本x1,x2,⋯ ,xn\mathbf{x}_1, \mathbf{x}_2, \cdots, \mathbf{x}_n,利用随机梯度上升来求解。

  • 最后总结下VAE的特点:
    • 将潜在变量的条件强制为单位范数,压缩形式是潜在变量的均值和方差;
    • 潜在变量是平滑连续的,且其随机值在解码器产生有意义的输出;
    • 解码器的输入是从具有编码器输出均值和方差的高斯中采样的随机值;
    • 正则化的潜在空间,具有生成能力。

扩散模型

在介绍扩散模型前,先引入前向和反向扩散过程:

  • 前向扩散过程可以理解为:从一张图片开始,逐步加入随机噪音,最终得到纯高斯噪音图片。其数学形式为: q(xt∣xt−1)=N(xt;αtxt−1,(1−αt)I)q(\mathbf{x}_t \mid \mathbf{x}_{t-1}) = N(\mathbf{x}_t; \sqrt{\alpha_t}\mathbf{x}_{t-1}, (1 - \alpha_t)\mathbf{I}) 由此可以推导出xt∣x0\mathbf{x}_t\mid\mathbf{x_0}的分布: xt∣x0∼N(αˉtx0,(1−αˉt)I)\mathbf{x}_t \mid \mathbf{x}_0 \sim N(\sqrt{\bar{\alpha}_t} \mathbf{x}_0, (1 - \bar{\alpha}_t) \mathbf{I}) 其中αˉt=α1α2⋯αt \bar{\alpha}_t = \alpha_1 \alpha_2 \cdots \alpha_t。由此可知,当t→∞t\to\infty时,xt∣x0⟶dN(0,I)\mathbf{x}_t\mid\mathbf{x}_0\stackrel{d}{\longrightarrow}N(0,\mathbf{I})。
  • 反向扩散过程则恰好与前向扩散过程相反,相当于从噪音图片逐渐还原出图像。由上述公式可以推出: q(xt−1∣xt,x0)=q(xt∣xt−1,x0)q(xt−1∣x0)q(xt∣x0)=N(xt;αtxt−1,(1−αt)I)N(xt−1;αˉt−1x0,(1−αˉt−1)I)N(xt;αˉtx0,(1−αˉt)I)∝exp⁡{−12[(xt−αtxt−1)21−αt+(xt−1−αˉt−1x0)21−αˉt−1]}=exp⁡{−12[(αt1−αt+11−αˉt−1)xt−12−2(αtxt1−αt+αˉt−1x01−αˉt−1)xt−1]}∝N(xt−1;αt(1−αˉt−1)xt+αˉt−1(1−αt)x01−αˉt⏟μq(xt,x0),(1−αt)(1−αˉt−1)1−αˉtI⏟Σq(t))\begin{aligned} q(x_{t-1}\mid x_t, x_0) &= \frac{q(x_t\mid x_{t-1}, x_0)q(x_{t-1}\mid x_0)}{q(x_t\mid x_0)} \\ &= \frac{N(x_t; \sqrt{\alpha_t}x_{t-1}, (1 - \alpha_t)\mathbf{I})N(x_{t-1}; \sqrt{\bar{\alpha}_{t-1}}x_0, (1 - \bar{\alpha}_{t-1})\mathbf{I})}{N(x_t; \sqrt{\bar{\alpha}_t}x_0, (1 - \bar{\alpha}_t)\mathbf{I})} \\ &\propto \exp\left\{ -\frac{1}{2} \left[ \frac{(x_t - \sqrt{\alpha_t}x_{t-1})^2}{1 - \alpha_t} + \frac{(x_{t-1} - \sqrt{\bar{\alpha}_{t-1}}x_0)^2}{1 - \bar{\alpha}_{t-1}} \right] \right\} \\ &= \exp\left\{ -\frac{1}{2} \left[ \left( \frac{\alpha_t}{1 - \alpha_t} + \frac{1}{1 - \bar{\alpha}_{t-1}} \right) x_{t-1}^2 - 2 \left( \frac{\sqrt{\alpha_t}x_t}{1 - \alpha_t} + \frac{\sqrt{\bar{\alpha}_{t-1}}x_0}{1 - \bar{\alpha}_{t-1}} \right) x_{t-1} \right] \right\} \\ &\propto N\left(x_{t-1}; \underbrace{\frac{\sqrt{\alpha_t}(1 - \bar{\alpha}_{t-1})x_t + \sqrt{\bar{\alpha}_{t-1}}(1 - \alpha_t)x_0}{1 - \bar{\alpha}_t}}_{\mu_q(x_t, x_0)}, \underbrace{\frac{(1 - \alpha_t)(1 - \bar{\alpha}_{t-1})}{1 - \bar{\alpha}_t}\mathbf{I}}_{\Sigma_q(t)}\right) \end{aligned}
  • 然而,直接的反向扩散过程不能用来生成图片,因为缺乏原始图像数据的支持。一个合适的训练方案是通过训练另一个概率分布p(xt−1∣xt)p(x_{t-1}\mid x_t),使其接近q(xt−1∣xt,x0)q(x_{t-1}\mid x_t, x_0)。也就是说要使得 p(xt−1∣xt)∝N(xt−1;αt(1−αˉt−1)xt+αˉt−1(1−αt)x^θ(xt,t)1−αˉt⏟μθ(xt,t),(1−αt)(1−αˉt−1)1−αˉtI⏟Σq(t))p(x_{t-1}\mid x_t)\propto N\left(x_{t-1}; \underbrace{\frac{\sqrt{\alpha_t}(1 - \bar{\alpha}_{t-1})x_t + \sqrt{\bar{\alpha}_{t-1}}(1 - \alpha_t)\hat{x}_\theta(x_t,t)}{1 - \bar{\alpha}_t}}_{\mu_\theta(x_t, t)}, \underbrace{\frac{(1 - \alpha_t)(1 - \bar{\alpha}_{t-1})}{1 - \bar{\alpha}_t}\mathbf{I}}_{\Sigma_q(t)}\right) 其中x^θ(xt,t)\hat{x}_\theta(x_t,t)为待训练神经网络,θ\theta为参数。其训练损失函数即为KL散度: DKL(q(xt−1∣xt,x0)∥pθ(xt−1∣xt))D_{KL}(q(x_{t-1} \mid x_t, x_0) \parallel p_\theta(x_{t-1} \mid x_t)) 具体展开计算如下: DKL(q(xt−1∣xt,x0)∥pθ(xt−1∣xt))=DKL(N(xt−1;μq,Σq(t))∥N(xt−1;μθ,Σq(t)))=12[log⁡∣Σq(t)∣∣Σq(t)∣−d+tr(Σq(t)−1Σq(t))+(μθ−μq)⊤Σq(t)−1(μθ−μq)]=12[(μθ−μq)⊤(σq2(t)I)−1(μθ−μq)]=12σq2(t)[∥μθ−μq∥22]=12σq2(t)αˉt−1(1−αt)2(1−αˉt)2[∥x^θ(xt,t)−x0∥22]\begin{aligned} & D_{KL}(q(x_{t-1}|x_t, x_0) \parallel p_\theta(x_{t-1}|x_t)) \\ &= D_{KL}(N(x_{t-1}; \boldsymbol{\mu}_q, \boldsymbol{\Sigma}_q(t)) \parallel N(x_{t-1}; \boldsymbol{\mu}_\theta, \boldsymbol{\Sigma}_q(t))) \\ &= \frac{1}{2} \left[ \log \frac{|\boldsymbol{\Sigma}_q(t)|}{|\boldsymbol{\Sigma}_q(t)|} - d + \mathrm{tr}(\boldsymbol{\Sigma}_q(t)^{-1}\boldsymbol{\Sigma}_q(t)) + (\boldsymbol{\mu}_\theta - \boldsymbol{\mu}_q)^\top \boldsymbol{\Sigma}_q(t)^{-1} (\boldsymbol{\mu}_\theta - \boldsymbol{\mu}_q) \right] \\ &= \frac{1}{2} \left[ (\boldsymbol{\mu}_\theta - \boldsymbol{\mu}_q)^\top (\sigma_q^2(t)\mathbf{I})^{-1} (\boldsymbol{\mu}_\theta - \boldsymbol{\mu}_q) \right] \\ &= \frac{1}{2\sigma_q^2(t)} \left[ \| \boldsymbol{\mu}_\theta - \boldsymbol{\mu}_q \|_2^2 \right]\\ &= \frac{1}{2\sigma_q^2(t)} \frac{\bar{\alpha}_{t-1}(1 - \alpha_t)^2}{(1 - \bar{\alpha}_t)^2} \left[ \| \hat{x}_\theta(x_t, t) - x_0 \|_2^2 \right] \end{aligned} 其中σq2(t)=(1−αt)(1−αˉt−1)1−αˉt\sigma_q^2(t) = \dfrac{(1 - \alpha_t)(1 - \bar{\alpha}_{t-1})}{1 - \bar{\alpha}_t}。
  • 上述目标函数仍然难以训练,且预测μθ\mu_{\theta}的效果不稳定。因此下述训练的等价形式被推出:
    • 首先,前向扩散过程里x0x_0可以直接由xtx_t得到: xt=αˉtx0+1−αˉtϵ⟹x0=xt−1−αˉtϵαˉtx_t = \sqrt{\bar{\alpha}_t}x_0 + \sqrt{1 - \bar{\alpha}_t}\epsilon \quad \Longrightarrow \quad x_0 = \frac{x_t - \sqrt{1 - \bar{\alpha}_t}\epsilon}{\sqrt{\bar{\alpha}_t}} 将其代回μq(xt,x0)\mu_q(x_t,x_0)中,得到 μq(xt,x0)=αt(1−αˉt−1)xt+αˉt−1(1−αt)x01−αˉt=1αtxt−1−αt1−αˉtαtϵ\begin{aligned} \boldsymbol{\mu}_q(x_t, x_0) &= \frac{\sqrt{\alpha_t}(1 - \bar{\alpha}_{t-1})x_t + \sqrt{\bar{\alpha}_{t-1}}(1 - \alpha_t)x_0}{1 - \bar{\alpha}_t} \\ &= \frac{1}{\sqrt{\alpha_t}} x_t - \frac{1 - \alpha_t}{\sqrt{1 - \bar{\alpha}_t}\sqrt{\alpha_t}} \epsilon \end{aligned} 由此可见其只和xtx_t与ϵ\epsilon有关。
    • 于是我们可以直接训练噪声神经网络: μθ(xt,t)=1αtxt−1−αt1−αˉtαtϵ^θ(xt,t)\boldsymbol{\mu}_\theta(x_t, t) = \frac{1}{\sqrt{\alpha_t}} x_t - \frac{1 - \alpha_t}{\sqrt{1 - \bar{\alpha}_t}\sqrt{\alpha_t}} \hat{\epsilon}_\theta(x_t, t) 将其代入KL散度得到 DKL(q∥pθ)∝12σq2(t)∥μθ−μq∥22=12σq2(t)(1−αt)2(1−αˉt)αt∥ϵ−ϵ^θ(xt,t)∥22\begin{aligned} D_{\mathrm{KL}}(q \parallel p_\theta) &\propto \frac{1}{2\sigma_q^2(t)} \|\boldsymbol{\mu}_\theta - \boldsymbol{\mu}_q\|_2^2 \\ &= \frac{1}{2\sigma_q^2(t)} \frac{(1 - \alpha_t)^2}{(1 - \bar{\alpha}_t)\alpha_t} \left\| \epsilon - \hat{\epsilon}_\theta(x_t, t) \right\|_2^2 \end{aligned} 这便是扩散模型“预测噪声”的精髓。

当然,扩散模型的算法远不止于此,实际模型常常会考虑连续时间状态情形,此时需要用到随机微积分的知识,这里就不详细展开了。