中文笔记:An Introduction to Discrete Variational Autoencoders

20 天前(已编辑)
5

中文笔记: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)

复习:

  1. 条件概率表示在事件 B 发生的前提下,事件 A 发生的概率是多少。

  2. KL 散度衡量的是:如果你用分布 p 来近似真实分布 q,会造成多大的“信息损失”。如果 ,即两分布完全一致,KL 散度为 0。它是非对称的:

  3. 熵用来量化一个概率分布的不确定性。如果一个事件很确定 —— 熵为 0。如果事件非常不确定,比如硬币有一半的几率是正面,一半是反面,那么结果完全不可预测 —— 熵最大。

  4. 交叉熵是评价用预测分布 q 来描述真实分布 p 有多糟? = 真实熵 + 预测带来的额外损失(KL 散度)

离散概率分布(Discrete Probability Distributions)

  1. 伯努利分布(Bernoulli Distribution):适用于仅有两个结果(例如抛硬币)的事件。

定义为:

, p是一种情况发生的概率

伯努利分布概率质量函数为:

亦可写作:

  1. 分类分布(Categorical Distribution):是伯努利分布在 个结果上的扩展。

定义为:

概率质量函数为:

可以使用Iverson Bracket简明表示为:

同样可以简写为:

最大似然估计(Maximum Likelihood Estimation)

当我们建立一个模型来估计分布 时,常见的方法是选择一组最优参数 ,使得在该模型下观察到的数据的联合概率(joint probability)最大。这种方法称为最大似然估计(MLE)

给定一组观测数据 ,我们希望找到能最大化似然函数的参数:

由于直接对乘积求最大值在数值计算中容易出现问题,我们通常对似然函数取对数,转为对数似然函数:

对数不会改变最大值的位置,所以最终解是相同的。

蒙特卡洛采样(Monte Carlo Sampling)

在优化模型时,我们经常需要计算如下形式的目标函数的梯度:

其中:

  • 是模型的可学习参数;
  • 是某个固定的分布(通常是训练数据分布);
  • 是与输入 和参数 有关的函数,例如损失函数。

上述期望一般是一个积分(或和),它包含了所有可能样本 的信息。但是,在实际中:

  • 数据集有限,我们无法枚举所有
  • 积分难以解析求解,尤其当 是复杂或隐式分布。

因此,通常我们只能对一个(或几个)样本 估计这个梯度:

这种做法称为 蒙特卡洛估计(Monte Carlo estimate)

它的核心思想是: > 用少量样本的梯度来近似整个分布下期望的梯度。

当我们采样 个样本 ,对每个计算梯度并取平均,有:

这意味着,当样本数量足够大时,我们就可以逼近真实的期望梯度。这个结论依赖于 大数定律(Law of Large Numbers)

使用蒙特卡洛采样得到的估计梯度可以简写为:

即,用单个样本的梯度来近似整体期望的梯度。


2. VAE的机制

  1. 自编码器(Autoencoder):
  • 结构:编码器 → 潜在空间特征 → 解码器
  • 目标:将 压缩到低维 ,再重建
  1. 变分自编码器(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)

  • 最终的目标函数:q(z) 替换为 q(z|x) 后,我们得到了最终的 ELBO 表达式:

    我们的优化问题就从“最大化 `log p(x)`” 变成了 “**最大化 ELBO**”。

4. ELBO 的精妙之处:双重优化

为了更好地理解我们到底在优化什么,我们将公式重新整理一下:

从这个式子可以看出,最大化 ELBO 同时在做两件事情:

  1. 最大化数据似然 log p(x): ELBO 的提升会直接推高 。这意味着我们的模型更好地捕捉到观测数据的分布。

  2. 最小化 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. 模型组件的具体选择

  1. 先验分布 p(z)

    • 对于离散的隐变量,一个自然的选择是均匀范畴分布 (Uniform Categorical Distribution)
    • 这意味着,在没有任何信息的情况下,我们假设每个隐变量 z^(d)K 个类别中选择任何一个的概率都是相等的 (1/K)。
    • 公式

      这里的 `K^-1` 表示一个所有元素都为 `1/K` 的概率向量。
  2. 编码器 Encoder (近似后验 q(z|x))

    • 编码器的作用是根据输入数据 x 来推断隐变量 z 的分布。
    • 它是一个神经网络 f_ϕ(x),其输出是 D x K 个概率值。这些概率值定义了 D 个范畴分布的参数。
    • 前向传播过程:我们将输入 x 送入编码器网络 f_ϕ(x),得到每个隐变量 z^(d) 的类别概率,然后从这个分布中进行采样,得到 one-hot 形式的 z
    • 公式

  3. 解码器 Decoder (数据似然 p(x|z))

    • 解码器的作用是根据隐变量 z 重建原始输入概率 x
    • 以二值化 MNIST 数据为例

      • 数据预处理:我们将 MNIST 的每个像素二值化为黑色(0)或白色(1),即 x ∈ {0,1}^P,其中 P 是像素总数。
      • 分布选择:对于这种二元数据,最自然的概率分布是伯努利分布 (Bernoulli Distribution)
      • 解码器网络 g_θ(z):它是一个神经网络,接收隐变量 z 作为输入,输出 P 个概率值。每个概率值对应一个像素,代表该像素为白色(1)的概率。
      • 公式


