Roxy's Library

Back

Generative Models#

生成式模型 vs 判别式模型:

  • 判别式模型:学习条件概率 P(yx)P(y|x),直接预测标签 yy
  • 生成式模型:学习 xx 自身的概率分布 P(x)P(x),通过采样生成新的数据
  • 条件生成式模型:学习条件概率 P(xy)P(x|y),根据标签 yy 生成数据 xx

对于生成式模型,大致可以分为两类:

  1. 显式概率模型:直接建模数据的概率分布 P(x)P(x),如朴素贝叶斯、隐马尔可夫模型等
  2. 隐式概率模型:不直接建模概率分布,而是通过某种机制从 P(x)P(x) 中采样数据,如生成对抗网络(GANs)、变分自编码器(VAEs)等

generative_models

Autoregressive Models#

目标:学习得到精确的 P(x)=f(x;W)P(x) = f(x;W)

对于一个序列数据 x=(x1,x2,...,xT)x = (x_1, x_2, ..., x_T),可以通过链式法则将联合概率分解为条件概率的乘积:

P(x)=t=1TP(xtx<t)P(x) = \prod_{t=1}^{T} P(x_t | x_{<t})

我们可以用模型来表达这个这个公式

VAE#

回顾一下AutoEncoder,我们通过 encoder 将一个高维数据压缩成一个低维的潜在空间表示,然后用 decoder 从这个潜在空间重建出原始数据

这种从潜在空间重建数据的能力使得 AutoEncoder 成为一种生成式模型,我们可以通过在潜在空间中采样来生成新的数据

问题是我们不知道潜在空间的分布是什么样子的,因此也无法进行采样

VAE的思想是:

假设所有已知数据 xx 来自一个未知的概率分布 P(x)P(x), 我们希望用一组参数 θ\theta 来确定一个参数分布 pθ(x)p_{\theta}(x) 来拟合 P(x)P(x)。我们假定 xx 与另一些隐变量 zz 有关,那么依据边缘分布和条件分布的相关性质可知

pθ(x)=pθ(xz)p(z)dzp_{\theta}(x) = \int p_{\theta}(x|z)p(z) dz

这里 p(z)p(z) 是隐变量 zz 的先验分布,通常我们假设它是一个简单的分布,比如标准正态分布 N(0,I)N(0, I)pθ(xz)p_{\theta}(x|z) 是给定隐变量 zz 时数据 xx 的条件分布,通常也假设为一个正态分布,我们用一个神经网络来建模其参数 μ,σ\mu,\sigma,这也是 decoder 学习的分布。

另外,我们称 pθ(zx)p_{\theta}(z|x) 为后验分布,表示在给定数据 xx 的情况下隐变量 zz 的分布,这也是 encoder 学习的分布。

尽管我们确定了 p(z)p(z)pθ(xz)p_{\theta}(x|z) 的形式,但由于积分的存在,是难以计算的

因此采用贝叶斯公式,换一种方法:

pθ(x)=pθ(xz)p(z)pθ(zx)p_{\theta}(x)= \frac{p_{\theta}(x|z)p(z)}{p_{\theta}(z|x)}

这里面的 pθ(zx)p_{\theta}(z|x) 是我们无法计算的后验分布,因此我们引入一个变分分布 qϕ(zx)q_{\phi}(z|x) 来近似它,同样使用一个神经网络来建模

注意对于 VAE 的基本假设有如下三条

  • p(z)p(z) 已知,是一个高维标准正态分布
  • pθ(xz)p_{\theta}(x|z) 函数族已知,是一个均值和方差来源于神经网络的正态分布
  • qϕ(zx)q_{\phi}(z|x) 函数族已知,是一个均值和方差来源于神经网络的正态分布

vae

VAE Loss#

VAE 要同时训练 encoder 和 decoder,我们希望最大化输出数据的似然函数 pθ(x)p_{\theta}(x),但由于 pθ(x)p_{\theta}(x) 的计算困难,我们引入了变分下界(ELBO)来优化:

L(θ,ϕ;x)=DKL(qϕ(zx)p(z))+Eqϕ(zx)[logpθ(xz)]\mathcal{L}(\theta, \phi; x) = -D_{KL}(q_{\phi}(z | x) || p(z)) + E_{q_{\phi}(z|x)}[\log p_{\theta}(x|z)]

下面来推导一下这个 loss 的来源:

对于 pθ(x)p_{\theta}(x),我们可以取对数得到 logpθ(x)\log p_{\theta}(x)

