Generative Models#
生成式模型 vs 判别式模型:
- 判别式模型:学习条件概率 P(y∣x),直接预测标签 y
- 生成式模型:学习 x 自身的概率分布 P(x),通过采样生成新的数据
- 条件生成式模型:学习条件概率 P(x∣y),根据标签 y 生成数据 x
对于生成式模型,大致可以分为两类:
- 显式概率模型:直接建模数据的概率分布 P(x),如朴素贝叶斯、隐马尔可夫模型等
- 隐式概率模型:不直接建模概率分布,而是通过某种机制从 P(x) 中采样数据,如生成对抗网络(GANs)、变分自编码器(VAEs)等

Autoregressive Models#
目标:学习得到精确的 P(x)=f(x;W)
对于一个序列数据 x=(x1,x2,...,xT),可以通过链式法则将联合概率分解为条件概率的乘积:
P(x)=t=1∏TP(xt∣x<t)
我们可以用模型来表达这个这个公式
VAE#
回顾一下AutoEncoder,我们通过 encoder 将一个高维数据压缩成一个低维的潜在空间表示,然后用 decoder 从这个潜在空间重建出原始数据
这种从潜在空间重建数据的能力使得 AutoEncoder 成为一种生成式模型,我们可以通过在潜在空间中采样来生成新的数据
问题是我们不知道潜在空间的分布是什么样子的,因此也无法进行采样
VAE的思想是:
假设所有已知数据 x 来自一个未知的概率分布 P(x), 我们希望用一组参数 θ 来确定一个参数分布 pθ(x) 来拟合 P(x)。我们假定 x 与另一些隐变量 z 有关,那么依据边缘分布和条件分布的相关性质可知
pθ(x)=∫pθ(x∣z)p(z)dz
这里 p(z) 是隐变量 z 的先验分布,通常我们假设它是一个简单的分布,比如标准正态分布 N(0,I),pθ(x∣z) 是给定隐变量 z 时数据 x 的条件分布,通常也假设为一个正态分布,我们用一个神经网络来建模其参数 μ,σ,这也是 decoder 学习的分布。
另外,我们称 pθ(z∣x) 为后验分布,表示在给定数据 x 的情况下隐变量 z 的分布,这也是 encoder 学习的分布。
尽管我们确定了 p(z) 和 pθ(x∣z) 的形式,但由于积分的存在,是难以计算的
因此采用贝叶斯公式,换一种方法:
pθ(x)=pθ(z∣x)pθ(x∣z)p(z)
这里面的 pθ(z∣x) 是我们无法计算的后验分布,因此我们引入一个变分分布 qϕ(z∣x) 来近似它,同样使用一个神经网络来建模
注意对于 VAE 的基本假设有如下三条:
- p(z) 已知,是一个高维标准正态分布
- pθ(x∣z) 函数族已知,是一个均值和方差来源于神经网络的正态分布
- qϕ(z∣x) 函数族已知,是一个均值和方差来源于神经网络的正态分布

VAE Loss#
VAE 要同时训练 encoder 和 decoder,我们希望最大化输出数据的似然函数 pθ(x),但由于 pθ(x) 的计算困难,我们引入了变分下界(ELBO)来优化:
L(θ,ϕ;x)=−DKL(qϕ(z∣x)∣∣p(z))+Eqϕ(z∣x)[logpθ(x∣z)]
下面来推导一下这个 loss 的来源:
对于 pθ(x),我们可以取对数得到 logpθ(x)
logpθ(x)=Ez∼qϕ(z∣x)[logpθ(x)]=Ez[logpθ(z∣x)pθ(x∣z)pθ(z)]=Ez[logpθ(x∣z)]−Ez[logpθ(z)qϕ(z∣x)]+Ez[logpθ(z∣x)qϕ(z∣x)]=Ez[logpθ(x∣z)]−Ez[logpθ(z)qϕ(z∣x)]+DKL(qϕ(z∣x)∣∣pθ(z∣x))≥Ez[logpθ(x∣z)]−Ez[logpθ(z)qϕ(z∣x)]=−DKL(qϕ(z∣x)∣∣p(z))+Eqϕ(z∣x)[logpθ(x∣z)]
- 第一行:由于 pθ(x) 与 z 无关,我们引入期望
- 第二行:根据贝叶斯公式将 pθ(x) 表达为 pθ(x∣z)、pθ(z) 和 pθ(z∣x) 的函数
- 第三行:分式上下同乘 qϕ(z∣x),并将期望分成三部分
- 第四行:将第三部分的期望转换为 KL 散度,但是这个 KL 散度不可计算(pθ(z∣x) 未知)
- 第五行:由于 KL 散度非负,因此得到一个下界
- 第六行:将第二部分的期望转换为 KL 散度的形式,这些全已知,可以计算
这个损失函数也可以这么理解:
- −DKL(qϕ(z∣x)∣∣p(z)) 是一个正则化项,鼓励 encoder 学习的分布 qϕ(z∣x) 接近先验分布 p(z),也就是让生成时直接采样的隐变量 z 能够符合先验分布的假设(N(0,I))
- Eqϕ(z∣x)[logpθ(x∣z)] 是一个重建项,鼓励 decoder 能够从 encoder 生成的隐变量 z 中重建出原始数据 x
在反向传播时,由于 z 是通过采样得到的,这会导致 z 的梯度无法直接传播到 encoder 的参数上。为了解决这个问题,我们使用了重参数化技巧,将 z 表达为一个可微分的函数:
z=μ+σ⊙ϵ
其中 μ 和 σ 是 encoder 输出的均值和标准差,ϵ 是一个从标准正态分布中采样的随机变量,这样我们就可以通过 μ 和 σ 来计算梯度了
VAE 的损失函数的不完美
- 正则化项如果接近 0,说明 encoder 学习的分布 qϕ(z∣x) 非常接近先验分布 p(z),即 N(0,I),这时 decoder 不可能从一个任意的高斯采样中还原原输入,因此重建项会很大
- 重建项如果接近 0,说明 decoder 能够很好地重建输入数据,这时 encoder 学习的分布 qϕ(z∣x) 一定会包含输入本身的特定信息,导致正则化项可能很大