4. 离散 VAE 的梯度推导与损失函数

理解了离散 VAE 的模型结构后,最后一步是推导其梯度,以便我们进行优化,并明确最终的损失函数。ELBO 的目标是最大化,但在实践中我们通常最小化其负数,即-ELBO。

1. 解码器(Decoder)参数 θ 的梯度 ∇θ

这部分的推导相对直接。

  • 核心思路:ELBO 中关于 θ 的项是 E[log pθ(x|z)]。因为期望是针对 qϕ(z|x) 计算的,它不依赖于 θ,所以我们可以将梯度算子 ∇θ 直接移入期望内部。

  • 推导过程

    1. 这一交换使得我们可以使用蒙特卡洛采样来近似梯度:从 qϕ(z|x) 中采样一个 z,然后计算 ∇θ log pθ(x|z)

    2. 对于二值化的独立像素,log pθ(x|z) 可以分解为每个像素的对数概率之和。

    3. 每个像素服从伯努利分布 p(x) = p^x(1-p)^(1-x)。其对数概率为 x log(p) + (1-x) log(1-p)

    4. 将解码器网络 gθ(z) 的输出视为伯努利分布的参数 p,我们得到:

      这里的梯度就是我们非常熟悉的二元交叉熵 (Binary Cross-Entropy, BCE) 损失的负梯度。在任何自动微分库(如 PyTorch)中,这都可以被直接计算。


2. 编码器(Encoder)参数 ϕ 的梯度 ∇ϕ

这部分要复杂得多,因为它包含两项,且其中一项的梯度不能直接计算。

A. KL 散度项 -DKL(qϕ(z|x)||p(z)) 的梯度

  • 核心思路:总的 KL 散度是 D 个独立隐变量的 KL 散度之和。我们可以先分析单个变量,再求和。
  • 推导过程:对于单个隐变量 z^(d),其 KL 散度展开后经过化简可以得到:

    这里 `Entropy` 是编码器输出的范畴分布的**熵**。

    对所有 D 个变量求和,这一项的梯度变为:

    最大化 ELBO 意味着要最大化编码器输出分布的熵,这鼓励编码器不要对某个类别过于自信,起到正则化的作用。

B. 重建项 E[log pθ(x|z)] 的梯度
  • 挑战:在这里,我们不能将梯度 ∇ϕ 直接移入期望,因为期望本身就是对 计算的, 依赖于 ϕ
  • 解决方案:Log-Derivative Trick 我们使用一种名为“对数-导数技巧”(在强化学习中也叫 REINFORCE)的方法来重写梯度:

    这个技巧再次将梯度移入了期望内部,使我们又能使用蒙特卡洛采样。
  • 推导过程

    1. 应用该技巧后,我们的梯度近似为:

    2. 第一部分 log pθ(x|z) 我们已经知道,它就是负的 BCE 损失:-BCE(gθ(z), x)
    3. 第二部分 log qϕ(z|x)D 个隐变量的对数概率之和。对于一个被采样出的 one-hot 样本 zlog qϕ(z|x) 等于所有被选中类别的对数概率之和。记 k(d) 为第 d 个变量被采样的类别索引,则:

    4. 组合起来,得到最终的梯度表达式:

  • 直观理解:这个梯度形式可以看作是:[奖励] 乘以 [采取动作的对数概率的梯度]。这里的“奖励”是重建效果的好坏(-BCE,重建越好,此项值越大),“动作”是编码器选择了某个类别。


3. 最终的 ELBO 损失函数

综合以上推导,我们可以写出在训练中实际计算和追踪的 ELBO 的蒙特卡洛近似形式。记住,我们的目标是最大化 ELBO。

在实践中,我们通常会最小化 -ELBO,其损失函数为:

这个公式清晰地告诉了我们训练离散 VAE 的全部内容:

  1. 最小化重建损失 (BCE):让解码器学会如何从隐变量中恢复原始图像。
  2. 最大化熵 (Entropy):鼓励编码器的输出分布更多样化,防止模式坍塌。
  3. D log K 是一个常数,在比较不同隐空间大小的模型时很重要,但在单次训练的梯度计算中可以忽略。
  • Loading...
  • Loading...
  • Loading...
  • Loading...
  • Loading...