斯坦福-CS236-深度生成模型笔记-全-

斯坦福 CS236 深度生成模型笔记(全)

课程一:深度生成模型导论 🚀

在本节课中,我们将学习深度生成模型的基本概念、哲学背景、广泛应用以及课程的整体结构。我们将探讨为什么生成模型是理解复杂数据的关键,并了解它们如何推动人工智能领域的发展。

概述

深度生成模型旨在学习数据的概率分布,并能够从中生成新的、类似的数据样本。其核心哲学是:真正的理解意味着创造的能力。如果我们声称理解一个概念(例如“苹果”或“意大利语”),那么我们应该能够生成与之相关的内容(例如画出一个苹果或说出一句意大利语)。生成模型正是将这种哲学转化为统计和计算框架,通过大量数据学习世界的潜在规律。

生成模型的哲学与动机

上一节我们概述了生成模型的目标。本节中,我们来看看其背后的核心思想。

理查德·费曼曾说过:“我不能创造的,我就不理解。” 生成模型将这一理念逆向应用:如果我们能生成逼真的图像、文本或语音,那就意味着我们对这些数据背后的结构和含义有了一定程度的理解。这种“通过生成来理解”的范式,为计算机视觉、自然语言处理等领域的许多任务提供了统一的框架。

例如,计算机图形学通过编写渲染器来从高级描述生成图像,这需要理解形状、颜色、光照等概念。深度生成模型则采用更数据驱动的方式,试图用最少的先验知识,从海量数据中直接学习如何生成。

从统计视角看,生成模型本质上是对数据 x(如图像、文本序列)的概率分布 p(x) 进行建模。这个模型是一个函数,为任何可能的输入 x 分配一个标量概率值,表示该数据出现的可能性。训练完成后,我们可以从这个分布中采样,从而创造出新的数据。因此,生成模型可以被视为数据模拟器

生成模型的广泛应用

理解了基本概念后,我们来看看生成模型在各个领域带来的革命性进展。以下是其主要应用方向:

图像生成与编辑

生成模型在图像领域取得了令人瞩目的成就,从生成模糊的人脸到创造高分辨率、逼真的全新图像。

  • 文本到图像:用户输入文字描述(如“一个骑在马上的宇航员”),模型能生成符合描述的图像。这展示了模型对概念及其组合方式的理解。
  • 图像编辑:基于草图生成精美图像、为黑白照片上色、提升图像分辨率(超分辨率)、或根据文字指令修改图像(如“让鸟展开翅膀”)。
  • 医学成像:减少获取清晰医学影像(如CT扫描)所需的辐射剂量或测量次数。

音频生成与处理

在音频领域,生成模型同样能合成高质量、自然的语音。

  • 文本到语音:将文字转换为带有情感、语调自然的语音。
  • 音频超分辨率:从低质量音频信号中恢复出高质量音频。

文本与代码生成

大型语言模型是文本生成模型的典型代表,它们不仅能生成流畅的文本,还能完成复杂任务。

  • 对话与内容创作:根据提示完成句子、回答问题、撰写文章。
  • 机器翻译:将一种语言的文本转换为另一种语言。
  • 代码生成:根据自然语言描述自动生成代码片段。

视频生成

视频可视为一系列连贯的图像,视频生成模型正朝着生成高质量、长篇幅内容的方向快速发展。

  • 文本到视频:根据描述生成短视频片段。
  • 图像动画化:让静态图像动起来。

科学发现与决策制定

生成模型的应用已超越常见的媒体模态,进入科学和决策领域。

  • 分子与蛋白质设计:生成具有特定属性或功能的新分子结构,用于药物研发。
  • 机器人模仿学习:学习人类演示的行为,生成合理的动作序列,用于机器人控制(如驾驶、抓取)。

核心概念与课程路线图

领略了生成模型的强大能力后,我们需要了解构建它们所需的核心构件。本课程将深入探讨以下三个关键概念:

  1. 表示:如何用神经网络等参数化模型来表示复杂的高维概率分布 p(x)
  2. 学习:如何利用数据来训练模型,即如何衡量并最小化模型分布与真实数据分布之间的差异。
  3. 推断:如何从训练好的模型中高效采样,以及如何通过生成过程反推数据的潜在表示(逆向过程)。

基于这些概念,课程将系统性地讲解以下几类主流的深度生成模型:

  • 似然模型:直接对概率分布 p(x) 进行建模并计算似然。
    • 自回归模型:将联合分布分解为条件分布的乘积,p(x) = ∏ p(x_i | x_<i)。常用于文本(如LLMs)。
    • 标准化流模型:通过一系列可逆变换将简单分布转换为复杂分布。
  • 隐变量模型:引入隐变量 z 来增加模型表达能力,建模 p(x) = ∫ p(x|z)p(z) dz
    • 变分自编码器:使用变分推断进行近似学习和推断。
  • 隐式生成模型:不显式定义 p(x),而是定义一个生成样本的随机过程。
    • 生成对抗网络:通过生成器和判别器的对抗博弈进行训练。
  • 基于能量的模型与扩散模型
    • 扩散模型:当前图像生成领域的核心技术,通过逐步去噪的过程生成数据。

课程要求与安排

为了顺利完成本课程,你需要具备以下基础:

  • 机器学习:至少完成一门机器学习课程。
  • 数学:熟悉概率论、微积分、线性代数、贝叶斯规则。
  • 编程:熟悉Python,我们将使用PyTorch框架。

课程评估将包括:

  • 作业(15%):包含理论与编程任务。
  • 期中考试:在课堂进行。
  • 课程项目(40%):是课程的核心部分,鼓励学生进行探索与创新。

总结

本节课中,我们一起学习了深度生成模型的宏伟图景。我们从“理解即创造”的哲学出发,探讨了生成模型作为数据模拟器的本质,并展示了其在图像、音频、文本、视频乃至科学发现中的广泛应用。最后,我们概述了构建这些模型所需的核心概念——表示、学习与推断,以及本课程将涵盖的具体模型类型和技术路线。这是一个充满活力与机遇的领域,希望本课程能为你打下坚实的基础,使你不仅能理解现有的强大系统,更能参与构建下一代生成模型。

斯坦福CS236:深度生成模型 I 2023 | 课程10 - 生成对抗网络(GAN)🚀

在本节课中,我们将要学习生成对抗网络(GAN)的核心概念、数学原理及其扩展。我们将从GAN的基本思想出发,探讨如何通过对抗性训练来优化模型,并介绍更广泛的散度概念,如f-散度和Wasserstein距离。最后,我们会简要讨论如何在GAN中推断潜在表示。


概述 📖

生成对抗网络(GAN)是一种强大的生成模型,它通过对抗性训练来学习数据分布。与基于似然的模型不同,GAN不需要显式地评估数据点的概率,这使得它能够使用更灵活的模型架构。在本节中,我们将深入探讨GAN的训练目标、数学原理及其扩展。


GAN的基本思想 🧠

上一节我们介绍了基于似然的生成模型,本节中我们来看看生成对抗网络(GAN)。GAN的核心思想是通过一个判别器(Discriminator)和一个生成器(Generator)之间的对抗性游戏来训练模型。

生成器试图生成与真实数据相似的样本,而判别器则试图区分真实样本和生成样本。如果判别器难以区分这两种样本,那么生成器的表现就很好。

GAN的训练目标

GAN的训练目标是一个极小极大游戏(Minimax Game),其中生成器试图最小化判别器的性能,而判别器试图最大化其区分能力。数学上,这个目标可以表示为:

公式:
[
\min_G \max_D V(D, G) = \mathbb{E}{x \sim p{\text{data}}(x)}[\log D(x)] + \mathbb{E}_{z \sim p_z(z)}[\log(1 - D(G(z)))]
]

其中:

  • ( D ) 是判别器,输出样本为真实数据的概率。
  • ( G ) 是生成器,将随机噪声 ( z ) 映射为数据样本。
  • ( p_{\text{data}} ) 是真实数据分布。
  • ( p_z ) 是噪声分布(如高斯分布)。

GAN的优势

以下是GAN的主要优势:

  • 不需要显式评估数据点的概率。
  • 可以使用灵活的模型架构(如神经网络)。
  • 生成的样本质量通常较高。

从Jensen-Shannon散度到f-散度 🔄

上一节我们介绍了GAN如何优化Jensen-Shannon散度,本节中我们来看看更一般的f-散度(f-divergence)。f-散度是一类用于衡量两个概率分布之间差异的函数。

f-散度的定义

f-散度定义为:

公式:
[
D_f(p | q) = \mathbb{E}_{x \sim q}\left[ f\left( \frac{p(x)}{q(x)} \right) \right]
]

其中:

  • ( p ) 和 ( q ) 是两个概率分布。
  • ( f ) 是一个凸函数,且满足 ( f(1) = 0 )。

常见的f-散度

通过选择不同的 ( f ) 函数,我们可以得到不同的散度:

  • KL散度:( f(u) = u \log u )
  • 反向KL散度:( f(u) = -\log u )
  • Jensen-Shannon散度:( f(u) = -(u+1)\log\frac{u+1}{2} + u\log u )
  • Hellinger距离:( f(u) = (\sqrt{u} - 1)^2 )

GAN与f-散度的关系

GAN的训练目标可以看作是在优化某种f-散度。通过选择不同的 ( f ) 函数,我们可以使用类似的对抗性训练框架来优化不同的散度。


Wasserstein距离:另一种衡量差异的方式 🌊

上一节我们讨论了f-散度,本节中我们来看看Wasserstein距离(Earth Mover‘s Distance)。Wasserstein距离通过衡量将一个分布“移动”到另一个分布所需的最小成本来定义差异。

Wasserstein距离的定义

Wasserstein距离定义为:

公式:
[
W(p, q) = \inf_{\gamma \in \Pi(p, q)} \mathbb{E}_{(x, y) \sim \gamma}[| x - y |]
]

其中:

  • ( \Pi(p, q) ) 是所有边际分布为 ( p ) 和 ( q ) 的联合分布 ( \gamma ) 的集合。
  • ( | x - y | ) 是 ( x ) 和 ( y ) 之间的距离(如L1距离)。

Wasserstein距离的优势

Wasserstein距离在处理分布支持集不重叠的情况下表现更好,因为它提供了平滑的梯度信号。这使得训练更加稳定。

Wasserstein GAN(WGAN)

WGAN使用Wasserstein距离作为训练目标,并通过一个判别器(称为批评器,Critic)来近似计算距离。训练目标为:

公式:
[
\min_G \max_{D \in \mathcal{D}} \mathbb{E}{x \sim p{\text{data}}}[D(x)] - \mathbb{E}_{z \sim p_z}[D(G(z))]
]

其中 ( \mathcal{D} ) 是所有满足Lipschitz约束的函数集合。


在GAN中推断潜在表示 🧩

上一节我们讨论了如何训练GAN生成样本,本节中我们来看看如何在GAN中推断潜在表示。潜在表示可以帮助我们理解数据的结构,并用于下游任务(如半监督学习)。

BiGAN:双向GAN

BiGAN通过引入一个编码器(Encoder)来将数据映射回潜在空间。训练目标包括:

  • 生成器 ( G ) 将潜在变量 ( z ) 映射为数据 ( x )。
  • 编码器 ( E ) 将数据 ( x ) 映射为潜在变量 ( z )。
  • 判别器 ( D ) 试图区分真实数据-潜在对和生成数据-潜在对。

BiGAN的训练目标

BiGAN的训练目标为:

公式:
[
\min_{G, E} \max_D \mathbb{E}{x \sim p{\text{data}}}[\log D(x, E(x))] + \mathbb{E}_{z \sim p_z}[\log(1 - D(G(z), z))]
]

BiGAN的应用

训练完成后,编码器可以用于推断输入数据的潜在表示,这些表示可以用于聚类、分类或其他下游任务。


总结 🎯

本节课我们一起学习了生成对抗网络(GAN)的核心概念及其扩展。我们从GAN的基本思想出发,探讨了如何通过对抗性训练优化模型。接着,我们介绍了更一般的f-散度和Wasserstein距离,并讨论了它们在GAN中的应用。最后,我们简要介绍了如何在GAN中推断潜在表示,为下游任务提供有用的特征。

通过本节课的学习,你应该对GAN的原理、训练方法及其扩展有了更深入的理解。这些知识将帮助你在实际应用中设计并训练高效的生成模型。

斯坦福CS236深度生成模型课程 P11:基于能量的模型 (EBMs) 🧠

在本节课中,我们将学习一种新的生成模型家族——基于能量的模型。我们将了解其核心思想、优势、挑战以及如何训练和从这类模型中采样。


概述

基于能量的模型是一种非常灵活的生成模型。它允许我们使用任意的神经网络来定义概率分布,而无需像自回归模型或流模型那样受到归一化约束的严格限制。然而,这种灵活性也带来了计算上的挑战,特别是涉及难以计算的配分函数。本节课将探讨EBMs的基本原理、其与之前模型的关系,以及应对这些挑战的方法。


生成模型的设计空间

上一节我们讨论了各种生成模型。在设计生成模型时,我们通常面临两个核心问题:定义模型族和定义损失函数。

  • 模型族:我们需要定义一个由参数θ参数化的概率分布集合 p_θ
  • 损失函数:我们需要一个衡量模型分布 p_θ 与真实数据分布 p_data 之间差异的方法。

一种非常自然的方法是使用最大似然估计,它等价于最小化KL散度。这种方法要求我们能够(精确或近似地)评估模型分配给数据点的概率 p_θ(x)。自回归模型、正则化流和变分自编码器都提供了实现这一目标的不同途径。


灵活性与约束的权衡

本节中,我们来看看定义模型族时的核心矛盾:灵活性与归一化约束。

我们希望模型族尽可能灵活,例如使用任意的神经网络架构。神经网络可以将高维输入 x(如图像、句子)映射到一个标量。然而,一个有效的概率密度函数(PDF)或概率质量函数(PMF)必须满足两个约束:

  1. 非负性:对于所有输入 x,输出必须非负。p_θ(x) ≥ 0
  2. 归一化:所有可能 x 的概率之和(或积分)必须为1。∫ p_θ(x) dx = 1

非负性约束相对容易满足(例如,在神经网络输出后加一个 expsquare 操作)。真正的困难在于归一化约束。它要求无论参数θ如何变化,模型分配的“总概率质量”必须保持恒定(总和为1)。这就像切一个固定大小的蛋糕:如果你给某一块切得更大,其他部分就必须变小。

自回归模型和流模型通过特殊的设计(如分解为条件概率乘积或使用可逆变换)来保证模型天生就是归一化的。而基于能量的模型则采取了一种不同的策略。


基于能量模型的核心思想

基于能量模型的核心思想是:将难以满足的归一化约束,转化为一个可以(近似)处理的常数计算问题

具体做法如下:

  1. 我们用一个任意的神经网络 f_θ(x) 来定义一个“能量”函数。通常,能量越低表示该配置 x 越可能。
  2. 通过指数函数将其转换为非负的“未归一化概率”:g_θ(x) = exp(-f_θ(x))。使用指数函数可以方便地捕捉概率的巨大变化。
  3. 为了得到一个有效的概率分布,我们除以一个归一化常数,即配分函数 Z(θ)
    p_θ(x) = g_θ(x) / Z(θ) = exp(-f_θ(x)) / Z(θ)
    其中,Z(θ) = ∫ exp(-f_θ(x)) dx(连续)或 Σ exp(-f_θ(x))(离散)。

这样一来,只要我们能定义 f_θ(x),我们就定义了一个有效的概率模型。灵活性达到了极致,因为 f_θ(x) 可以是任何神经网络。代价是,配分函数 Z(θ) 通常没有解析解,计算极其困难,这就是“维度诅咒”的体现。


EBM的实例与优势

以下是EBMs的一些具体实例和其独特优势:

  • 经典分布:许多常见分布(如高斯分布、指数分布及整个指数族)都可以写成EBM的形式。例如,高斯分布 N(x; μ, σ) 对应 f_θ(x) = (x-μ)²/(2σ²),且 Z(θ) = √(2πσ²) 有解析解。
  • Softmax函数:分类模型中的softmax层就是一个离散情况下的EBM,其配分函数是对所有类别的求和,可以精确计算。
  • 组合模型:EBMs允许以有趣的方式组合不同模型。例如,将多个专家模型的概率相乘,可以得到一个新的EBM,其能量是各专家对数概率之和。这类似于一个“与”操作,只有所有专家都认为某个样本可能时,它才被赋予高概率。
  • 受限玻尔兹曼机 (RBM):这是一个经典的、包含隐变量的EBM例子。它定义了可见单元 v 和隐单元 h 的联合分布,形式为 p(v, h) ∝ exp(-E(v, h)),其中能量函数 E(v, h) 是简单的二次型。训练RBM是深度学习早期成功的关键之一。

EBM的挑战与应对策略

EBM的主要挑战源于难以处理的配分函数 Z(θ)。这导致两个直接困难:

  1. 评估似然困难:计算单个数据点的概率 p_θ(x) 需要知道 Z(θ)
  2. 采样困难:没有高效的方法直接从 p_θ(x) 中生成样本。