logpθ(x)=Ezqϕ(zx)[logpθ(x)]=Ez[logpθ(xz)pθ(z)pθ(zx)]=Ez[logpθ(xz)]Ez[logqϕ(zx)pθ(z)]+Ez[logqϕ(zx)pθ(zx)]=Ez[logpθ(xz)]Ez[logqϕ(zx)pθ(z)]+DKL(qϕ(zx)pθ(zx))Ez[logpθ(xz)]Ez[logqϕ(zx)pθ(z)]=DKL(qϕ(zx)p(z))+Eqϕ(zx)[logpθ(xz)]\begin{aligned} \log p_{\theta}(x) &= \mathbb{E}_{z\sim q_{\phi}(z|x)}[\log p_{\theta}(x)] \\ &= \mathbb{E}_{z}\left[\log \frac{p_{\theta}(x|z) p_{\theta}(z)}{p_{\theta}(z|x)}\right] \\ &= \mathbb{E}_{z}\left[\log p_{\theta}(x|z)\right] - \mathbb{E}_{z}\left[\log \frac{q_{\phi}(z|x)}{p_{\theta}(z)}\right] + \mathbb{E}_{z}\left[\log \frac{q_{\phi}(z|x)}{p_{\theta}(z|x)}\right] \\ &= \mathbb{E}_{z}\left[\log p_{\theta}(x|z)\right] - \mathbb{E}_{z}\left[\log \frac{q_{\phi}(z|x)}{p_{\theta}(z)}\right] + D_{KL}(q_{\phi}(z|x) || p_{\theta}(z|x)) \\ &\geq \mathbb{E}_{z}\left[\log p_{\theta}(x|z)\right] - \mathbb{E}_{z}\left[\log \frac{q_{\phi}(z|x)}{p_{\theta}(z)}\right] \\ &= -D_{KL}(q_{\phi}(z | x) || p(z)) + E_{q_{\phi}(z|x)}[\log p_{\theta}(x|z)] \end{aligned}
  • 第一行:由于 pθ(x)p_{\theta}(x)zz 无关,我们引入期望
  • 第二行:根据贝叶斯公式将 pθ(x)p_{\theta}(x) 表达为 pθ(xz)p_{\theta}(x|z)pθ(z)p_{\theta}(z)pθ(zx)p_{\theta}(z|x) 的函数
  • 第三行:分式上下同乘 qϕ(zx)q_{\phi}(z|x),并将期望分成三部分
  • 第四行:将第三部分的期望转换为 KL 散度,但是这个 KL 散度不可计算(pθ(zx)p_{\theta}(z|x) 未知)
  • 第五行:由于 KL 散度非负,因此得到一个下界
  • 第六行:将第二部分的期望转换为 KL 散度的形式,这些全已知,可以计算