另外,对于重建项,我们无法真正求出期望,因此我们通常使用单次采样来近似这个期望
VAE Generation#
VAE 在生成时不再需要编码器,也不需要真实输入,直接从先验分布 p(z) 中采样一个隐变量 z,然后利用 decoder 来生成新数据 x′
VAE 一图流#

- Encoder:输入一张图片,输出 μ 和 σ
- Decoder:输入一个 latent space 中的向量 z,输出一张图片
- Loss中的重建项:一个损失函数来计算输入 x 和输出 x′ 之间的差距
GAN#
GAN 通过生成器和判别器的对抗博弈来学习数据的分布
回顾 decoder 从隐式空间 z 中生成数据的过程,我们可以把 decoder 看作一个生成器 G,它接受一个随机噪声 z 作为输入,输出一个生成的数据样本 G(z)
但是这样怎么设计 Loss 呢? GAN 引入一个判别器 D,它的任务是区分输入的数据是真实的还是生成的。判别器接受一个数据样本作为输入,输出一个概率值,判断输入是真实还是伪造
判别器的训练需要同时使用真实数据和生成数据,对于真实数据,我们希望判别器判断为真的;对于生成数据,我们希望判别器判断为假的
也就是说:
GminDmaxV(D,G)=Ex∼Pdata(x)[logD(x)]+Ez∼Pz(z)[log(1−D(G(z)))]
左项表示 D 对于真实数据的预测,右项表示 D 对于生成数据的预测
- D 的目标是最大化这个函数,也就是真实样本输出高概率(logD(x) 大),生成样本输出低概率(log(1−D(G(z))) 大)
- G 的目标是最小化这个函数,让 D(G(z)) 接近于1,从而log(1−D(G(z))) 很小(即生成的样本能够骗过 D)

判别器梯度上升:
maxDV(D,G)=Ex∼Pdata(x)[logD(x)]+Ez∼Pz(z)[log(1−D(G(z)))]
生成器梯度下降:
minGV(D,G)=Ez∼Pz(z)[log(1−D(G(z)))]
有一点值得注意:这个损失函数对于生成器不公平
在训练之初,判别器很容易判断出生成器生成的图片为假,上式中 log(1−D(G(z))) 的值接近于 0,导致生成器的梯度非常小,难以更新参数
因此通常会对生成器的损失函数进行修改:
maxGEz∼Pz(z)[logD(G(z))]
GAN Training#
GAN 的训练是一个交替优化的过程:
- 训练判别器:
- 从真实数据采样一个 batch{x},前向得到D(x),计算logD(x)
- 从噪声分布采样一个 batch{z},生成伪造图像G(z),前向得到D(G(z)),计算log(1−D(G(z)))
- 求和得到判别器损失,反向传播只更新判别器参数(生成器固定)
- 训练生成器:
- 从噪声分布采样另一个 batch{z},生成伪造图像G(z),经过判别器得到 D(G(z))
- 目标是让 D(G(z)) 接近 1
- 反向传播只更新生成器参数(判别器固定)
交替重复直到收敛(判别器无法区分真假,概率稳定在 0.5 附近)