生成模型本质上,是给定一个服从某个分布 \(p_{data}(x)\) 的数据集,然后学到一个 \(p_{model}(x)\) 来尽量拟合 \(p_{data}(x)\),使得一方面可以学到 \(x\) 的 probability,另一方面可以从 \(p_{model}\) 中去采样 \(x\).

一个天然的训练目标是 MLE,即最大化 \(\sum_i \log p_{model}(x_i)\),这样就显示地将 \(p_{model}\) 给建模出来. 但是这不意味就可以从中采样了. 而要想要进行 sample 也未必一定需要去能够 estimate density. 后者称为 Implicit density estimation,即可以采样但是不可以去直接计算出 density. 而有 density 这个概念的称为 Explicit density estimation,于是就可以通过优化这个的方式去训练网络. 这分为 tractable density(可以直接 forward 出概率),也有 approximate density(用近似的方式优化概率).

Discriminative Model 本质上学的是,给 Label \(Y\) 和 Inputs \(x\),学 \(P(Y|X)\) 的条件概率,去给定 \(X\), sample 出 \(Y\). 而生成模型,则学的是 \(P(X)\)\(P(X,Y)\). 这里的 \(X,Y\) 的联合分布概率,而非条件概率,并从这样的模型中去 sample 出 \(X\) 或者 \((X,Y)\).

一个非常简洁的模型就是一个 Pixel 一个 Pixel 去生成,去坐一个 autoregressive 的生成,这个和序列的 generative 没有啥区别. 但是显而易见效果很差.


第一个能看的模型是 Autoencoder. 这是一个 self-supervised model. \(x\) 通过 encoder 变成 latent space 上的一个 feature \(z\),然后再通过 decoder 变成 \(\hat x\),然后以 \(||x-\hat x||\) 作为 Loss.

但是这是不能直接随便选一个 \(z\) 然后 decode 的. 这是因为符合要求的 \(x_{data}\)\(x\) 空间中占无限小(实际上是一个 manifold,流形),于是映过去的 \(z_{data}\) 也在 \(z\) 空间中占无限小,所以直接从 \(z\) 空间随机一个肯定是错的. 我们只有确保 \(z\) 是一个可采样的分布才可以去做生成.

VAE:一个很简单的解决方法是直接令 \(p(z)\) 为高斯分布. 我们只需要操控 encoder 学完之后是标准正太分布即可. 当然这有很多的不合理性,所以也是 VAE 的一个很大局限,但至少高斯分布是一个合理的可采样的分布了,比随便乱采合理不少. 然后 decoder 的 \(p_{\theta}(x\mid z)\) 可以写成一个预测 \(\mu\)\(\Sigma\) 的网络,相当于预测它的高斯分布.(?)

对于模型 \(\theta\)\(p_{\theta}(x)=\int p(z)p_{\theta}(x\mid z)dz\),这是算不出来的. 如果用蒙特卡洛进行随机采样估计,虽说是无偏的,但是噪声太大了.

我们做点变形,\(p_{\theta}(x)=\frac{p_{\theta}(x,z)}{p_{\theta(z\mid x)}}=\frac{1}{p_{\theta}(z\mid x)} p(z)p_{\theta}(x\mid z)\). 所以我们看能不能求出 \(p_{\theta}(z\mid x)\). 这个本质就是我们的 encoder 的形式. 将 encoder \(\phi\) 也写成一个高斯分布,\(q_{\phi}(z\mid x)\).

推导出来之后,\(\log p_{\theta}(x^{(i)})\) 等于 \(E_z[\log p_{\theta}(x^{(i)}\mid z)]-D_{KL}(q_{\phi}(z|x^{(i)})||p(z))+D_{KL}(q_{\phi}||p_{\theta})\). 最后一项我们根本不知道,所以丢掉,得到 Lowerbound!然后去最优化这个 Lowerbound 即可. 这个称为 ELBO.

一个问题就是我们 \(z\) 是从高斯分布中 sample 出来的,这个 sample 怎么求导呢?Reparameterization trick: sample 的方式等价于 \(z=\mu+\epsilon\sigma\)\(\epsilon\) 为从 \(N(0,1)\) 中 sample 看作常数,于是就可导了.

这个 Loss 项的第一项表面上就是某种 L2 Loss,称为 Reconstruction Loss;然后第二个 Loss 项表面上是控制 \(z\) 空间的分布为标准正太分布. 如果强制让 Decoder 的 \(\sigma=1\),那么 VAE 和普通 Autoencoder 的表面上就是多了一个控制分布的 loss. 但是我们发现这两项 loss 是打架的. 因为你不可能在让 \(z\)\(x\) 的特征的情况下还让对于任意 \(x\) 都能给出标准正态分布. 所以 VAE 在这里就是矛盾的,所以就卡在这里了,生成质量就很不好. 不过 VAE 确实可以给出一个 Approximate 的 density estimation,即这个 ELBO.

L2 是一个很不好的东西. 因为它会默认带一个 Gaussian 分布. 这些都生成的很不好,显然会有高斯噪声.


GAN 则分为 discriminator 和 generator.

训练主要是一个 minimax game.我们希望 minimax \(\min_{\theta g}\max_{\theta d}\) 真图被判别为真图的期望概率 + 假图被判别为假图的期望概率.

对于 discriminator,就是最大化 \(E_{x\sim{p_{data}}}[\log D(x)]+E_{z\sim p(z)}[\log(1-D(G(z)))]\),而对于 generator,就是最小化 \(E_{z\sim p(z)}[\log(1-D(G(z)))]\).

但是这个任务 discriminator 更简单,于是很快 generator 就没梯度了.

于是我们修改为增加自己生成真图的概率,即 \(E_{z\sim p(z)}[\log(D(G(z)))]\),这样如果是 \(0\) 的时候梯度会很大.

非常难以训练. 当时有很多篇论文研究如何训练,形成了 Gan Zoo. Progressive GAN 是逐层训练 GAN,不断增加分辨率.

当分布 Diverse 的时候,GAN 做不到. 所以生成人脸中,分布比较 narrative 的前景就比较好,但是背景就很烂.

Mode Collapse: GAN 没有义务去生成足够有丰富性的图,而是可能会'打游击',来来回回生成一张图,被干了之后再换一张图. 而 VAE 就不会这样.

FID: 拿一个另外一个 pretrained 的网络抽生成的图的 feature,然后假定 feature 遵从 gaussian distribution,然后比较和 real data 的 feature 分布.

GAN 的 latent space 中有线性的,语义的结构,可以做语义层面的加减法.


Diffusion Model 回到对 Density 的 modeling,也是一个 approximately density.

Diffusion 的每一次加噪/去噪都是弄一个高斯噪声,和 VAE 有一定相似性. 每步都加高斯,最后一堆高斯分布的叠加几乎就是任意的分布.

没时间讲了.


参考讲义:Lecture 15 - Generative Model