然而,许多任务并不需要完整的 p_θ(x),我们可以采用以下策略:

  • 相对比较:比较两个样本 xx’ 的相对概率只需要计算比值 p_θ(x)/p_θ(x’),配分函数 Z(θ) 在比值中会被约去。这对于去噪、异常检测等任务已经足够。
  • 基于MCMC的采样:虽然不能直接采样,但我们可以使用马尔可夫链蒙特卡洛方法。例如,使用Metropolis-Hastings算法
    1. 从随机初始样本 x_t 开始。
    2. 提议一个新样本 x’(例如,给 x_t 加噪声)。
    3. 计算接受概率 A = min(1, p_θ(x’)/p_θ(x_t))。由于是比值,无需 Z(θ)
    4. 以概率 A 接受 x’ 作为下一个状态 x_{t+1},否则保持 x_t
      理论上,经过足够多的步骤后,链的状态将服从分布 p_θ(x)
  • 对比散度训练:最大似然训练的目标是最大化数据的对数似然 log p_θ(x)。其梯度有一个优美的形式:
    ∇_θ log p_θ(x) = -∇_θ f_θ(x) + E_{x~p_θ}[∇_θ f_θ(x)]
    梯度包含两项:一项降低数据点的能量(正例),另一项升高模型分布中典型样本的能量(负例)。我们无法精确计算第二项的期望,但可以用MCMC采样得到的样本来近似。这就是训练RBM等模型的对比散度算法的核心思想:推动数据,拉低模型生成的样本。

总结

本节课我们一起学习了基于能量的模型。

  • 核心思想:通过引入配分函数 Z(θ),将归一化约束与模型表达能力解耦,允许使用任意神经网络 f_θ(x) 来定义概率分布 p_θ(x) = exp(-f_θ(x)) / Z(θ)
  • 优势:提供了极大的建模灵活性,并能以乘积等方式组合不同模型。
  • 挑战:配分函数 Z(θ) 难以计算,导致评估似然和采样困难。
  • 解决方案:利用概率比值进行相对比较;使用MCMC方法进行近似采样;采用基于对比散度的策略进行近似训练。

EBMs代表了生成模型中灵活性的一个极端,虽然其训练和采样过程可能较慢,但其思想为后续更强大的模型(如扩散模型)奠定了基础。

课程 P12:斯坦福 CS236 深度生成模型 I 2023 - 第12讲 📚

在本节课中,我们将要学习基于能量的模型(EBMs)的进一步内容,特别是其训练方法。我们将重点讨论如何在不依赖难以处理的配分函数或昂贵采样过程的情况下训练这些模型。我们将介绍分数匹配和噪声对比估计等关键技术,这些技术为高效训练EBMs提供了基础。

基于能量模型回顾 🔄

上一节我们介绍了基于能量模型的基本概念。本节中我们来看看其核心定义和面临的挑战。

基于能量的模型提供了一种定义非常广泛概率分布的方式。它通过一个能量函数 ( f_\theta(x) ) 来定义概率分布:
[
p_\theta(x) = \frac{e^{-f_\theta(x)}}{Z(\theta)}
]
其中 ( Z(\theta) = \int e^{-f_\theta(x)} dx ) 是归一化常数(配分函数)。

这种模型的好处在于,能量函数 ( f_\theta(x) ) 可以是任何神经网络架构,从而提供了极大的灵活性。然而,关键问题在于评估配分函数 ( Z(\theta) ) 通常是难以处理的,因为我们需要对所有可能的 ( x ) 进行积分或求和,这在数据维度很高时几乎不可能。

虽然直接评估数据点的概率很困难,但比较两个数据点的概率相对容易,因为概率比值的计算中配分函数会相互抵消。

训练挑战与对比散度 🎯

训练基于能量的模型通常采用最大似然估计。对数似然函数的梯度表达式为:
[
\nabla_\theta \log p_\theta(x) = -\nabla_\theta f_\theta(x) - \nabla_\theta \log Z(\theta)
]
其中,第一项是数据点能量函数的梯度,容易计算。第二项是配分函数对数的梯度,它等于模型样本能量函数梯度的负期望:
[
\nabla_\theta \log Z(\theta) = \mathbb{E}{x \sim p\theta} [-\nabla_\theta f_\theta(x)]
]
这意味着要计算准确的梯度,我们需要从当前模型 ( p_\theta ) 中生成样本。

