监督学习和无监督学习
大区别:监督 vs 无监督
1. 监督学习
- 定义:模型学习的是从输入 X 到输出 Y 的映射。
- 例子:
- 图像分类(输入是图像X,输出是类别Y)
- 目标检测(输出是多个目标的位置和类别)
- 语义分割(输出是每个像素的分类标签)
- 图像描述生成(输出是对图像的自然语言描述)
- 特点:
- 需要人类标注的数据(标签Y必须由人工提供)
- 效果很好,但依赖大量高质量标注数据
- 问题:数据标注昂贵、耗时,限制了模型的扩展能力
2. 无监督学习
- 定义:只用到输入数据 X,没有输出标签 Y。
- 目标:通过模型找出数据中的隐藏结构(hidden structure)
- 意义:
- 不需要人工标注,适合处理网络上“海量无标签数据”
- 被认为是“机器学习的圣杯”:自动学习有用结构
- 例子:
- 聚类(Clustering):把数据划分为不同类别,但没有提前定义标签
- 降维(Dimensionality Reduction):如PCA,找出数据的主要变化方向
- 自动编码器(Autoencoder):重建输入图像,同时学习潜在特征(无标签)
- 密度估计(Density Estimation):学习一个概率分布,给常见图像高概率,不常见图像低概率
比较点 | 监督学习 | 无监督学习 |
---|---|---|
数据 | 有标签 (X, Y) | 无标签 (仅X) |
目标 | 学习X→Y的映射 | 学习数据内部结构 |
依赖 | 需要大量人工标注 | 不依赖人工标注 |
应用 | 分类、检测、分割等 | 聚类、降维、生成等 |
局限性 | 标注成本高 | 模型更难训练和评估 |
理想状态 | 学得准 | 学得巧,学得多 |
概率框架上的机器学习模型
一、引出背景:概率框架下的机器学习模型
在机器学习中,很多模型都可以从概率分布的视角来理解:
- 模型的目标就是“学一个概率分布”,这个分布反映数据中潜在的规律。
一、判别模型(Discriminative Model)
判别模型建模的是:
条件概率分布 P(y|x):给定输入 x,预测输出 y 的概率
- 举个例子:图像分类器就是一个判别模型
- 输入 x:一张图片
- 输出 P(y|x):这张图是“猫”、“狗”或“猴子”的概率分布
特点:
- 核心任务是“分类”:直接判别输入属于哪个类别
- 只关心决策边界,不关心数据是怎么来的
- 通常用于监督学习(因为需要输入和标签对)
二、生成模型学习的是什么?
“生成模型将尝试学习图像 X 的概率分布。”
含义:
- 它建模的是 P(X):即“这张图像在真实世界中出现的概率有多大?”
- 换句话说,生成模型试图从无中生有,学会像人一样“画出”类似真实图片的数据。
- 它不仅能判断一张图像是否合理,还能生成全新的图像。
举例:
- 给定一堆人脸图片,训练一个模型后,它可以生成逼真的新的人脸。
- GAN、VAE 等都属于生成模型。
三、条件生成模型(Conditional Generative Model)
“它将尝试学习基于标签 Y 的图像 X 的概率分布。”
含义:
- 它建模的是 P(X|Y):在给定一个标签 Y(如“狗”)的条件下,生成一个合理的图像 X(如一只狗的图片)。
- 与普通生成模型相比,它多了一个控制条件:你可以告诉模型你要“生成狗”还是“生成猫”。
三种模型数学上一览
一、密度函数的本质要求
- 所有概率密度函数都必须满足:
这叫归一化约束。意思是:一个密度函数的“总概率质量”是有限的,必须分布在整个样本空间中。
二、对比三类模型的数学结构
1. 判别模型:学习 p(y|x)
- 给定输入 x,预测标签 y 的条件概率。
- 模型输出一个合法的分类分布,比如:
- 归一化发生在所有可能的 y 上:
- 关键点:对不同标签 y 竞争归一化,但 输入 x 无需竞争。输入空间是无限的,每个 x 单独评估。
2. 生成模型:学习 p(x)
- 学的是图像或数据本身的概率密度分布。
- 这意味着对整个输入空间的 x 都要建模。
- 要求:
- 关键点:不同的输入样本 x 之间要竞争有限的“概率质量”。
- 如果你给一个
较高的概率密度,那么其他 x 就要分得更少。 - 结论:训练生成模型更难,因为你要在整个 x 空间上建模,并考虑全局分布结构。
3. 条件生成模型:学习 p(x|y)
- 给定标签 y,学习输入 x 的分布。
- 要求:
- 关键点:对于每个 y(每个条件),都必须有一个独立归一化的 p(x|y)。
- 比如,给定标签“狗”,就要在所有“狗”的图像中分配密度。
三、为什么数学上差异巨大?
虽然看起来只是“x 和 y 的位置换了”,但:
- 在判别模型中,归一化是在 离散的标签空间。
- 在生成模型中,归一化是在 连续的、高维的数据空间,如图像像素空间(非常大),这使得训练和评估都更复杂。
- 密度函数归一化导致生成模型必须在所有可能的 x 上“分配权重”,这个竞争非常激烈。
- 判别模型只需“局部判断”,而生成模型需“全球建模”。
四、图中内容总结联系
结合你提供的图:
- 判别模型学习的是 p(y|x),目标是分类。
- 生成模型学习的是 p(x),目标是从噪声中生成“像真的一样”的图像。
- 条件生成模型 p(x|y) 加入控制条件。
- 所有密度函数都要归一化,这一点是数学约束的本质,也是生成模型更难训练的关键原因。
判别模型的数学局限性
判别模型(Discriminative Model)的数学局限性,并从概率密度函数的归一化约束角度解释了为什么判别模型对不合理输入表现不佳。下面是逐层讲解和分析:
一、从概率密度函数说起
1. 什么是概率密度函数(PDF)
- 概率模型要建模的是“在某些输入条件下事件发生的可能性”。
- 密度函数 p(x):给出某个输入 x 在这个模型下出现的“可能性有多大”。
2. 归一化约束
- 所有概率密度函数都必须满足:
- 含义是:整个样本空间中的“概率质量”是有限的、固定的,总量为1。
- 所以不同的 x 或 y必须竞争这固定的总质量:你给一个值多了,别的就要少。
二、判别模型中的“归一化”是怎么体现的
判别模型学习的是 p(y|x),也就是:
- 给定一个输入图像 x,输出在标签空间中各个标签的概率(比如猫、狗)
- 输出的是一个概率分布,必须满足:
- 关键点:在每个具体输入 x 下,标签之间要竞争概率质量
→ 猫的概率上升,狗的概率就必须下降
图中例子说明了这个过程:
- 对于一张猴子的照片,模型虽然只训练了“猫”和“狗”这两个标签,但仍然被迫输出一个在这两个标签上的分布
→ 也许是:
- 然而,这张图根本不是猫也不是狗,这种输出是不合理的
三、问题的根源:模型无法拒绝不合理输入
因为:
- 判别模型的数学结构是:对每一个输入 x**,都必须输出一个合法的标签分布**
- 它没有机制判断这个 x 合不合理
- 无论图像是猴子还是一堆无意义的彩色噪声,它都必须在已知标签(如猫、狗)之间输出一个“看起来合理”的概率分布
更极端的例子:
- 输入一张极其抽象、完全不像猫或狗的图像,模型仍然输出类似:
→ 这是一个数学上的强制归一化,但语义上是毫无意义的
四、这与对抗样本的关系
这段话还指出了一个很重要的观点:
判别模型这种“强制归一化”的机制,是对抗攻击(adversarial attacks)成功的部分原因
为什么?
- 对抗攻击是故意制造一种“模型训练中从未见过的输入”
- 判别模型无论如何都要输出一个标签分布,无法判断“这个输入是不是根本不合法”
- 所以对抗图像(即“伪装”的无效输入)也能被模型“认真分类”,从而造成误判
五、总结:数学层面的本质区别
| 比较点 | 判别模型 p(y|x) |
|––––|———————––|
| 输出 | 给定输入,标签之间归一化竞争 |
| 是否判断输入合理 | 不能,必须对任意输入做出判断 |
| 局限性 | 无法处理 out-of-distribution 输入 |
| 对抗样本脆弱性 | 很高,模型无法拒绝“不合理”的输入 |
生成模型工作流程
一、生成模型的工作流程(以 VAE / GAN 为例)
(1)训练阶段:学习 p(x) 或 p(x|y)
目标是让模型学到:哪些图像是“可能的”,哪些是不合理的。
一种典型结构(以 GAN 为例):
- 输入:真实图像 x,或随机噪声向量 z
- 生成器 G(z):把随机向量转成图像
- 判别器 D(x):判断输入图像是真实的还是生成的(可看作学习
)
生成器通过不断调整参数,让生成的图像“更像真实图像”。
换成 VAE:
- 训练时使用输入图像 x
- 编码器 q(z|x):把图像变成潜在变量
- 解码器 p(x|z):从潜在变量重建图像
- 优化目标:让 x 的重建误差 + 使潜在分布接近标准正态
(2)生成阶段:真正“生成图像”
这个阶段就不需要输入图像了,只有:
- 从潜在空间中采样随机向量 z(比如从标准正态分布)
- 送入生成器 G(z),得到一张图像 x
这就是生成模型的“生成”功能所在。
二、常见误解:生成模型 ≠ 输入图像 → 输出概率
这个行为(输入图像输出概率)更接近:
- 判别模型:如分类器,给定图像 x,输出标签概率 p(y|x)
- 或 密度估计器:如 flow-based models,能输出 p(x) 的精确值,但通常不用于生成图像(相比 GAN/VAE 效果差)
阶段 | 输入 | 输出 | 目标 |
---|---|---|---|
训练阶段 | 图像 x(VAE)或噪声 z(GAN) | 图像 / 重建图像 | 学会数据分布 p(x),让生成图像逼真 |
生成阶段 | 噪声 z | 新图像 x | 从无到有地“画”出合理图像 |
有拒绝能力
这段话讲的是生成模型相对于判别模型的一个重要优势:它们具有**“拒绝不合理输入”的能力**。也就是说:
生成模型可以判断某个输入是否合理,甚至明确告诉你:“这东西不像是现实世界会出现的”。
这个现象背后的数学原理和实际意义:
一、生成模型建模的是 p(x)
- 生成模型的目标是学出整个输入数据的分布 p(x)。
- 它知道哪些图像更常见(高密度),哪些图像很罕见甚至从未见过(低密度)。
- 所以它有能力说:“这个输入在我的训练数据中几乎没出现过,我觉得它非常不可能。”
二、这意味着什么?
- 如果你输入一个看起来很怪的图像(比如抽象艺术,或者一堆彩色噪声),
- 判别模型还是会给你一个概率分布(比如 70% 猫,30% 狗),哪怕它从没见过这种图。
- 但生成模型会输出一个非常低的密度值 p(x) \approx 0,意思是:
“我觉得这个图根本不像是从真实世界来的。”
三、这种“拒绝能力”从哪里来?
数学上,来源于:
- 生成模型输出的是整个图像空间上的密度函数 p(x),需要对所有可能的输入都建模。
- 这让它可以计算每个输入的“可能性”(哪怕不能直接精确求值,也能估计相对大小)。
- 所以:
- 高密度 → 可能性高 → 是合理的图像
- 低密度 → 可能性低 → 是奇怪/不合理/异常的图像
四、这在实际应用中有什么用?
生成模型的这种能力可以用来做很多有价值的事情:
- 异常检测(anomaly detection):比如在医学图像中发现“极不正常的异常点”
- 数据清洗:筛掉一些生成任务中出现的“胡乱的结果”
- 增强系统鲁棒性:判断输入是否在训练分布中(Out-of-Distribution 检测)
概率密度注意
在无限(或高)维空间中,不能简单地说“某个点的概率是多少”,因为在这种情况下,“点的概率为 0” 是数学上的事实。
一、密度函数 vs 概率的区别
- 在有限离散空间里(比如抛硬币),我们可以说:
→ 这是一个明确的概率。
- 但在连续空间,比如实数轴
,你不能说:
因为在连续空间中,任何具体点的概率严格等于 0。
二、概率密度函数(PDF)解决了这个问题
我们引入了概率密度函数 p(x),它不是概率,而是一个“概率密度”,它满足:
也就是说:
- 概率 = 密度 × 区间大小
- 单点概率永远是 0
- 但如果我们看的是一个范围,就可以用积分得到实际概率
三、在无限维或高维空间中更要小心
生成模型建模的是图像 x,这在数学上是一个非常高维向量(比如 64×64 的彩色图像就是
- 在这么高维的空间中,“一个点”的概率是 0
- 所以说“这张图像的概率是多少”在数学上是不严谨的
- 正确的说法是:“在某个小区域内的概率是多少”,即计算积分:
四、这对生成模型意味着什么?
- 你不能单纯说某张图像 x 的概率是 0.21,这是没意义的。
- 所以 GAN / VAE 并不直接输出“某张图像的概率”。
- 真正可解释的是:
- 哪些区域的图像“更可能”
- 哪些区域密度“更集中”
- 或者通过对比两个图像区域的积分来判断哪个区域更“常见”
五、总结一句话
在高维或连续空间中,我们不谈“点的概率”,而是谈“密度”和“区域上的概率”。要得到真实概率,必须对密度函数积分。
这段话是在提醒我们,在用生成模型建模图像空间的时候,必须以“密度函数 + 积分”的数学方式来思考,而不能像分类问题那样对单个图像输出概率。
评估生成模型的好坏
我们如何判断一个生成模型(如 GAN、VAE)到底“好不好”?
这是一个开放性且困难的问题,原因在于生成模型并不像分类器那样能用“准确率”来衡量,所以评价方式并不直接。讲者重点介绍了一个经典的衡量思路:困惑度(Perplexity)或对数似然(log-likelihood)。
一、生成模型的评估为什么困难?
- 分类模型有明确的标签,可以通过准确率等指标衡量性能。
- 生成模型的目标是“学习数据分布”,即学到 p(x),但没有标签可以对比。
- 所以我们必须换一种方式来衡量:它是不是学到了“真实世界图像”分布的本质结构?
二、理想的评估标准:模型对“未见图像”赋予高概率密度
这是核心观点:
一个好的生成模型,不只是记住训练图像,而是能理解数据的结构,从而对没见过但“合理”的图像也赋予高概率密度
换句话说:
- 如果你给模型一些新的、真实世界的图像(测试集):
- 一个好模型应该说:这些图像**“很有可能”是现实中会出现的
- 即:对它们的概率密度 p(x) 不应该太低
这才说明它学到的不是“死记硬背”,而是“理解”了数据分布。
三、困惑度(Perplexity)是什么?
虽然这段话没详细展开“困惑度”的定义,但我们可以简单补充:
- 困惑度常用于语言建模,也用于图像建模,它是对模型输出概率的逆数尺度。
- 通常计算公式是:
- 含义:平均来看,模型有多“困惑”(即越小越好,越小代表越 confident)
四、总结这段的关键点
- 生成模型的评估非常困难,因为它没有标准答案可以直接对比。
- 理想的评估标准是:在测试集上的图像也能被模型赋予高概率密度
- 这说明模型真正学会了分布结构,而不是简单记忆训练数据
- 困惑度、对数似然是衡量这一点的数学工具
挖个坑
深入理解其中的数学机制,比如潜在空间 z 的意义、重建损失如何定义、GAN 的 min-max 结构,
条件生成模型工作流程
条件生成模型(Conditional Generative Model),即学习 p(x|y) 的模型,它在生成和分类任务中都有独特优势。
它的特点是:
对每个标签 y,学习“这个标签下,哪类图像是最可能的”,也就是说:标签固定,图像之间竞争概率质量。
我们先讲清楚它的数学含义,再讲训练方式和应用流程。
一、什么是条件生成模型?
- 它学习的是 p(x|y),即:
“在给定标签 y 的条件下,图像 x 出现的可能性有多大?”
- 和生成模型 p(x) 比,它不是建模所有图像,而是:每个标签一个“图像分布”
- 和判别模型 p(y|x) 比,它不是“图像输入→标签输出”,而是反过来:标签输入→生成图像
二、从图中看怎么理解 p(x|y)
- 图像分布会因标签不同而不同,比如:
- 给定 label = “cat”,图1(小猫)的概率密度很高,而其他图像(狗、猴子、噪声图)概率低
- 给定 label = “dog”,图2(小狗)的概率密度高,而图1就低了
- 换句话说:每个 label y 拥有自己的一套图像概率分布,图像们在其中“竞争”被生成的可能性
三、训练流程(怎么学会 p(x|y))
- **训练数据:**一堆带标签的图像样本对 (x, y)
- **目标:**让模型学会生成符合条件标签 y 的图像 x
- 方法:
- GAN 中 → 条件 GAN:生成器 G(z, y),输入噪声 + 标签,输出图像
- VAE 中 → 条件 VAE:编码器 q(z|x, y),解码器 p(x|z, y)
- **损失函数:**优化对数似然或对抗损失,确保生成图像在给定标签下逼真
四、使用流程(怎么用 p(x|y) 做分类)
- 给定输入图像 x,我们无法直接算 p(y|x)
- 但可以利用 贝叶斯公式反推:
- 具体操作:
- 枚举所有标签
- 对每个 y,评估 p(x|y):图像在该标签下的生成可能性
- 哪个 y 使 p(x|y) 最大 → 就认为该图像属于该类
五、条件生成模型的一个重要优势:能拒绝“不合理输入”
- 如果图像 x 是一个“抽象艺术图”或“不属于任何标签的图”,那么:
- 对所有 y,模型都输出很低的 p(x|y)
- 这时我们可以设置一个阈值,比如:
- 如果最大值
,就说:阈 值
“这个图像太奇怪了,不属于任何已知类别,我拒绝分类。”
这就是条件生成模型相比判别模型的关键优势:它不光能分类,还能判断“不属于任何类”的样本,并拒绝输出。
六、总结:条件生成模型的训练和工作流程
阶段 | 内容 |
---|---|
训练 | 用带标签样本 ( (x, y) ) 学习每个标签 ( y ) 对应的图像分布 ( |
推理(分类) | 输入图像 ( x ),枚举每个标签 ( y ),计算 ( |
优势 | 如果所有 ( |
贝叶斯—联系三种模型
一、先回顾贝叶斯公式:
贝叶斯公式是:
这可以看作把“已知 y 的条件概率”转化为“已知 x 的条件概率”。
二、把每一项对应到模型上
图中公式和颜色已经标注清楚,我们再逐项解释:
数学符号 | 含义 | 所属模型类型 |
---|---|---|
( |
在给定标签 ( y ) 时生成图像的概率 | 条件生成模型(蓝色) |
( |
输入图像后预测标签的概率 | 判别模型(橙色) |
( |
所有图像的整体分布 | 非条件生成模型(紫色) |
( |
各类标签的先验分布,可统计得到 | 标签先验(绿色) |
三、为什么这个公式重要?
因为它揭示了:
这三种模型类型在数学上是互相关联、互可转化的!
换句话说:
- 如果你已经有了一个判别模型 P(y|x)
- 也有一个无条件生成模型 P(x)
- 再加上标签先验 P(y)
那么你就可以通过贝叶斯公式构造出一个条件生成模型 P(x|y),即不必重新训练!
四、直觉理解:基础?衍生?
这段话最后的核心观点是:
- 判别模型(P(y|x)) 和 生成模型(P(x))是基础构件
- 条件生成模型 P(x|y) 可以通过它们 组合推导出来
- 所以从训练策略上来说,想学会一个强大的 P(x|y),只要先搞定:
- 如何学一个强判别器
- 如何建一个生成器
- 然后就能组合出新的功能
五、总结:三种模型的数学关系和互相转换
模型类型 | 建模对象 | 是否可用于生成图像 | 是否可用于分类 | 数学关系 |
---|---|---|---|---|
判别模型 | ( |
否 | 是 | 是 |
生成模型 | ( |
是 | 否 | 贝叶斯公式的乘项 |
条件生成模型 | ( |
是 | 是 | 是(可用于分类 + 拒绝) |
一个很有启发性的观点:
三种模型不是孤立的,它们是数学上可以互换、组合、推导的。
这为模型设计提供了灵活的工具,也为生成任务与判别任务之间的融合(比如半监督学习、生成式分类器)提供了理论基础。
三种模型功能上的联系
三种模型(判别模型、生成模型、条件生成模型)分类、特征学习、异常检测、数据生成等任务中的应用场景。
一、判别模型(Discriminative Model:学习
可以做什么?
- 分类(Assign labels to data)
- 输入图像 x,输出它属于哪个标签 y
- 常见任务:图像分类、语义分割等
- 监督特征学习(Supervised Feature Learning)
- 训练一个分类网络后,把最后的分类头去掉,留下前面的 CNN 主体,用作特征提取器
- 应用于迁移学习、检索系统等
二、生成模型(Generative Model:学习 P(x))
可以做什么?
- 异常检测(Detect outliers)
- 给输入图像打分(计算或估计密度)
- 若图像密度极低,说明它在训练数据分布中不常见 → 异常值
- 无监督特征学习(Unsupervised Feature Learning)
- 学习一个生成模型后,其潜在空间(latent space)可作为图像的特征表示
- 比如 VAE、GAN 中的 encoder、隐变量 z 可作为语义表示向量
- 数据生成(Sample to generate new data)
- 这是最具特色的用途:从潜在变量空间中采样,生成新的、类似训练数据的图像(或语音、文本等)
三、条件生成模型(Conditional Generative Model:学习 P(x \mid y))
可以做什么?
- 分类 + 拒绝异常值
- 给定输入图像 x,枚举所有标签 y,计算
- 如果所有的
都很低 → 表明输入异常,可选择拒绝分类 - 否则选择最大概率对应的标签作为预测
- 条件生成(Generate data given labels)
- 给定标签 y,生成相应图像 x
- 例子:
- “生成一只猫”
- “生成一条狗”
- 输入自然语言描述 → 生成图像(即 text-to-image)
四、总的思维视角(重点)
这段话最后强调了一个更深层的思考:
- 三种模型在形式上不同(建模目标不同),但都是在使用概率建模框架
- 如果你掌握了判别模型和生成模型,你就能推导出条件生成模型
- 这些模型之间不仅数学上互通,在功能、表达能力上也可以相互组合和补充
模型类型 | 学什么 | 能做什么 |
---|---|---|
判别模型 ( |
图像 → 标签 | 图像分类、监督特征学习 |
生成模型 ( |
学图像本身的分布 | 异常检测、无监督特征学习、采样生成新图像 |
条件生成模型 ( |
标签 → 图像 | 条件生成图像(如“给我一只猫”),可分类+拒绝机制 |
生成模型分类图
一、生成模型的顶层分类:两大类
生成模型可分为:
类别 | 特点 |
---|---|
显式密度模型(Explicit Density Models) | 模型可以明确给出样本 x 的概率密度值 p(x)。 |
隐式密度模型(Implicit Density Models) | 模型不能明确计算 p(x),但可以从中采样,即生成样本。 |
二、显式密度模型下的进一步划分
1. Tractable Density(可处理的显式密度)
- 可以直接计算出 p(x),在测试时对新图像打分(估算其概率)是可行的。
- 代表模型:
- Autoregressive(自回归模型):
- 如 PixelRNN、PixelCNN
- Flow-based 模型:
- NICE、RealNVP、Glow、Fjord 等
2. Approximate Density(近似密度)
- 无法直接求 p(x),但可以给出其近似或下界(例如 ELBO)。
- 一般通过优化变分下界来间接学习 p(x)
- 分两类:
- 变分方法(Variational):
- 代表模型:VAE(Variational Autoencoder)
- 马尔可夫链方法(Markov Chain):
- 代表模型:Boltzmann Machines(玻尔兹曼机)
三、隐式密度模型下的分类
这类模型训练后不能评估 p(x),但能“直接或间接采样”生成数据。
1. Markov Chain Sampling(通过马尔可夫链间接采样)
- 如 GSN(Generative Stochastic Network)
- 从一个初始样本出发,逐步演化生成
2. Direct Sampling(直接采样)
- 无需链式推理,直接从生成器网络中抽样
- 代表模型:GAN(Generative Adversarial Network)
**四. 归纳
这张图想表达的核心逻辑是:
关键问题 | 对应模型特点 |
---|---|
你能不能精确算 p(x)? | 显式模型能,隐式模型不能 |
即使算不了,能不能“近似”算? | 变分方法、玻尔兹曼方法可以 |
算不了也无所谓,我只要能生图 | 隐式模型就足够(比如 GAN) |
五、图中提到的三种重点模型
- Autoregressive(自回归)模型
- 能显式输出 p(x)
- 像素一个个生成,例如 PixelCNN
- VAE(变分自编码器)
- 不能直接算 p(x),但能给出下界(ELBO)
- 优雅地连接生成与编码
- GAN(生成对抗网络)
- 完全不能算 p(x),但能生成高质量样本
- 属于隐式模型中的“直接采样”类
六、总结:生成模型分类表
类别类型 | 是否能算 ( p(x) ) | 是否可采样 | 示例模型 |
---|---|---|---|
显式 - 可处理 | 是 | 是 | Autoregressive, Flow 模型 |
显式 - 近似 | 近似或下界 | 是 | VAE, Boltzmann Machine |
隐式 - 马尔可夫采样 | 否 | 是 | GSN |
隐式 - 直接采样 | 否 | 是 | GAN |
自回归生成模型(Autoregressive Models)的基本思想
一、自回归生成模型的目标(Goal)
明确建模 p(x),也就是对每一个数据样本 x 直接建模其概率密度。
其核心目标是写出一个可计算的显式密度函数:
其中 f 是一个参数化函数(通常是神经网络),W 是待学习的权重。
二、如何写出这个密度函数?用 链式法则(Chain Rule) 分解
我们假设数据 x 是由多个子部分组成的,比如:
- 对文本来说:字符序列
- 对图像来说:像素序列
我们将其写作:
然后用 链式法则 分解联合概率:
这个公式的含义是:当前子项的概率依赖于前面所有子项的内容。
三、很像?语言建模中的 RNN
实际上,这就是 RNN 语言模型中的结构:
- 在语言建模中,我们预测下一个词的概率
- 在自回归图像模型中,预测第 t 个像素的概率
自回归生成模型和 RNN 语言建模在形式上是一致的
四、训练目标:最大化训练数据的对数似然
训练时,我们有数据集
- 最大化训练数据的对数概率
- 换句话说,找到一组权重 W,使得模型在所有数据上预测出的概率总和最大
形式上:
因为 p(x) 是多个条件概率的乘积,所以我们通常转成对数:
这也便于反向传播训练。
五、模型实现:用神经网络来建模每个条件概率
在图中:
- 每一个
的条件概率由一个神经网络(比如 RNN、Transformer)来建模 - 这个神经网络隐式地捕捉了所有之前的子部分(像素、字符等)的上下文信息
六、自回归模型在图像中的应用
虽然自回归模型最初用于语言序列,但:
图像也可以被当作序列来建模,只需按像素顺序展开。
比如:
- 将图像按行优先或列优先拉平成序列
- 用 PixelRNN / PixelCNN 等模型来建模每个像素的概率
模型特点 | 描述 |
---|---|
建模目标 | 显式建模 ( p(x) ),即每个样本的概率密度 |
数学分解 | 使用链式法则分解为条件概率乘积 |
实现方式 | 使用 RNN 或 CNN 模型建模条件概率 |
训练方法 | 最大化对数似然,最小化负对数似然损失 |
图像建模方式 | 将图像展开为像素序列,自回归建模 |
关键术语:implicity dependency
“Implicit dependency”(隐式依赖)这个术语的意思是:
某个变量、结果或行为依赖于另一个变量,但这种依赖关系不是直接表达出来的,而是通过模型结构、计算流程间接体现出来的。
在生成模型上下文中的解释:
当我们说:
“每个预测都将 implicitly depend on all previous subparts”
这表示:
- 我们并没有显式地在代码或公式中写出所有依赖,比如
- 但神经网络(例如 RNN、Transformer)内部的隐藏状态已经记住了所有前面的输入信息
- 所以当前预测确实是基于前面的内容,只是这种依赖是通过隐藏状态“隐式地建模”出来的
举个例子:
以语言模型为例:
1 | 输入序列:I love deep ... |
你要预测下一个词:
- 如果你手写一个公式:
→ 这是显式依赖
- 但在 RNN 中,你只写:
→ 然后用 h_t 来预测下一个词
→ 你并没有在每一步把所有
→ 但是 h_t 的信息其实包含了整个过去的序列,这就是隐式依赖
总结:
隐式依赖:不是在公式里“写明白”的依赖,而是通过神经网络等机制“自动捕捉”的依赖关系。
PixelRNN
一、PixelRNN 的核心思想
用 RNN 来建模图像中每一个像素的概率分布,按顺序一个一个生成图像。
- 类似于文本中的语言模型(预测下一个词),
- PixelRNN 预测的是:当前像素的颜色值,条件是前面所有像素的值
二、结构与公式详解
图像中的像素是二维排列的,但我们仍要定义一个“序列顺序”。
1. 每个像素的预测
假设我们当前要生成像素 (x, y),它的隐藏状态由左边和上方像素的隐藏状态决定:
然后用
- 每个通道是 0-255 的整数,预测时用 softmax 得到 p(R), p(G), p(B)
2. 隐式依赖的体现
虽然当前像素只显式依赖:
- 左边的像素
- 上边的像素
但由于左/上的像素也依赖它们各自的左/上方……
最终,当前像素会对所有左上区域的像素隐式依赖
三、生成流程(图右侧动画所示)
- 从左上角开始,按行优先或对角线顺序生成
- 每生成一个像素,就立刻更新其右边和下方像素的隐藏状态
- 遍历整张图像 → 得到完整 RGB 输出
四、优点与缺点
优点
- 完整建模 p(x):是一个 显式自回归生成模型
- 能准确估计每一个像素的概率分布
- 支持精细控制(比如条件图像生成)
缺点(重点)
问题 | 描述 |
---|---|
生成速度慢 | 因为是一个像素一个像素地生成,不能并行 |
训练时间长 | 每一步预测都依赖之前所有步骤,需要顺序处理 |
高分辨率图像成本高 | 对于 |
五、总结对照表
特点 | PixelRNN 描述 |
---|---|
类型 | 自回归生成模型,显式建模 ( p(x) ) |
单个像素建模 | 使用上方和左方像素的隐藏状态计算当前像素的概率 |
输出形式 | 每个通道(R/G/B)使用 softmax 输出 0~255 的概率分布 |
依赖方式 | 显式依赖:上/左像素;隐式依赖:所有左上区域的像素 |
优点 | 概率精确、建模能力强 |
缺点 | 非并行,训练/采样速度慢,成本高 |
PixelCNN
一、PixelCNN 的核心思想
还是自回归地建模图像的概率分布
,但不再用 RNN,而是用 带掩码的卷积神经网络(Masked CNN) 来实现。
- 每个像素的生成仍依赖它左边和上方的像素(即“上下文区域”)
- 但依赖建模方式从 RNN ➝ CNN
- 卷积核使用了“遮罩”来防止看到当前或未来像素
二、工作机制
如图右所示:
- 输入图像中的每个像素周围的感受野被 CNN 探索
- 卷积核经过遮罩处理,只能看到左边或上方的像素(防止信息泄露)
- 每个像素位置预测一个 softmax 分布(值域:0~255),用于预测 R/G/B
三、优点与缺点对比 PixelRNN
对比维度 | PixelRNN | PixelCNN |
---|---|---|
依赖建模方式 | RNN(逐步展开) | CNN(全局感受野 + 掩码) |
训练能否并行 | 每一步依赖前一步 | 所有像素的上下文是已知的,可并行卷积 |
训练速度 | 慢 | 快(可以并行卷积) |
生成(采样)速度 | 一样慢(仍需逐像素生成) | 一样慢(仍需按顺序生成) |
信息覆盖 | 所有左上像素(通过堆叠卷积层可扩大感受野) | 同左,但更灵活 |
四、总结要点
- PixelCNN 用 CNN 替代了 RNN,但仍保留自回归的建模结构
- 利用 掩码卷积(Masked Convolution) 限制模型只能看到历史像素
- 训练可以并行,显著加快效率
- 生成仍然是逐步的,所以采样速度和 PixelRNN 差不多
特点 | PixelCNN 描述 |
---|---|
类型 | 自回归生成模型,显式建模 ( p(x) ) |
建模结构 | 使用带掩码的 CNN 替代 RNN |
上下文建模 | 当前像素只看“左边和上边”的像素 |
输出方式 | 每个像素用 softmax 输出 0~255 的分布 |
训练是否并行 | 是,并行处理整张图的上下文 |
生成是否并行 | 否,仍需一个一个像素生成 |
总体效果 | 更快训练,但生成速度仍是瓶颈 |
对比PixelRNN 与PixelCNN 的训练速度
一、PixelCNN 和 PixelRNN 的本质区别
模型 | 依赖方式 | 每一步是否依赖前一步结果 | 是否可并行 |
---|---|---|---|
PixelRNN | RNN:递归结构 | 是 | 否 |
PixelCNN | CNN:带掩码卷积 | 否(只依赖输入图像) | 是 |
PixelRNN 中每一步的隐藏状态都依赖于前一步的输出,导致:
- 每个像素的预测必须一个一个计算
- 所有像素的处理只能串行进行
而 PixelCNN 中,每个像素的依赖都来自输入图像中“左上区域”:
- 这些区域是已知的(在训练时你有整张图像)
- 所以可以一次性并行卷积整张图像!
二、PixelCNN 为什么能并行训练?
原因:训练时上下文已知!
- 自回归模型训练的目标是:最大化似然
- 但在训练阶段,整个 x(整张图)是已知的
- 所以我们可以在同一时刻:
- 对每个像素的位置
- 使用 CNN 提取它左上角的上下文
- 并并行计算每个
三、掩码卷积(Masked Convolution)怎么做的?
PixelCNN 使用 掩码卷积核 限制每个像素只看**“之前”**的像素:
- 类似语言建模中的 Masked Transformer
- 卷积核结构如下(以 3×3 为例):
1 | Mask A: |
在训练时,这种设计确保网络只能学习从过去像素预测当前像素的分布,而不会“偷看”未来像素。
四、总结:
PixelCNN 的训练快,是因为它把自回归依赖建模“转换”为一个 CNN 的结构,而 CNN 的卷积可以在 GPU 上并行完成。
**五、图示对比总结
模型 | 每个像素依赖 | 是否必须按顺序训练 | 是否可并行训练 | 原因说明 |
---|---|---|---|---|
PixelRNN | 上一个像素的隐藏状态 | 是 | 否 | RNN 结构天生串行,必须等待前一个预测完成 |
PixelCNN |
左上像素(固定上下文) | 否 | 是 | CNN 卷积在训练时所有上下文都已知,可并行执行 |
自回归生成模型的优缺点总结**
自回归生成模型的优缺点总结
优点
- 明确的概率建模能力(Explicit Density)
- 自回归模型能明确计算 p(x),即每张图像的似然(likelihood)。
- 因此,它们是显式生成模型,区别于 GAN 等隐式模型。
- 良好的评估指标
- 因为能明确计算训练或测试图像的
,所以可以量化模型生成图像的“合理程度”。 - 可用于模型选择、早停、泛化能力评估等。
- 能生成高质量样本
- 虽然不是“照片级别”,但生成样本具备丰富的局部细节、边缘结构、颜色过渡——比 GAN 更多样、更稳定。
缺点
- 生成速度慢(Sequential Generation)
- 每一个像素必须按序生成,比如先生成左上角,再生成其右边,再下一行……一个像素一个像素地来。
- 所以采样(测试时生成新图像)非常慢,尤其是高分辨率图像。
从生成样本看 PixelRNN 效果
左边:CIFAR-10 数据集
- 分辨率是 32×32。
- 生成样本看起来“像是”动物、车辆等类别,有基本结构,但局部模糊。
右边:ImageNet 子集(同样是 32×32)
- 内容更复杂,类别更多,图像也更混乱。
- PixelRNN 能捕捉颜色分布和纹理边缘,但细节仍然含糊,难以辨认。
技术细节与延伸思考
- 如何生成第一个像素?
- 通常使用“起始标记”(start token)或全 0 输入,作为第一个像素的上下文。
- 是否能做条件生成?
- 可以!比如:
- 给定图像类别标签(class label)生成图像;
- 给定文字描述生成图像(text-to-image);
- 方法是将条件 y 融入模型输入,比如连接在隐藏状态或卷积输入中。
- 是否能泛化到不同分辨率?
- 基本版 PixelRNN 不容易泛化(比如从训练的 32×32 用到 64×64),因为其结构绑定在序列长度上。
- 改进方法:
- 多尺度(Multi-scale)建模;
- 可变形 RNN;
- PixelCNN++ 使用更强大的架构,支持一定的泛化能力。
初探变分自动编码器(Variational Autoencoders, VAE)
背景对比:PixelRNN / PixelCNN vs. VAE
模型类型 | 密度函数是否可计算? | 优化目标 | 示例 |
---|---|---|---|
PixelRNN/CNN | 显式可计算 p(x) | 最大化训练样本的 log-likelihood | 自回归模型(逐像素预测) |
VAE | 不可计算(intractable) | 最大化 下界(lower bound) | 用 latent variable 建模图像结构 |
VAE 的核心思想
- PixelRNN/CNN 显式地用神经网络建模并计算 p(x),训练时就最大化这个概率。
- VAE 不同:它 定义了一个包含 latent variable z 的模型,导致我们无法直接计算
。
为什么不能直接算 p(x) 呢?
- 因为包含一个 连续隐变量 z,需要对它 积分,而积分在高维空间里是非常困难甚至不可能显式求解的。
VAE 的解决方案:最大化下界
VAE 提出的方法是:
- 不直接最大化
, - 而是最大化一个可计算的 变分下界(ELBO),这个下界是 \log p(x) 的近似。
这样,即使我们无法得到真实的 p(x),也能通过优化下界,让模型学得尽可能接近真实密度。
“变分”与“自动编码器”的意义
- “变分”(Variational):
- 使用“变分推断”思想,引入一个近似后验 q(z|x) 来代替真正的后验 p(z|x)。
- 并通过优化下界,使 q(z|x) 尽量接近真实后验。
- “自动编码器”(Autoencoder):
- 网络结构和传统的 autoencoder 类似:
- 编码器:
- 解码器:
- 区别在于它的训练目标是基于概率的,而不是简单重建。
数学回顾(图中公式)
图中公式:
这个是 PixelRNN/CNN 的公式,通过链式法则拆解 p(x),每一步都能明确计算。但对比 VAE 就不行了,它的
为什么不能积分?
结论
概念 | 含义 |
---|---|
将联合分布对 |
|
不能计算的原因 | |
解决办法 | 使用近似后验 |
1. 这条公式
这是一个边际概率(marginal likelihood),表示我们对一个观测样本 x 的生成概率。
- z:是我们引入的潜在变量(latent variable),它代表图像背后“看不见”的结构信息,比如“这是一只狗”、“颜色偏暗”等。
- p(z):是潜在变量的先验分布(通常设为高斯分布)。
- p(x|z):是给定潜在变量时生成观测数据 x 的条件概率,也就是“解码器”的作用。
这条公式表达的是:
“从所有可能的 z 出发,我们生成 x 的所有方式的加权总和。”
2. 不能计算原因
因为这个积分很难算(不可解):
- 积分的维度很高:z 是一个高维向量,积分不是在一个数轴上,而是在多维空间中。
- p(x|z) 是用神经网络(decoder)定义的复杂函数,没有解析形式。
- p(z) 虽然简单(比如标准正态),但和 p(x|z) 一起组合后整个函数无法手动计算积分。
你可以想象:
让我们用神经网络生成图像,问“总共有哪些方式能生成这张图像”,这是一个组合数巨大的问题,很难在数学上求解。
3. 解决方式–用“变分推断”近似它!
我们无法直接算这个积分,但可以:
- 构造一个“近似后验分布” q(z|x),模拟真实后验 p(z|x);
- 然后推导一个可优化的 下界(ELBO) 来逼近 \log p(x);
- 最终目标就是:虽然 p(x) 不能精确计算,但我们能用下界最大化它。
变分自编码器(VAE)中的ELBO(Evidence Lower Bound)近似
目标:计算或最大化边缘似然
但我们无法直接计算:
因为:
是神经网络参数化的;- 积分空间高维、复杂,无法求闭式解。
变分推断引入近似后验
我们假设一个可计算的近似后验分布
应用 Jensen 不等式(因为
这就是 ELBO(Evidence Lower Bound):
含义解释:
项 | 含义说明 |
---|---|
重建项:希望从 |
|
正则化项:让 |
普通(非变分)自动编码器(Autoencoder, AE)
基本原理和作用
Autoencoder 是什么?
Autoencoder 是一种无监督学习模型,它的目标是:
- 从未标注数据中学习有用的特征表示
- 没有任何标签,只使用原始输入数据 x
模型结构
由两个主要部分组成:
模块 | 作用 |
---|---|
Encoder(编码器) | 将输入 x 压缩成一个低维表示 z(特征) |
Decoder(解码器) | 从 z 恢复出一个重建版本 |
结构图如下:
1 | Input x → [Encoder] → z (特征向量) → [Decoder] → Reconstructed x̂ |
训练目标:最小化重建误差
损失函数:
意思是最小化输入和重建数据之间的欧几里得距离(L2 距离)。
编码器和解码器可以是什么样子?
- 最初:线性 + sigmoid 非线性(非常简单)
- 后来:变成了多层感知机(MLP) 或 卷积神经网络(CNN)
- 编码器:多个 CNN 卷积层,提取 z
- 解码器:多个转置卷积(transpose conv)层,生成
Autoencoder 的意义
它可以学出一种有意义的低维特征表达 z,这个特征可以用于:
- 分类 / 检索 / 聚类 等下游任务
- 作为迁移学习的中间表示
实验示意图说明
- 输入数据:图像(比如 CIFAR-10)
- 编码器:将图像压缩成 z
- 解码器:从 z 还原图像
- 重建结果:比较原始图像和重建图像的差异(图右上角显示)
总结
普通 autoencoder 并不是生成模型,但它学到了有用的特征表示。虽然不能直接用于生成“全新”的图像,但作为深度表示学习工具非常重要。
如你接下来看到的变分自动编码器(VAE),就是在这个架构上加上概率解释,才形成的生成模型。
注意,不是在学恒等函数,压缩(bottleneck)机制的重要性
表面上看,自动编码器是在学恒等函数:
因为我们输入了数据 x,然后通过:
- Encoder 得到潜在变量 z
- Decoder 再从 z 生成重建数据
训练目标是最小化:
表面上好像就是想学一个“输出和输入一样”的恒等函数。
但如果真的只想实现恒等函数,根本不需要神经网络:
直接返回输入就行了,不需要训练模型。
真正的目的是:压缩表示学习
这段话强调了自动编码器中最重要的一点:
不是为了复制输入,而是为了“压缩”输入,提取有用特征 z。
这就是bottleneck(瓶颈)结构的意义:
- Encoder 和 Decoder 之间的 z 是一个维度远小于输入 x 的中间表示。
- 模型为了尽可能准确地恢复 x,就必须从压缩后的 z 中“提取最重要的信息”。
举个例子:
如果原始图片是
我们强制中间的特征 z 只能有 64 个数(维度大大压缩),
那就等于强制模型用这 64 个值去表达图像的“核心信息”。
为什么要加这个“限制”或“约束”?
为了:
- 防止模型偷懒直接记住输入
- 让模型“提炼出信息”
- 方便下游任务(比如图像分类),直接用 z 做输入更有效
后面提到:在 VAE 中我们也会添加一个“概率瓶颈”
即不仅强制维度低,还会强制 z 遵循某个概率分布(比如高斯分布),从而使编码器输出有更好的生成能力(可以采样)。
最终目标是迁移学习
训练完自动编码器后,通常:
- 只保留 Encoder 部分
- 丢弃 Decoder
- 用 Encoder 输出的 z 当作其他任务(分类、聚类等)的输入
总结:
自动编码器的核心价值在于它的“瓶颈结构”,强迫模型学习压缩数据的有用低维表示,而不是简单地复制输入。这种表示是无监督学习中的黄金财富,可迁移到各种下游任务中。
应用方式–扔掉 Decoder
普通(非变分)自动编码器的最终应用方式,即在训练后,如何“扔掉 decoder,只保留 encoder”来迁移到下游任务
自动编码器训练后的典型用途
核心思想:
训练时: 用输入 x 重建自身,学习特征向量 z
训练后: 丢掉 decoder,把 encoder 当成特征提取器用于监督学习任务
图中结构说明
- 原始输入 x:比如一张图片
- Encoder: 把 x 映射到潜在空间,生成特征表示 z
- Classifier(新的): 接上一个分类器层,从 z 预测标签 \hat{y}
- Loss: 使用监督任务的损失函数(比如 softmax cross-entropy)来训练这个分类器
图中右侧是个例子:鸟、狗、飞机等标签用于最终的监督训练。
**解释“扔掉 decoder” **
- Decoder 的任务是还原图像,但在下游任务(如分类)中我们不需要再还原图像
- 所以我们只保留 encoder 提取的特征 z,让它作为新的神经网络的前几层
下游任务中的操作细节
- 初始化阶段:
- 使用自动编码器预训练好的 encoder 权重初始化下游模型
- 微调阶段(Fine-tune):
- 将 encoder 和分类器一块继续训练(有时 encoder 冻结,只训练分类器)
这样做的好处是:
- 可以在没有标签的大量数据上预训练 encoder
- 再在少量标注数据上做分类任务
这就是“自监督学习” + “迁移学习” 的核心思想。
架构方面的补充
- Encoder 一般是卷积网络(CNN),做下采样提取高层语义特征
- Decoder 是 encoder 的“镜像结构”,通过转置卷积或上采样恢复图像
- 在图像任务中,这种结构非常像语义分割任务中的“编码-解码”结构(Encoder-Decoder)
扩展设计:多个 encoder 共享一个 decoder
作者还提到了一种有趣的变体设计:
多个 encoder((多模态)可能来自不同模态,如图像、语音、文本)共享一个 decoder,共同学习一个统一的潜在空间
这种结构会鼓励所有 encoder 都学习成“可以被同一个 decoder 理解”的表示,从而实现不同模态之间的协同或对齐。
总结:
普通自动编码器不仅能学重建,还能作为强大的特征提取器,在无监督预训练之后,将 encoder 用于有监督下游任务,从而实现迁移学习和数据效率的提升。
局限
普通自动编码器(non-variational autoencoder)的一种现实性反思与局限分析,
虽然普通自动编码器在理论上是个非常优雅的想法 —— 能在没有标签的条件下学习有用特征,但:
在现实中,它们并未真正实现“无监督学习的承诺”,也没有在主流系统中发挥决定性作用。
原因分析
1. 实际效果有限
虽然图上展示的架构(输入 → encoder → 特征 → 分类器)很合理,并且自动编码器理论上可用于初始化下游任务(尤其是样本少的情境),但在实践中发现:
- 它们学到的表示往往不如监督学习强
- 在大规模任务中,很少有 SOTA 系统依赖自动编码器特征作为核心表征
- 尽管“丢掉 decoder,保留 encoder”的思想有一定效果,但比不上 BERT、SimCLR 等先进的预训练方式
2. 最大问题:不是生成模型
普通自动编码器的结构决定了它的本质是重建输入,但它不是一个概率模型,因此存在两大局限:
局限 | 原因说明 |
---|---|
不能进行新图像生成 | 没有建模 p(x),没有 latent sampling 机制 |
没法作为完整生成模型使用 | 只能做压缩和还原,不是生成而是编码压缩 |
总结一下这段的要点
内容 | 解读说明 |
---|---|
自动编码器是一个优雅想法 | 无监督地提取有用特征,理论美丽 |
实际表现不尽如人意 | 没有成为主流 SOTA 系统的核心组件 |
最大限制 | 不是概率模型,无法进行采样、生成新图像 |
衍生启发 | 引出了变分自动编码器 VAE —— 一个概率性的、可采样的自动编码器变体 |
普通(非变分)自动编码器和自回归模型对比
项目 | PixelRNN / PixelCNN | 普通 Autoencoder (AE) |
---|---|---|
是否是概率模型 | 是,显式建模 ( p(x) ) | 否,只是学习编码 + 解码函数 |
建模方式 | 使用链式法则建模 ( |
( |
目标函数 | 最大化 log-likelihood | 最小化重建误差(如 L2 loss) |
是否有生成能力 | 从头逐像素采样生成新图像 | 只能重建已有图像,无法从噪声开始生成 |
训练是否需要标签 | 不需要 | 不需要 |
能否评估 log p(x) | 能直接评估 | 无法评估 |
采样速度 | 慢(像素级别采样,逐个生成) | 不支持采样 |
变分自动编码器(VAE)大体架构
基本知识
VAE 的核心目标
变分自动编码器(Variational Autoencoder)在普通自动编码器的基础上,引入了概率建模能力,目标有两个:
- 从输入数据中学习潜在特征变量 z
- 能够采样生成新数据
VAE 的生成假设(Generative Assumption)
我们做一个“生成建模”的假设:
每个样本
是由某个不可见的潜变量 z 生成出来的。
这个假设意味着我们可以从潜变量 z 出发,利用一个解码器来“生出”图像。
与普通自动编码器的对比
普通 AE | 变分 AE | |
---|---|---|
学习特征 ( z ),还原图像 ( |
学习潜变量 ( z ),生成图像 ( |
|
不能采样生成新图像 | 能采样新图像 | |
无概率分布建模 | 建模概率分布(如 ( |
VAE 的关键构造如下:
1. 先验分布 p(z)
我们假设潜变量 z 服从一个简单可采样的分布,通常是单位高斯:
这保证了生成时我们可以轻松采样新的 z。
2. 解码器(生成器)
给定 z,我们希望生成数据 x,所以建模:
用一个神经网络来表示这个条件概率,这就是我们训练时的“decoder”。
注意:这里的输出不是一个固定的
,而是一个分布,比如每个像素是高斯分布的均值或 Bernoulli 分布的概率。
训练后如何生成图像?
训练结束后,我们可以像下面这样使用 VAE 来“生图”:
- 从
中采样一个潜变量 z
- 送入解码器网络,得到 p(x|z)
- 从 p(x|z) 中采样 x,作为生成的新图像
这就解决了普通自动编码器无法生成新图像的问题!
直觉总结
- z 表示图像的潜在语义,比如姿态、物体类型等
- VAE 本质上是概率版的自动编码器
- 增加了建模 p(x) 的能力,使其成为一个真正的生成模型
与 AE 的不同 (得到z 方面)
VAE 是有 encoder 的,而且这个 encoder 和普通自动编码器最大的不同是:
它不是输出一个确定的 z,而是输出一个分布(通常是高斯分布)的参数,比如均值
和标准差 ,然后再从这个分布中采样得到 z。
更清晰一点的过程如下:
1. 输入图像 x
进入 VAE 的 encoder,输出的不是一个确定的向量,而是两个向量:
:均值 :标准差
这些构成了一个条件分布
2. 从这个分布中采样 z
为了能反向传播梯度,我们引入 重参数技巧(reparameterization trick),将采样写成:
这一步用可导操作将采样从随机中分离出来,使得网络可训练。
3. 将 z 送入 decoder
然后用 decoder 从 z 生成图像
VAE概率生成模型的目标(Decoder 层面)
1. Decoder 要输出的是一个概率分布(不是一个确定的图像)
在 VAE 中我们建模的是:
这不是一个具体的图像,而是一个条件概率分布,表示在给定潜变量 z 的条件下,图像 x 可能是什么样子。
2. 这个概率分布用高斯分布表示
- 假设图像 x 是一个高维向量(比如 512×512 图像就有 262144 个像素点)
- 那么我们就让 decoder 输出一个高维高斯分布:
:图像每个像素的均值(decoder 输出) :图像像素间的协方差矩阵
3. 协方差矩阵太大,简化为对角高斯
协方差矩阵如果是全连接的会非常庞大,比如:
- 对于一个
维的图像 - 协方差矩阵就是
大小,太难处理了
所以我们简化假设为对角高斯,即每个像素是条件独立的,只需为每个像素输出一个:
- 均值
- 方差
这样就大大减小了参数量,训练也更容易。
4. 图像像素的条件独立性假设
假设:
在给定 z 的条件下,图像的每个像素是彼此独立的。
虽然这是个简化假设,但它在实际中效果不错,而且让训练 tractable(可处理)。
总结:
VAE 中 decoder 输出的是:
- 每个像素的均值和方差
- 从而构成一个高维对角高斯分布
- 我们可以从中采样出整张图像
VAE图像质量与数学建模上的一个核心矛盾
为什么 VAE 生成图像会模糊?
在训练 VAE 时我们做了一个简化假设:
在给定潜变量 z 的条件下,图像的每个像素是相互独立的
即:
这个假设带来的好处是:
- 让高维图像的概率建模变得可处理
- decoder 只需输出每个像素的均值和方差
但问题也来了:
这个条件独立假设太“粗暴”
现实中图像的像素之间是高度相关的:
- 比如边缘、纹理、物体结构,像素之间有强烈的空间联系
- 但我们却假设“在给定 z 的条件下它们彼此独立”,这会让 decoder 输出的是模糊的平均像素值,而非清晰的细节
所以 VAE 的生成图像常常:
- 缺少锐利边缘
- 看起来有“均值模糊”的效果(模糊马赛克感)
一个讽刺但真实的现象
VAE 的数学建模非常优雅:推导、训练都有很强的理论基础
但它生成的图像却往往“不够漂亮”,在实际视觉效果上输给了一些没那么“优雅”的方法(比如 GAN)
这就是讲者说的“讽刺”:
- VAE 理论很美、很系统,但视觉结果不美
解决方法
后面课程中会讲,VAE 可以和其他模型(比如 GAN)结合:
- VAE 生成全局结构 + GAN 负责局部细节
- 这样可以兼顾概率建模和生成质量
这类混合模型(如 VAE-GAN、VQ-VAE 等)就会更强大。
训练 VAE
问题出发点
我们有一组训练数据
- 我们看不到
- 我们想训练模型使它最大化训练数据的似然
目标函数定义
我们想最大化 数据似然:
这是边缘似然:要对所有可能的
尝试贝叶斯规则
我们写出贝叶斯公式:
问题在于:后验
解决思路:引入近似后验(变分推断)
我们训练另一个神经网络
这个网络就是我们在 VAE 中的 encoder。
- 它输入
- 输出一个分布
,通常是一个高斯分布
目标重写:ELBO(证据下界)
我们不能直接最大化
这个被称为 ELBO(Evidence Lower Bound)。
- 第一项是 重建误差(decoder 给出
的概率) - 第二项是 正则项,鼓励
接近标准先验 (通常是标准正态)
1 | x |
最终优化
$$
\mathcal{L}(\theta, \phi; x) = \mathbb{E}{q\phi (z|x)}[\log p_\theta (x|z)] - \mathrm{KL}(q_\phi (z|x) | p (z))
$$
具体的数学推导
概率项
正确理解几个概率项的含义:
符号 | 含义 | 谁来建模 | 是否可计算 |
---|---|---|---|
生成模型 / 解码器,给定潜变量 |
由 decoder 模型建模 | 可以建模 | |
潜变量的先验分布(一般设为标准高斯) | 人为假设的 | 可以写公式 | |
后验分布,真实模型下 |
无法直接建模(需要贝叶斯推断) | 无法直接建模 | |
近似后验,作为 |
由 encoder 网络建模 | 可近似建模 |
后验为什么不是
因为 解码器的目标 是还原
那
它是真实后验分布,表示:在看到一个图像
这就是为什么我们引入了 encoder 网络 来学习一个
总结关系图
1 | x z |
- 左边 encoder 给出
- 右边 decoder 给出
- 真实后验
无法求,所以才用 来逼近它
要点总结:
- Decoder 建模的是
,不是 是目标后验,不能计算- 所以引入 encoder 网络学
逻辑关系:真实与近似
encoder 得到的潜变量的分布 和 真实的潜变量后验分布 不是一回事,但在变分自动编码器(VAE)中,我们是用前者去近似后者的。
表达式 | 含义 | 是否可计算 |
---|---|---|
真正的后验分布:在生成模型下,已知图像 |
无法计算(积分太复杂) | |
encoder 网络学到的分布,用来近似上面这个 |
可由 encoder 输出的均值和方差建模(如高斯) |
VAE 无法直接计算
,所以我们训练一个 encoder 去学一个可计算的近似分布 ,让它尽可能逼近真正的后验。
在 训练阶段:
我们并不知道真实的后验分布
- encoder 输出一个 近似后验分布
- 然后我们 从
中采样 - 再将这个采样得到的
送入 decoder 得到图像
所以图中步骤 3 的“将
时机 | 是否来自 encoder | |||
---|---|---|---|---|
训练阶段 | 从 |
近似后验 | 是 | |
推理阶段 | 从 |
先验高斯分布 | 不是(直接从 |
ELBO(Evidence Lower BOund)最大化推导
推导目标:最大化数据的对数似然
我们要最大化:
但由于潜变量 z 不可观测,不能直接计算。于是
第一步:引入贝叶斯公式改写
用贝叶斯公式写出 $$p_\theta(x):
\log p_\theta(x) = \log \left( \frac{p_\theta(x|z)p(z)}{p_\theta(z|x)} \right)$$
为了引入易于计算的 近似后验分布
然后拆成三项(使用对数运算性质):
第二步:对公式两边取期望
因为我们无法直接观测 z,我们对
第三步:识别 KL 散度项
- 第二项是:
即 近似后验 和 先验 之间的 KL 散度
- 第三项是:
但这是我们 无法计算的项,因为
第四步:舍弃不可计算的 KL 散度,得到 ELBO
由于:
所以我们可以忽略它,得到对数似然的下界(ELBO):
最终训练目标(最大化 ELBO)
我们最大化的是这两个可计算项的和:
- 第一项是:重建项(decoder预测图像的对数概率)
- 第二项是:KL 散度(encoder生成的潜变量分布 和 先验分布之间的差距)
具体构建和训练一个变分自动编码器(VAE)
总目标:训练 VAE 最大化变分下界(variational lower bound)
我们希望最大化以下目标函数:
它由两项组成:
- 重构项(第一项):鼓励从潜变量 z 生成的图像尽可能像原图。
- KL 散度项(第二项):鼓励编码器输出的潜变量分布 q_\phi(z|x) 接近事先设定好的先验分布 p(z)。
1. 如何输出“分布”?
神经网络通常输出确定值,这里我们想让 encoder 输出一个“概率分布”。技巧如下:
假设输出是一个 对角高斯分布:
- 神经网络输出两个向量:
- 均值向量
- 方差向量(协方差矩阵对角线)\Sigma_z(x)
这样就构成了一个概率分布。
2. 网络结构设计(以 MNIST 为例)
假设输入图像是 MNIST(28×28 的灰度图,展平为784维向量):
Encoder:
- 输入:784维向量
- 中间隐藏层(线性+ReLU):400维
- 输出:
:20维 :20维,对应对角协方差矩阵
Decoder:
- 输入:z(20维)
- 中间层:400维
- 输出:
- 图像像素的均值
:784维 - (可选)协方差(但很多实现直接固定)
3. 训练过程(重点在 KL 项)
KL 散度项:
- 如果我们设定:
:对角高斯分布
- p(z):单位高斯分布
那么 KL 散度有一个闭式解(公式在图里):
这样我们就不需要数值积分,训练效率高
可选先验分布?
- VAE 默认使用单位高斯
- 为什么用它?
- 有闭式解,训练方便。
- 但其他先验也可用,如:
- 拉普拉斯分布(稀疏性)
- 伯努利分布(分类潜变量)
- GMM、多模态先验等
⚠️ 缺点:这些分布通常无法计算 KL 的闭式解,需要采样或变分推理,会变复杂。
补充:用二元分类器代替高斯分布建模z?
什么叫“用二元分类器代替高斯分布建模 z”?
在 变分自动编码器 VAE 中,潜在变量 z 通常是一个连续的向量,满足 高斯分布(即
而“用二元分类器建模 z”,意思是将每个潜在变量的分量(比如 z_1, z_2, …, z_n)都变成 二元的离散变量,比如:
这样我们就不是用连续的高斯分布表示 z,而是用 一组独立的伯努利分布(Bernoulli) 来表示每个分量:
举个具体例子
假设我们想要 10 维潜变量 z:
- 原始 VAE 做法:
- 用二元分类器建模:
其中每个
如何训练?
训练过程就会变成让模型输出一组二元分类概率
但这里就会遇到一个大问题:
从离散分布(如伯努利)采样是不可导的,不能直接用于反向传播训练。
为了解决这个问题,研究人员引入了近似技巧,比如:
- Gumbel-Softmax / Concrete 分布:一种可微分的近似伯努利采样方法。
—总结对比
特性 | 连续高斯潜变量(经典 VAE) | 离散伯努利潜变量(用分类器) |
---|---|---|
变量类型 | 连续向量 |
离散变量 |
输出方式 | 输出 |
输出 |
是否可导 | 可以(重参数化) | 原本不可导,要用近似技巧 |
易训练性 | 高,计算方便 | 难,需要 Gumbel-softmax 等技巧 |
但 VAE 一般使用连续的对角高斯分布,原因如下:
1. 共享计算(shared computation)
“我们实际上想要在编码器网络内共享计算”
- 高斯分布的均值 \mu(x) 和方差 \sigma(x) 是 从共享的隐藏层里计算出来的。
- 换句话说,虽然我们要输出多个参数(比如 20 个 \mu_j 和 20 个 \sigma_j),但这些参数都是通过**相同一组网络层(共享特征)**得到的。这样就高效且参数共享。
2. 建模结构更灵活
“模型内部有两层建模结构:一层是神经网络,一层是概率结构”
- 神经网络层:输入 x,输出
,这表示网络学到了“怎样预测潜变量的分布参数”。 - 概率建模层:基于
,我们再构造高斯分布 ,并从中采样。 - 这样的两层建模结构让模型既具有神经网络的表示能力,又具备概率建模的灵活性和解释性。
3. 训练更方便
“我们选择这样做是出于计算的原因”
- 离散变量的 KL 散度不易有闭式解,而高斯分布之间的 KL 散度可以解析计算,非常高效。
- 同时对角高斯能避免采样复杂度和梯度传播问题(可通过重参数化 trick 实现可导)。
变分自编码器(VAE)训练过程中目标函数的第一项
基本训练流程
这段话解释的是 变分自编码器(VAE)训练过程中目标函数的第一项——也就是重建项(reconstruction term):
一、核心目标回顾:
VAE 的优化目标是最大化变分下界(variational lower bound):
这两个项分别含义是:
- 重建项 $\mathbb{E}{z \sim q\phi(z|x)}[\log p_\theta(x|z)]$:
希望根据隐变量
- KL 散度项
:
惩罚编码器预测的分布
二、本段聚焦在第一项的解释(即重建项)
VAE 的训练流程如下(与图配合讲解):
步骤 1:
“Run input data through encoder to get a distribution over latent codes”
输入数据
这不是一个确定的向量,而是一个条件分布。
步骤 2:
“Encoder output should match the prior p(z)!”
编码器输出的分布(即上面的高斯分布)应该尽量靠近我们设定好的先验分布
步骤 3:
“Sample code z from encoder output”
从编码器输出的分布
步骤 4:
“Run sampled code through decoder to get a distribution over data samples”
把采样出来的
表示在给定
步骤 5:
“Original input data should be likely under the distribution output from (4)!”
这就是重建项的关键点:
我们希望原始数据
所以:
而这一项就是目标函数的第一项,表示解码器在还原
三、小结
这段话就是在说明 VAE 的训练第一步怎么走通这条“编码 → 抽样 → 解码 → 评估”的路径,同时解释了 第一项期望
re dive into 重建项
这项中涉及的符号
重建项(Reconstruction Term),衡量的是:
在使用
重建数据 时,模型生成的分布 有多可能“覆盖住”真实的 。
各符号的角色:
:参数化 encoder 的神经网络,即:
这个分布告诉我们如何根据输入图像
:参数化 decoder 的神经网络,即:
这个分布用于根据采样到的潜变量
为什么这个公式里同时有
这项的数学表达式是:
它表示的意思是:
- 我们使用 encoder(参数为
)得到了一个分布 ; - 然后我们从这个分布中 采样出 z;
- 把这个 z 丢进 decoder(参数为
),计算它输出的 ; - 看 decoder 能不能 “重建好” 原始图像
,也就是 log-likelihood 大不大。
1. 期望项内部是什么?
意思是:给定一个 latent code z ,decoder 生成了一个数据分布
→ 也就是:否能通过这个 z 把原图 x 重建回来?
2. 这个式子的作用?
它是在做 概率版本的自动编码器重建损失。
普通自动编码器(AE)中,我们的目标是:
而现在在 VAE 中,我们的目标变成:
也就是:在 decoder 生成的图像分布下,原图像 x 是否有可能是这个分布中出来的?
3. 为什么说它是自动编码器的目标?
因为整个过程是这样的:
- 把图像 x 送入 encoder,得到一个潜变量分布
; - 从这个分布中采样出一个 z;
- 把 z 送入 decoder,它会预测 x 的分布
; - 我们希望原图像 x 在这个分布下的概率很高。
这就是“重建原始数据”的含义。只是从 “像素距离” 换成了 “概率意义上的重建”。
举个例子(具体流程):
假设:
- 输入图像
是一张猫的照片; - Encoder 输出
; - 从这个分布中采样出一个潜变量
; - 将
送进 decoder ; - decoder 输出一张图像(比如一张分辨率为 28x28 的灰度图像的分布);
- 然后我们g
总结:
这项衡量的是:“从 encoder 得到 z,再通过 decoder 重建 x 的效果好不好”。
如果 decoder 给出一个
,我们希望原始 x 在这个分布下的可能性要尽可能大。
就像传统 autoencoder 想让重建图像
和原图 x 尽量接近一样,VAE 用的是“概率上的接近”。
控制采样的 ; 控制重建的 ;
所以两个参数都在这个项中出现是完全合理的。
为什么 log-likelihood(\log p_\theta(x|z))值越高,就表示生成模型越好?
本质解释:log-likelihood 是衡量一个分布“解释”样本能力的度量
想象场景:
我们现在有一张真实图片 x,我们从 encoder 中得到潜变量 z,并通过 decoder 得到一个分布:
这个分布不是一个具体图像,而是 一堆图像可能性 的集合(比如一个高斯分布,均值是“生成图像的中心”,协方差控制模糊程度)。
如果我们观察到的真实图像 x 在这个分布中很可能出现(概率密度很高),我们就说:
“这个模型生成得不错,它确实能生成我们真实看到的图像。”
所以 log-likelihood 的含义是:
也就是说:如果 decoder 给出的分布能“覆盖”住真实的 x,那我们就奖励它一个高分(高 log-likelihood);
数学视角:最大似然估计(MLE)
最大似然估计的目标就是:
它希望通过调节参数
这就是我们在 VAE 中优化的重建项 —— 它是 MLE 的变种,在条件上加了 z。
为什么使用对数?
- 实际中概率值(密度)非常小,log 可以避免数值不稳定;
- 更重要的是:log-likelihood 可以转换为损失函数(负 log-likelihood 是我们优化的目标);
- 高斯分布下,对数似然正好等价于 L2 距离(MSE),这就和传统 autoencoder 联系起来了。
总结一句话:
log-likelihood 越大,说明模型生成的分布
越有可能生成我们真正观察到的数据 x,这就意味着:模型更“理解”数据,重建越真实,生成越靠谱。
如果你还想,我可以:
- 给你画图解释什么叫“分布覆盖住数据”;
- 举具体例子说明 log-likelihood 和图像重建的对应关系。
是什么
理解过程
从结构说:
- x:是一个高维向量,比如一张 28x28 的图像,展平成 784 维向量。
- z:是潜变量,可能是 20 维的向量,从 encoder 输出。
:是一个概率密度函数,给定一个 z,它告诉我们**“x 这个值在生成分布中的可能性有多大”**。
我们现在要做的是:
也就是问:“在给定 z 的情况下,生成模型给出的分布在 x 这个点的 概率密度 是多少?” 然后我们对它取对数,得到的是 一个数,也就是一个标量 loss。
举例
假设 decoder 给出的是一个多维高斯分布:
那么这个高斯分布下给定 x 的概率密度就是一个数:
然后我们对这个数取对数,得到一个标量(loss):
那为什么它可以衡量模型好坏?
因为它本质上在告诉我们:
“你这次用 z 重建出的 x,和真实的 x 差距有多大”,只是用概率的语言说出来了。
重构项和 KL 项之间的对抗
VAE的训练目标:两个项
VAE的目标是最大化 变分下界(ELBO):
它包含两个部分:
① 重构项
含义:
- 编码器
得到潜变量 z。 - 解码器
用这个 z 来重建原始图像 x。 - 这个项衡量 还原得好不好 —— 也就是“图像重建质量”。
这个可以通过最大似然估计来优化(比如负对数高斯似然),是模型对输入数据的“忠诚度”指标。
② KL 散度项
含义:
:编码器输出的后验分布。 :先验分布(通常是标准高斯)。
这个项鼓励编码器输出的分布 接近先验分布,换句话说,潜在空间要“有序、简单”,比如服从标准正态分布。
为什么说“两个目标是对抗的”?
- 重构项希望 z 里携带足够多的信息,能完美还原 x;
- KL项希望 z 不要太复杂,要分布简单(接近先验),有时这可能会抹掉掉一部分有用的信息。
这就形成了“对抗”:信息多了 → 分布复杂,信息少了 → 难以重建。
VAE的训练目标,就是在这两者之间找到一个平衡。
训练流程总结
每一次前向传播的步骤:
- 输入图像 x
- 编码器
输出高斯分布(均值和标准差) - 从该高斯分布中采样得到 z
- 用解码器
输出图像的分布 - 计算:
- 重构项:原始图像在解码器分布下的 log-likelihood
- KL项:预测分布和先验分布的 KL 距离
- 联合优化两者,更新 encoder 和 decoder 的参数
总结:
VAE 用编码器压缩信息,用解码器还原信息,同时保持潜在变量分布的简单性,这通过最大化ELBO中的两个相对抗的项来实现。
训练完 VAE 后的功能一:生成新数据
训练后的 VAE 就像一个梦境制造机 —— 你从标准正态分布中采一个向量,它就“幻想”出一个可能的图像,这图像符合它从训练集中学到的“世界规则”。
我们不再仅仅是喂图让它重构,而是可以让它主动“编造”图像。这正是**生成模型(generative model)**的核心能力。
怎么“生成”新数据?
VAE 是一个概率模型,它建模的是数据 x 的生成过程:
从先验 p(z) 中采样潜变量 z → 用解码器生成图像 x。
所以步骤如下:
- 从先验分布(一般是标准高斯)采样一个潜变量向量 z
- 把这个 z 输入到训练好的 解码器
- 解码器会输出一个图像 x 的概率分布(比如像素的高斯分布)
- 从这个分布中采样 → 得到一张图
最终的结果就是一张VAE自己“想出来”的图像,虽然它没见过这些图,但它生成出来的内容和训练集风格、结构相似。
> 功能一:解耦变化因子
变分自动编码器(VAE)在学习到潜在空间之后,我们如何通过操控 latent code z 来“控制”生成的数据 —— 也就是所谓的 “解释性”或“可控生成”能力。
重点 | 解释 |
---|---|
解码器 | 输入不同的 z,输出不同的图像 |
潜变量结构 | 因为先验是独立高斯,每个维度独立控制某种属性 |
意义 | VAE 不仅可以生成图像,还可以通过控制 z 来调节生成内容的属性 |
图像说明
这张图的每一张小图片是 VAE 解码器生成的数字图像:
- 横轴:潜变量 z_2 的不同取值
- 纵轴:潜变量 z_1 的不同取值
每一个位置的图像是:
为什么这张图很重要?
因为它展示了 VAE 的潜变量 z 的不同维度对应不同的“生成因子”,比如:
:控制数字的“种类”(比如从 6 → 4 → 9 → 7) :控制数字的“书写角度”或“粗细样式”
也就是说:每一个维度学到了一个“可解释”的变化因子(factor of variation)。
原因?
这与我们在训练中引入的 先验分布 有关:
我们假设
,即所有维度都是 互相独立 的高斯分布。
然后训练时,我们用 KL 散度去强制让 encoder 输出的 q_\phi(z|x) 尽量接近这个先验。
最终就导致:
- 每个维度学到的信息尽量互相独立;
- 不同维度的改变影响解码结果的不同方面。
这就是所谓的:
**“Disentangling Factors of Variation”(解耦变化因子)
图像说明
这张图的每一张小图片是 VAE 解码器生成的数字图像:
- 横轴:潜变量 z_2 的不同取值
- 纵轴:潜变量 z_1 的不同取值
每一个位置的图像是:
为什么这张图很重要?
因为它展示了 VAE 的潜变量 z 的不同维度对应不同的“生成因子”,比如:
- z_1:控制数字的“种类”(比如从 6 → 4 → 9 → 7)
- z_2:控制数字的“书写角度”或“粗细样式”
也就是说:每一个维度学到了一个“可解释”的变化因子(factor of variation)。
这与我们在训练中引入的 先验分布 有关:
我们假设
,即所有维度都是 互相独立 的高斯分布。
然后训练时,我们用 KL 散度去强制让 encoder 输出的
最终就导致:
- 每个维度学到的信息尽量互相独立;
- 不同维度的改变影响解码结果的不同方面。
这就是所谓的:
“Disentangling Factors of Variation”(解耦变化因子)
功能二:变分自动编码器(VAE)在图像编辑中
通过修改潜变量 z 来控制生成图像的具体属性,例如面部表情、姿态、光照方向等。
内容说明
每一行代表一个人脸样本,每行从左到右:
列 | 含义 |
---|---|
Original | 原始人脸图像 |
Reconstruction | VAE 重建图像(输入编码器后再通过解码器恢复) |
Pose Azimuth varied | 保持潜变量中大多数维度不变,只修改表示“姿态”的维度 |
Light direction varied | 只修改潜变量中表示“光照方向”的维度 |
这意味着:
- 在保持其他因素不变的前提下,只动一个潜变量的维度,看看生成图像如何变化。
潜变量 z 的语义学习能力
- 编码器将原始图像 x 映射成一个潜变量 z,通常是一个高斯分布(有均值和方差);
- 然后我们从中采样得到一个具体的 z,作为潜在表示;
- 解码器根据这个 z 生成图像
。
VAE 的“图像编辑”能力
变分自动编码器学到的是:
- z 中的某些维度自动对齐了特定的语义因素,例如:
- 姿态(头部方向)
- 光照角度
- 表情(愤怒、微笑)
通过手动调整这些维度的值(保持其他不变),就可以实现非常自然的图像编辑。
具体流程是这样的:
- 输入原始图像 x,通过 Encoder 得到潜在分布
; - 从该分布中采样得到潜变量 z;
- 修改 z 的某一个维度(比如调整姿态);
- 将新的 z 输入给 Decoder,得到新的图像 x{\prime}。
这个图像就实现了某个属性上的编辑改变,而其他属性保持不变。
需要注意:
模型训练的时候并不知道哪些维度代表什么,
但由于我们施加了标准正态的先验、KL散度的约束,模型会自动学到 disentangled 的结构(解耦表达)。
这种可操控的语义潜变量空间是 VAE 相比于 PixelCNN、普通 Autoencoder 的一个很大优势。
特性 | 意义 |
---|---|
可解释性潜变量 | 每个维度可以控制特定语义属性 |
可编辑性 | 修改潜变量就能自然编辑图像 |
生成式建模 + 表达学习 | 同时学会生成数据和理解结构 |
模型本身决定维度语义 | 不需要人工标注哪个维度控制什么,模型自己学出来 |
总结 VAE
优点
特性 | 解释 |
---|---|
概率形式的自动编码器 | 相比传统 Autoencoder 只学习一个点表示,VAE 学的是一个分布(潜变量的分布),更有表达力和生成能力。 |
生成模型 | 可以从一个简单的分布(如 |
具有理论基础 | 基于变分推理、最大化数据似然下界(ELBO),是一种有原则的学习方式 |
潜变量可解释 | 不同维度常能学出语义有意义的因子,比如脸的姿态、表情、光照等 |
能做图像编辑 | 修改潜变量就能控制图像内容,实现图像生成+操控 |
缺点
缺点 | 原因和解释 | ||||
---|---|---|---|---|---|
不能精确最大化对数似然 | 我们优化的是下界 ELBO: |
$$
\log p_\theta(x) \geq \mathbb{E}{q\phi(z | x)}[\log p_\theta (x| z)] - D_{KL}(q_\phi (z | x) | p (z))
$$
由于后验 ( p(z | x) ) 无法计算,整个推理过程是近似的 |
| 生成图像偏模糊 | 因为我们假设 ( p (x | z) ) 是对角高斯分布,无法建模像素间复杂依赖关系 | | | |
| 潜变量表达有限 | 受限于高斯假设和 KL 散度项的约束,潜变量 ( z ) 可能不够丰富 | | | | |
| 采样难以精准控制内容 | 尽管能编辑潜变量,但我们并不知道哪一维代表什么,需要事后探索 | | | | |
VQ-VAE2(Vector-Quantized Variational Autoencoder 2)
一种将 VAE 和自回归模型(如 PixelCNN)结合起来的新一代生成模型
问题背景
目前有两种流行的生成模型,各有优劣:
模型 | 优点 | 缺点 |
---|---|---|
自回归模型(如 PixelCNN) | 图像质量高,像素细节清晰 | 生成速度慢,不能学习“潜在表示” |
变分自动编码器(VAE) | 生成速度快,有潜在表示可编辑 | 图像质量差,生成图像偏模糊 |
VQ-VAE2 的核心思想:融合两者优点
它的策略是:
训练阶段:先用 VAE-like 架构 学习图像的多层次潜在表征(latent code grids),并对这些表征 进行量化(VQ),让潜在表示是离散的向量索引(比如一个词表)。
生成阶段:在 潜在空间中运行 PixelCNN(多尺度),逐点采样潜在代码(而不是像素),最后用 Decoder 把潜在代码解码成图像。
VQ-VAE 编码器训练阶段
• 图像输入后,编码器提取出底层和顶层的 latent grid。
• 每一层的 latent grid 都经过 Vector Quantization(VQ)——将连续空间“离散化”为一个 codebook。
• Decoder 从顶层开始逐步解码,还原图像。
• 好处是 latent 表示是结构化的、可量化的,而且不再是高斯,而是离散的 index。
使用 PixelCNN 在 latent 空间中生成
• 首先,在顶层 latent space 中,PixelCNN 逐格生成编码(自回归)。
• 再在每个位置 condition 上下文生成下一层 latent。
• 最终,Decoder 将 latent grids 转回图像。
好处是:
• PixelCNN 不再直接建模像素,而是在压缩后的 latent 空间中采样,速度更快。
• 因为是 VAE 风格的编码结构,依然保留了潜在语义表示的结构性。
VQ-VAE2 带来的成果
• 在 ImageNet 上能生成 256x256 的清晰图像。
• 在人脸数据集上可生成分辨率高达 1024x1024 的照片级图像,细节如头发、面部毛发都非常清晰。
• 比普通 VAE 清晰得多,也比纯 PixelCNN 生成得快。
总结
VQ-VAE2 是将离散潜变量表示(VQ)+ 多尺度自回归(PixelCNN)+ VAE 架构融合的一种强力模型,结合了:
• VAE 的高效潜变量学习
• PixelCNN 的清晰图像建模能力
• VQ 的离散性和灵活性
它代表了未来通用生成模型(如 DALL·E、Imagen、VQ-GAN)的发展方向。