这个损失函数也可以这么理解:

  • DKL(qϕ(zx)p(z))-D_{KL}(q_{\phi}(z | x) || p(z)) 是一个正则化项,鼓励 encoder 学习的分布 qϕ(zx)q_{\phi}(z|x) 接近先验分布 p(z)p(z),也就是让生成时直接采样的隐变量 zz 能够符合先验分布的假设(N(0,I)N(0,I)
  • Eqϕ(zx)[logpθ(xz)]\mathbb{E}_{q_{\phi}(z|x)}[\log p_{\theta}(x|z)] 是一个重建项,鼓励 decoder 能够从 encoder 生成的隐变量 zz 中重建出原始数据 xx

在反向传播时,由于 zz 是通过采样得到的,这会导致 zz 的梯度无法直接传播到 encoder 的参数上。为了解决这个问题,我们使用了重参数化技巧,将 zz 表达为一个可微分的函数:

z=μ+σϵz = \mu + \sigma \odot \epsilon

其中 μ\muσ\sigma 是 encoder 输出的均值和标准差,ϵ\epsilon 是一个从标准正态分布中采样的随机变量,这样我们就可以通过 μ\muσ\sigma 来计算梯度了

VAE 的损失函数的不完美

  • 正则化项如果接近 00,说明 encoder 学习的分布 qϕ(zx)q_{\phi}(z|x) 非常接近先验分布 p(z)p(z),即 N(0,I)N(0, I),这时 decoder 不可能从一个任意的高斯采样中还原原输入,因此重建项会很大
  • 重建项如果接近 00,说明 decoder 能够很好地重建输入数据,这时 encoder 学习的分布 qϕ(zx)q_{\phi}(z|x) 一定会包含输入本身的特定信息,导致正则化项可能很大

vae_loss

另外,对于重建项,我们无法真正求出期望,因此我们通常使用单次采样来近似这个期望

VAE Generation#

VAE 在生成时不再需要编码器,也不需要真实输入,直接从先验分布 p(z)p(z) 中采样一个隐变量 zz,然后利用 decoder 来生成新数据 xx'

VAE 一图流#

vae_flow

  • Encoder:输入一张图片,输出 μ\muσ\sigma
  • Decoder:输入一个 latent space 中的向量 zz,输出一张图片
  • Loss中的重建项:一个损失函数来计算输入 xx 和输出 xx' 之间的差距

GAN#

GAN 通过生成器和判别器的对抗博弈来学习数据的分布

回顾 decoder 从隐式空间 z 中生成数据的过程,我们可以把 decoder 看作一个生成器 GG,它接受一个随机噪声 zz 作为输入,输出一个生成的数据样本 G(z)G(z)

但是这样怎么设计 Loss 呢? GAN 引入一个判别器 DD,它的任务是区分输入的数据是真实的还是生成的。判别器接受一个数据样本作为输入,输出一个概率值,判断输入是真实还是伪造

判别器的训练需要同时使用真实数据和生成数据,对于真实数据,我们希望判别器判断为真的;对于生成数据,我们希望判别器判断为假的

也就是说:

minGmaxDV(D,G)=ExPdata(x)[logD(x)]+EzPz(z)[log(1D(G(z)))]\begin{aligned} \min_G \max_D V(D, G) &= \mathbb{E}_{x \sim P_{data}(x)}[\log D(x)] + \mathbb{E}_{z \sim P_z(z)}[\log (1 - D(G(z)))] \end{aligned}

左项表示 DD 对于真实数据的预测,右项表示 DD 对于生成数据的预测

  • DD 的目标是最大化这个函数,也就是真实样本输出高概率(logD(x)\log D(x) 大),生成样本输出低概率(log(1D(G(z)))log(1-D(G(z))) 大)
  • GG 的目标是最小化这个函数,让 D(G(z))D(G(z)) 接近于11,从而log(1D(G(z)))\log(1 - D(G(z))) 很小(即生成的样本能够骗过 DD

gan

判别器梯度上升:

maxDV(D,G)=ExPdata(x)[logD(x)]+EzPz(z)[log(1D(G(z)))]max_D V(D, G) = \mathbb{E}_{x \sim P_{data}(x)}[\log D(x)] + \mathbb{E}_{z \sim P_z(z)}[\log (1 - D(G(z)))]

生成器梯度下降:

minGV(D,G)=EzPz(z)[log(1D(G(z)))]min_G V(D, G) = \mathbb{E}_{z \sim P_z(z)}[\log (1 - D(G(z)))]

有一点值得注意:这个损失函数对于生成器不公平

在训练之初,判别器很容易判断出生成器生成的图片为假,上式中 log(1D(G(z)))\log(1 - D(G(z))) 的值接近于 00,导致生成器的梯度非常小,难以更新参数

因此通常会对生成器的损失函数进行修改:

maxGEzPz(z)[logD(G(z))]max_G \mathbb{E}_{z \sim P_z(z)}[\log D(G(z))]

GAN Training#

GAN 的训练是一个交替优化的过程:

  • 训练判别器:
    • 从真实数据采样一个 batch{x}batch\{x\},前向得到D(x)D(x),计算logD(x)\log D(x)
    • 从噪声分布采样一个 batch{z}batch\{z\},生成伪造图像G(z)G(z),前向得到D(G(z))D(G(z)),计算log(1D(G(z)))log(1−D(G(z)))
    • 求和得到判别器损失,反向传播只更新判别器参数(生成器固定)
  • 训练生成器:
    • 从噪声分布采样另一个 batch{z}batch\{z\},生成伪造图像G(z)G(z),经过判别器得到 D(G(z))D(G(z))
    • 目标是让 D(G(z))D(G(z)) 接近 1
    • 反向传播只更新生成器参数(判别器固定)

交替重复直到收敛(判别器无法区分真假,概率稳定在 0.50.5 附近)

Generative Model I
https://greyrats.xyz/blog/cvintro_05_27
Author GreyRat
Published at May 29, 2026
Comment seems to stuck. Try to refresh?✨