中文笔记:An Introduction to Discrete Variational Autoencoders
1. 统计学基础:
数学符号:
标量(Scalar-valued variable):,
向量、矩阵或向量拼接(Vectors, matrices, concatenations of vectors):,
概率分布(Probability Distributions):, 从分布中采样或随机变量的记法:,
可学习的参数:,
概率密度函数(或概率质量函数): , ,
分布在参数 下对 的评估: ,
概率分布下的期望表示: , 积分形式展开:
概率与信息度量(Probabilities and Information Measures)
编号 | 概念 | 表达式 |
---|---|---|
(1) | 联合概率与条件概率关系 | |
(2) | 全概率公式 | |
(3) | KL 散度(KL Divergence) | |
(4) | 熵(Entropy) | |
(5) | 交叉熵(Cross-Entropy) | |
(6) | 离散熵(Discrete Entropy) | |
(7) | 离散交叉熵(Discrete Cross-Entropy) | |
(8) | 二元交叉熵(Binary Cross-Entropy) | |
(9) | 批量熵(Aggregate Entropy) | |
(10) | 批量二元交叉熵(Aggregate Binary Cross-Entropy) |
复习:
条件概率表示在事件 B 发生的前提下,事件 A 发生的概率是多少。
KL 散度衡量的是:如果你用分布 p 来近似真实分布 q,会造成多大的“信息损失”。如果 ,即两分布完全一致,KL 散度为 0。它是非对称的:
熵用来量化一个概率分布的不确定性。如果一个事件很确定 —— 熵为 0。如果事件非常不确定,比如硬币有一半的几率是正面,一半是反面,那么结果完全不可预测 —— 熵最大。
交叉熵是评价用预测分布 q 来描述真实分布 p 有多糟? = 真实熵 + 预测带来的额外损失(KL 散度)
离散概率分布(Discrete Probability Distributions)
- 伯努利分布(Bernoulli Distribution):适用于仅有两个结果(例如抛硬币)的事件。
定义为:
, p是一种情况发生的概率
伯努利分布概率质量函数为:
亦可写作:
- 分类分布(Categorical Distribution):是伯努利分布在 个结果上的扩展。
定义为:
概率质量函数为:
可以使用Iverson Bracket简明表示为:
同样可以简写为:
最大似然估计(Maximum Likelihood Estimation)
当我们建立一个模型来估计分布 时,常见的方法是选择一组最优参数 ,使得在该模型下观察到的数据的联合概率(joint probability)最大。这种方法称为最大似然估计(MLE)。
给定一组观测数据 ,我们希望找到能最大化似然函数的参数:
由于直接对乘积求最大值在数值计算中容易出现问题,我们通常对似然函数取对数,转为对数似然函数:
对数不会改变最大值的位置,所以最终解是相同的。
蒙特卡洛采样(Monte Carlo Sampling)
在优化模型时,我们经常需要计算如下形式的目标函数的梯度:
其中:
- 是模型的可学习参数;
- 是某个固定的分布(通常是训练数据分布);
- 是与输入 和参数 有关的函数,例如损失函数。
上述期望一般是一个积分(或和),它包含了所有可能样本 的信息。但是,在实际中:
- 数据集有限,我们无法枚举所有 ;
- 积分难以解析求解,尤其当 是复杂或隐式分布。
因此,通常我们只能对一个(或几个)样本 估计这个梯度:
这种做法称为 蒙特卡洛估计(Monte Carlo estimate)。
它的核心思想是: > 用少量样本的梯度来近似整个分布下期望的梯度。
当我们采样 个样本 ,对每个计算梯度并取平均,有:
这意味着,当样本数量足够大时,我们就可以逼近真实的期望梯度。这个结论依赖于 大数定律(Law of Large Numbers)。
使用蒙特卡洛采样得到的估计梯度可以简写为:
即,用单个样本的梯度来近似整体期望的梯度。
2. VAE的机制
- 自编码器(Autoencoder):
- 结构:编码器 → 潜在空间特征 → 解码器 。
- 目标:将 压缩到低维 ,再重建 。
变分自编码器(Variational Autoencoder)的机制
- 将确定性潜在空间特征替换为 指定的潜在空间中的分布(通常采用独立高斯):
- 解码器对样本进行重建:
- 训练损失(ELBO 形式):
– 第一项 = 重建误差;第二项 = 先验正则化。
3. 目标函数推导
1. 无法直接优化的目标
最终目标: 和许多机器学习模型一样,我们的根本目标是最大化数据的对数似然 (log-likelihood),即 。这个值代表了在给定模型参数 的情况下,观测到真实数据 的概率。概率越大,说明我们的模型越能“解释”或“生成”真实数据。
VAE 的设定: VAE 是一个隐变量模型 (Latent Variable Model)。它假设我们观测到的数据 是由一些我们无法直接观测到的隐变量
z
(latent variables) 所生成的。数学表达: 我们可以通过对所有可能的隐变量
使用条件概率法则,上式可以写为: 这里:z
进行积分(边缘化),来表达 :- 是隐变量的先验分布(我们对
z
的预先假设,通常设为简单的标准正态分布)。 - 是给定一个隐变量
z
,生成数据x
的概率。
- 是隐变量的先验分布(我们对
棘手之处: 公式中的积分是难以计算的 (intractable)。因为隐空间
z
通常是高维连续的,我们无法穷举所有z
来计算这个积分。即使z
是离散的,其计算量也会随着维度呈指数级增长 (m^n
)。
2. 推导可行的目标函数
既然直接优化行不通,我们需要找到一个替代方案。
第一步:引入后验概率 我们利用贝叶斯公式 ,反向得到 。取对数后:
这个式子虽然没有了积分,但引入了一个新的难题:后验概率 $p_{\theta}(z|x)$。计算它需要知道 $p_{\theta}(x)$,这又回到了原点,陷入了循环论证。第二步:关键技巧——引入一个辅助分布
q(z)
为了打破僵局,我们引入一个由参数 控制的、关于 的任意概率分布 。然后我们进行一系列数学变换:- 变换解释:
- 行(1):因为 相对于 是个常数,所以它在任何关于 的分布 下的期望都是它本身。
- 行(3):在对数内部,同时乘以和除以 ,这是一个值为1的恒等变换。
- 行(4):利用对数的性质 ,将式子拆成两项。
- 变换解释:
3. ELBO 的诞生及其重要意义
公式(4)
的拆分是整个推导的核心。让我们来分析这两项:
第二项:KL 散度
这一项正是 `q` 分布与真实后验分布 `p(z|x)` 之间的KL 散度 (KL-divergence),永远非负。第一项:证据下界 (ELBO) 既然 等于第一项加上一个非负的 KL 散度,那么第一项必然是 的一个下界。 这个下界就是我们梦寐以求的可优化的目标,它被称为证据下界 (Evidence Lower Bound, ELBO)。 如果我们能找到参数和使该下界最大化(同时不导致其他项发散),那么这将也是一个接近最大化对数似然本身的解。
让
q
更有效:q
分布之前是任意的,但我们的目标是让这个下界尽可能地接近真实的log p(x)
。什么时候下界最紧呢?当 KL 散度为 0 时。而 KL 散度为 0 的条件是当且仅当两个分布完全相同,即q_{\phi}(z) = p_{\theta}(z|x)
。 这启发我们,q
分布应该用来近似 那个我们算不出来的真实后验p(z|x)
。因此,我们让q
也依赖于x
,将其写为q(z|x)
。最终的目标函数: 将
我们的优化问题就从“最大化 `log p(x)`” 变成了 “**最大化 ELBO**”。q(z)
替换为q(z|x)
后,我们得到了最终的 ELBO 表达式:
4. ELBO 的精妙之处:双重优化
为了更好地理解我们到底在优化什么,我们将公式重新整理一下:
从这个式子可以看出,最大化 ELBO 同时在做两件事情:
最大化数据似然
log p(x)
: ELBO 的提升会直接推高 。这意味着我们的模型更好地捕捉到观测数据的分布。最小化 KL 散度
DKL(...)
: 对于一个给定的数据 , 是一个定值。此时,要让 ELBO 变大,就必须让 KL 散度变小。这使我们的近似后验分布 去不断逼近真实的后验分布 。
3. 离散 VAE (Discrete VAE)
离散 VAE 的隐空间 z
不再是连续的,而是由一系列离散的类别变量构成。
1. 隐空间 z
的设计
- 结构:隐空间由
D
个独立的隐变量组成,每个隐变量可以从K
个离散的类别中取值。 - 表示方法:为了在实践中实现这一点,每个隐变量都用一个 one-hot 编码的向量来表示。向量的长度为
K
,在被选中的类别索引处为“1”,其余位置为“0”。 数学表达:因此,一个完整的隐样本
z
是一个D x K
的矩阵,即z ∈ {0,1}^{D×K}
,并且对于D
个变量中的任何一个d
,其K
个类别的总和都为1:
2. 模型组件的具体选择
先验分布
p(z)
- 对于离散的隐变量,一个自然的选择是均匀范畴分布 (Uniform Categorical Distribution)。
- 这意味着,在没有任何信息的情况下,我们假设每个隐变量
z^(d)
从K
个类别中选择任何一个的概率都是相等的 (1/K
)。 公式:
这里的 `K^-1` 表示一个所有元素都为 `1/K` 的概率向量。
编码器 Encoder (近似后验
q(z|x)
)- 编码器的作用是根据输入数据
x
来推断隐变量z
的分布。 - 它是一个神经网络
f_ϕ(x)
,其输出是D x K
个概率值。这些概率值定义了D
个范畴分布的参数。 - 前向传播过程:我们将输入
x
送入编码器网络f_ϕ(x)
,得到每个隐变量z^(d)
的类别概率,然后从这个分布中进行采样,得到 one-hot 形式的z
。 公式:
- 编码器的作用是根据输入数据
解码器 Decoder (数据似然
p(x|z)
)- 解码器的作用是根据隐变量
z
重建原始输入概率x
。 以二值化 MNIST 数据为例:
- 数据预处理:我们将 MNIST 的每个像素二值化为黑色(0)或白色(1),即
x ∈ {0,1}^P
,其中P
是像素总数。 - 分布选择:对于这种二元数据,最自然的概率分布是伯努利分布 (Bernoulli Distribution)。
- 解码器网络
g_θ(z)
:它是一个神经网络,接收隐变量z
作为输入,输出P
个概率值。每个概率值对应一个像素,代表该像素为白色(1)的概率。 公式:
- 数据预处理:我们将 MNIST 的每个像素二值化为黑色(0)或白色(1),即
- 解码器的作用是根据隐变量
4. 离散 VAE 的梯度推导与损失函数
理解了离散 VAE 的模型结构后,最后一步是推导其梯度,以便我们进行优化,并明确最终的损失函数。ELBO 的目标是最大化,但在实践中我们通常最小化其负数,即-ELBO。
1. 解码器(Decoder)参数 θ
的梯度 ∇θ
这部分的推导相对直接。
核心思路:ELBO 中关于
θ
的项是E[log pθ(x|z)]
。因为期望是针对qϕ(z|x)
计算的,它不依赖于θ
,所以我们可以将梯度算子∇θ
直接移入期望内部。推导过程:
这一交换使得我们可以使用蒙特卡洛采样来近似梯度:从
qϕ(z|x)
中采样一个z
,然后计算∇θ log pθ(x|z)
。对于二值化的独立像素,
log pθ(x|z)
可以分解为每个像素的对数概率之和。每个像素服从伯努利分布
p(x) = p^x(1-p)^(1-x)
。其对数概率为x log(p) + (1-x) log(1-p)
。将解码器网络
gθ(z)
的输出视为伯努利分布的参数p
,我们得到:这里的梯度就是我们非常熟悉的二元交叉熵 (Binary Cross-Entropy, BCE) 损失的负梯度。在任何自动微分库(如 PyTorch)中,这都可以被直接计算。
2. 编码器(Encoder)参数 ϕ
的梯度 ∇ϕ
这部分要复杂得多,因为它包含两项,且其中一项的梯度不能直接计算。
A. KL 散度项 -DKL(qϕ(z|x)||p(z))
的梯度
- 核心思路:总的 KL 散度是
D
个独立隐变量的 KL 散度之和。我们可以先分析单个变量,再求和。 推导过程:对于单个隐变量
这里 `Entropy` 是编码器输出的范畴分布的**熵**。z^(d)
,其 KL 散度展开后经过化简可以得到:对所有
D
个变量求和,这一项的梯度变为:最大化 ELBO 意味着要最大化编码器输出分布的熵,这鼓励编码器不要对某个类别过于自信,起到正则化的作用。
B. 重建项 E[log pθ(x|z)]
的梯度
- 挑战:在这里,我们不能将梯度
∇ϕ
直接移入期望,因为期望本身就是对qϕ
计算的,qϕ
依赖于ϕ
。 解决方案:Log-Derivative Trick 我们使用一种名为“对数-导数技巧”(在强化学习中也叫 REINFORCE)的方法来重写梯度:
这个技巧再次将梯度移入了期望内部,使我们又能使用蒙特卡洛采样。推导过程:
应用该技巧后,我们的梯度近似为:
- 第一部分
log pθ(x|z)
我们已经知道,它就是负的 BCE 损失:-BCE(gθ(z), x)
。 第二部分
log qϕ(z|x)
是D
个隐变量的对数概率之和。对于一个被采样出的 one-hot 样本z
,log qϕ(z|x)
等于所有被选中类别的对数概率之和。记k(d)
为第d
个变量被采样的类别索引,则:组合起来,得到最终的梯度表达式:
直观理解:这个梯度形式可以看作是:
[奖励]
乘以[采取动作的对数概率的梯度]
。这里的“奖励”是重建效果的好坏(-BCE
,重建越好,此项值越大),“动作”是编码器选择了某个类别。
3. 最终的 ELBO 损失函数
综合以上推导,我们可以写出在训练中实际计算和追踪的 ELBO 的蒙特卡洛近似形式。记住,我们的目标是最大化 ELBO。
在实践中,我们通常会最小化 -ELBO,其损失函数为:
这个公式清晰地告诉了我们训练离散 VAE 的全部内容:
- 最小化重建损失 (BCE):让解码器学会如何从隐变量中恢复原始图像。
- 最大化熵 (Entropy):鼓励编码器的输出分布更多样化,防止模式坍塌。
D log K
是一个常数,在比较不同隐空间大小的模型时很重要,但在单次训练的梯度计算中可以忽略。