以下是使用马尔可夫链蒙特卡洛(MCMC)从EBM中采样的基本思路:

  1. 初始化一个样本 ( x_0 )(例如随机噪声)。
  2. 重复以下步骤多次:
    • 对当前样本 ( x_t ) 进行一个小的随机扰动,提出一个新样本 ( x' )。
    • 计算接受概率 ( A = \min(1, \frac{p_\theta(x‘)}{p_\theta(x_t)}) )。由于我们只需要概率比值,这可以计算。
    • 以概率 ( A ) 接受 ( x‘ ) 作为新状态 ( x_{t+1} ),否则保持 ( x_t )。
  3. 经过足够多的步骤后,样本将近似来自分布 ( p_\theta )。

一种更高效的MCMC变体是朗之万动力学,它利用能量函数的梯度信息来提出新样本:
[
x_{t+1} = x_t + \epsilon \nabla_x \log p_\theta(x_t) + \sqrt{2\epsilon} z_t, \quad z_t \sim \mathcal{N}(0, I)
]
其中,( \epsilon ) 是步长。这里的关键是,对数概率的梯度 ( \nabla_x \log p_\theta(x) = -\nabla_x f_\theta(x) ) 不依赖于配分函数,因此可以高效计算。

尽管MCMC提供了理论上的采样方法,但在训练过程中需要不断生成样本以估计梯度,这使得基于最大似然的训练非常昂贵。因此,我们需要寻找不需要在训练循环中进行MCMC采样的替代方法。

分数匹配:绕过配分函数 🧮

本节我们将介绍分数匹配,这是一种通过匹配“分数”而非概率本身来训练模型的方法。

分数函数定义为对数概率密度关于数据的梯度:
[
s_\theta(x) = \nabla_x \log p_\theta(x)
]
对于基于能量的模型,分数函数为 ( s_\theta(x) = -\nabla_x f_\theta(x) ),它不依赖于配分函数 ( Z(\theta) ),因此可以高效计算。

核心思想是:如果模型分布 ( p_\theta ) 与真实数据分布 ( p_{data} ) 相似,那么它们的分数函数也应该相似。因此,我们可以定义一个基于分数差异的损失函数——费舍尔散度:
[
J(\theta) = \frac{1}{2} \mathbb{E}{p(x)} [| \nabla_x \log p_{data}(x) - \nabla_x \log p_\theta(x) |^2]
]
最小化这个散度可以迫使模型分数匹配真实数据分数。然而,这个表达式仍然包含未知的真实数据分数 ( \nabla_x \log p_{data}(x) )。

通过分部积分技巧,我们可以将上述目标转化为一个等价的、不依赖于真实数据分数的形式。以一维情况为例,经过推导可得:
[
J(\theta) = \mathbb{E}{p(x)} [\nabla_x \log p_\theta(x)^2 + \nabla_x^2 \log p_\theta(x)] + \text{常数}
]
其中 ( \nabla_x^2 ) 是二阶导数。对于高维数据 ( x \in \mathbb{R}^D ),推广形式为:
[
J(\theta) = \mathbb{E}{p(x)} [\frac{1}{2} | s_\theta(x) |^2 + \text{tr}(\nabla_x s_\theta(x)) ] + \text{常数}
]
这里 ( \text{tr}(\nabla_x s_\theta(x)) ) 是分数函数雅可比矩阵的迹,即 ( \log p_\theta(x) ) 的Hessian矩阵的迹。

以下是分数匹配的训练流程:

  1. 从训练集采样一批数据 ( {x_i} )。
  2. 对于每个样本 ( x_i ),使用自动微分计算:
    • 模型分数 ( s_\theta(x_i) = -\nabla_x f_\theta(x_i) )
    • 分数函数的雅可比矩阵迹 ( \text{tr}(\nabla_x s_\theta(x_i)) )
  3. 计算损失 ( \hat{J}(\theta) = \frac{1}{B} \sum_{i=1}^B [\frac{1}{2} | s_\theta(x_i) |^2 + \text{tr}(\nabla_x s_\theta(x_i)) ] )
  4. 通过梯度下降更新参数 ( \theta ) 以最小化损失。

迹的计算在高维下可能昂贵,但可以通过 Hutchinson 迹估计器等技巧进行近似。分数匹配的优势在于,它完全避免了配分函数的计算和在训练时从模型采样。

噪声对比估计:转化为分类问题 🎲

现在,我们来看另一种流行的训练方法——噪声对比估计(NCE),它将密度估计问题转化为一个二分类问题。

我们引入一个已知的、易于采样的噪声分布 ( p_n(x) )(例如高斯分布)。目标是训练一个分类器来区分来自真实数据分布 ( p_{data}(x) ) 的样本和来自噪声分布 ( p_n(x) ) 的样本。

我们定义分类器 ( D(x) ) 为数据样本(而非噪声样本)的概率,并将其参数化为:
[
D(x) = \frac{p_\theta(x)}{p_\theta(x) + p_n(x)} = \frac{e{-f_\theta(x)}/Z}{e/Z + p_n(x)}
]
这里,我们使用基于能量的模型来参数化 ( p_\theta(x) ),并将配分函数 ( Z ) 也视为一个可学习的标量参数,而不是通过积分计算。

以下是NCE的训练目标:
我们训练分类器最大化其区分能力,即最小化以下交叉熵损失:
[
\mathcal{L}(\theta, Z) = -\mathbb{E}{p{data}}[\log D(x)] - \mathbb{E}{p_n}[\log (1 - D(x))]
]
通过将 ( D(x) ) 的表达式代入并优化 ( \theta ) 和 ( Z ),分类器为了更好地区分数据与噪声,就必须学习到一个使 ( p
\theta(x) ) 逼近 ( p_{data}(x) ) 的能量函数 ( f_\theta )。理论上,当最优分类器被找到时,学习到的 ( Z^* ) 就会是模型真实的配分函数。

NCE的训练步骤:

  1. 从训练集采样一批真实数据 ( {x_i^d} )。
  2. 从噪声分布 ( p_n ) 采样一批噪声数据 ( {x_j^n} )。
  3. 计算分类器对两类样本的输出 ( D(x_i^d) ) 和 ( D(x_j^n) )。
  4. 计算交叉熵损失 ( \mathcal{L} )。
  5. 通过梯度下降同时更新能量函数参数 ( \theta ) 和配分函数估计 ( Z )。

NCE的优点同样是在训练过程中不需要从 ( p_\theta ) 中采样。噪声分布 ( p_n ) 的选择很重要,一个更高级的变体是“对比性散度流”,其中噪声分布 ( p_n ) 本身也是一个可学习的流模型 ( p_\phi(x) ),并通过对抗训练的方式与判别器一起优化,使分类任务更具挑战性,从而学到更好的生成模型。

总结 📝

本节课中我们一起学习了训练基于能量模型(EBMs)的几种核心方法,以克服配分函数难以处理和采样昂贵的挑战。

  • 对比散度与MCMC:提供了理论上的采样和训练方法,但依赖于内部循环采样,计算成本高。
  • 分数匹配:通过匹配模型与数据分布的分数函数(梯度场)来训练。它绕过了配分函数,损失函数仅依赖于能量函数 ( f_\theta(x) ) 的导数,训练效率高,是扩散模型的重要基础。
  • 噪声对比估计(NCE):将生成建模转化为一个二分类问题,通过区分真实数据和预设噪声来学习能量函数。它将配分函数作为可学习参数,在训练中同样无需从EBM采样。

这些方法使得训练灵活且强大的基于能量模型变得可行,为后续学习扩散模型等现代生成式AI技术奠定了坚实的基础。

课程13:基于分数的生成模型与扩散模型入门 🧠

在本节课中,我们将要学习一种强大的生成模型——基于分数的模型,也称为扩散模型。这类模型在图像、视频、音频等连续数据生成任务上达到了最先进的水平。我们将看到,它建立在之前讨论过的多种技术之上,并提供了建模概率分布的一种新视角。

概述:从概率密度到分数函数

上一节我们介绍了多种生成模型家族。本节中我们来看看另一种表示概率分布的方法。

我们已经见过两大类生成模型:

  1. 基于似然的模型:模型的核心是概率密度函数(PDF)或概率质量函数(PMF)。模型是一个函数 \(p_\theta(x)\),它将输入 \(x\) 映射到一个标量,表示 \(x\) 的可能性。这类模型的挑战在于必须满足归一化约束(即积分和为1),这限制了可用的网络架构(如自回归模型、归一化流)。
  2. 隐式生成模型:这类模型(如GAN)直接建模采样过程,例如将随机噪声通过一个神经网络(生成器)来产生样本。其问题在于难以评估生成样本的似然度,且训练不稳定(涉及极小极大优化)。

今天,我们将讨论第三种方法:基于分数的生成模型。它适用于连续随机变量,其核心思想不是直接建模概率密度 \(p(x)\),而是建模其对数密度的梯度,即分数函数(score function)

\[s(x) = \nabla_x \log p(x) \]

分数函数是一个向量场,它指明了在数据空间中,哪个方向能最快地增加数据的对数似然。从计算角度看,分数函数不需要满足归一化约束,这简化了建模过程。

分数匹配:训练分数模型

上一节我们定义了分数函数。本节中我们来看看如何训练一个模型来匹配真实数据分布的分数。

我们的目标是:给定一个来自未知数据分布 \(p_{data}(x)\) 的样本集,学习一个参数化的向量值函数 \(s_\theta(x)\)(例如一个神经网络),使其尽可能接近真实分数 \(\nabla_x \log p_{data}(x)\)

一个自然的比较方法是使用费舍尔散度(Fisher Divergence)

\[J(\theta) = \frac{1}{2} \mathbb{E}_{p_{data}(x)} [\| \nabla_x \log p_{data}(x) - s_\theta(x) \|^2] \]

然而,这个目标依赖于未知的真实分数 \(\nabla_x \log p_{data}(x)\),无法直接优化。通过分部积分技巧,我们可以将其重写为一个可计算的形式:

\[J(\theta) = \mathbb{E}_{p_{data}(x)} [\text{tr}(\nabla_x s_\theta(x)) + \frac{1}{2} \| s_\theta(x) \|^2] + \text{const.} \]

这里,\(\text{tr}(\nabla_x s_\theta(x))\) 是模型分数 \(s_\theta(x)\) 的雅可比矩阵的迹。虽然这个目标不再依赖真实分数,但计算雅可比矩阵的迹在高维数据(如图像)上计算成本极高,与数据维度 \(d\) 成正比。

去噪分数匹配:一种高效的近似方法

为了解决高维下雅可比迹计算昂贵的问题,我们引入去噪分数匹配(Denoising Score Matching)

核心思想是:我们不直接估计干净数据分布 \(p_{data}(x)\) 的分数,而是估计一个经过噪声扰动后的分布 \(q_\sigma(\tilde{x})\) 的分数。这个扰动分布是通过给数据添加高斯噪声得到的:\(q_\sigma(\tilde{x}) = \int p_{data}(x) \mathcal{N}(\tilde{x}; x, \sigma^2 I) dx\)。当噪声水平 \(\sigma\) 很小时,\(q_\sigma(\tilde{x})\) 非常接近 \(p_{data}(x)\)

神奇的是,通过一系列代数推导,匹配噪声数据分布分数的目标,可以等价地转化为一个去噪(Denoising)任务。最终的目标函数简化为:

\[\tilde{J}(\theta) = \frac{1}{2} \mathbb{E}_{p_{data}(x)} \mathbb{E}_{\tilde{x} \sim \mathcal{N}(x, \sigma^2 I)} [\| s_\theta(\tilde{x}) - \frac{(\tilde{x} - x)}{\sigma^2} \|^2] \]

以下是其直观解释和训练流程:

  • 直观解释:对于每个噪声样本 \(\tilde{x}\),模型 \(s_\theta(\tilde{x})\) 试图预测的是为得到 \(\tilde{x}\) 而添加到原始数据 \(x\) 上的噪声向量 \((\tilde{x} - x)\),并除以 \(\sigma^2\)。因此,训练一个分数模型等价于训练一个去噪器。
  • 训练流程
    1. 从数据集中采样一个批次干净数据 \(\{x_i\}\)
    2. 为每个 \(x_i\) 添加高斯噪声,得到噪声样本 \(\tilde{x}_i = x_i + \epsilon_i, \epsilon_i \sim \mathcal{N}(0, \sigma^2 I)\)
    3. 计算损失:\(L = \frac{1}{N} \sum_i \| s_\theta(\tilde{x}_i) - \epsilon_i / \sigma^2 \|^2\)
    4. 通过梯度下降更新参数 \(\theta\) 以最小化损失。

这种方法避免了计算雅可比迹,使得训练可以扩展到高维数据。

切片分数匹配:另一种高效方法

除了去噪分数匹配,另一种使训练高效的方法是切片分数匹配(Sliced Score Matching)

其思想是:比较两个向量场是否相等,可以通过比较它们在随机方向上的投影是否相等来实现。我们不再直接比较整个向量,而是随机选取一个方向向量 \(v\),然后比较分数在该方向上的投影。

最终得到的目标函数涉及雅可比向量积(Jacobian-vector product),这可以通过一次反向传播高效计算,其成本与数据维度 \(d\) 无关,从而实现了可扩展性。

基于分数的采样:朗之万动力学

假设我们已经训练好了一个分数模型 \(s_\theta(x) \approx \nabla_x \log p_{data}(x)\)。我们如何用它来生成新的样本呢?答案是使用朗之万动力学(Langevin Dynamics)

朗之万动力学是一种马尔可夫链蒙特卡洛(MCMC)方法,它仅利用分数函数就可以从分布中采样。其更新规则如下:

\[x_{t+1} = x_t + \epsilon \cdot s_\theta(x_t) + \sqrt{2\epsilon} \cdot z_t, \quad z_t \sim \mathcal{N}(0, I) \]

其中 \(\epsilon\) 是步长。

  • 直观理解:在每一步,粒子 \(x_t\) 沿着分数指示的方向(即对数似然梯度上升的方向)移动一小步,同时注入一个随机噪声 \(z_t\)。噪声的加入确保了采样过程最终能收敛到整个分布 \(p_{data}(x)\),而不仅仅是其众数(mode)。
  • 与去噪的联系:每一步 \(x_t + \epsilon \cdot s_\theta(x_t)\) 可以看作是对当前样本 \(x_t\) 的一次“去噪”尝试,而添加噪声则防止了确定性过程陷入局部最优。

挑战与展望

然而,直接将上述方法应用于复杂数据(如图像)会遇到挑战:

  1. 流形假设:真实数据往往存在于一个低维流形上。在流形之外或低数据密度区域,分数估计可能非常不准确甚至未定义,导致朗之万动力学采样失败或混合速度极慢。
  2. 混合权重问题:对于多模态分布,分数函数不包含各模态间的相对权重信息,导致采样结果无法反映真实的模态比例。

在接下来的课程中,我们将看到扩散模型(Diffusion Models) 如何通过引入一系列逐渐加噪和去噪的步骤,巧妙地解决这些挑战。扩散模型本质上是在多个噪声尺度上训练分数模型,从而能够在整个空间中获得更准确、更稳定的分数估计,最终实现高质量样本的生成。

总结

本节课中我们一起学习了基于分数的生成模型的核心思想:

  • 我们放弃了直接建模概率密度,转而建模其对数密度的梯度——分数函数
  • 我们介绍了通过分数匹配来训练分数模型,并探讨了其原始形式在高维数据下的计算难题。
  • 我们学习了两种高效的训练方法:去噪分数匹配(将分数估计转化为去噪任务)和切片分数匹配(通过随机投影降低计算成本)。
  • 我们了解了如何使用朗之万动力学,仅利用分数函数从学习到的分布中采样。
  • 最后,我们指出了朴素方法的局限性,并引出了更强大的扩散模型作为解决方案。

基于分数的模型为我们提供了一种灵活且强大的生成建模框架,是理解当前最先进的扩散模型的重要基础。

课程 P14:基于分数的模型与扩散模型 🧠

在本节课中,我们将学习基于分数的生成模型,并探讨它们如何与扩散模型相连接。我们将看到这些技术如何被用于生成高质量的图像和视频。


概述

基于分数的模型通过参数化数据分布的“得分”(即对数概率密度的梯度)来定义模型族。通过使用得分匹配损失来学习这个向量场,我们可以生成新的数据样本。然而,原始的得分匹配方法在高维数据(如图像)上并不实用。我们将讨论如何通过添加噪声和考虑多个噪声尺度来解决这些问题,从而引出扩散模型的核心思想。


1. 基于分数模型的核心思想

上一节我们介绍了生成模型的基本概念,本节中我们来看看基于分数模型的具体思路。

关键理念是使用一个向量值神经网络来表示概率分布。对于数据空间中的每个点 x,神经网络输出一个向量 s_θ(x)。这个向量应该代表数据分布在该点的对数概率密度的梯度,即“得分”。

公式s_θ(x) ≈ ∇_x log p_data(x)

因此,你可以将其视为一个由神经网络参数化的向量场。通过改变网络权重 θ,我们获得不同的向量场。


2. 得分匹配及其挑战

我们已经看到,可以通过最小化得分匹配损失来将估计的梯度拟合到真实梯度上。这是一种原则性的模型拟合方法。

然而,它在实践中并不奏效,尤其是在处理像图像这样的高维数据时。主要问题在于计算损失函数中涉及的雅可比矩阵迹非常昂贵,需要大量的反向传播步骤。


3. 可扩展的得分匹配方法

为了解决上述挑战,我们介绍了两种使得分匹配更可扩展的方法。

3.1 去噪得分匹配

在去噪得分匹配中,我们不再试图直接建模干净数据分布 p_data(x) 的得分,而是建模一个噪声扰动数据分布 q_σ(x̃) 的得分。通常,我们通过向干净数据点 x 添加高斯噪声来获得这个扰动分布。

核心等价关系:估计噪声扰动数据的得分,等价于解决一个去噪问题。神经网络的目标是预测添加到干净数据上的噪声 z

代码概念

# 假设:x_clean 是干净数据,z 是高斯噪声
x_noisy = x_clean + σ * z
# 神经网络 s_θ 的目标是预测噪声 z
predicted_noise = s_θ(x_noisy, σ)
loss = ||predicted_noise - z||^2

这种方法计算上更高效,因为我们不再需要处理雅可比矩阵的迹。但其缺点是,我们最终估计的是噪声扰动分布的得分,而非原始数据分布的得分。

3.2 切片得分匹配

在切片得分匹配中,我们不再试图在每个点上完全匹配整个梯度向量,而是仅匹配它们在某个随机方向 v 上的投影。

核心思想:在每个数据点,我们从某个分布中采样一个随机方向向量 v,然后比较真实得分与估计得分在该方向上的投影标量。如果两个向量场相同,那么它们在所有方向上的投影也应该相同。

这种方法可以重写为一个仅依赖于模型、且可高效评估和优化的目标函数。它能估计真实数据密度的得分,但训练速度通常比去噪得分匹配慢。


4. 采样与存在的问题

如果我们能够通过得分匹配估计出底层的梯度向量场,就可以使用朗之万动力学等随机过程来生成样本。基本思想是沿着得分所指的方向(即概率增加的方向)移动,同时添加少量噪声。

然而,这种方法在实践中存在几个问题:

  1. 得分定义不明确:对于图像等数据,我们通常认为其大致分布在低维流形上。在流形之外的点,概率密度为零,对数概率密度及其梯度(得分)可能没有良好定义。
  2. 低概率区域估计不准:训练损失依赖于从数据分布中采样的点,这些点大多来自高概率区域。对于训练中未见过的低概率区域,模型无法准确估计得分。
  3. 收敛性问题:朗之万动力学的长期动态可能存在收敛速度慢甚至不收敛的问题。

5. 解决方案:添加噪声

上述所有问题的一个简单而有效的解决方案是:向数据中添加噪声。

  • 解决得分定义问题:当向数据添加噪声后,噪声扰动数据的支持集变成了整个空间,而不再局限于一个低维流形,因此得分在整个空间上都有定义。
  • 改善低概率区域估计:添加噪声后,样本会散布到整个空间。如果我们添加足够大的噪声,就可以在更多区域获得准确的得分估计。

但这里存在一个权衡:我们添加的噪声量 σ 越大,得分估计越容易、越准确;但同时,我们估计的目标也偏离原始数据分布越远。如果我们跟随噪声扰动数据分布的得分生成样本,最终得到的是带噪声的图像,而非干净的图像。


6. 关键进展:多噪声尺度

为了在“准确估计得分”和“生成干净样本”之间取得平衡,我们引入了一个关键思想:同时考虑多个噪声尺度

我们不再只使用一个噪声水平 σ,而是使用一系列噪声水平 {σ_1, σ_2, ..., σ_L},其中 σ_1 很小(接近干净数据),σ_L 很大(接近纯噪声)。

训练:我们训练一个噪声条件得分网络 s_θ(x, σ)。它接收数据点 x 和噪声水平 σ 作为输入,目标是估计对应噪声扰动分布 p_σ(x) 的得分。训练损失是不同噪声水平下去噪得分匹配损失的加权和。

代码概念

def loss(θ):
    total_loss = 0
    for (x_clean, σ) in data_and_noise_levels:
        z = GaussianNoise()
        x_noisy = x_clean + σ * z
        predicted_noise = s_θ(x_noisy, σ)
        total_loss += λ(σ) * ||predicted_noise - z||^2
    return total_loss

采样(退火朗之万动力学)

  1. 从最大的噪声水平 σ_L 开始,用朗之万动力学从 p_{σ_L}(x) 中采样。由于噪声大,得分估计准确,采样过程能有效探索空间。
  2. 将上一步得到的样本作为初始点,在下一个稍小的噪声水平 σ_{L-1} 上运行朗之万动力学。
  3. 重复此过程,逐步降低噪声水平。
  4. 在最后的噪声水平 σ_1(非常小)上采样,得到的样本几乎来自干净数据分布 p_data(x)

这个过程结合了两种优势:在初始阶段(高噪声)有准确的梯度指引,在最终阶段(低噪声)能生成高质量样本。


7. 连续时间视角:扩散模型

我们可以将多个离散噪声尺度的思想推向极致:考虑一个连续的噪声水平,用时间变量 t ∈ [0, T] 索引。其中 t=0 对应干净数据分布 p_0 = p_datat=T 对应纯噪声分布 p_T(例如高斯分布)。

t=0t=T 的过程(数据加噪)可以由一个前向随机微分方程描述。关键的理论结果是,如果我们知道每个时间点 t 的得分函数 ∇_x log p_t(x),那么从噪声生成数据(时间反转)的过程可以由一个反向随机微分方程描述。

公式(反向SDE)
dx = [ - drift_term + diffusion_term * ∇_x log p_t(x) ] dt + diffusion_term * dw

其中 dw 是布朗运动噪声。

实践

  1. 我们训练一个连续时间噪声条件得分网络 s_θ(x, t) 来近似 ∇_x log p_t(x)
  2. 采样时,我们从 t=T 的纯噪声开始,数值求解上述反向SDE(例如使用欧拉-丸山法),直到 t=0,即可得到来自数据分布的样本。

这个框架统一了基于分数的模型和扩散模型。之前讨论的退火朗之万动力学可以看作是求解这个反向SDE的一种特定数值方法。


8. 总结与成果

本节课中我们一起学习了基于分数的生成模型到扩散模型的演变。

我们从得分匹配的基本思想出发,指出了其在实践中的挑战。通过引入去噪多噪声尺度的技术,我们得到了可扩展且强大的模型训练方法。最终,在连续时间视角下,这些模型被统一为通过求解反向随机微分方程来生成样本的扩散模型。

这些模型在图像生成领域取得了巨大成功,能够生成非常逼真和高分辨率的图像,在许多基准测试上达到了领先水平。它们的主要优势在于训练稳定性(基于匹配的损失)和推理时可以利用非常深(近乎无限)的计算图来逐步 refine 样本。


核心要点回顾

  • 得分:数据对数概率密度的梯度。
  • 得分匹配:通过匹配梯度来学习分布。
  • 去噪得分匹配:通过解决去噪问题来高效学习噪声扰动分布的得分。
  • 多噪声尺度:同时学习多个噪声水平下的得分,以平衡估计准确性和生成质量。
  • 退火朗之万动力学:从高噪声到低噪声逐步采样。
  • 扩散模型(连续视角):将数据加噪/去噪过程建模为SDE,生成样本即求解反向SDE。

斯坦福CS236深度生成模型课程 P15:生成模型评估方法 📊

在本节课中,我们将要学习如何评估深度生成模型的好坏。这是一个具有挑战性的主题,因为目前并没有关于如何正确评估的共识。我们将尽力覆盖一些现有的方法,尽管没有完美的方法,但了解这些方法对于比较和选择模型至关重要。

概述:为什么评估生成模型很困难?

上一节我们介绍了多种生成模型和训练目标。一个自然的问题是:如何为你的数据集选择合适的模型?这最终归结为“哪个模型更好”的问题。为了回答这个问题,你需要能够评估生成模型的质量。与用于分类的判别模型不同,生成模型的评估相当困难。对于分类任务,你可以通过损失函数或准确率等量化指标在未见数据上评估性能。然而,对于生成模型,任务的性质本身就不明确,这是我们面临的主要挑战。

评估目标:我们关心什么?

评估生成模型取决于你的最终目标。以下是几种常见的关心点:

  • 密度估计:关心评估图像或句子的概率。
  • 压缩:关心如何高效地压缩数据。
  • 样本生成:关心生成美观或逼真的输出。
  • 表示学习:希望模型从无标签数据中学习结构,以改进下游任务。
  • 任务解决:例如,利用大型语言模型通过提示解决各种任务。

这些不同的目标导致了多种不同的评估指标。

基于似然(压缩)的评估 📉

如果你真正关心密度估计或压缩,那么似然度是一个相当合理的度量。你可以将数据分为训练集、验证集和测试集,在测试集上评估模型的平均对数似然度。最大化似然度等于最小化KL散度,这与尝试最佳地压缩数据是同一件事。

公式:平均代码长度 ≈ -log p(x)

实际上,训练良好的概率模型可以映射到高效的压缩方案(如算术编码)。因此,比较模型的似然度就是在比较它们压缩数据的能力。直觉上,要实现良好的压缩,模型必须识别数据中的模式和结构,这可以看作是学习世界知识的一种方式。

然而,这种方法存在主要限制:并非所有信息位都同等重要。例如,图像标签信息可能比单个像素的微小颜色变化重要得多,但从压缩角度看,它们被同等对待。此外,许多模型(如GAN)无法直接计算似然度。

如何为无法计算似然的模型估计密度? 🔍

对于只能采样、不能直接计算似然度的模型(如GAN),我们可以使用核密度估计来近似其概率密度函数。

方法:给定模型生成的样本 {x₁, x₂, ..., xₙ},对于新数据点 x,其概率密度估计为:
p̂(x) = (1/n) * Σᵢ K((x - xᵢ)/σ)
其中,K 是核函数(如高斯核),σ 是控制平滑度的带宽参数。

核密度估计在高维空间(如图像)中可能不可靠,因为需要大量样本来覆盖整个空间。对于潜在变量模型(如VAE),可以通过对潜在变量 z 积分来计算似然,但通常需要使用重要性采样等技术来获得更准确的估计。

评估样本质量 🖼️

在许多情况下,我们更关心生成样本的质量。如何判断一组样本比另一组更好呢?

人类评估 👥

最直接的方法是让人类评估者比较样本。这通常被认为是“黄金标准”。一些原则性方法包括:

  • 欺骗率:给评估者无限时间,计算他们无法区分真实样本与生成样本的比例。
  • 辨别时间:测量评估者需要多长时间才能准确辨别样本真伪,所需时间越长,样本质量可能越好。

然而,人类评估成本高、难以规模化、且不易复现。此外,它可能无法检测模型是否只是简单地记忆了训练集。

自动化指标 🤖

以下是几种常用的自动化评估指标:

1. Inception Score
该指标适用于有标签的数据集(如ImageNet)。它结合了两个方面:

  • 清晰度:分类器对生成样本的预测应非常确信(熵低)。
  • 多样性:所有类别的生成样本都应出现(预测标签的边缘分布熵高)。

公式:IS = exp( Eₓ [ KL( p(y|x) || p(y) ) ] )
更高的Inception Score通常意味着更好的样本质量。但其缺点在于只关注生成样本,未与真实数据直接比较。

2. Fréchet Inception Distance
FID分数通过比较生成样本与真实样本在预训练模型(如Inception网络)特征空间中的统计量来工作。

  • 方法:为两组样本的特征分别拟合一个多维高斯分布,然后计算这两个高斯分布之间的Fréchet距离(又称Wasserstein-2距离)。
  • 公式FID = ||μ_r - μ_g||² + Tr(Σ_r + Σ_g - 2(Σ_r Σ_g)^(1/2))
    较低的FID分数表示生成样本与真实样本更相似。

3. 核最大平均差异
MMD是一种基于核的两样本检验方法。它比较了样本间相似性的统计量。

  • 思想:如果两个分布相同,那么样本内的平均相似度应该等于样本间的平均相似度。
  • 方法:可以在原始像素空间或预训练模型提取的特征空间上计算MMD。

对于文本到图像等更复杂的生成任务,评估可能涉及更多维度,如图文对齐度、审美得分、偏见测量等,需要更全面的基准(如HEIM)。

评估学习到的表示 🧠

如果我们训练生成模型的目的是进行表示学习,如何评估学习到的特征好坏呢?

在下游任务上的性能

如果你心中有特定的下游任务(如分类),最直接的方法是使用生成模型提取的特征来训练一个简单的分类器,并评估其性能。性能越好,表示质量可能越高。

聚类质量

在无监督设置下,可以评估特征空间的聚类能力。将数据点映射到特征空间后,应用聚类算法(如K-means),然后使用数据集的真实标签(如果有)来评估聚类结果。常用指标包括:

  • 同质性:每个簇中是否只包含单一类别的样本。
  • 完整性:同一类别的样本是否都被分配到了同一个簇中。
  • V-measure:同质性和完整性的调和平均数。

重建质量

如果你关心有损压缩,可以评估从潜在表示重建原始数据的准确性。例如,比较重建图像与原始图像之间的均方误差或PSNR。

解耦程度

对于潜在变量模型,我们可能希望每个潜在变量控制数据生成过程中某个独立的、可解释的因素(如物体大小、颜色)。评估解耦程度的指标包括:训练一个线性分类器,根据潜在变量预测已知的生成因子,并计算其准确率。但理论上,仅从无标签数据中完全解耦所有因子被证明是不可能的。

评估语言模型的应用能力 💬

对于大型语言模型,除了困惑度(与似然相关)外,我们更关心其解决实际任务的能力。主要使用方式有两种:

1. 提示
通过精心设计自然语言提示,让模型直接生成任务答案。评估方式是在一系列多样的任务(如问答、情感分析、数学推理)上测试模型的零样本或少样本性能。大规模的基准测试(如HELM、Big-Bench)包含了数百个任务,用于全面比较不同模型。

2. 微调
将预训练模型在其特征表示上,针对特定下游任务进行微调。然后评估微调后的模型在该任务上的性能。

提示通常更便捷,无需额外训练;而微调可能获得更高性能,但需要计算资源和专业知识。

总结与展望 🎯

本节课中我们一起学习了评估深度生成模型的各种方法。我们了解到:

  • 评估高度依赖于最终目标(密度估计、样本质量、表示学习等)。
  • 似然/压缩是密度估计的自然指标,但有局限性,且不适用于所有模型。
  • 样本质量可以通过人类评估或自动化指标(如IS、FID、MMD)来衡量,但各有优缺点。
  • 表示质量可以通过下游任务性能、聚类、重建或解耦程度来评估。
  • 对于语言模型,评估重点转向其通过提示或微调解决多样化任务的能力。

生成模型的评估仍然是一个活跃且开放的领域。尽管我们有许多指标和基准,但如何权衡不同指标、什么是“正确”的任务分布,仍然没有明确答案。随着生成模型的不断发展,设计更好、更全面的评估方法将是至关重要的研究方向。希望本课内容能帮助你为自己的项目选择合适的评估策略。

课程 P16:扩散模型与基于分数的生成模型 🧠

在本节课中,我们将学习扩散模型的核心概念,并探讨其与基于分数的生成模型以及变分自编码器之间的联系。我们将从基础回顾开始,逐步深入到如何将扩散过程视为一种层次化的变分自编码器,并最终理解如何将其转换为可精确计算似然度的流模型。


1. 基于分数模型的简要回顾 📊

上一节我们介绍了生成模型的基本概念,本节中我们来看看基于分数模型的核心思想。

基本思想是通过对概率分布的得分函数(即对数概率密度的梯度)进行建模来工作。得分函数是一个向量场,指示了在输入空间中应向哪个方向移动以增加样本的可能性。我们使用深度神经网络来建模这个得分函数。

以下是核心概念:

  • 得分函数score(x) = ∇_x log p(x)
  • 目标:训练一个神经网络 s_θ(x),使其近似真实数据分布的得分函数。

我们见过,可以使用分数匹配来从数据中估计得分。这是一种回归损失,旨在最小化估计得分与真实得分之间的L2距离。然而,直接计算真实得分是困难的。

因此,我们引入了去噪分数匹配。其核心思想不是直接估计干净数据分布 p_data 的得分,而是估计一个被噪声扰动后的分布 q_σ 的得分,其中 q_σp_data 与高斯核的卷积结果。

以下是去噪分数匹配的关键步骤:

  1. 从数据分布中采样一个干净样本 x
  2. 添加高斯噪声,得到噪声样本 x̃ = x + σ * ε,其中 ε ~ N(0, I)
  3. 训练一个去噪模型 ε_θ(x̃, σ),使其能够预测添加到干净样本上的噪声向量 ε
  4. 可以证明,优化这个去噪目标等价于估计噪声扰动分布 q_σ 的得分。

一旦我们有了对得分的估计,就可以使用朗之万动力学来生成样本。这个过程从一个随机初始化的点开始,然后沿着估计的得分方向(即梯度上升方向)移动,并添加少量噪声,从而逐渐移动到高概率区域。

为了使这个过程有效,我们不仅估计单一噪声水平下的得分,而是估计一系列不同噪声水平 {σ_i} 下的得分。我们训练一个噪声条件得分网络,它同时以样本 x 和噪声水平 σ 作为输入。

以下是生成样本(朗之万动力学)的过程:

  1. 从纯噪声(大σ)开始初始化样本。
  2. 对于从大到小的一系列噪声水平 σ_i
    • 运行朗之万动力学链,使用对应于当前噪声水平 σ_i 的得分估计来更新样本。
    • 将最终样本作为下一个更小噪声水平链的初始值。
  3. 最终,当噪声水平足够小时,我们得到一个接近干净数据分布的样本。

这个过程具有迭代去噪的直观含义:从纯噪声开始,逐步去除噪声以揭示数据结构。


2. 将扩散模型视为层次化变分自编码器 🔄

上一节我们回顾了基于分数模型的采样过程,本节中我们来看看如何将这个过程形式化为一个层次化的变分自编码器。

我们可以将数据逐步添加噪声的过程(前向过程)视为一个编码器,而将逐步去噪生成数据的过程(反向过程)视为一个解码器

前向过程(编码器)
这是一个固定的马尔可夫链,每一步都向数据添加少量高斯噪声。

  • 给定 x_{t-1},定义 x_t 的分布为:q(x_t | x_{t-1}) = N(x_t; √(1-β_t) * x_{t-1}, β_t * I)
  • 其中 β_t 是控制噪声量的超参数。
  • 这个过程从数据 x_0 开始,经过 T 步后,x_T 近似于纯高斯噪声。

这个编码器是固定的、无需学习的,它只是简单地添加噪声。联合分布 q(x_{1:T} | x_0) 是所有条件高斯分布的乘积。

反向过程(解码器)
这是我们希望学习的生成模型,它试图逆转前向过程。

  • 我们定义生成分布 p_θ(x_{0:T}),它从一个先验分布(纯噪声)开始:p(x_T) = N(x_T; 0, I)
  • 然后学习一系列条件分布来逐步去噪:p_θ(x_{t-1} | x_t)
  • 通常,我们假设这些条件分布也是高斯的:p_θ(x_{t-1} | x_t) = N(x_{t-1}; μ_θ(x_t, t), Σ_θ(x_t, t))
  • 其中均值 μ_θ 和方差 Σ_θ 由神经网络参数化。

这定义了一个层次化的潜在变量模型,其中潜在变量序列是 x_1, x_2, ..., x_T

训练目标
与变分自编码器类似,我们通过最大化证据下界来训练模型。对于扩散模型,ELBO 可以推导为:
L = E[log p_θ(x_0) - D_KL(q(x_{1:T}|x_0) || p_θ(x_{1:T}|x_0))]

经过推导和参数化选择(例如,让神经网络 ε_θ 预测噪声),这个ELBO损失可以简化为一个去噪分数匹配损失
L_simple = E_{t, x_0, ε}[|| ε - ε_θ(√(ᾱ_t)x_0 + √(1-ᾱ_t)ε, t) ||^2]
其中 ᾱ_tβ_t 的函数。

因此,优化扩散模型的ELBO等价于训练一个噪声条件得分网络进行去噪分数匹配。两种视角在训练目标上达成了统一。

采样
在采样时,扩散模型通过执行学习到的反向过程来生成样本:

  1. x_T ~ N(0, I) 采样。
  2. 对于 t = T, ..., 1
    • p_θ(x_{t-1} | x_t) 采样 x_{t-1}
    • 这通常涉及计算 μ_θ(x_t, t) 并添加一些噪声。

这个过程与朗之万动力学类似,都是迭代去噪,但具体更新规则源于对反向过程高斯分布的参数化。


3. 连续时间视角:随机微分方程与概率流ODE ⏱️

上一节我们在离散时间框架下讨论了扩散模型,本节中我们来看看当时间步数趋于无穷时的连续时间视角。

当我们将离散时间步 t 无限细化,前向加噪声过程可以描述为一个随机微分方程
dx = f(x, t) dt + g(t) dw
其中 dw 是布朗运动增量。一个简单的选择是 f(x, t) = -0.5 β(t) x, g(t) = √β(t)。这个SDE描述了概率密度如何随时间“扩散”。

有趣的是,对于每一个前向SDE,都存在一个对应的反向时间SDE,它描述了从噪声生成数据的过程:
dx = [f(x, t) - g(t)^2 ∇_x log p_t(x)] dt + g(t) d\bar{w}
其中 ∇_x log p_t(x) 正是在时间 t 的得分函数,d\bar{w} 是反向时间的布朗运动。

关键联系:为了数值求解这个反向SDE以生成样本,我们需要知道每一步的得分函数 ∇_x log p_t(x)。这正是我们通过噪声条件得分网络 s_θ(x, t) 所学习的内容。

将学习到的得分模型 s_θ(x, t) 代入反向SDE,我们就可以通过数值SDE求解器(如欧拉-丸山法)从噪声中采样数据。这提供了另一种生成样本的视角。

更进一步,任何一个SDE都可以转换为一个常微分方程,称为概率流ODE,它具有相同的边缘分布 p_t(x)
dx/dt = f(x, t) - 0.5 * g(t)^2 ∇_x log p_t(x)

这个ODE是确定性的(没有随机噪声项)。它的优势在于:

  1. 可逆性:由于是确定性ODE,从 x_Tx_0 的映射是可逆的。这实际上将模型变成了一个连续归一化流
  2. 精确似然计算:利用变量变换公式,我们可以通过积分这个ODE来精确计算数据点 x_0 的似然值 p(x_0)
  3. 高效采样:可以使用更高效、精度更高的ODE求解器进行采样。

因此,通过得分函数,我们可以在SDE(随机采样)和ODE(确定性流,可计算似然)视角之间自由切换。


4. 总结与核心联系 🎯

本节课中我们一起学习了扩散模型的多重视角及其内在联系。

  1. 基于分数的模型:核心是学习数据分布(及其噪声扰动版本)的得分函数,并使用朗之万动力学采样。
  2. 扩散模型(DDPM):将生成过程视为一个学习去噪反向过程的层次化VAE。其训练目标被证明等价于去噪分数匹配。
  3. 随机微分方程视角:在连续时间极限下,扩散过程由SDE描述。生成样本需要求解依赖得分函数的反向SDE。
  4. 概率流ODE:任何扩散SDE都有对应的确定性ODE。使用得分函数求解此ODE,可将模型转换为一个可精确计算似然的流模型。

这些视角通过得分函数 ∇_x log p_t(x) 这一核心概念紧密相连。无论是作为VAE的解码器参数,还是作为SDE/ODE的驱动项,学习准确的得分函数都是扩散模型成功的关键。

最终,我们拥有了一个灵活的框架:既可以利用SDE视角的随机性进行采样,也可以利用ODE视角的确定性和可逆性进行精确似然计算,为生成建模提供了强大的工具。

课程 P17:扩散模型与连续时间视角 🧠

在本节课中,我们将深入探讨扩散模型,特别是从变分自编码器(VAE)的视角出发,理解其与基于分数的模型之间的联系。我们将看到如何将离散时间过程推广到连续时间,并探讨这种视角如何带来更高效的采样、似然计算以及可控生成等强大功能。


从 VAE 视角看扩散模型 🔄

上一节我们介绍了扩散模型的基本思想。本节中,我们来看看如何将其视为一种特殊的变分自编码器。

扩散模型的前向过程(向数据添加噪声)可以看作是一个编码器。每一步的转换 Q(xt | xt-1) 是一个以 xt-1 为中心的高斯分布,我们只需添加一些噪声即可得到 xt。经过多步后,数据中的结构被完全破坏,最终得到纯噪声。

相应地,存在一个反向过程(从噪声到数据),可以看作是一个解码器。解码器 pθ(xt-1 | xt) 试图根据 xt 来猜测 xt-1 的值。这些解码器通常也是高斯分布,其参数由神经网络计算。

我们可以通过优化证据下界(ELBO)来训练这类模型,其目标是最小化编码器分布与解码器分布之间的 KL 散度。有趣的是,经过数学推导,这个 ELBO 目标最终变成了精确的噪声分数匹配目标

核心公式
优化 ELBO 对应于学习一系列去噪器,每个去噪器对应链中的一个不同噪声水平。这本质上与噪声条件分数网络(NCSN)做的事情相同。

因此,去噪扩散概率模型(DDPM)的训练和推理过程与基于分数的模型非常相似。在训练时,我们学习一系列去噪器;在生成样本时,我们使用解码器进行采样。由于解码器是高斯分布,采样步骤包括计算均值并添加噪声,这与朗之万动力学(跟随梯度并添加噪声)的更新步骤非常相似。


迈向连续时间极限 ⏱️

上一节我们讨论了离散时间步的扩散模型。本节中,我们来看看当噪声级别趋于无穷多时,会发生什么。

我们可以将离散的噪声级别序列视为一个由连续变量 t 索引的分布谱。在 t=0 端是干净的数据分布,在 t=T 端是纯噪声分布。这种连续视角揭示了模型的额外结构,可用于开发更高效的采样器和精确的似然评估。

连续版本描述了一个从数据到噪声的随机过程。这个过程可以通过随机微分方程(SDE) 来描述。

核心公式(前向 SDE):
dxt = dwt
其中 dwt 表示无穷小的噪声(维纳过程的微分)。这是一个没有漂移项的 SDE,意味着变化完全由噪声驱动,就像一种连续的随机游走。

这个 SDE 本质上是之前 VAE 视角中,相邻切片时间步长趋于无穷小时的极限。在密度层面上,这相当于用高斯核连续地对密度进行卷积。


时间反转与生成过程 🔁

上一节我们定义了从数据到噪声的前向 SDE。本节中,我们来看看如何反转时间,以得到一个从噪声生成数据的随机过程。

如果我们翻转时间轴的方向(令 t' = T - t),可以得到描述反向过程的 SDE。有趣的是,这个反向 SDE 包含了一个漂移项,而这个漂移项正是扰动数据密度在时间 t 的得分(梯度)

核心公式(反向 SDE):
dxt = [∇ log pt(xt)] dt + dwt
这里的 ∇ log pt(xt) 就是得分函数。这个方程告诉我们,要从噪声生成数据,我们不仅需要添加噪声,还需要跟随得分函数指引的方向。

直观理解:如果我们想从混合了两个高斯分布(例如,猫和狗的图像)的数据分布中采样,并且只想生成狗,那么得分函数会引导轨迹走向“狗”对应的概率质量区域。这为后续的可控生成奠定了基础。

为了从该 SDE 定义的模型中生成样本,我们需要知道得分函数 ∇ log pt(xt)。我们可以通过训练一个神经网络 sθ(x, t) 来估计它,使用的目标函数是分数匹配(或去噪分数匹配)损失。


从随机微分方程到常微分方程 🛤️

上一节我们讨论了用随机微分方程(SDE)描述生成过程。本节中,我们将看到存在一个完全确定性的过程,能产生完全相同的边缘分布。

通过一个称为概率流常微分方程(Probability Flow ODE) 的变换,我们可以将随机性的 SDE 转换为一个确定性的常微分方程。

核心公式(概率流 ODE):
dxt = [∇ log pt(xt) - 1/2 ∇·(∇ log pt(xt))] dt ≈ ∇ log pt(xt) dt (在某些简化条件下)
这个 ODE 定义了一个确定性的轨迹。关键点在于,由这个 ODE 产生的边缘分布 pt(xt),与之前反向 SDE 产生的边缘分布完全相同

这意味着我们可以将扩散模型视为一个连续时间的归一化流(Normalizing Flow)。这个流模型由 ODE 的解定义,映射是可逆的。这带来了两大好处:

  1. 高效、精确的采样:可以利用数值 ODE 求解器(如 Runge-Kutta 方法)进行快速、高精度的采样。
  2. 精确的似然计算:通过反转 ODE 将数据点映射回先验噪声空间,并计算变量变换的雅可比行列式(实践中通过积分迹实现),可以计算数据点的确切似然。

尽管扩散模型并非直接通过最大似然训练,但通过分数匹配学习后,它们能在图像数据集上达到最先进的似然值。


加速采样与蒸馏技术 ⚡

上一节我们介绍了通过 ODE 进行确定性采样的优点。本节中,我们来看看如何进一步加速采样过程。

在实践中,我们仍需离散化时间轴来数值求解 ODE 或 SDE。采样速度与步数直接相关。

以下是几种加速策略:

1. 更粗的离散化
直接减少采样步数(例如从 1000 步减到 30 步),以计算换速度。这会引入数值误差,但通常能保持可接受的样本质量。

2. 先进的 ODE 求解器
使用更高级的数值 ODE 求解器(如 DPM-Solver),可以在更少的步数内获得高精度的解。

3. 并行化采样
通过并行计算轨迹的不同部分(在多个 GPU 上),可以用更多的总计算量来换取更短的“墙钟时间”。

4. 知识蒸馏(渐进式蒸馏)
这是一种模型压缩技术:

  • 训练一个“教师”扩散模型(步数多,结果准)。
  • 训练一个“学生”模型,目标是让其一步的输出,匹配教师模型多步后的输出。
  • 迭代此过程,可以将千步模型蒸馏成几步甚至一步的模型,实现极速生成。“一致性模型”便是此类思想的体现。

潜在扩散模型与条件生成 🎨

上一节我们讨论了在原始像素空间操作的扩散模型。本节中,我们来看看如何将其扩展到潜在空间,并实现条件生成。

潜在扩散模型(LDM)
直接在像素上训练扩散模型计算成本高昂。潜在扩散模型的核心思想是:

  1. 使用一个预训练的自编码器(VAE)将高维图像 x 编码到低维潜在空间 z
  2. 在潜在空间 z 上训练扩散模型。
  3. 生成时,先从潜在空间的扩散模型采样得到 z,再用解码器重建为图像 x

优势:在低维空间训练更快、更省内存,同时保持了生成质量。Stable Diffusion 是此方法的成功代表。

条件生成
我们通常希望生成特定类别的图像(如“狗”),或根据文本描述生成图像。这需要学习条件分布 p(x|y) 的得分函数,其中 y 是标签或文本。

方法一:训练条件模型
直接训练一个以 y 为额外输入的去噪网络 sθ(x, t, y)。这需要将 y(如通过文本编码器得到的向量)集成到网络架构中(例如通过交叉注意力)。

方法二:事后引导(Classifier Guidance)
如果我们已有一个无条件扩散模型(先验 p(x))和一个分类器 p(y|x),则可以通过贝叶斯规则得到后验得分:
∇ log p(x|y) = ∇ log p(x) + ∇ log p(y|x)
核心操作:在采样时,将无条件模型的得分与分类器对 x 的梯度相加,即可引导生成过程朝向符合条件 y 的样本。这无需重新训练扩散模型。

方法三:无分类器引导(Classifier-Free Guidance)
更常用的方法是同时训练一个条件扩散模型 sθ(x, t, y) 和一个无条件模型 sθ(x, t, ∅),然后在采样时进行插值:
引导得分 = sθ(x, t, y) + γ * (sθ(x, t, y) - sθ(x, t, ∅))
其中 γ > 1 是引导强度。这种方法避免了训练显式分类器,在实践中效果更好、更稳定,被当前先进的文生图模型广泛采用。


总结 📚

本节课我们一起深入学习了扩散模型的连续时间视角及其强大应用。

  • 我们从 VAE 的视角 理解了扩散模型的训练目标与分数匹配的等价性。
  • 通过引入连续时间极限,我们用随机微分方程(SDE) 描述了前向噪声添加和反向生成过程。
  • 我们发现了与之等价的概率流常微分方程(ODE),这允许我们将扩散模型视为连续时间归一化流,从而实现精确的似然计算高效的确定性采样
  • 为了加速生成,我们探讨了粗离散化、高级 ODE 求解器、并行化及知识蒸馏等技术。
  • 最后,我们介绍了潜在扩散模型(LDM) 如何通过在高维数据上进行操作来提升效率,并详细讲解了条件生成的多种方法,包括训练条件模型、事后引导和无分类器引导,这些技术使得扩散模型能够根据文本、类别等指令进行可控生成。

这种连续时间的数学框架为理解、改进和应用扩散模型提供了强大而统一的基础。

课程 P18:离散数据扩散模型 🧬

在本节课中,我们将学习如何将扩散模型应用于离散数据,特别是文本数据。我们将探讨连续空间模型在处理离散数据时面临的挑战,并介绍一种名为“具体分数”的新概念,它允许我们将基于分数的建模范式扩展到离散领域。课程将涵盖从理论推导到实际应用的完整流程,包括如何学习、采样以及评估离散扩散模型。


概述:为什么离散数据建模很重要? 🤔

在之前的课程中,我们学习了多种生成模型,如变分自编码器、生成对抗网络和扩散模型。这些模型通常以连续数据(如图像像素)为例进行说明。然而,许多重要的数据模态本质上是离散的,例如自然语言中的词元序列、DNA序列或蛋白质结构。

离散数据空间 X = {1, ..., N}^D 与连续空间 R^D 有根本不同。在离散空间中,我们只能在有限的、孤立的点上生成有效样本,而不能在点之间进行插值。这使得直接应用为连续数据设计的模型(如标准化流或GANs)变得非常困难,因为这些模型严重依赖于微积分和梯度计算。

尽管如此,对离散生成模型的需求非常迫切。大型语言模型(如GPT系列)的核心——语言模型预训练——本质上就是在学习一个离散数据的概率分布。此外,在生物信息学等领域,生成新的DNA或蛋白质序列也需要离散模型。


连续模型为何在离散数据上失效? 🚫

上一节我们介绍了离散数据的重要性,本节中我们来看看为什么直接将连续模型(如标准化流或GANs)应用于离散数据会失败。

标准化流 (Normalizing Flows) 的核心是通过可逆变换 f_θ 将简单分布映射到复杂分布。其公式为:
p_θ(x) = p_z(f_θ^{-1}(x)) |det J_{f_θ^{-1}}(x)|
其中 z 是噪声。然而,在离散空间中,我们缺乏这种可以“拉伸”和“挤压”空间的连续、可微的双射变换。离散变换通常只是从一个离散点映射到另一个,无法改变分布的形态,因此基础分布必须已经非常接近数据分布,这失去了建模的意义。

生成对抗网络 (GANs) 通过判别器提供的梯度来更新生成器。如果生成器的输出是离散值(如词元索引),梯度将无法通过这些离散值进行反向传播,因为离散操作是不可微的。

核心问题:现有模型过于依赖连续微积分,难以直接扩展到离散空间。虽然可以将离散标记嵌入到连续空间(例如通过词嵌入),然后使用连续模型生成后再离散化,但这会引入大量无意义的“空白空间”,并非一个良好的归纳偏置,导致学习困难且采样缓慢。


自回归建模:当前的主流范式 📝

在扩散模型兴起之前,自回归模型(如Transformer)是处理离散序列数据(尤其是文本)的主导范式。

自回归模型通过链式法则分解序列的概率:
p_θ(x) = ∏_{t=1}^{D} p_θ(x_t | x_{<t})
其中 x = (x_1, ..., x_D) 是一个序列。

以下是自回归建模的主要优缺点:

优点

  1. 可扩展性:计算下一个标记的概率只需要对词汇表大小 N 进行求和,计算高效。
  2. 表达能力强:理论上,一个足够强大的神经网络可以通过这种分解表示任何序列分布。
  3. 合理的归纳偏置:对于自然语言这种按顺序生成的数据,从左到右的生成方式非常直观。

缺点

  1. 误差累积:采样时,早期步骤的误差会不断累积,导致生成结果偏离轨道。
  2. 非普适的归纳偏置:对于DNA序列等数据,没有理由必须从左到右生成。
  3. 架构约束:需要严格的因果注意力掩码。
  4. 采样速度慢:由于是迭代生成,采样速度与序列长度成正比。

因此,我们需要探索非自回归的生成方法。


将分数匹配扩展到离散空间:具体分数 🧮

上一节我们看到了自回归模型的局限性,本节我们将探索如何将分数匹配(Score Matching)的思想扩展到离散空间,从而绕过自回归分解。

在连续空间中,分数函数是数据对数概率的梯度:∇_x log p(x)。在离散空间中,“梯度”的概念不再适用。其自然的推广是有限差分。对于函数 f,在点 x 处的“梯度”可以推广为所有其他点 yx 的函数值之差。

由此,我们可以定义离散空间中的“分数”——具体分数 (Concrete Score)
s(x, y) = p(y) / p(x) - 1,对于 y ≠ x
它衡量了从状态 x 跳转到状态 y 的相对概率比率。

然而,直接建模所有序列对 (x, y) 的比率是指数级复杂的。一个关键的简化是只建模局部邻居之间的比率,即两个序列 xy 仅在一个位置上不同。这样,我们需要建模的比率数量降为 O(N * D),变得可计算。

我们可以使用一个序列到序列的神经网络(如非因果Transformer)来参数化这些局部比率。网络输入序列 x,输出一个大小相同的序列,其中第 t 个输出向量经过Softmax后,可以表示在位置 t 上变成其他标记的比率。


学习具体分数:得分熵损失函数 🎯

现在我们有了具体分数的定义和参数化方法,接下来我们需要一种方式来学习它,即训练我们的神经网络 s_θ(x, y) 使其逼近真实比率 p(y)/p(x)

类似于连续分数匹配,我们定义得分熵 (Score Entropy) 损失函数:
J(θ) = E_{x ~ p} [ ∑_{y≠x} (s_θ(x, y) - (p(y)/p(x) - 1))^2 ]
最小化这个损失,可以证明最优解 s_θ^*(x, y) 恰好等于 p(y)/p(x) - 1

然而,损失函数中包含了未知的真实数据分布 p(x)p(y)。为了解决这个问题,我们借鉴去噪分数匹配 (Denoising Score Matching) 的思想,引入去噪得分熵 (Denoising Score Entropy)

我们定义一个前向扩散过程(一个条件分布 q(x|x_0)),将干净数据 x_0 扰动为 x。经过推导,我们可以得到一个等价的、可计算的损失函数:
J_dse(θ) = E_{x_0 ~ p_data} E_{x ~ q(·|x_0)} [ ∑_{y≠x} (s_θ(x, y) - (q(y|x_0)/q(x|x_0) - 1))^2 ]
现在,损失函数只依赖于我们可以采样和计算的扩散核 q(·|x_0),从而变得可优化。


离散扩散过程与逆向采样 🔄

上一节我们学会了如何学习具体分数,本节我们来看看如何利用它来生成新的样本。这需要定义离散空间中的扩散过程及其逆向过程。

我们定义一个连续时间马尔可夫链作为前向扩散过程。其状态演化由速率矩阵 Q_t 描述:
dp_t / dt = Q_t^T p_t
其中 p_t 是在时间 t 的状态概率向量。Q_t 的非对角线元素 Q_t(i, j) 表示从状态 i 跳转到状态 j 的瞬时速率。矩阵需满足每列之和为零,以保证总概率守恒。

前向过程示例

  1. 均匀过渡:以一定速率从当前标记跳转到词汇表中的任何其他随机标记。最终稳态是均匀分布。
  2. 掩码过渡:以一定速率从当前标记跳转到特殊的 [MASK] 标记。最终所有标记都会被掩码。

前向过程在时间 t 的转移概率可以通过矩阵指数计算:p_t = exp(∫_0^t Q_s ds) p_0

关键结论:对于定义好的前向扩散过程,存在一个逆向过程,其速率矩阵 \bar{Q}_t 与前向矩阵 Q_t 通过具体分数联系起来:
\bar{Q}_t(j, i) = (p_t(j) / p_t(i)) * Q_t(i, j),对于 i ≠ j

这正是我们需要的!我们可以用学习到的具体分数网络 s_θ(x, t) 来近似 p_t(j)/p_t(i) - 1,从而近似整个逆向速率矩阵 \bar{Q}_t。有了逆向速率矩阵,我们就可以从简单的先验分布(如均匀分布或全掩码状态)开始,通过模拟逆向随机过程来采样生成数据。

为了提高采样效率,我们可以允许在每个采样步骤中同时改变多个位置的状态,而不是一次只改变一个。


模型评估:生成质量与似然度边界 📊

我们已经建立了完整的学习和采样框架,最后需要评估模型的性能。评估主要围绕两个方面:生成样本的质量和模型拟合数据分布的能力(似然度)。

生成质量:我们可以从模型中采样序列,并使用一个大型预训练语言模型(如GPT-2 Large)来计算这些生成序列的困惑度 (Perplexity)。困惑度越低,说明生成的序列越自然、越像真实语言。实验表明,在相似的模型规模下,离散扩散模型生成的序列困惑度可以低于自回归的GPT-2模型,并且通过增加采样步骤,生成质量可以进一步提升。

似然度评估:为了与自回归模型进行公平比较,我们需要评估模型在数据上的对数似然度(或困惑度)。对于扩散模型,我们可以推导出一个变分下界 (Evidence Lower Bound, ELBO)。
-log p_θ(x_0) ≤ E[ ∫_0^T ... dt ] + C
有趣的是,这个上界中的关键项与我们去噪得分熵损失函数密切相关。因此,通过优化得分熵损失,我们同时在优化似然度的上界。在实际评估中,基于这个上界计算出的困惑度与GPT-2等自回归模型的结果具有可比性,甚至在部分数据集上表现更优。


总结与展望 🎓

本节课中我们一起学习了如何为离散数据构建扩散模型。

  1. 挑战:离散数据空间缺乏连续性和可微性,使得主流连续生成模型直接应用失效。
  2. 新范式:我们将分数匹配推广到离散空间,引入了具体分数的概念,即数据分布之间的局部比率。
  3. 学习:通过得分熵及其去噪变体,我们可以有效地从数据中学习具体分数。
  4. 生成:我们定义了离散前向扩散过程,并利用学习到的具体分数来推导和模拟逆向过程,从而进行非自回归的并行采样。
  5. 评估:模型在生成质量和序列似然度方面都能与强大的自回归基线模型竞争,展示了离散扩散模型的潜力。

这项工作首次为非自回归建模挑战自回归Transformer在离散序列生成中的主导地位提供了强有力的证据。它为更快、更可控的文本生成,以及DNA、蛋白质等非语言序列的建模开辟了新的道路。未来的工作可能包括设计更高效的扩散过程、探索更复杂的网络架构,以及将这种方法扩展到更大规模的数据和模型上。

课程2:深度生成模型基础 🧠

在本节课中,我们将学习生成模型的基本概念,特别是如何应对高维数据建模中的“维度诅咒”挑战。我们将从概率图模型的高层概述开始,探讨生成模型与判别模型的区别,并最终了解如何利用神经网络来构建深度生成模型。


概述:生成模型的核心问题

生成模型的核心目标是:给定一组来自未知真实数据分布 ( p_{data} ) 的样本(如图像、文本),我们需要找到一个模型分布 ( p_{\theta} ) 来近似这个真实分布。一旦获得一个好的近似,我们就可以从中采样,生成新的、类似训练数据的数据。

为了实现这个目标,我们需要定义三个关键部分:

  1. 模型族:一组由参数 (\theta) 索引的概率分布。
  2. 损失函数/相似度度量:用于衡量模型分布 ( p_{\theta} ) 与真实数据分布 ( p_{data} ) 之间距离的方法。
  3. 优化:在模型族中找到最接近真实分布的参数 (\theta)。

通过改变这三个部分的选择,我们可以得到不同类型的生成模型,如自回归模型、扩散模型和生成对抗网络。


维度诅咒与表示挑战 🧩

上一节我们介绍了生成模型的基本框架,本节中我们来看看构建模型时遇到的首要挑战:如何表示复杂的概率分布。

当我们处理低维数据(如单个伯努利随机变量)时,描述其分布很简单。然而,对于高维数据(如图像的像素或文本的单词),可能的状态空间会呈指数级增长。

例如,一个简单的黑白图像(28x28像素,每个像素是二进制的)有 (2^{784}) 种可能的状态。我们无法为每一种可能的状态存储一个概率值。因此,我们必须做出一些假设来简化表示。

一种极端的简化是假设所有随机变量相互独立。这样,联合分布可以分解为边缘分布的乘积:
[
p(x_1, x_2, ..., x_n) = \prod_{i=1}^{n} p(x_i)
]
这大大减少了参数数量(对于n个二进制变量,只需n个参数)。但此假设通常过强,无法捕捉数据中复杂的依赖关系(如图像中相邻像素的相关性)。


概率图模型:利用条件独立性 🔗

为了在表示能力和计算可行性之间取得平衡,我们引入条件独立性假设,这可以通过概率图模型(特别是贝叶斯网络)来形式化描述。

贝叶斯网络使用有向无环图来表示随机变量之间的依赖关系。每个节点的条件概率只依赖于其父节点。联合分布可以分解为一系列条件概率的乘积:
[
p(x_1, x_2, ..., x_n) = \prod_{i=1}^{n} p(x_i | \text{parents}(x_i))
]
通过精心设计图的结构(即限制每个节点的父节点数量),我们可以用相对较少的参数来表示复杂的联合分布。

例如,在马尔可夫模型中,我们假设当前状态只依赖于前一个状态,这对应一个链式图结构,显著降低了模型复杂度。


生成模型 vs. 判别模型 ⚖️

上一节我们讨论了如何利用图结构简化模型,本节我们来看看生成式建模与更常见的判别式建模有何不同。

两者都旨在从数据中学习,但关注点不同:

  • 生成模型:尝试对特征 (X)标签 (Y)联合分布 (p(X, Y)) 进行建模。它学习数据是如何“生成”的。
  • 判别模型:直接对条件分布 (p(Y | X)) 进行建模。它只关心给定输入 (X) 时,输出 (Y) 是什么。

举例:在垃圾邮件分类任务中((Y):是否为垃圾邮件,(X):邮件中的词)。

  • 朴素贝叶斯(生成式):先建模 (p(Y)) 和 (p(X|Y)),然后利用贝叶斯定理计算 (p(Y|X))。它假设在给定 (Y) 的条件下,(X) 中的各个特征是独立的。
  • 逻辑回归(判别式):直接建模 (p(Y|X)),通常假设其为 (X) 的线性函数经过sigmoid变换后的形式。

判别模型通常更简单高效,因为它无需对 (X) 的复杂分布进行建模。然而,生成模型功能更强大,一旦学得联合分布,不仅可以进行分类,还可以生成新数据、处理缺失值等。


神经网络的引入:从逻辑回归到深度生成模型 🧠

无论是生成模型中的条件概率 (p(x_i | \text{parents}(x_i))),还是判别模型中的 (p(Y|X)),当依赖关系复杂时,我们都难以用简单的表格或线性函数来刻画。

这时,神经网络成为了强大的工具。我们可以用神经网络来参数化这些复杂的条件分布。

以下是神经网络如何逐步增强模型表达能力的例子:

  1. 逻辑回归:( p(Y=1|X) = \sigma(\alpha^T X) ),其中 (\sigma) 是sigmoid函数。这是一个线性决策边界。
  2. 单层神经网络:( p(Y=1|X) = \sigma(\alpha^T \text{ReLU}(AX + b)) )。这引入了非线性变换,允许更复杂的决策边界。
  3. 深度神经网络:堆叠更多层,可以拟合极其复杂的函数关系。

在生成模型中,最直接的应用是神经自回归模型。我们利用概率的链式法则分解联合分布,然后用神经网络来建模每一个条件概率 (p(x_i | x_1, ..., x_{i-1}))。现代的大型语言模型(LLMs)本质上就是深度的神经自回归模型。


连续变量与混合模型 🌊

到目前为止,我们主要讨论了离散变量。但许多数据(如图像像素值)本质上是连续的。

对于连续随机变量,我们使用概率密度函数(PDF) 而非概率质量函数。好消息是,之前讨论的所有原理(链式法则、贝叶斯网络、神经网络参数化)对连续变量同样适用。

我们可以构建包含连续和离散变量的混合模型。例如,高斯混合模型可以看作一个简单的贝叶斯网络:

  • 隐变量 (Z) 是一个离散的类别变量(如伯努利分布)。
  • 观测变量 (X) 的条件分布 (p(X|Z)) 是一个高斯分布,其参数依赖于 (Z) 的值。

更一般地,我们可以用神经网络根据隐变量 (Z) 来输出高斯分布的参数,从而得到非常灵活的条件分布。这就是变分自编码器(VAE) 等模型生成部分的核心思想。


总结 📚

本节课我们一起学习了深度生成模型的基础:

  1. 核心目标:学习一个近似真实数据分布的模型分布,以用于生成、密度估计等任务。
  2. 核心挑战:“维度诅咒”使得直接表示高维联合分布不可行。
  3. 关键工具1:条件独立性:通过概率图模型(贝叶斯网络)做出结构化假设,简化联合分布的表示。
  4. 关键工具2:神经网络:用于参数化复杂的条件概率分布,极大地提升了模型的表达能力。
  5. 建模范式:生成模型学习联合分布 (p(X,Y)),功能强大但计算复杂;判别模型学习条件分布 (p(Y|X)),通常更高效直接。
  6. 统一视角:许多现代深度生成模型(自回归、VAE、扩散模型)都是链式法则分解条件独立性假设神经网络参数化这三者以不同方式结合的产物。

在接下来的课程中,我们将深入探讨这些具体的深度生成模型。

课程三:自回归生成模型 🧠

在本节课中,我们将要学习自回归模型。这是生成模型家族中的第一种类型,也是支撑像GPT这样的大型语言模型的核心技术。我们将从基本概念出发,逐步理解如何利用链式法则和神经网络来构建能够生成新数据的概率模型。


概述

生成模型的目标是学习一个能够近似真实数据分布的模型分布。我们拥有来自某个未知分布 p_data 的独立同分布样本。我们需要定义一个由参数 θ 决定的模型分布族 p_model(x; θ),并优化这些参数,使模型分布尽可能接近数据分布。自回归模型是实现这一目标的一种有效方法。


链式法则与概率分解

上一节我们介绍了生成模型的通用框架,本节中我们来看看如何具体表示一个复杂的联合概率分布。

根据概率论中的链式法则,任何包含 n 个随机变量 X1, X2, ..., Xn 的联合分布都可以分解为一系列条件概率的乘积:

p(x1, x2, ..., xn) = p(x1) * p(x2 | x1) * p(x3 | x1, x2) * ... * p(xn | x1, ..., xn-1)

这种分解是完全通用的,不依赖于分布的任何特性。关键在于,我们需要为这些条件概率 p(xi | x1, ..., xi-1) 找到一个好的参数化表示方法。直接使用条件概率表在变量很多时是不可行的。


从分类器到生成模型

解决条件概率表示问题的一个核心思路是:将每个条件概率的预测视为一个分类或回归问题

例如,预测像素 Xi 是黑色(0)还是白色(1),可以看作一个二分类问题。我们可以使用逻辑回归模型:

p(xi = 1 | x1, ..., xi-1) = σ(α_i^T * [x1, ..., xi-1])

其中 σ 是sigmoid函数,α_i 是模型参数。这样,建模一个包含 n 个像素的图像联合分布,就转化为了 n 个相关的分类问题。

然而,为每个位置 i 都训练一个独立的逻辑回归模型(参数为 α_i)会导致参数数量庞大(与 n^2 成正比),且无法共享不同位置学到的特征。


神经自回归模型

为了构建更强大、参数更高效的模型,我们使用神经网络来参数化这些条件概率。

我们可以构建一个共享权重的神经网络。该网络以序列中之前的所有变量为输入,并输出下一个变量的条件分布参数。对于二值数据,输出是伯努利分布的参数(一个介于0和1之间的概率);对于多值数据,输出是类别分布的参数(通过softmax获得);对于连续数据,输出可以是高斯分布等连续分布的参数。

以下是构建块示意图(以全连接网络为例):

输入: [x1, x2, ..., xi-1]
    ↓
隐藏层: h = f(W * [x1, ..., xi-1] + b)
    ↓
输出层: p(xi | ...) = g(V * h + c)

其中 f 是非线性激活函数,g 是sigmoid(二值)、softmax(多类)或线性层(连续分布参数)。

这种结构的优势在于:

  1. 权重共享:同一个网络处理所有位置 i 的预测,大大减少了参数量。
  2. 计算高效:评估一个数据点的概率时,可以顺序计算并重用部分中间结果。
  3. 采样简单:生成新样本时,可以按照链式法则顺序采样:先根据 p(x1) 采样 x1,再根据 p(x2|x1) 采样 x2,依此类推。

掩码自编码器

我们注意到,上述神经自回归模型的计算图与去噪自编码器类似,但有一个关键区别:自回归模型在预测 xi 时,不允许“看到”未来的信息 xi, xi+1, ..., xn

为了实现这一点,我们可以通过对神经网络权重矩阵应用掩码来强制实施这种因果依赖关系。具体做法是:

  • 为网络中的每个神经元分配一个“依赖索引”。
  • 在连接权重时,只允许神经元接收来自索引小于或等于其自身依赖索引的神经元的输入。
  • 这样,网络的输出层在预测第 i 个变量时,其计算路径只会经过代表前 i-1 个变量的输入。

这种方法将自回归模型变成了一个单次前向传播就能输出所有条件概率参数的单一神经网络,极大提升了训练效率。


递归神经网络(RNN)方法

对于序列数据(如文本、语音),使用RNN来构建自回归模型是非常自然的选择。

RNN通过一个不断更新的隐藏状态 h_t 来总结历史信息:

h_t = f(W * h_{t-1} + U * x_t + b)

然后利用这个隐藏状态来预测序列中的下一个元素:

p(x_{t+1} | x1, ..., x_t) = g(V * h_t + c)

以下是RNN用于字符级文本生成的流程:

  1. 将字符进行独热编码。
  2. 初始化RNN隐藏状态 h0
  3. 对于序列中的每个位置 t,根据当前隐藏状态 h_{t-1} 和当前输入字符 x_t,计算下一个字符的概率分布 p(x_{t+1})
  4. 同时更新隐藏状态到 h_t
  5. 训练目标是最大化真实序列中下一个字符的对数概率。

RNN的优点是其参数数量固定,与序列长度无关,并且理论上可以处理任意长的依赖关系。它在字符级语言建模上取得了令人印象深刻的效果,可以生成类似莎士比亚文风的文本或格式正确的伪维基百科页面。

然而,RNN的缺点是训练和推理必须顺序进行,无法充分利用GPU的并行计算能力,并且长程依赖难以学习。


总结

本节课中我们一起学习了自回归生成模型的核心思想与方法。

  • 核心思想:利用概率的链式法则,将高维联合分布的建模问题分解为一系列顺序的条件概率预测问题。
  • 基本方法:使用神经网络(如逻辑回归、全连接网络、RNN)来参数化每个条件概率。
  • 关键优势
    • 提供了一种清晰且易于理解的生成模型框架。
    • 采样过程简单直接(顺序采样)。
    • 概率计算和训练目标(最大似然)定义明确。
  • 主要挑战
    • 需要选择一个变量顺序,这对于没有天然顺序的数据(如图像)可能是个问题。
    • 生成过程本质上是顺序的,无法并行化,导致生成速度较慢。
    • 对于RNN,存在长程依赖学习困难的问题。

自回归模型是理解现代生成式AI的重要基石,它为后续更复杂的模型(如Transformer)奠定了基础。

课程 P4:自回归模型与最大似然学习 🧠

在本节课中,我们将学习自回归模型的核心概念、其面临的挑战,以及如何使用最大似然法来训练这些模型。我们将从回顾递归神经网络(RNN)开始,探讨其局限性,然后介绍注意力机制和Transformer架构如何解决这些问题。最后,我们将深入探讨如何通过最小化KL散度来定义学习目标,并将其转化为可计算的最大似然估计问题。


回顾:递归神经网络(RNN)的挑战 🔄

上一节我们介绍了自回归模型的基本思想。本节中,我们来看看递归神经网络(RNN)作为参数化自回归模型的一种方式。

RNN的关键思想是使用一个恒定数量的参数来建模序列,通过一个隐藏向量来跟踪并总结已看到的所有上下文信息,并用它来预测序列中的下一个元素(如标记或像素)。

例如,在构建文本模型时,RNN会处理序列“我朋友打开了”,更新其隐藏状态,最终得到一个隐藏向量 h4。然后,使用这个向量来预测下一个合理的标记(如“门”或“窗户”),并对不合理的续写赋予低概率。

尽管基于字符级别的RNN可以工作得相当好,但它面临几个主要挑战:

  • 信息瓶颈:单个隐藏向量必须总结整个历史序列的全部含义,这可能是困难的。
  • 计算效率:训练时需要展开计算图,导致速度较慢。
  • 长程依赖问题:梯度在长序列中可能爆炸或消失,使得模型难以学习早期的依赖关系。

因此,RNN并非当前最先进语言模型的首选架构。


注意力机制与Transformer架构 ⚡

为了解决RNN的瓶颈问题,现代模型采用了注意力机制。其核心思想是:在预测下一个元素时,不是仅依赖最后一个隐藏状态,而是考虑整个过去序列的所有隐藏状态,并通过注意力机制有选择地关注最相关的部分。

注意力机制的工作原理类似于数据库查询。它计算一个查询向量(当前状态)与一系列键向量(历史状态)的相关性得分(例如通过点积)。这些得分经过softmax函数处理后,形成一个注意力分布,指明了序列中哪些部分对当前预测更重要。

以下是注意力得分的简化计算方式:
attention_scores = softmax(query · key^T)

通过注意力机制,模型在预测时能够利用整个历史上下文,同时又能选择性地忽略不相关信息。例如,在理解“机器人必须遵守给它的命令”时,注意力机制可以帮助模型聚焦于“机器人”和“命令”这两个关键标记。

在实际应用中,需要确保模型不会“窥视”未来的信息,这通过使用掩码(Mask) 来实现,强制模型只能关注当前位置之前的元素。

Transformer架构完全摒弃了循环结构,仅使用前馈计算和堆叠的注意力层。其关键优势在于并行计算能力:在训练时,可以并行计算序列中所有位置的预测,这极大地提升了训练效率,使得将模型扩展到巨大规模(如GPT系列)成为可能。


自回归模型在图像生成中的应用 🖼️

自回归模型不仅可用于文本,也可用于图像。我们可以将图像视为一个像素序列(例如从左到右、从上到下),然后逐个像素地生成。

对于RGB图像,每个像素包含红、绿、蓝三个通道。我们可以按顺序(如先红、后绿、再蓝)为每个通道建模条件概率分布。这同样可以使用带有掩码的RNN或CNN架构来实现,确保在预测某个通道时,只允许使用之前像素和当前像素已生成通道的信息。

使用卷积神经网络(CNN)构建图像自回归模型时,需要通过设置卷积核的权重为0来实施掩码,确保感受野只包含“过去”的像素,这与Transformer中的因果掩码思想一致。

尽管自回归图像模型可以生成结构合理的图像完成样本,并能用于异常检测(例如区分自然图像和对抗性攻击图像),但由于需要逐个像素顺序生成,其采样速度通常较慢。


最大似然学习:理论基础 📈

现在,我们转向如何训练自回归模型。我们的目标是找到一个模型分布 ( p_{\theta} ),使其尽可能接近真实的数据分布 ( p_{data} )。

我们使用KL散度(Kullback-Leibler Divergence) 来衡量两个分布之间的差异:

D_KL(p_data || p_θ) = E_{x~p_data} [ log( p_data(x) / p_θ(x) ) ]

KL散度是非负的,且仅在两分布完全相同时为零。它有一个直观的信息论解释:它衡量了使用基于模型 ( p_{\theta} ) 的压缩方案来压缩来自真实分布 ( p_{data} ) 的数据时,所损失的平均信息量(即效率低下程度)。

我们的学习目标是最小化这个KL散度。将其展开后,我们发现最小化 ( D_KL(p_{data} || p_{\theta}) ) 等价于最大化模型在数据分布下的期望对数似然

argmin_θ D_KL(p_data || p_θ) = argmax_θ E_{x~p_data} [ log p_θ(x) ]

由于我们无法直接计算关于 ( p_{data} ) 的期望,我们使用从数据集中采样的蒙特卡洛估计来近似,即用训练集上的平均对数似然来代替期望:

E_{x~p_data} [ log p_θ(x) ] ≈ (1/N) Σ_{i=1}^{N} log p_θ(x^{(i)})

其中 ( x^{(i)} ) 是训练集中的样本。最大化这个平均对数似然,就是经典的最大似然估计(MLE)

对于自回归模型,单个数据点 ( x ) 的似然可以通过链式法则轻松计算:
p_θ(x) = Π_{j=1}^{D} p_θ(x_j | x_<j)

因此,整个数据集的对数似然就是所有数据点、所有位置上条件对数概率的总和。这实质上等同于训练一系列分类器(每个条件概率对应一个),让它们尽可能准确地预测序列中的下一个元素。


实践优化与挑战 ⚙️

在实际训练中,我们无法直接计算整个数据集的精确梯度(计算量过大)。我们再次使用蒙特卡洛思想,采用随机梯度下降(SGD)小批量(Mini-batch) 梯度下降。我们通过从数据集中随机采样一小批(Batch)数据来计算梯度的无偏估计,并以此更新模型参数。

在优化过程中,需要注意机器学习中的经典问题:

  • 过拟合(Overfitting):模型可能只是记住了训练集,而在未见数据上表现不佳。
  • 偏差-方差权衡(Bias-Variance Trade-off):模型过于简单(高偏差)可能无法捕捉数据规律;模型过于复杂(高方差)则容易过拟合。

以下是应对这些挑战的常见策略:

  • 使用验证集:留出一部分数据不参与训练,用于监控模型在未见数据上的性能,判断是否过拟合。
  • 正则化(Regularization):在损失函数中添加惩罚项(如L1/L2正则化),偏好参数更小或更简单的模型。
  • 调整模型容量:通过减少网络层数、神经元数量或增加参数共享来控制模型复杂度。

总结 🎯

本节课中我们一起学习了:

  1. 自回归模型的核心:使用链式法则将联合分布分解为一系列条件分布的乘积。
  2. RNN的局限性:存在信息瓶颈、训练慢和长程依赖问题。
  3. 注意力与Transformer的优势:通过全局上下文和选择性关注解决了RNN的瓶颈,并利用并行计算实现了高效训练与扩展。
  4. 图像上的自回归模型:将图像视为序列,可以用于生成和异常检测,但采样较慢。
  5. 最大似然学习理论:通过最小化KL散度,我们将学习目标转化为最大化数据对数似然,这等价于优化一系列条件预测分类器。
  6. 实践优化方法:使用随机梯度下降和小批量训练来高效优化参数,并需要注意过拟合和偏差-方差权衡问题。

自回归模型提供了可计算的似然和直接的采样过程,是生成模型中的一个强大工具。在接下来的课程中,我们将探讨另一类重要的模型——隐变量模型。

课程5:深度生成模型 I - 变分自编码器 (VAEs) 🧠

在本节课中,我们将要学习一种新的生成模型家族——潜在变量模型,特别是变分自编码器。我们将从简单的混合模型开始,理解其核心思想,然后逐步深入到如何利用深度神经网络构建更强大的模型,并解决其中的学习和推断难题。


概述:为什么需要潜在变量模型? 🤔

在之前的课程中,我们介绍了自回归模型。它们通过链式法则将联合概率分解为一系列条件概率的乘积,并使用神经网络来近似这些条件。这类模型易于评估似然,便于通过最大似然进行训练。

然而,自回归模型也存在一些缺点:需要预先确定变量顺序、生成速度较慢(通常需要逐个变量生成),并且难以从无监督数据中直接提取有意义的特征。

当我们试图建模复杂的数据集(例如人脸图像)时,数据中存在大量潜在的变异因素(如年龄、姿势、发色)。这些因素没有被明确标注,但直觉上它们构成了数据的“潜在结构”。潜在变量模型的核心思想就是引入一组未被观察的随机变量 Z(即潜在变量),来捕获这些隐藏的变异因素。

通过建立 X(观测数据,如图像像素)和 Z 的联合概率分布,我们期望模型能变得更灵活,并且能够从数据中推断出这些潜在变量,从而获得可用于下游任务(如分类)的特征表示。


从简单模型开始:高斯混合模型 (GMM) 🎯

上一节我们回顾了自回归模型的优缺点,本节中我们来看看最简单的潜在变量模型——高斯混合模型。它可以被视为一个“浅层”的潜在变量模型,不涉及深度神经网络。

在这个模型中,潜在变量 Z 是一个类别随机变量(例如,有 K 个类别,代表 K 个混合成分)。给定 Z 的取值,观测数据 X 的条件分布是一个高斯分布。每个类别 k 对应一个具有特定均值 μ_k 和协方差 Σ_k 的高斯分布。

生成过程如下:

  1. 从类别分布 P(Z)(如均匀分布)中采样一个混合成分 z
  2. 根据采样到的 z,从对应的高斯分布 P(X|Z=z) 中采样数据点 x

公式描述:

  • P(Z=k) = π_k (混合权重)
  • P(X|Z=k) = N(X; μ_k, Σ_k) (第 k 个高斯成分)
  • P(X) = Σ_{k=1}^{K} π_k * N(X; μ_k, Σ_k) (边际分布,即观测数据的分布)

尽管每个混合成分(P(X|Z))只是一个简单的高斯分布,但它们的混合(边际分布 P(X))可以形成非常复杂、多模态的概率密度形状。这展示了潜在变量模型的核心优势:用简单的条件分布组合出灵活的边际分布

GMM 也可以用于聚类。在拟合模型后,对于一个新数据点 x,我们可以计算其后验概率 P(Z=k|X=x),来判断它最可能属于哪个簇。

然而,GMM 的表示能力有限。对于像图像这样的复杂数据,除非混合成分数量 K 极大,否则很难很好地拟合数据分布。


迈向深度:变分自编码器 (VAE) 的直觉 🏗️

上一节我们介绍了浅层的混合模型,本节中我们来看看如何用深度神经网络构建更强大的潜在变量模型,即变分自编码器。

在 VAE 中,我们依然保持 Z -> X 的生成结构。但关键变化在于:

  1. Z 通常是连续的多维变量,例如从一个简单的先验分布(如标准高斯分布 N(0, I))中采样。
  2. 条件分布 P_θ(X|Z) 的参数(例如高斯分布的均值 μ 和方差 σ^2)不再是一个查找表,而是由神经网络(生成网络)根据 Z 计算得出。这个神经网络可以是非常复杂的非线性函数。

生成过程如下:

  1. 从先验分布 P(Z)(如 N(0, I))中采样一个潜在向量 z
  2. z 输入生成网络,得到条件分布 P_θ(X|Z=z) 的参数(例如 μ_θ(z)σ_θ(z))。
  3. 从该分布中采样,生成数据 x

公式描述:

  • P(Z) = N(Z; 0, I) (先验分布)
  • P_θ(X|Z) = N(X; μ_θ(Z), σ_θ(Z)²) (由神经网络参数化的似然)
  • P_θ(X) = ∫ P_θ(X|Z) P(Z) dZ (边际分布,需要对所有 Z 积分)

这可以理解为一种 “无限混合模型”:先验分布 P(Z) 定义了无限多个混合成分(每个 z 值对应一个成分),而神经网络决定了每个成分对应的简单分布(如高斯)的参数。尽管每个成分很简单,但无限多个简单分布的混合可以产生极其复杂的边际分布。

VAE 的目标依然是最大化观测数据的对数似然(边际似然)。但问题在于,计算或估计这个边际似然 log P_θ(X) 非常困难,因为它涉及对潜在变量 Z 的积分(或求和),这在计算上是难以处理的。


核心挑战:如何学习与推断? 🧩

上一节我们建立了 VAE 的生成模型,本节中我们来看看训练这个模型面临的核心挑战以及解决思路。

我们的目标是最大化训练数据的平均对数边际似然:
目标:max_θ (1/M) Σ_{i=1}^{M} log P_θ(x_i)

困难在于,对于单个数据点 x,其对数边际似然 log P_θ(x) = log ∫ P_θ(x, z) dz 难以直接计算。

一种天真的尝试:均匀采样蒙特卡洛估计
我们可以将积分写成期望形式:P_θ(x) = ∫ P_θ(x, z) dz = |Z| * E_{z~Uniform(Z)}[P_θ(x, z)]
然后通过从均匀分布中采样 z 来用样本均值近似期望。但这种方法方差极高,因为绝大多数随机采样的 z 与当前 x 不匹配,导致 P_θ(x, z) 的值极小,估计效率低下。

更好的方法:重要性采样
我们引入一个提议分布 q(z)(可以依赖于 x),并重写边际似然:
P_θ(x) = ∫ [P_θ(x, z) / q(z)] q(z) dz = E_{z~q(z)}[P_θ(x, z) / q(z)]
现在我们可以从 q(z) 中采样来估计期望。关键在于选择一个好的 q(z),使其能将概率质量集中在那些与 x 兼容的、P_θ(x, z) 值较大的 z 区域。

然而,我们最终需要优化的是 log P_θ(x),而不是 P_θ(x)。对重要性采样估计量直接取对数会引入偏差(因为 log E[·] ≠ E[log ·])。

解决方案:证据下界 (ELBO)
利用 Jensen 不等式,我们可以得到对数边际似然的一个下界:
log P_θ(x) = log E_{z~q(z)}[P_θ(x, z) / q(z)] ≥ E_{z~q(z)}[log (P_θ(x, z) / q(z))]
右边这个量被称为 证据下界。我们可以通过从 q(z) 中采样来估计并优化这个下界。

这个下界可以进一步分解为两项:
ELBO(θ, q; x) = E_{z~q(z)}[log P_θ(x|z)] - D_KL(q(z) || P(z))

  • 第一项是 重构项:期望在 q(z) 下,由 z 生成 x 的对数似然。它鼓励模型能够很好地从潜在变量重建数据。
  • 第二项是 KL 散度项:衡量提议分布 q(z) 与先验分布 P(z) 的差异。它鼓励 q(z) 不要偏离先验太远,起到正则化作用。

关键洞察:

  • 对于任意 q(z),ELBO 都是 log P_θ(x) 的一个下界。
  • q(z) 恰好等于真实后验分布 P_θ(z|x) 时,这个下界是紧的,即 ELBO = log P_θ(x)
  • 因此,训练 VAE 的策略就变成了:同时优化生成模型参数 θ 和推断模型(即提议分布)参数 φ,以最大化 ELBO。推断模型 q_φ(z|x) 通常也用另一个神经网络(编码器)来参数化,它接收 x 并输出 q_φ(z|x) 的参数(例如高斯分布的均值和方差)。

总结 🎓

本节课中我们一起学习了潜在变量模型,特别是变分自编码器。

  1. 动机:为了建模复杂数据中的隐藏结构,并学习有意义的特征表示,我们引入了潜在变量 Z
  2. 从简单到复杂:我们从高斯混合模型入手,理解了用简单条件分布混合得到复杂边际分布的思想。
  3. VAE 框架:在 VAE 中,我们使用深度神经网络(生成器)将连续潜在变量 Z 映射到观测数据 X 的条件分布参数。
  4. 学习挑战:直接最大化数据的边际似然难以处理,因为涉及对 Z 的积分。
  5. 解决方案:我们引入了证据下界作为边际似然的一个可优化的替代目标。ELBO 包含重构项和正则化项。
  6. 推断与学习:VAE 通过另一个神经网络(编码器)来近似潜在变量的后验分布 q_φ(z|x),并联合优化编码器和解码器(生成器)的参数以最大化 ELBO。

VAE 为我们提供了一种原则性的方法,能够同时学习一个生成模型和一个将数据映射到潜在空间的推断模型,是无监督学习和表示学习中的一个强大工具。

课程 P6:变分自编码器 (VAEs) 核心原理与训练 🧠

在本节课中,我们将学习变分自编码器的完整模型。我们将再次讨论证据下界,并了解如何解决相应的优化问题。最后,我们将解释为何该模型被称为“变分自编码器”,并展示其与自编码器的联系及如何将其推广为生成模型。

模型回顾与核心思想

上一节我们介绍了生成模型的基本概念。本节中,我们来看看变分自编码器的具体形式。

变分自编码器是一种生成模型,通常简称为 VAE。其最简单的形式如下:首先,从一个简单的潜在变量 z 中采样,例如从一个均值为零、协方差矩阵为单位矩阵的多元正态分布中采样。这可以看作是最简单的先验分布。

然后,将采样得到的 z 通过两个神经网络:μ_θσ_θ。这两个网络输出另一个高斯分布的参数(均值向量和协方差矩阵),这些参数依赖于 z。最后,从这个条件分布 P(x|z) 中生成数据点 x

这种模型的好处在于,尽管构建模块简单(简单的高斯先验和条件分布),但得到的 x 的边缘分布 P(x) 可以非常灵活和通用。因为它可以被视为一个无限大的高斯混合模型,每个 z 对应一个高斯分量。为了计算生成某个数据点的概率,我们需要对所有可能的 z 值进行积分。

核心公式
先验分布:z ~ p(z) = N(0, I)
生成过程:x|z ~ p_θ(x|z) = N(μ_θ(z), σ_θ(z))
目标:最大化数据的边际似然 p_θ(x) = ∫ p_θ(x|z) p(z) dz

然而,其代价是模型训练困难,因为评估边际似然 p(x) 的计算成本很高,这导致无法直接通过最大似然估计来优化参数。

变分推断与证据下界 (ELBO)

由于直接优化边际似然不可行,我们需要借助变分推断技术。其核心思想是引入一个由参数 φ 控制的辅助分布 q_φ(z|x),来近似真实但难以计算的后验分布 p_θ(z|x)

我们可以利用 Jensen 不等式,为对数边际似然构建一个下界,即证据下界。

核心公式
log p_θ(x) >= ELBO(θ, φ; x) = E_{z~q_φ(z|x)}[log p_θ(x, z) - log q_φ(z|x)]

这个下界可以进一步分解为两项:

  1. 重构项:E_{z~q_φ(z|x)}[log p_θ(x|z)],衡量模型根据推断出的 z 重构 x 的能力。
  2. 正则化项:-D_KL(q_φ(z|x) || p(z)),衡量近似后验 q_φ(z|x) 与先验 p(z) 之间的 KL 散度,促使 q 的分布不要偏离先验太远。

q_φ(z|x) 等于真实后验 p_θ(z|x) 时,这个下界是紧的,即等于对数边际似然。但真实后验通常无法计算,因此我们的目标是优化 q_φ 使其尽可能接近真实后验,从而最大化 ELBO。

训练 VAE:优化 ELBO

我们的目标是最大化整个数据集的平均对数似然。通过对每个数据点的 ELBO 求和,我们可以得到数据集对数似然的一个下界。

优化目标
max_{θ, φ} Σ_{x_i in D} ELBO(θ, φ; x_i)

这涉及到同时优化生成模型参数 θ(解码器)和推断模型参数 φ(编码器)。优化过程通常使用随机梯度上升。

关于 θ 的梯度计算相对直接,因为期望内部的项不依赖于 θ 的采样过程。困难在于计算关于 φ 的梯度,因为期望是基于依赖于 φ 的分布 q_φ 计算的。

重参数化技巧

为了解决关于 φ 的梯度问题,我们使用重参数化技巧。这个技巧要求潜在变量 z 是连续的(例如高斯分布)。

其核心思想是将从 q_φ(z|x) 中采样 z 的过程,重写为一个确定性变换:首先从一个固定的简单分布(如标准正态分布)中采样噪声 ε,然后通过一个依赖于 φ 的确定性函数 g_φ 得到 z

核心公式(以高斯为例)
原始采样:z ~ q_φ(z|x) = N(μ_φ(x), σ_φ(x)^2)
重参数化:z = μ_φ(x) + σ_φ(x) · ε,其中 ε ~ N(0, I)

通过这种变换,关于 φ 的梯度就可以通过蒙特卡洛采样和链式法则进行计算,因为梯度路径现在是确定且可微的。

梯度估计
∇_φ E_{z~q_φ}[f(z)] ≈ (1/L) Σ_{l=1}^L ∇_φ f(μ_φ(x) + σ_φ(x) · ε^{(l)}),其中 ε^{(l)} ~ N(0, I)

摊销推断与编码器

理论上,每个数据点 x_i 都应有自己独立的变分参数 φ_i 来获得最紧的下界,但这在大数据集上不可扩展。

因此,我们引入摊销推断:使用一个共享的神经网络(编码器)来为所有数据点预测变分参数。这个编码器以 x 为输入,输出近似后验 q_φ(z|x) 的参数(例如高斯分布的均值和方差)。

编码器-解码器结构

  • 编码器 (推断网络)q_φ(z|x),将数据 x 映射到潜在空间分布参数。
  • 解码器 (生成网络)p_θ(x|z),将潜在变量 z 映射回数据空间。

这样,我们只需要同时优化编码器参数 φ 和解码器参数 θ,大大提高了计算效率。虽然这可能会损失一些灵活性(因为所有数据点共享同一个编码器),但通过编码器的泛化能力,模型在新数据上也能进行有效推断。

自编码器视角与总结

本节课中我们一起学习了变分自编码器的核心原理和训练方法。

从结构上看,VAE 很像一个自编码器:编码器将数据压缩到潜在空间,解码器从潜在表示重建数据。然而,VAE 的关键区别在于:

  1. 编码器输出的是潜在空间的分布参数,而非固定的点。
  2. 训练目标不是最小化重建误差,而是最大化 ELBO,它同时包含了重建精度潜在空间正则化(KL 散度项)。

因此,VAE 是一个概率生成模型,其潜在空间具有良好结构(接近先验分布),允许我们通过从先验 p(z) 中采样并经过解码器来生成新的数据样本。

总结来说,VAE 通过变分推断和重参数化技巧,巧妙地解决了含复杂潜在变量生成模型的训练难题,将推断和学习过程统一在一个端到端的神经网络框架内,同时实现了数据生成和潜在表示学习。

课程 P7:斯坦福 CS236 深度生成模型 I 2023 - 第七讲:从 VAE 到流模型 🧠

在本节课中,我们将完成对变分自编码器的讨论,并开始介绍一种新的生成模型——流模型。我们将探讨它们的基本原理、训练目标以及与 VAE 的区别。


概述:从 VAE 到流模型

上一节我们介绍了变分自编码器的基本框架和训练目标。本节中,我们将深入理解 VAE 为何被称为“自编码器”,并开始探讨流模型如何通过可逆变换来解决 VAE 中难以处理的边际概率计算问题。


VAE 的自编码器视角

我们已经知道,VAE 的训练目标是最大化证据下界。这个目标函数可以重新表述,以揭示其自编码器的本质。

损失函数的分解

VAE 的损失函数可以分解为两部分:重构损失和正则化项。具体公式如下:

ELBO = E_{z~q(z|x)}[log p(x|z)] - KL(q(z|x) || p(z))

以下是该损失函数中各项的含义:

  • 第一项 E_{z~q(z|x)}[log p(x|z)]:这是重构损失。它鼓励编码器 q(z|x) 产生的潜在变量 z 能够通过解码器 p(x|z) 很好地重建原始输入 x。如果 p(x|z) 是高斯分布,此项近似于输入与重建输出之间的 L2 损失。
  • 第二项 KL(q(z|x) || p(z)):这是正则化项,即 KL 散度。它鼓励编码器输出的潜在变量分布 q(z|x) 接近我们预设的简单先验分布 p(z)(通常是标准高斯分布)。

训练与采样过程

在训练阶段,对于一个数据点 x_i

  1. 编码器 q(z|x_i) 输出变分参数(如均值和方差)。
  2. 从该分布中采样一个潜在变量 z
  3. 解码器 p(x|z) 尝试重建 x_i,计算重构损失。
  4. 同时,计算 q(z|x_i) 与先验 p(z) 之间的 KL 散度作为正则化。

在生成(采样)阶段,我们不再需要编码器:

  1. 直接从简单先验分布 p(z)(如标准高斯)中采样一个 z
  2. z 输入解码器 p(x|z),生成新的数据样本 x

KL 散度正则化项的关键作用在于,它确保了训练时编码器看到的 z 的分布与生成时我们从先验采样的 z 的分布是相似的,从而使生成过程成为可能。


流模型的基本动机

VAE 虽然提供了潜在表示,但其边际似然 p(x) = ∫ p(x|z)p(z) dz 难以直接计算,导致训练需要使用变分推断和近似下界。流模型旨在解决这个问题。

核心思想

流模型也是一种潜在变量模型,但其结构特殊。它要求从潜在变量 z 到观测数据 x 的映射函数 f确定且可逆的。这意味着:

  • 可逆性:对于每个 x,都存在唯一的一个 z 使得 x = f(z)。我们可以通过逆映射 z = f^{-1}(x) 轻松找到它。
  • 维度一致:为了保证可逆性,zx 必须具有相同的维度,因此流模型通常不进行维度压缩。

变量变换公式

流模型的理论基础是概率论中的变量变换公式。对于一个已知分布的随机变量 z(其概率密度函数为 p_z(z)),通过一个可逆变换 x = f(z) 得到新的随机变量 x。那么 x 的概率密度 p_x(x) 为:

p_x(x) = p_z(z) * |det(J_{f^{-1}}(x))| = p_z(f^{-1}(x)) * |det(J_{f^{-1}}(x))|

其中,J_{f^{-1}}(x) 是逆变换 f^{-1} 在点 x 处的雅可比矩阵。|det(·)| 表示雅可比矩阵行列式的绝对值,它衡量了变换 fx 点处引起的局部体积缩放比例。

等价地,也可以用正向变换的雅可比矩阵表示:

p_x(x) = p_z(f^{-1}(x)) * |det(J_f(z))|^{-1}

流模型的优势

通过这种设计,流模型实现了:

  1. 精确的似然计算:我们可以直接计算任何数据点 x 的精确对数似然 log p(x),而不需要像 VAE 那样求积分或用下界近似。
  2. 直接的最大似然训练:模型可以通过直接最大化 log p(x) 来训练,训练目标更简洁。
  3. 易于采样:生成样本时,从简单先验 p_z(z) 采样 z,然后通过正向映射 x = f(z) 即可得到 x

总结

本节课中我们一起学习了:

  1. VAE 的自编码器本质:其损失函数由重构损失和 KL 散度正则化项构成,前者鼓励重建输入,后者鼓励潜在分布匹配简单先验,从而使得模型既能重建也能生成。
  2. 流模型的动机:为了克服 VAE 中边际似然难以计算的困难,流模型引入了确定的可逆变换,使得数据的似然可以精确计算,并支持直接的最大似然训练。
  3. 流模型的核心:基于变量变换公式,通过可逆函数将简单分布(如高斯分布)“流动”成复杂的数据分布。其关键是需要计算变换的雅可比矩阵行列式。

下一讲,我们将深入探讨如何具体设计这些可逆的变换函数,以及如何高效地计算雅可比行列式,从而构建出实用的流模型。

课程 P8:正则化流模型详解 🧠

在本节课中,我们将要学习一种称为“正则化流”的生成模型。与变分自编码器类似,它也是一种潜在变量模型,但关键区别在于,它允许我们精确地计算数据的似然度,而无需依赖变分推断的近似方法。我们将探讨其核心思想、如何构建可逆的变换,以及如何高效地训练这类模型。


核心概念与动机

上一节我们介绍了构建能够精确评估似然度的潜在变量模型的想法。本节中我们来看看正则化流的具体实现。

正则化流模型包含两个变量集:观测变量 x 和潜在变量 z。与变分自编码器不同,这两个变量之间的关系是确定性的且可逆的。我们通过一个可逆变换 f_θz 得到 x,反之亦然。

由于映射是可逆的,我们可以使用变量变换公式来精确计算观测数据 x 的概率密度:

p_θ(x) = p_z(f_θ^{-1}(x)) * |det J_{f_θ^{-1}}(x)|

其中:

  • p_z(·) 是潜在变量 z 的先验分布(例如高斯分布)。
  • f_θ^{-1} 是从 xz 的逆映射。
  • |det J_{f_θ^{-1}}(x)| 是逆映射的雅可比矩阵的行列式的绝对值,它衡量了变换对局部空间的“拉伸”或“压缩”程度。

这种方法的优势在于可以精确计算似然度,但一个限制是 xz 必须有相同的维度,因此无法像 VAE 那样得到低维的压缩表示。


构建流模型:组合简单层

我们如何将上述数学思想转化为实用的模型呢?想法是组合多个相对简单的、可逆的层,来构建一个灵活的映射。

我们从一个简单的先验分布(如高斯分布)中采样得到 z_0,然后顺序应用一系列可逆变换层 f_θ1, f_θ2, ..., f_θm,最终得到观测数据 x

x = f_θm ◦ ... ◦ f_θ2 ◦ f_θ1 (z_0)

只要每一层都是可逆的,整个组合映射也是可逆的。整个变换的雅可比行列式也可以分解为各层雅可比行列式的乘积,这使得计算成为可能。

因此,构建流模型的核心挑战是:设计神经网络层,使其满足:

  1. 可逆性:可以高效地进行正向和逆向计算。
  2. 高效雅可比行列式计算:雅可比矩阵需要有特殊结构(如下三角矩阵),以便能在线性时间内计算其行列式。

具体的流层设计

以下是几种实现可逆变换层的经典方法。

加性耦合层 (NICE)

这是一种简单而有效的设计。其核心思想是将输入向量 z 分成两部分 z_{1:d}z_{d+1:n}

前向变换定义为:

  • x_{1:d} = z_{1:d} (前一部分直接复制)
  • x_{d+1:n} = z_{d+1:n} + m_θ(z_{1:d}) (后一部分加上一个由前一部分计算出的偏移量)

其中 m_θ 是一个任意的神经网络(如 MLP),输入是 z_{1:d},输出是维度为 n-d 的偏移向量。

逆向变换非常容易:

  • z_{1:d} = x_{1:d}
  • z_{d+1:n} = x_{d+1:n} - m_θ(x_{1:d})

这种设计的雅可比矩阵是下三角矩阵,且对角线元素全为 1,因此其行列式恒为 1。这意味着该变换是体积保持的。虽然简单,但堆叠足够多的此类层可以产生相当复杂的分布。

仿射耦合层 (RealNVP)

这是对加性耦合层的增强,不仅进行平移,还进行缩放。

前向变换定义为:

  • x_{1:d} = z_{1:d}
  • x_{d+1:n} = z_{d+1:n} ⊙ exp(α_θ(z_{1:d})) + μ_θ(z_{1:d})

其中 表示逐元素乘法。μ_θα_θ 是两个任意的神经网络,分别计算偏移量和缩放量的对数(使用指数保证缩放因子为正)。

逆向变换为:

  • z_{1:d} = x_{1:d}
  • z_{d+1:n} = (x_{d+1:n} - μ_θ(x_{1:d})) ⊙ exp(-α_θ(x_{1:d}))

其雅可比矩阵同样是下三角矩阵,行列式是缩放因子 exp(α_θ(z_{1:d})) 所有元素的乘积。这不再是体积保持的,因此建模能力更强。


自回归模型作为流模型

有趣的是,连续型的自回归模型可以看作是一种特殊的流模型。

考虑一个自回归模型,其中每个条件分布 p(x_i | x_{<i}) 是高斯分布,其均值和方差由神经网络根据 x_{<i} 计算得出。从这个模型采样可以重新表述为:

x_i = μ_θ(x_{<i}) + σ_θ(x_{<i}) ⊙ z_i

其中 z_i 来自标准高斯分布。这可以视为将一个简单的噪声向量 z 通过一系列依赖于先前输出的变换,映射为数据 x

  • 前向评估(似然计算):给定 x,可以并行计算所有 μ_θσ_θ,然后反向计算出所有 z_i,从而高效计算似然度。
  • 逆向采样:采样时必须按顺序进行 i=1, 2, ..., n,因为计算 x_i 需要知道 x_{<i},因此采样较慢。

这种视角引出了两种对偶的流模型:

  • 自回归流 (MAF):对应上述自回归模型,似然计算快,采样慢
  • 逆自回归流 (IAF):如果将上述计算图完全反转(即让偏移和缩放量依赖于 z 而非 x),则得到 IAF。此时采样快(可并行生成所有 x_i),但似然计算慢(需要顺序计算 z_i)。

这种对偶性可以被巧妙利用。例如,可以先训练一个采样慢但精度高的 MAF 作为“教师模型”,然后训练一个采样快的 IAF “学生模型”去匹配教师模型生成的样本分布,从而实现高质量且快速的生成。


训练与应用

训练正则化流模型非常直接,因为我们能精确计算似然度。我们只需最大化训练数据的对数似然:

θ = argmax_θ Σ_{x∈D} log p_θ(x)*

通过反向传播优化该目标即可。

模型训练好后:

  • 生成样本:从先验分布采样 z,然后通过正向映射 f_θ 得到 x
  • 推断潜在变量:对于任何数据点 x,通过逆映射 f_θ^{-1} 即可得到对应的 z。虽然 zx 同维,但它在流形上通常具有有意义的连续结构,可以进行插值等操作。

总结

本节课中我们一起学习了正则化流模型。它是一种通过堆叠可逆变换层,将简单先验分布(如高斯分布)转换为复杂数据分布的生成模型。其核心优势在于能够精确计算似然度,从而支持直接的最大似然训练。

我们探讨了构建可逆层的关键技术,如耦合层,并理解了如何通过设计使雅可比行列式能被高效计算。我们还发现了自回归模型与流模型之间的深刻联系,以及如何利用这种联系(如 MAF 和 IAF 的对偶性)来权衡计算效率。

尽管流模型要求数据维度与潜在维度相同,但它提供了似然计算的精确性和潜在空间的可解释性,是生成模型工具箱中一个强大而独特的工具。

斯坦福CS236深度生成模型课程 P9:生成对抗网络 (GANs) 🎭

在本节课中,我们将学习一种全新的生成模型——生成对抗网络。我们将探讨其核心思想、工作原理、训练目标以及在实际应用中的挑战。

概述

回顾之前的课程,我们构建生成模型的基本思路是:从数据分布 p_data 中获取独立样本,定义一个由神经网络参数化的模型分布族 p_θ,然后通过优化某种相似性度量(如KL散度)来寻找最接近数据分布的模型分布。我们已经学习了自回归模型、变分自编码器和正则化流模型,它们都致力于建模数据点的概率,从而可以进行最大似然训练。

然而,最大化似然度并不总是与生成高质量样本的目标完全一致。本节课,我们将改变比较概率分布的方式,引入一种不依赖于似然度的新方法——生成对抗网络。

从最大似然到新目标

最大似然的优势与局限

最大似然训练是一种原则性强的方法。如果我们能根据模型评估数据点的概率 p_θ(x_i),就可以通过最大化训练集的平均对数概率来选择参数:
θ* = argmax_θ (1/N) Σ_i log p_θ(x_i)
这等价于最小化数据分布与模型分布之间的KL散度。在理想条件下,这是最有效利用数据的方式。

然而,高似然度并不总是对应高质量的生成样本。反之,高质量的样本也可能来自似然度很差的模型。

示例1:高似然度,差样本
考虑一个混合模型:以99%的概率生成纯噪声,以1%的概率从真实数据分布 p_data 中采样。对于数据点 x,其模型概率为:
p_θ(x) = 0.99 * p_noise(x) + 0.01 * p_data(x)
其对数概率至少为 log p_data(x) - log(100)。在高维空间中,该模型能达到接近最优的似然度,但99%的时间都在生成垃圾样本。

示例2:好样本,差似然度
过拟合训练集:构建一个模型,将所有概率质量均匀分配给训练样本。从这个模型采样会得到完美的训练样本,但会给任何未见过的数据点分配零概率,导致测试似然度极差。

这表明,样本质量与似然度可以解耦,这为我们探索基于不同比较方法的训练目标提供了动机。

两样本测试:比较分布的新思路

生成对抗网络的核心思想是改变性能度量方式。我们不再使用KL散度,而是尝试其他比较两个概率分布 PQ 的方法。

一个直观的想法是:如果我们有两组样本,一组来自 P,一组来自 Q,我们能否判断它们是否来自同一分布?这就是两样本测试问题。

  • 零假设 H0: P = Q(样本来自同一分布)。
  • 备择假设 H1: P ≠ Q(样本来自不同分布)。

传统的两样本测试需要手工设计检验统计量(如比较样本均值、方差)。但手工设计很难捕捉高维数据中所有的分布差异特征。

判别器:学习差异的神经网络

与其手工设计统计量,不如学习一个分类器(称为判别器)来自动识别两组样本的差异。

设置如下:

  • 一组真实样本:来自数据分布 p_data(标记为1)。
  • 一组生成样本:来自当前模型分布 p_θ(标记为0)。

我们训练一个判别器 D_φ(通常是一个神经网络),其目标是准确区分这两组样本。这通过最小化标准的二分类交叉熵损失来实现:
L(φ) = -E_{x~p_data}[log D_φ(x)] - E_{x~p_θ}[log(1 - D_φ(x))]
判别器试图最大化这个目标(即最小化损失),以最好地区分真假样本。

如果判别器很难区分两组样本(即损失很高),则说明两组样本相似,分布 p_θ 接近 p_data。反之,如果判别器能轻松区分(损失很低),则说明分布差异较大。

生成对抗网络:最小最大博弈

现在,我们引入生成器 G_θ。它从一个简单的先验分布(如高斯分布)中采样噪声 z,并通过一个神经网络将其映射为样本 x = G_θ(z)。关键的是,对这个神经网络没有任何限制(如可逆性),因为它只用于采样,不用于计算似然度。

训练过程是一个两人博弈

  • 判别器 D_φ:试图最大化上述目标,更好地区分真假样本。
  • 生成器 G_θ:试图最小化上述目标,即生成能“欺骗”判别器的样本,使其难以区分。

这形成了一个最小最大优化问题
min_θ max_φ V(θ, φ) = E_{x~p_data}[log D_φ(x)] + E_{z~p(z)}[log(1 - D_φ(G_θ(z)))]

理论最优解

可以证明,对于固定的生成器 G_θ,最优判别器为:
D*(x) = p_data(x) / (p_data(x) + p_θ(x))
将其代入目标函数 V,经过推导,生成器的优化目标等价于最小化数据分布 p_data 与模型分布 p_θ 之间的 Jensen-Shannon散度 (JSD)
JSD(p_data || p_θ) = 1/2 KL(p_data || M) + 1/2 KL(p_θ || M)
其中 M = (p_data + p_θ)/2

JSD是对称的、非负的,且当且仅当 p_data = p_θ 时取得全局最小值0。因此,在理想情况下,GAN的博弈均衡点对应于生成器完美复现数据分布。

训练过程与实践挑战

训练算法

在实际训练中,我们交替优化判别器和生成器:

  1. 训练判别器:从真实数据和小批量噪声 {z_i} 中采样,通过生成器得到假样本 {G_θ(z_i)}。固定生成器参数 θ,对判别器参数 φ 执行梯度上升,以最大化 V
  2. 训练生成器:固定判别器参数 φ,对生成器参数 θ 执行梯度下降,以最小化 V。注意,第一项与 θ 无关,梯度仅通过第二项(假样本)传递。

以下是核心训练循环的简化代码表示:

for epoch in range(num_epochs):
    # 1. 更新判别器
    real_data = sample_from_p_data(batch_size)
    noise = sample_from_p_z(batch_size)
    fake_data = generator(noise)
    d_loss = - (log(discriminator(real_data)) + log(1 - discriminator(fake_data))).mean()
    d_loss.backward()
    optimizer_D.step()

    # 2. 更新生成器
    noise = sample_from_p_z(batch_size)
    fake_data = generator(noise)
    g_loss = - log(discriminator(fake_data)).mean()  # 或使用 log(1 - D(G(z))) 的变体
    g_loss.backward()
    optimizer_G.step()

主要挑战

尽管GAN思想强大,但训练非常困难且不稳定:

  1. 优化不稳定:最小最大博弈本质上是非凸的,容易导致训练振荡,难以收敛。损失值波动大,缺乏可靠的停止准则(不像似然度可以监控)。
  2. 模式坍缩:生成器可能只学会生成少数几种“成功”骗过判别器的样本,而忽略数据分布中的其他模式(多样性不足)。这与最大似然训练(会因忽略某个模式而受到巨大惩罚)形成对比。
  3. 评估困难:缺乏像似然度这样的内在评估指标,通常需要人工检查生成样本质量。

由于这些挑战,训练GAN需要大量技巧(如特定的网络架构、正则化方法、损失函数设计等)。这也是近年来扩散模型等更稳定方法兴起的原因之一。然而,GAN的核心理念——通过对抗性训练来学习分布——仍然极具影响力,并被融合到其他先进模型中。

总结

本节课我们一起学习了生成对抗网络。我们从最大似然训练的局限性出发,引入了通过两样本测试来比较分布的新视角。通过使用一个可学习的判别器来自动发现分布间的差异,并构建生成器与之进行对抗性博弈,我们得到了一个灵活且强大的生成模型框架。尽管GAN在理论上优雅,并在图像生成等领域取得了显著成果,但其训练过程的不稳定性和实践难度也是不容忽视的挑战。理解GAN的原理为我们探索更鲁棒、更高效的生成模型奠定了重要基础。

posted @ 2026-02-05 08:54  绝不原创的飞龙  阅读(4)  评论(0)    收藏  举报