生成模型
Thu Mar 12 2026
1173 words · 13 minutes

生成模型


Table of Contents

生成模型 Link to 生成模型

真实分布为p(x)p(x),目标训练一个由θ\theta控制的模型,使用pθ(x)p_{\theta}(x)来逼近p(x)p(x)

pθ(x)p_{\theta}(x)就是生成模型

通过采样,能生成得到各式各样的结果

1.隐变量模型 Link to 1.隐变量模型

  • p(x)p(x)难以直接近似,使用全概率公式:p(x)=p(xz)p(z)dzp(x)=\int p(x|z)p(z)\,dz,理论上就可以得到生成模型

    其中zz就是隐变量,p(z)p(z)是一个指定的先验概率分布,因此只要用pθ(xz)p_{\theta}(x|z)近似p(xz)p(x|z)即可

    理论上用KL散度“逼近”,但是KL(p(xz)pθ(xz))KL(p(x|z) \| p_{\theta}(x|z))不容易计算,需要采用别的逼近方法

  • 考虑使用pθ(x,z)p_{\theta}(x,z)近似p(x,z)p(x,z)也可以,因为p(x,z)=p(xz)p(z)p(x,z)=p(x|z)p(z)pθ(x.z)=pθ(xz)p(z)p_{\theta}(x.z)=p_{\theta}(x|z)p(z)

    所以实际上只要有pθ(x,z)p_{\theta}(x,z)就能拟合pθ(xz)p_\theta(x|z),也就能拟合p(x)p(x)

    计算KL散度如下:

    KL(p(x,z)pθ(x,z))=p(x,z)logp(x,z)pθ(x,z)dzdx=p(x)[p(zx)logp(x)p(zx)pθ(x,z)dz]dx=Exp(x)[p(zx)logp(x)p(zx)pθ(x,z)dz]=Exp(x)[p(zx)(logp(x)+logp(zx)pθ(x,z))dz]=Exp(x)[logp(x)p(zx)dz]+Exp(x)[p(zx)logp(zx)pθ(x,z)dz]\begin{aligned} KL(p(x,z)\|p_\theta(x,z)) &= \iint p(x,z)\log \frac{p(x,z)}{p_\theta(x,z)} \,dz\,dx \\[6pt] &= \int p(x)\left[ \int p(z|x)\log \frac{p(x)p(z|x)}{p_\theta(x,z)}\,dz \right]dx \\[6pt] &= \mathbb{E}_{x\sim p(x)} \left[ \int p(z|x)\log \frac{p(x)p(z|x)}{p_\theta(x,z)}\,dz \right] \\[6pt] &= \mathbb{E}_{x\sim p(x)} \left[ \int p(z|x)\left( \log p(x) + \log \frac{p(z|x)}{p_\theta(x,z)} \right)dz \right] \\[6pt] &= \mathbb{E}_{x\sim p(x)} \left[ \log p(x)\int p(z|x)dz \right] + \mathbb{E}_{x\sim p(x)} \left[ \int p(z|x)\log \frac{p(z|x)}{p_\theta(x,z)}dz \right] \end{aligned}

    这里的关键步骤是将p(x,z)p(x,z)都拆分为p(x)p(zx)p(x)p(z|x),注意log里面的拆分后要写成加法的形式

    这样的话,先把dxdx给解决掉,再就可以引入常数项

    第一项

    Exp(x)[logp(x)p(zx)dz]=Exp(x)[logp(x)]=C\mathbb{E}_{x \sim p(x)} \left[ \log p(x) \int p(z \mid x)\,dz \right] = \mathbb{E}_{x \sim p(x)}[\log p(x)] = C

    其中CC为常数,所以有

    L=KL(p(x,z)pθ(x,z))C=Exp(x)[p(zx)logp(zx)pθ(x,z)dz]\begin{aligned} \mathcal{L} &= \mathrm{KL}\big(p(x,z)\,\|\,p_\theta(x,z)\big) - C \\[6pt] &= \mathbb{E}_{x\sim p(x)} \left[ \int p(z\mid x) \log \frac{p(z\mid x)}{p_\theta(x,z)} \,dz \right] \end{aligned}

    要最小化 KL(p(x,z)pθ(x,z))KL(p(x,z)\|p_\theta(x,z)),只要最小化L\mathcal{L} 也可以理解为极大化 L-\mathcal{L}, ==L-\mathcal{L} 被叫做变分下限(ELBO)== 接着可以对 L\mathcal{L} 再进行一些变化:

    L=Exp(x)[p(zx)logp(zx)pθ(x,z)dz]=Exp(x)[p(zx)logp(zx)pθ(xz)p(z)dz]=Exp(x)[p(zx)logpθ(xz)dz+p(zx)logp(zx)p(z)dz]=Exp(x)[Ezp(zx)[logpθ(xz)]+KL(p(zx)p(z))]\begin{aligned} \mathcal{L} &= \mathbb{E}_{x\sim p(x)} \left[ \int p(z|x)\log\frac{p(z|x)}{p_\theta(x,z)}dz \right] \\[6pt] &= \mathbb{E}_{x\sim p(x)} \left[ \int p(z|x)\log\frac{p(z|x)}{p_\theta(x|z)p(z)}dz \right] \\[6pt] &= \mathbb{E}_{x\sim p(x)} \left[ -\int p(z|x)\log p_\theta(x|z)dz + \int p(z|x)\log\frac{p(z|x)}{p(z)}dz \right] \\[6pt] &= \mathbb{E}_{x\sim p(x)} \left[ \mathbb{E}_{z\sim p(z|x)}[-\log p_\theta(x|z)] + KL(p(z|x)\|p(z)) \right] \end{aligned}

    这里的关键步骤是对pθ(x,z)p_\theta(x,z)动手,因为p(z)p(z)是已知的,所以拆分为pθ(xz)p(z)p_\theta(x|z)p(z)

    然后拆下来的一个是期望,一个是KL散度

    先验分布:p(z)p(z),表示没有看到任何xx时,对隐变量zz的假设分布,这个是已知的一个确定的分布

    真实后验分布:p(zx)p(z|x),表示已经观测到真实数据xx后,隐变量zz的真实分布

    这里我们引入了真实后验分布p(zx)p(z|x),我们需要一个神经网络来拟合它,即pθ(zx)p_\theta(z|x),称作编码器Encoder,与之对应的就是解码器Decoder pθ(xz)p_\theta(x|z)

    L\mathcal{L} 的第一项是Ezp(zx)[logpθ(xz)]\mathbb{E}_{z\sim p(z|x)}[-\log p_\theta(x|z)],由于pθ(xz)p_\theta(x|z)就是似然函数,所以最小化logpθ(xz)-\log p_\theta(x|z)就是最大化函数

    L\mathcal{L} 的第二项是KL(p(zx)p(z))KL(p(z|x)\|p(z)),希望p(zx)p(z|x)p(z)p(z)尽可能的接近,也就是用Encoder得到的zz的分布和预设的尽可能接近

  • 因此隐变量模型的框架为:

    • 用神经网络拟合pθ(xz)p_\theta(x|z)pθ(zx)p_\theta(z|x)
    • 最小化L\mathcal{L}
  • 在这里再补充一些说明,虽然上面推导出了隐变量模型为了近似得到p(x)p(x),需要做什么,但还有一些问题要说明

    我们本来想做的是最大化数据的对数似然 logpθ(x)\log p_\theta(x)

    但这个东西很难直接算,因为pθ(x)=pθ(xz)p(z)dzp_\theta(x)=\int p_\theta(x|z)p(z)\,dz这个积分很难算。

    所以我们换一个容易优化的下界去优化,这个下界就是 VAE 的目标,也就是ELBO

    ELBO 不是瞎编的,它和真正想要的对数似然有明确关系:logpθ(x)=ELBO+KL(p(zx)pθ(zx))\log p_\theta(x)=\text{ELBO}+KL(p(z|x)\|p_\theta(z|x))

    因为后面这个 KL 散度永远0\ge 0,所以 ELBO 一定不超过真正的对数似然,因此叫“下界”。

    • 为什么不直接优化对数似然?

      因为xx在隐变量模型里面不是直接建模的,而是通过隐变量zz生成出来的:pθ(x,z)=pθ(xz)p(z)p_\theta(x,z)=p_\theta(x|z)p(z)

      所以边缘分布的所以边缘分布是:pθ(x)=pθ(x,z)dz=pθ(xz)p(z)dzp_\theta(x)=\int p_\theta(x,z)\,dz=\int p_\theta(x|z)p(z)\,dz

      问题就在这里:

      • zz可能是高维向量
      • pθ(xz)p_\theta(x|z)是神经网络输出
      • 这个积分通常没法精确计算

      所以虽然我们想优化logpθ(x)\log p_\theta(x),但它本身不好算

    • 为什么会突然引入KL散度?

      因为==KL散度和极大似然估计在本质上等价==

      L=CKL(p(x,z)pθ(x,z))=Exp(x)[p(zx)logpθ(x,z)p(zx)dz]=Exp(x)[p(zx)logpθ(x)pθ(zx)p(zx)dz]=Exp(x)[logpθ(x)KL(p(zx)pθ(zx))]\begin{aligned} -\mathcal{L} &= C - KL(p(x,z)\|p_\theta(x,z)) \\[6pt] &= \mathbb{E}_{x\sim p(x)} \left[ \int p(z|x)\log \frac{p_\theta(x,z)}{p(z|x)}dz \right] \\[6pt] &= \mathbb{E}_{x\sim p(x)} \left[ \int p(z|x)\log \frac{p_\theta(x)p_\theta(z|x)}{p(z|x)}dz \right] \\[6pt] &= \mathbb{E}_{x\sim p(x)} \left[ \log p_\theta(x) - KL(p(z|x)\|p_\theta(z|x)) \right] \end{aligned}

      因为 KL 散度永远满足:KL()0KL(\cdot\|\cdot)\ge 0

      所以:logpθ(x)KL(p(zx)pθ(zx))logpθ(x)\log p_\theta(x)-KL(p(z|x)\|p_\theta(z|x)) \le \log p_\theta(x)

      也就是说:LExp(x)[logpθ(x)]-\mathcal{L} \le \mathbb{E}_{x\sim p(x)}[\log p_\theta(x)]

      所以L-\mathcal{L}是对数似然的一个变分下界

      • 变分:引入了一个分布去近似、去变换原来难算的目标。
      • 下界:永远不超过真正的对数似然

    总结为:

    我真正想优化的是数据似然,但它太难算 所以我找一个容易优化的替代目标 这个替代目标不是乱来的,它是原目标的下界 只要把这个下界尽量提高,就等于在间接提高真实似然

Thanks for reading!

生成模型

Thu Mar 12 2026
1173 words · 13 minutes