Deep Generative Models¶
约 4094 个字 12 张图片 预计阅读时间 14 分钟
Abstract
生成式模型被广泛应用于视频图像生成、文本生成、语音生成等领域,我在25年初(寒假)开始进行这部分的学习,主要参考的是Stanford CS236 课程和MIT 6.S987 课程的讲义,还有我哥的笔记,Lilian Weng的博客、Yang Song的博客
进行这部分学习的初衷是在侯老师的实验室,我在秦睿师兄的指导下开展关于分子生成工作的评测,由于不想局限于使用现有模型而是能更深入的理解模型的工作原理,因此开始进行这部分的学习。
- VAE
- Autoregressive Models
- Normalizing Flows
- Ganerative Adversarial Networks
- Energy-based Models
- Score-based Models
在Diffusion和FlowMatching的学习中,我结合了MIT的6.S184课程,这门课提供了视频讲解+详细笔记+代码作业(赞👍,更重要的是他从Application角度进行了部分授课,包括热门的AIGC以及我将来想尝试的Protein Design!(这两部分我可能会多一些代码的学习尝试🤪
同时Stanford CS236还有一节课专门讲了Evaluating Generative Models,这是我认为在GenAI发展如此迅速的时代一件最有意义的一件事(之一):
how to evaluate your model?
Intro¶
我们说生成式模型(Generative Model),与之相对的是判别式模型(Discriminative Model):
-
Discriminative:
sample
label只有一个期望输出
-
Generative:
label
sample有多个期望输出
x and y
- 在chatbot中,
是prompt, 是response - 在蛋白质生成中,
是性质/约束, 是蛋白质结构
并且利用贝叶斯公式我们可以由生成式模型的概率得到判别式:
但是反之并不能很好的成立:

因为我们需要知道数据sample的分布,但是只有生成式概率
总结
生成式模型就是要去寻找数据的潜在分布
Probabilistic Modeling¶
前文中我们提到了一系列概率
Hint
怎么理解这句话呢,我的理解就是我们在学习时,其实就是在学习一种概率分布,对观测的数据进行建模,所以其实得到的分布函数就是我们的模型。
这样说有点抽象,试着举个例子:
我们以生成式模型为例,采用概率建模的方法:
Image Generation
- 我们的目标是通过给定的一些图像,生成一个新的图像
- 在通过一系列的方法,得到一个估计(estimated)的分布,这个分布的评估是通过损失函数
来进行的
- 此时我们依照给定特征
,生成一个图像 ,这个 就遵从我们得到的分布
Notes
- Generative models involve statistical models which are often designed and derived by humans.
- Probabilistic modeling is not just work of neural nets.
- Probabilistic modeling is a popular way, but not the only way.
"Deep" Generative Models¶
深度学习是一种表征学习,也就是说我们学习的是如何将数据
在深度生成模型的学习中,我们学习的是如何表征概率分布

这里我们学习得到一个简单分布到复杂分布的映射,这个映射就是我们的模型。
像这样:

随后最小化基于数据的损失函数
总结
一个DGM可能包括:
- Formulation:
- formulate a problem as a probabilistic modeling (进行概率建模)
- decompose a complex distribution into simpler and tractable ones (将复杂分布分解)
- Representation:deep neural networks to represent data and their distributions (使用深度神经网络表示数据和他们的分布)
- Objective function:evaluate the predicted distribution
- Optimization:optimize the networks and/or the decomposition
- Inference:
- sampler
- probability density estimator
- ...
Latent Variable Models¶
在这里我觉得需要提前说明的是,在深度生成模型中,我们经常使用隐变量(Latent Variables)
例如这样一组图片:

由于性别、年龄、肤色等等因素,图像
Latent Variable
这时我们的想法就是用隐变量
很直观的想法是用 Bayes 网络来表达:

但是这其中的条件概率分布是很难得到的,因此我们使用神经网络来近似这个条件概率分布:

这时我们通常假设
通过神经网络的处理,我们可以得到

我们希望在训练结束后,
使用
- 用潜变量可以简化问题
- 得到的潜变量本身就具有他的意义(不用在生成,用在推断或寻找特征)
Measure Distribution¶
在得到生成分布后,我们需要评估这个分布的优劣,这里对几个常用的评估方法进行介绍。
Divergence¶
给定两个概率分布
- KL
KL 散度(Kullback-Leibler divergence): 对于给定的两个分布
离散的:
连续的:
可以看到KL散度是
-
非负性:
-
KL散度越小,两个分布越相似。
-
KL散度不具有对称性,即
在对
可以推导KL散度最小值等价于最大化 期望对数似然(Maximum Log-Likelihood Estimation):(用离散的KL公式,打开
缺陷
- 由于我们忽略了
的期望项,所以最终我们只能得到一个参数 的取值的估计,但是不能知道how close the model is to the true distribution。 - In practice, we can't compute the true distribution
对于第二个问题,我们为了避免涉及到
期望对数似然是对所有数据点的对数似然求期望,而经验对数似然是对所有数据点的对数似然求平均。
这样我们就得到了所需要的最大似然估计。
对于数据的最大化似然:(联合概率似然)
- Fisher
Evaluating Generative Models¶
Key
总的来说我们有以下几个任务:
Summary
- Density Estimation
- Compression
- Sampling/Generation
- Latent representation learning
- Composition tasks
Density Estimation or Compression¶
对likelihood进行建模,就是将数据分割为train、val、test,用train进行训练的到
这里就引入了熵的概念,也是为什么我们有压缩即评估的说法
在压缩中,我们希望出现频率越高的数据,压缩后的长度越短,而出现频率越低的数据,压缩后的长度越长,我们在测试集上评估压缩后的平均长度,这个平均码长正是上文中期望的值(内部是负对数),这个值越小,说明模型越好。
一个例子就是对语言模型来说:
Note
这里我的理解是,Compression对于模型来说,就是学习pattern,得到pattern后的模型,可以抛弃给定数据下pattern的输出,直接输出pattern,这样就去除了redundancy。
但问题是对于很多模型,我们是没有tractable likelihood输出的,例如GAN,VAE,EBMs,那我们怎么估计likelihood如果我们只有samples?
总的来说:
Unbiased estimation of
所以我们要采用一些近似的方法,例如:
Kernel Density Estimation
给定一个Sample样本集合
其中
-
K 需要满足以下两条性质:
- 归一化:
- 对称性:
- 归一化:
-
Bandwidth parameter
需要选择一个合适的值(black),如果 太小,则估计的密度函数会过于尖锐(red),如果 太大(green),则估计的密度函数会过于平滑。

总的来说核密度估计是一种插值方法,通过对比待估计点与已知samples之间的距离,插值取值在用已知samples用核函数进行拟合的函数曲线上。
但是KDE的计算复杂度是
Quantitative Evaluations¶
Inception Score¶
Inception Score 用于评估labelled data生成质量,主要考虑的是生成样本的sharpness和diversity
Inception Score
在IS中,我们有两点假设:
- 有标签的监督学习模型
- 具有好的分类器
Sharpness:
Diversity:
IS:
对于这里清晰度和多样性的理解:
-
清晰度S:如果我们得到了一个非常清晰的图像,那么我们应该非常容易识别出一个图像的类别,这时分类器
的分布应该是一个尖峰,也就是一个低熵的分布,所以我们用上述的S公式来求算分类器 的熵,并追求他的最小化 -
多样性D:如果我们得到了非常多的类别,那么我们的边缘分布
应该是接近一个均匀分布的形态,意味着每个样本出现的次数都差不多,所以 的熵应该是一个高熵的分布,所以我们用上述的D公式来求算 的熵,并追求他的最大化
如果还记得KL Divergence的定义,我们可以将IS公式改写为:
这时maximize IS等价于最大化D和S之间的差异,也就是既要求模型生成清晰度高的图像,又要求模型生成多样性的图像,只有当两者都达到时,IS才会达到最大值
但是IS的问题在于:
- 依赖分类器
- 无法检测类内多样性
而且你会发现,好像IS并没有在考虑真实数据的分布,而是只考虑了生成数据的分布
Fréchet Inception Distance¶
FID的核心在于,与其间接地通过分类概率来评估,不如直接比较真实数据和生成数据在深度特征空间中的统计分布
FID Procedure
-
Feature Extraction
对于每一个真实数据
和生成数据 ,输入进Inception V3模型提取特征,得到特征向量,这个向量不仅仅是浅层的分类,而是包含了更深层的特征,例如纹理、形状等,类似于一个特征指纹,这样我们得到了两组特征向量 和 -
Fitting a Multivalue Gaussian
在这里FID做出一个假设:这两堆特征向量的分布可以用多元高斯来近似描述,这两个数据集分别具有他们自己的高斯属性:
- 均值向量
和 - 协方差矩阵
和
- 均值向量
-
Fréchet Distance
计算两个高斯分布之间的距离:
在最后的式子中,第一项就是两个高斯分布均值之间的距离,第二项通过两个矩阵之间的trace衡量协方差矩阵的差异性
Kernel Inception Distance¶
在讨论FID的过程中,我们有一个关键的假设是数据的分布服从高斯分布,这会导致一些局限性。我们现在尝试直接比较两个数据分布本身:
KID
结合了Inception特征提取和核方法的分布差异度量MMD:
- MMD:Maximum Mean Discrepancy,通过对比两个分布在再生核希尔伯特空间中的均值来衡量分布差异
其中,
对于整个表达式,第一二项用于衡量两个数据分布
-
KID Procedure
- 特征提取:使用预训练的Inception网络提取特征
- 计算MMD:计算生成数据
和真实数据 的MMD - 计算KID:
常见的核函数有高斯核或者是计算高效的多项式核
KID的优点:
- 避免了高斯分布假设
- 无偏估计
- 避免了trace计算
- 通过核函数隐含高阶统计量,有可解释性
对于有无偏估计我不是太清楚,这里放一些解释:
Bias vs. Unbiased
最直观的一个解释是:无偏估计是一个弓箭手能够围绕靶心进行射击,而偏差估计是弓箭手可以固定一个射击范围,但这个范围的中心不是靶心(系统性偏离真实值)
对于一个真实参数
而偏差估计为:
同时偏差量定义为:
对于实际任务来说:在小样本下有偏估计会系统性低估真实分布差异(偏差随样本量增大而减小),而无偏估计则不会因为样本量的变化而变化,但同时偏差的有无并不是绝对的好/坏,而是取决于任务本身,因为有的时候模型会需要降低方差不得不牺牲无偏性
Latent Representations¶
这是我认为的一个很困难的但是很核心的问题,并且这个问题是没有通解的。
有几个核心或者说常用的手段:
- Clustering
- Compression
- Disentanglement
Disentanglement
解耦,我的理解就是将复杂多元系统拆解成单一变量控制的系统。
也就是说我们在潜空间中找到一个特定的潜变量,这个潜变量具有某种意义能够控制生成数据的某个特征,这样我们通过控制这个变量就能达到全局特征的修改
留言