章节封面

《理解深度学习》第17章 变分自编码器 读书笔记

目录


开篇导语

  前面两章我们学习了GAN和标准化流两种生成模型。GAN训练不稳定、没有显式似然;标准化流需要可逆变换、对网络架构有限制。本章我们学习第三种生成模型——变分自编码器(Variational Autoencoder,VAE)

  VAE的核心思想是隐变量模型(Latent Variable Model):假设观测数据是由一些未观测到的隐变量生成的。例如,一张人脸图像可能由"是否微笑"、“年龄”、“性别”、"发型"等隐变量决定。VAE通过学习这些隐变量的分布,既能生成新数据,又能学习有意义的表示。

  VAE的名字来源于两个部分:"变分"指的是用变分推断(Variational Inference)来近似难以计算的后验分布;"自编码器"指的是网络架构像自编码器一样,有编码器(将数据压缩到隐空间)和解码器(从隐空间重建数据)。

  VAE的优势是训练稳定(有明确的优化目标ELBO)、隐空间结构良好(适合插值和属性编辑)、能学习解耦表示。VAE是深度学习中最重要的生成模型之一,在表示学习、图像生成、异常检测等领域有广泛应用。


17.1 隐变量模型

隐变量模型

什么是隐变量模型

  隐变量模型(Latent Variable Model) 假设观测数据 x x x 是由一些未观测到的隐变量 z z z 生成的。隐变量代表数据中未直接观测但对生成数据有影响的因素。

  例如,对于人脸图像:

  • 观测数据 x x x:像素值
  • 隐变量 z z z:可能包括身份、表情、姿态、光照、年龄、性别等

  隐变量模型的生成过程:

  1. 从先验分布 p ( z ) p(z) p(z) 中采样隐变量 z z z
  2. 从条件分布 p ( x ∣ z ) p(x|z) p(xz) 中采样观测数据 x x x

  数据的边缘似然为:

p ( x ) = ∫ p ( x ∣ z ) p ( z ) d z p(x) = \int p(x|z) p(z) dz p(x)=p(xz)p(z)dz

  这个积分通常是不可计算的(intractable),因为隐空间维度很高,积分没有解析解。

隐变量模型的优势

  1. 数据压缩:将高维数据压缩到低维隐空间,去除冗余信息。
  2. 表示学习:学习数据的有意义表示,隐变量可能对应数据的语义因素。
  3. 生成建模:从先验分布采样隐变量,再通过解码器生成新数据。
  4. 缺失数据处理:隐变量模型可以自然地处理缺失数据。
  5. 解耦表示:通过适当的约束,可以让隐变量的不同维度对应数据的不同独立因素。

简单的隐变量模型:PCA

  主成分分析(PCA) 可以看作是最简单的线性隐变量模型:

  • 隐变量 z z z:主成分(低维)
  • 生成过程: x = W z + μ + ϵ x = Wz + \mu + \epsilon x=Wz+μ+ϵ,其中 W W W 是投影矩阵, ϵ \epsilon ϵ 是高斯噪声
  • 先验: p ( z ) = N ( 0 , I ) p(z) = \mathcal{N}(0, I) p(z)=N(0,I)
  • 似然: p ( x ∣ z ) = N ( W z + μ , σ 2 I ) p(x|z) = \mathcal{N}(Wz + \mu, \sigma^2 I) p(xz)=N(Wz+μ,σ2I)

  PCA的隐变量和观测数据之间是线性关系,表达能力有限。VAE用神经网络来建模非线性关系,大大增强了表达能力。


17.2 非线性隐变量模型

  非线性隐变量模型用神经网络来参数化条件分布 p ( x ∣ z ) p(x|z) p(xz),使得模型可以捕捉数据和隐变量之间的复杂非线性关系。

模型定义

  非线性隐变量模型的定义:

  • 先验 p ( z ) = N ( 0 , I ) p(z) = \mathcal{N}(0, I) p(z)=N(0,I)(标准正态分布)
  • 似然 p ( x ∣ z ) = N ( f ( z ; θ ) , σ 2 I ) p(x|z) = \mathcal{N}(f(z; \theta), \sigma^2 I) p(xz)=N(f(z;θ),σ2I) 或伯努利分布,其中 f f f 是解码器神经网络, θ \theta θ 是解码器参数

  对于连续数据(如图像像素归一化到[0,1]),通常用高斯似然;对于二值数据,用伯努利似然。

后验分布的不可计算性

  给定观测数据 x x x,我们想知道对应的隐变量 z z z 的分布,即后验分布 p ( z ∣ x ) p(z|x) p(zx)。根据贝叶斯公式:

p ( z ∣ x ) = p ( x ∣ z ) p ( z ) p ( x ) = p ( x ∣ z ) p ( z ) ∫ p ( x ∣ z ′ ) p ( z ′ ) d z ′ p(z|x) = \frac{p(x|z) p(z)}{p(x)} = \frac{p(x|z) p(z)}{\int p(x|z') p(z') dz'} p(zx)=p(x)p(xz)p(z)=p(xz)p(z)dzp(xz)p(z)

  分母中的积分是不可计算的(因为解码器 f f f 是非线性神经网络),所以后验分布 p ( z ∣ x ) p(z|x) p(zx) 也是不可计算的。这是隐变量模型的核心困难。

为什么需要近似后验

&ememsp;虽然后验不可计算,但我们仍然需要某种方式来推断给定数据对应的隐变量,因为:

  1. 训练时:需要计算数据的似然 p ( x ) p(x) p(x),但这涉及对隐变量的积分,不可计算。
  2. 推理时:给定新数据,需要知道它在隐空间中的表示,用于可视化、插值、编辑等。

  VAE的解决方案是:用一个神经网络(编码器)来近似后验分布 q ( z ∣ x ) ≈ p ( z ∣ x ) q(z|x) \approx p(z|x) q(zx)p(zx),这就是变分近似


17.3 训练

证据下界(ELBO)

  VAE的训练目标是最大化数据的对数似然 log ⁡ p ( x ) \log p(x) logp(x)。但 log ⁡ p ( x ) \log p(x) logp(x) 不可直接计算,所以我们推导它的一个下界——证据下界(Evidence Lower Bound,ELBO)

  从对数似然出发:

log ⁡ p ( x ) = log ⁡ ∫ p ( x ∣ z ) p ( z ) d z = log ⁡ ∫ q ( z ∣ x ) q ( z ∣ x ) p ( x ∣ z ) p ( z ) d z \log p(x) = \log \int p(x|z) p(z) dz = \log \int \frac{q(z|x)}{q(z|x)} p(x|z) p(z) dz logp(x)=logp(xz)p(z)dz=logq(zx)q(zx)p(xz)p(z)dz

  利用Jensen不等式( log ⁡ E [ f ] ≥ E [ log ⁡ f ] \log \mathbb{E}[f] \geq \mathbb{E}[\log f] logE[f]E[logf]):

log ⁡ p ( x ) ≥ E q ( z ∣ x ) [ log ⁡ p ( x ∣ z ) p ( z ) q ( z ∣ x ) ] \log p(x) \geq \mathbb{E}_{q(z|x)}\left[\log \frac{p(x|z) p(z)}{q(z|x)}\right] logp(x)Eq(zx)[logq(zx)p(xz)p(z)]

  整理得:

log ⁡ p ( x ) ≥ E q ( z ∣ x ) [ log ⁡ p ( x ∣ z ) ] − D K L ( q ( z ∣ x ) ∥ p ( z ) ) \log p(x) \geq \mathbb{E}_{q(z|x)}[\log p(x|z)] - D_{KL}(q(z|x) \parallel p(z)) logp(x)Eq(zx)[logp(xz)]DKL(q(zx)p(z))

  右边就是ELBO:

ELBO ( q , x ) = E q ( z ∣ x ) [ log ⁡ p ( x ∣ z ) ] − D K L ( q ( z ∣ x ) ∥ p ( z ) ) \text{ELBO}(q, x) = \mathbb{E}_{q(z|x)}[\log p(x|z)] - D_{KL}(q(z|x) \parallel p(z)) ELBO(q,x)=Eq(zx)[logp(xz)]DKL(q(zx)p(z))

  ELBO由两部分组成:

  1. 重构项 E q ( z ∣ x ) [ log ⁡ p ( x ∣ z ) ] \mathbb{E}_{q(z|x)}[\log p(x|z)] Eq(zx)[logp(xz)],衡量解码器从隐变量重构数据的能力。
  2. KL散度项 D K L ( q ( z ∣ x ) ∥ p ( z ) ) D_{KL}(q(z|x) \parallel p(z)) DKL(q(zx)p(z)),衡量近似后验和先验之间的距离,起到正则化作用。

ELBO和对数似然的关系

  ELBO和对数似然之间的差距正好是近似后验和真实后验之间的KL散度:

log ⁡ p ( x ) − ELBO ( q , x ) = D K L ( q ( z ∣ x ) ∥ p ( z ∣ x ) ) \log p(x) - \text{ELBO}(q, x) = D_{KL}(q(z|x) \parallel p(z|x)) logp(x)ELBO(q,x)=DKL(q(zx)p(zx))

  因为KL散度非负,所以ELBO总是小于等于对数似然。当近似后验等于真实后验时( q ( z ∣ x ) = p ( z ∣ x ) q(z|x) = p(z|x) q(zx)=p(zx)),ELBO等于对数似然。

  因此,最大化ELBO同时达到两个目的:

  1. 让ELBO接近对数似然(通过让 q q q 接近真实后验 p ( z ∣ x ) p(z|x) p(zx)
  2. 让对数似然本身增大(通过优化模型参数)

VAE的训练目标

  VAE的训练目标是最大化ELBO(等价于最小化负ELBO):

L ( θ , ϕ ) = − E q ϕ ( z ∣ x ) [ log ⁡ p θ ( x ∣ z ) ] + D K L ( q ϕ ( z ∣ x ) ∥ p ( z ) ) \mathcal{L}(\theta, \phi) = -\mathbb{E}_{q_\phi(z|x)}[\log p_\theta(x|z)] + D_{KL}(q_\phi(z|x) \parallel p(z)) L(θ,ϕ)=Eqϕ(zx)[logpθ(xz)]+DKL(qϕ(zx)p(z))

  其中 θ \theta θ 是解码器参数, ϕ \phi ϕ 是编码器参数。

  第一项是重构损失(负的重构对数似然),第二项是KL正则化损失。训练时同时优化编码器和解码器参数。


17.4 ELBO的性质

ELBO的分解

  ELBO可以从不同角度理解:

  1. 重构+正则化:ELBO = 重构对数似然 - KL散度。重构项鼓励准确重建数据,KL项鼓励后验接近先验,防止过拟合。

  2. 自由能:在统计物理中,ELBO对应变分自由能(Variational Free Energy)。

  3. 信息瓶颈:KL项限制了隐变量中关于数据的信息量,起到信息瓶颈(Information Bottleneck)的作用,鼓励学习最紧凑、最有用的表示。

KL散度的作用

  KL散度项 D K L ( q ( z ∣ x ) ∥ p ( z ) ) D_{KL}(q(z|x) \parallel p(z)) DKL(q(zx)p(z)) 有几个重要作用:

  1. 正则化:防止编码器把每个数据点映射到隐空间中相距很远的点,鼓励隐空间的结构连续、有意义。
  2. 先验匹配:让近似后验的聚合分布(aggregate posterior)接近先验分布,使得从先验采样的隐变量能通过解码器生成合理的数据。
  3. 防止后验坍缩:如果没有KL项,编码器可能把每个数据点映射到一个delta分布(方差为0),失去随机性和泛化能力。

后验坍缩(Posterior Collapse)

&ememsp;后验坍缩是VAE训练中可能出现的问题:当解码器非常强大时,它可以不依赖隐变量就能很好地重构数据(即 p ( x ∣ z ) ≈ p ( x ) p(x|z) \approx p(x) p(xz)p(x)),此时KL散度趋近于0,隐变量被忽略,近似后验等于先验。

  后验坍缩的表现:

  • KL散度接近0
  • 隐变量不包含关于数据的有用信息
  • 生成的样本缺乏多样性(都差不多)

&ememsp;解决后验坍缩的方法:

  1. KL退火(KL Annealing):训练初期用较小的KL权重,逐渐增大到1。
  2. 自由比特(Free Bits):给每个隐变量维度设置KL的下限,防止某个维度被忽略。
  3. 减弱解码器能力:使用更简单的解码器,防止它绕过隐变量。
  4. 使用自回归解码器:如PixelCNN解码器,虽然强大但需要隐变量来生成全局结构。

17.5 变分近似

变分推断

  变分推断(Variational Inference) 是一种用简单分布近似复杂后验分布的方法。核心思想是:在一个分布族 Q \mathcal{Q} Q 中寻找最接近真实后验 p ( z ∣ x ) p(z|x) p(zx) 的分布 q ( z ∣ x ) q(z|x) q(zx),用KL散度衡量接近程度:

q ∗ ( z ∣ x ) = arg ⁡ min ⁡ q ∈ Q D K L ( q ( z ∣ x ) ∥ p ( z ∣ x ) ) q^*(z|x) = \arg\min_{q \in \mathcal{Q}} D_{KL}(q(z|x) \parallel p(z|x)) q(zx)=argqQminDKL(q(zx)p(zx))

&ememsp;因为真实后验不可计算,我们通过最大化ELBO来间接最小化这个KL散度。

平均场近似

&ememsp;最简单的变分近似是平均场近似(Mean-field Approximation),假设隐变量各维度之间相互独立:

q ( z ∣ x ) = ∏ i q ( z i ∣ x ) q(z|x) = \prod_{i} q(z_i|x) q(zx)=iq(zix)

&ememsp;在VAE中,通常假设近似后验是对角高斯分布:

q ϕ ( z ∣ x ) = N ( z ; μ ϕ ( x ) , diag ( σ ϕ 2 ( x ) ) ) q_\phi(z|x) = \mathcal{N}(z; \mu_\phi(x), \text{diag}(\sigma_\phi^2(x))) qϕ(zx)=N(z;μϕ(x),diag(σϕ2(x)))

&ememsp;其中均值 μ ϕ ( x ) \mu_\phi(x) μϕ(x) 和方差 σ ϕ 2 ( x ) \sigma_\phi^2(x) σϕ2(x) 由编码器神经网络从数据 x x x 计算得到。

高斯后验的KL散度

&ememsp;当近似后验是对角高斯 q ( z ∣ x ) = N ( μ , diag ( σ 2 ) ) q(z|x) = \mathcal{N}(\mu, \text{diag}(\sigma^2)) q(zx)=N(μ,diag(σ2)),先验是标准正态 p ( z ) = N ( 0 , I ) p(z) = \mathcal{N}(0, I) p(z)=N(0,I) 时,KL散度有解析解:

D K L ( q ( z ∣ x ) ∥ p ( z ) ) = 1 2 ∑ i = 1 d ( μ i 2 + σ i 2 − 1 − log ⁡ σ i 2 ) D_{KL}(q(z|x) \parallel p(z)) = \frac{1}{2} \sum_{i=1}^{d} \left( \mu_i^2 + \sigma_i^2 - 1 - \log \sigma_i^2 \right) DKL(q(zx)p(z))=21i=1d(μi2+σi21logσi2)

&ememsp;这个解析解使得KL散度的计算非常高效,不需要采样估计。

摊销推断(Amortized Inference)

&ememsp;传统的变分推断需要为每个数据点单独优化近似后验的参数,计算量很大。VAE使用摊销推断(Amortized Inference):用一个共享的编码器神经网络 q ϕ ( z ∣ x ) q_\phi(z|x) qϕ(zx) 来为所有数据点计算近似后验,将推断的计算量"摊销"到所有数据点上。

&ememsp;摊销推断的优势:

  1. 高效:训练后,推断只需要一次前向传播。
  2. 泛化:编码器可以泛化到训练集中没有见过的新数据。
  3. 端到端训练:编码器和解码器可以一起端到端训练。

&ememsp;摊销推断的劣势:

  • 存在摊销差距(Amortization Gap):共享编码器可能无法为每个数据点找到最优的近似后验,导致ELBO比逐点优化的变分推断低一些。

17.6 变分自编码器

VAE架构

VAE的网络架构

&ememsp;变分自编码器(VAE) 由两个神经网络组成:

  1. 编码器(Encoder) q ϕ ( z ∣ x ) q_\phi(z|x) qϕ(zx):将观测数据 x x x 映射到近似后验分布的参数 μ ϕ ( x ) \mu_\phi(x) μϕ(x) log ⁡ σ ϕ 2 ( x ) \log \sigma_\phi^2(x) logσϕ2(x)。也叫识别网络(Recognition Network)或推断网络(Inference Network)。

  2. 解码器(Decoder) p θ ( x ∣ z ) p_\theta(x|z) pθ(xz):从隐变量 z z z 生成观测数据 x x x(或数据分布的参数)。也叫生成网络(Generative Network)。

&ememsp;VAE的前向过程:

  1. 输入数据 x x x
  2. 编码器计算 μ = μ ϕ ( x ) \mu = \mu_\phi(x) μ=μϕ(x) log ⁡ σ 2 = log ⁡ σ ϕ 2 ( x ) \log \sigma^2 = \log \sigma_\phi^2(x) logσ2=logσϕ2(x)
  3. 重参数化采样: z = μ + σ ⊙ ϵ z = \mu + \sigma \odot \epsilon z=μ+σϵ,其中 ϵ ∼ N ( 0 , I ) \epsilon \sim \mathcal{N}(0, I) ϵN(0,I)
  4. 解码器计算重构: x ^ = f θ ( z ) \hat{x} = f_\theta(z) x^=fθ(z)
  5. 计算损失:重构损失 + KL散度

VAE的损失函数

&ememsp;VAE的损失函数是负ELBO:

L = E q ϕ ( z ∣ x ) [ − log ⁡ p θ ( x ∣ z ) ] ⏟ 重构损失 + D K L ( q ϕ ( z ∣ x ) ∥ p ( z ) ) ⏟ KL散度 \mathcal{L} = \underbrace{\mathbb{E}_{q_\phi(z|x)}[-\log p_\theta(x|z)]}_{\text{重构损失}} + \underbrace{D_{KL}(q_\phi(z|x) \parallel p(z))}_{\text{KL散度}} L=重构损失 Eqϕ(zx)[logpθ(xz)]+KL散度 DKL(qϕ(zx)p(z))

&ememsp;对于高斯似然 p θ ( x ∣ z ) = N ( f θ ( z ) , σ 2 I ) p_\theta(x|z) = \mathcal{N}(f_\theta(z), \sigma^2 I) pθ(xz)=N(fθ(z),σ2I),重构损失等价于MSE损失:

E [ − log ⁡ p θ ( x ∣ z ) ] ∝ E [ ∥ x − f θ ( z ) ∥ 2 ] \mathbb{E}[-\log p_\theta(x|z)] \propto \mathbb{E}[\|x - f_\theta(z)\|^2] E[logpθ(xz)]E[xfθ(z)2]

&ememsp;对于伯努利似然(二值数据),重构损失等价于二元交叉熵(BCE)损失。

VAE vs 标准自编码器

&ememsp;VAE和标准自编码器的区别:

特性标准自编码器VAE
隐空间确定性的点概率分布(高斯)
损失重构损失重构损失 + KL散度
生成能力弱(隐空间不连续)强(隐空间连续有结构)
正则化通常没有或用稀疏性KL散度强制后验接近先验
概率解释没有有显式的概率模型

&ememsp;标准自编码器的隐空间可能不连续,隐空间中两个点之间的插值可能产生无意义的输出。VAE的KL散度项强制隐空间连续、有结构,使得隐空间中的插值和采样都能产生有意义的输出。


17.7 重参数化技巧

重参数化技巧

问题:采样不可微

&ememsp;VAE训练时需要从近似后验 q ϕ ( z ∣ x ) = N ( μ ϕ ( x ) , σ ϕ 2 ( x ) ) q_\phi(z|x) = \mathcal{N}(\mu_\phi(x), \sigma_\phi^2(x)) qϕ(zx)=N(μϕ(x),σϕ2(x)) 中采样隐变量 z z z,然后计算重构损失。但采样操作是不可微的——我们无法通过采样操作反向传播梯度到编码器参数 ϕ \phi ϕ

&ememsp;具体来说,如果直接写 z ∼ N ( μ , σ 2 ) z \sim \mathcal{N}(\mu, \sigma^2) zN(μ,σ2),那么 z z z 是一个随机变量,它对 μ \mu μ σ \sigma σ 的梯度无法定义(采样操作没有梯度)。

重参数化技巧的解决方案

&ememsp;重参数化技巧(Reparameterization Trick) 将采样操作重参数化为一个可微的变换:

z = μ + σ ⊙ ϵ , ϵ ∼ N ( 0 , I ) z = \mu + \sigma \odot \epsilon, \quad \epsilon \sim \mathcal{N}(0, I) z=μ+σϵ,ϵN(0,I)

&ememsp;其中 ⊙ \odot 表示逐元素乘法。这样,随机性来自与参数无关的 ϵ \epsilon ϵ,而 z z z μ \mu μ σ \sigma σ 是可微的:

∂ z ∂ μ = 1 , ∂ z ∂ σ = ϵ \frac{\partial z}{\partial \mu} = 1, \quad \frac{\partial z}{\partial \sigma} = \epsilon μz=1,σz=ϵ

&ememsp;因此,梯度可以通过 z z z 反向传播到编码器参数 μ ϕ ( x ) \mu_\phi(x) μϕ(x) σ ϕ ( x ) \sigma_\phi(x) σϕ(x),进而传播到编码器参数 ϕ \phi ϕ

重参数化技巧的一般形式

&ememsp;重参数化技巧不仅适用于高斯分布,也适用于其他位置-尺度族分布。一般地,如果分布可以表示为 z = g ( ϵ , ϕ ) z = g(\epsilon, \phi) z=g(ϵ,ϕ),其中 ϵ \epsilon ϵ 是与 ϕ \phi ϕ 无关的随机变量, g g g 是可微函数,那么就可以用重参数化技巧。

&ememsp;例如:

  • 高斯: z = μ + σ ϵ z = \mu + \sigma \epsilon z=μ+σϵ
  • 均匀: z = a + ( b − a ) ϵ z = a + (b-a)\epsilon z=a+(ba)ϵ ϵ ∼ U ( 0 , 1 ) \epsilon \sim U(0,1) ϵU(0,1)
  • 对数正态: z = exp ⁡ ( μ + σ ϵ ) z = \exp(\mu + \sigma \epsilon) z=exp(μ+σϵ)

&ememsp;对于不能重参数化的分布(如离散分布),需要使用其他方法,如Gumbel-Softmax(连续松弛)或REINFORCE(得分函数估计器,方差大)。

训练算法

&ememsp;VAE的完整训练算法(小批量随机梯度下降):

  1. 采样小批量数据 { x ( i ) } i = 1 M \{x^{(i)}\}_{i=1}^M {x(i)}i=1M
  2. 对每个数据点:
    a. 编码器计算 μ ( i ) = μ ϕ ( x ( i ) ) \mu^{(i)} = \mu_\phi(x^{(i)}) μ(i)=μϕ(x(i)) log ⁡ σ 2 ( i ) = log ⁡ σ ϕ 2 ( x ( i ) ) \log \sigma^{2(i)} = \log \sigma_\phi^2(x^{(i)}) logσ2(i)=logσϕ2(x(i))
    b. 采样 ϵ ( i ) ∼ N ( 0 , I ) \epsilon^{(i)} \sim \mathcal{N}(0, I) ϵ(i)N(0,I)
    c. 重参数化: z ( i ) = μ ( i ) + σ ( i ) ⊙ ϵ ( i ) z^{(i)} = \mu^{(i)} + \sigma^{(i)} \odot \epsilon^{(i)} z(i)=μ(i)+σ(i)ϵ(i)
    d. 解码器计算重构 x ^ ( i ) = f θ ( z ( i ) ) \hat{x}^{(i)} = f_\theta(z^{(i)}) x^(i)=fθ(z(i))
    e. 计算重构损失 L r e c o n ( i ) \mathcal{L}_{recon}^{(i)} Lrecon(i) 和KL散度 L K L ( i ) \mathcal{L}_{KL}^{(i)} LKL(i)
  3. 计算总损失 L = 1 M ∑ i ( L r e c o n ( i ) + L K L ( i ) ) \mathcal{L} = \frac{1}{M} \sum_i (\mathcal{L}_{recon}^{(i)} + \mathcal{L}_{KL}^{(i)}) L=M1i(Lrecon(i)+LKL(i))
  4. 反向传播,更新编码器参数 ϕ \phi ϕ 和解码器参数 θ \theta θ

17.8 应用

VAE应用

图像生成

&ememsp;VAE可以用于生成新图像:从先验 p ( z ) = N ( 0 , I ) p(z) = \mathcal{N}(0, I) p(z)=N(0,I) 采样隐变量 z z z,然后通过解码器生成图像。VAE生成的图像通常比GAN更模糊(因为高斯似然假设像素独立),但隐空间结构更好,适合插值和编辑。

&ememsp;改进的VAE架构(如VQ-VAE、NVAE、VDVAE)在图像生成质量上有很大提升,甚至可以和GAN媲美。

表示学习与解耦

&ememsp;VAE的隐空间通常学习到数据的有意义表示。通过适当的约束(如 β \beta β-VAE、FactorVAE、TC-VAE),可以让隐变量的不同维度对应数据的不同独立生成因素(解耦表示,Disentangled Representation)。

&ememsp;例如,在人脸数据集上,隐变量的不同维度可能分别对应:

  • 微笑/不微笑
  • 年龄
  • 性别
  • 姿态角度
  • 光照方向

&ememsp;解耦表示使得属性编辑变得简单:只需要在隐空间中沿着对应维度移动,就能改变图像的对应属性。

异常检测

&ememsp;VAE可以用于异常检测(Anomaly Detection):正常数据的重构误差小,异常数据的重构误差大(因为VAE只学到了正常数据的分布,无法很好地重构异常数据)。也可以用似然的下界来判断异常——低似然的样本可能是异常。

&ememsp;VAE在工业缺陷检测、医疗异常检测、网络入侵检测等领域有广泛应用。

数据压缩

&ememsp;VAE的编码器将高维数据压缩到低维隐空间,可以用于数据压缩。隐变量的维度远小于原始数据维度,实现了有损压缩。通过调整隐空间维度和KL权重,可以在压缩率和重构质量之间权衡。

其他应用

  1. 序列建模:用RNN/LSTM作为编码器和解码器,构建序列VAE(如VRNN、SRNN),用于语音、文本、时间序列生成。
  2. 药物分子生成:用VAE生成新的药物分子结构(如GrammarVAE、Junction Tree VAE)。
  3. 强化学习:用VAE学习状态表示,用于模型基强化学习(World Models)。
  4. 多模态学习:用VAE学习多模态数据的联合表示和跨模态生成。
  5. 公平性与因果推断:用VAE学习解耦表示,分离敏感属性和非敏感属性,实现公平的预测。

17.9 本章小结

&ememsp;本章我们系统学习了变分自编码器。核心要点如下:

  1. 隐变量模型假设观测数据由未观测的隐变量生成:先验 p ( z ) p(z) p(z) 采样隐变量,似然 p ( x ∣ z ) p(x|z) p(xz) 生成观测数据。数据似然 p ( x ) = ∫ p ( x ∣ z ) p ( z ) d z p(x) = \int p(x|z)p(z)dz p(x)=p(xz)p(z)dz 通常不可计算。

  2. 非线性隐变量模型用神经网络参数化解码器 p ( x ∣ z ) p(x|z) p(xz),增强表达能力。但后验分布 p ( z ∣ x ) p(z|x) p(zx) 因积分不可计算而无法直接推断。

  3. ELBO(证据下界)是对数似然的下界 ELBO = E q ( z ∣ x ) [ log ⁡ p ( x ∣ z ) ] − D K L ( q ( z ∣ x ) ∥ p ( z ) ) \text{ELBO} = \mathbb{E}_{q(z|x)}[\log p(x|z)] - D_{KL}(q(z|x) \parallel p(z)) ELBO=Eq(zx)[logp(xz)]DKL(q(zx)p(z))。ELBO和对数似然的差距是近似后验和真实后验的KL散度。最大化ELBO同时优化模型和近似后验。

  4. 变分近似用简单分布(通常对角高斯)近似复杂后验 q ϕ ( z ∣ x ) = N ( μ ϕ ( x ) , diag ( σ ϕ 2 ( x ) ) ) q_\phi(z|x) = \mathcal{N}(\mu_\phi(x), \text{diag}(\sigma_\phi^2(x))) qϕ(zx)=N(μϕ(x),diag(σϕ2(x))),参数由编码器神经网络计算。高斯后验和标准正态先验的KL散度有解析解。

  5. VAE由编码器和解码器组成:编码器计算近似后验参数,解码器从隐变量生成数据。损失函数 = 重构损失 + KL散度。VAE的隐空间连续有结构,适合插值和编辑。

  6. 重参数化技巧解决采样不可微问题 z = μ + σ ⊙ ϵ z = \mu + \sigma \odot \epsilon z=μ+σϵ ϵ ∼ N ( 0 , I ) \epsilon \sim \mathcal{N}(0,I) ϵN(0,I)。随机性来自与参数无关的 ϵ \epsilon ϵ,使得梯度可以通过采样操作反向传播到编码器。

  7. 后验坍缩是VAE训练中的潜在问题:解码器过强时可能忽略隐变量,KL趋近于0。解决方法包括KL退火、自由比特、减弱解码器等。

  8. VAE的应用包括:图像生成、表示学习与解耦、异常检测、数据压缩、序列建模、药物分子生成、强化学习等。VAE的隐空间结构良好是其核心优势。

  9. VAE vs GAN vs 流模型:VAE训练稳定、隐空间好,但生成图像偏模糊;GAN生成图像清晰,但训练不稳定、模式崩溃;流模型有精确似然、可逆,但需要可逆变换限制架构。三者各有优劣,在不同场景中使用。


代码实验结果

&ememsp;我们编写了完整的Python代码,从零实现了变分自编码器,包括ELBO计算验证、KL散度解析解、编码器-解码器架构、重参数化技巧、以及在二维环形分布上的训练。以下是真实运行结果。

实验1:ELBO计算验证

  • 模型 p ( z ) = N ( 0 , 1 ) p(z)=\mathcal{N}(0,1) p(z)=N(0,1), p ( x ∣ z ) = N ( z , 1 ) p(x|z)=\mathcal{N}(z,1) p(xz)=N(z,1),则 p ( x ) = N ( 0 , 2 ) p(x)=\mathcal{N}(0,2) p(x)=N(0,2)
  • 测试点 x = 0 x=0 x=0
  • 最优后验 q ( z ∣ x ) = N ( 0 , 0.5 ) q(z|x)=\mathcal{N}(0, 0.5) q(zx)=N(0,0.5)(精确后验)
在x=0.0处:
  真实 log p(x) = -1.2655
  最优后验 ELBO = -1.2655
  ELBO <= log p(x): True
  差距(应为0,因为q是精确后验): 0.000000

实验2:KL散度解析解验证

KL散度测试(q=N(mu, exp(log_var)), p=N(0,1)):
  mu=0.0, log_var=0.0: KL=-0.0000(q=p,KL=0)
  mu=1.0, log_var=0.0: KL=0.5000(均值偏移)
  mu=0.0, log_var=1.0: KL=0.3591(方差变大)
  mu=2.0, log_var=0.5: KL=2.0744(均值和方差都偏移)

实验3:重参数化技巧验证

  • 设置 μ = [ 1 , 2 ] \mu=[1,2] μ=[1,2], log ⁡ σ 2 = [ 0 , 0 ] \log\sigma^2=[0,0] logσ2=[0,0](即 σ = 1 \sigma=1 σ=1
  • 采样次数:1000次
重参数化测试(mu=[1,2], log_var=[0,0],即std=1):
  采样均值: [1.0199, 2.0629](应接近[1,2])
  采样标准差: [0.9764, 1.0045](应接近[1,1])

实验4:VAE训练(二维环形分布)

  • VAE结构:编码器 2→32→(2,2),解码器 2→32→2
  • 目标分布:二维环形分布(半径2.0,标准差0.3)
  • 训练轮次:300,批次大小256,学习率0.001
Epoch 100: 总损失=4.0604, 重构损失=4.0514, KL损失=0.0090
Epoch 200: 总损失=4.0942, 重构损失=4.0847, KL损失=0.0095
Epoch 300: 总损失=4.0006, 重构损失=3.9908, KL损失=0.0098

结果可视化

VAE实验结果

结果分析

  1. ELBO验证通过:在x=0处,真实log p(x)=-1.2655,用最优后验(精确后验)计算的ELBO也是-1.2655,两者差距为0。这验证了ELBO的理论性质——当近似后验等于真实后验时,ELBO等于对数似然。这是VAE训练的理论基础。

  2. KL散度解析解正确:当q=p(mu=0, log_var=0)时,KL=0;当均值偏移(mu=1)时,KL=0.5;当方差变大(log_var=1)时,KL=0.359。这些结果和理论公式 K L = 0.5 × ( μ 2 + σ 2 − 1 − log ⁡ σ 2 ) KL = 0.5 \times (\mu^2 + \sigma^2 - 1 - \log\sigma^2) KL=0.5×(μ2+σ21logσ2) 完全一致。高斯后验的KL散度有解析解是VAE的一大优势——不需要采样估计,计算精确且高效。

  3. 重参数化技巧验证通过:用 z = μ + σ ⊙ ϵ z = \mu + \sigma \odot \epsilon z=μ+σϵ 采样1000次,采样均值[1.02, 2.06]接近理论均值[1,2],采样标准差[0.98, 1.00]接近理论标准差[1,1]。这验证了重参数化技巧的正确性——它确实从 N ( μ , σ 2 ) \mathcal{N}(\mu, \sigma^2) N(μ,σ2) 中采样,同时保持对 μ \mu μ σ \sigma σ 的可微性。

  4. VAE训练稳定:和GAN的训练不稳定不同,VAE的损失曲线平滑(总损失从4.06波动到4.00,没有剧烈震荡)。重构损失占主导(约4.0),KL损失很小(约0.01)。这是VAE的核心优势——有明确的优化目标ELBO,训练稳定可预测。

  5. 简化实现的局限性:这个简化的VAE用数值梯度(随机扰动)而不是自动微分来更新参数,训练轮次也较少(300轮),所以生成结果还不够完美——生成样本的方差(约0.001)远小于目标分布的方差(约2.0),说明VAE还没有完全学到环形分布的形状。在实际应用中,使用PyTorch/TensorFlow自动微分、更多训练轮次、更深的网络,可以得到更好的结果。

  6. KL损失很小的意义:训练中KL损失约0.01,非常小。这说明近似后验已经很接近先验(标准正态),隐空间被正则化得很好。但KL太小也可能意味着后验坍缩的风险——隐变量可能没有包含足够的关于数据的信息。在实际训练中,需要监控KL损失,必要时使用KL退火或自由比特等技术。


本章核心总结

第17章思维导图

&ememsp;一句话概括:VAE通过隐变量模型和变分推断学习生成模型,用ELBO稳定训练,用重参数化技巧实现端到端优化,隐空间结构良好适合表示学习和生成。

VAE核心公式清单

概念公式
数据似然 p ( x ) = ∫ p ( x ∣ z ) p ( z ) d z p(x) = \int p(x|z)p(z)dz p(x)=p(xz)p(z)dz
ELBO ELBO = E q [ log ⁡ p ( x ∣ z ) ] − D K L ( q ( z ∣ x ) ∣ p ( z ) ) \text{ELBO} = \mathbb{E}_q[\log p(x|z)] - D_{KL}(q(z|x) | p(z)) ELBO=Eq[logp(xz)]DKL(q(zx)p(z))
ELBO与log p(x) log ⁡ p ( x ) − ELBO = D K L ( q ( z ∣ x ) ∣ p ( z ∣ x ) ) \log p(x) - \text{ELBO} = D_{KL}(q(z|x) | p(z|x)) logp(x)ELBO=DKL(q(zx)p(zx))
高斯KL解析解 D K L = 1 2 ∑ i ( μ i 2 + σ i 2 − 1 − log ⁡ σ i 2 ) D_{KL} = \frac{1}{2}\sum_i(\mu_i^2 + \sigma_i^2 - 1 - \log\sigma_i^2) DKL=21i(μi2+σi21logσi2)
重参数化 z = μ + σ ⊙ ϵ ,   ϵ ∼ N ( 0 , I ) z = \mu + \sigma \odot \epsilon,\ \epsilon \sim \mathcal{N}(0,I) z=μ+σϵ, ϵN(0,I)
VAE损失 L = 重构损失 + D K L ( q ( z ∣ x ) ∣ p ( z ) ) \mathcal{L} = \text{重构损失} + D_{KL}(q(z|x) | p(z)) L=重构损失+DKL(q(zx)p(z))

VAE编解码与重参数化动态演示

  下面的动画展示了变分自编码器的核心机制:从隐变量模型到ELBO下界,再到重参数化技巧,展示编码器如何近似后验、解码器如何生成数据以及梯度如何通过采样传播。


结语

&ememsp;本章我们系统学习了变分自编码器。从隐变量模型的基本概念,到非线性隐变量模型和后验不可计算性,再到ELBO的推导和性质、变分近似、VAE的网络架构和损失函数、重参数化技巧,最后讨论了VAE的广泛应用。VAE以其优雅的概率框架、稳定的训练、良好的隐空间结构,成为深度学习中最重要的生成模型之一。

&ememsp;VAE的一个特点是生成的图像通常偏模糊(因为高斯似然假设像素独立)。下一章我们将学习第四种生成模型——扩散模型(Diffusion Models)。扩散模型通过逐步添加噪声和学习去噪来生成数据,训练稳定,生成质量极高(当前图像生成的SOTA),DALL-E 2、Stable Diffusion、Midjourney等著名图像生成系统都基于扩散模型。扩散模型结合了VAE的稳定训练和GAN的高质量生成的优势。

&ememsp;下一章见!

更多推荐