第十二章 Generative Models 生成模型
12.1 Unsupervised Learning 无监督学习
12.1.1 Unsupervised Learning vs Supervised Learning
- Clustering 聚类
- Dimensionality reduction 降维
- Auto-encoder 自动编码器
学习数据的特征表达。在监督学习的方式中,学习数据的特征表达是通过数据标签、损失函数、神经网络来进行的。
而在无监督学习中,会经常用到自动编码器。其中,损失函数的目的是,更好地重构输入数据,然后在无监督标签的情况下学习特征表达。 - Density Estimation 密度估计
关注数据的内在分布情况。
12.2 Generative Models 生成模型综述
生成模型是无监督学习范畴下的一个模型。
-
生成模型的目标:
- 给定训练数据,生成来自相同分布的新样本。即,模型的目标是通过学习数据的分布 pdata(x)p_{data}(x)pdata(x),生成与训练数据相似的新样本 pmodel(x)p_{model}(x)pmodel(x)。
- 训练数据 pdata(x)p_{data}(x)pdata(x):表示从实际数据中提取的样本分布。
- 生成的样本 pmodel(x)p_{model}(x)pmodel(x):表示由生成模型生成的新样本,其目标是尽可能与训练数据的分布相似。
-
密度估计:
- 生成模型涉及到密度估计,即估计数据的概率分布,这在无监督学习中是一个核心问题。
-
两种密度估计方法:
- 显式密度估计(Explicit Density Estimation):明确地定义并求解生成模型 pmodel(x)p_{model}(x)pmodel(x)。
- 隐式密度估计(Implicit Density Estimation):学习一个模型,能够从 pmodel(x)p_{model}(x)pmodel(x) 中采样,而无需显式地定义该分布。
12.3 PixelRNN and PixelCNN
12.3.1 PixelRNN and PixelCNN 综述
完全可见的信念网络(Fully Visible Belief Network) 属于生成模型的一种。它采用显式密度模型,并利用链式法则(Chain Rule)将图像 xxx 的似然性(Likelihood)分解为一系列 1 维条件概率的乘积。其目标是通过这种分解,计算图像的似然性,并优化模型来生成符合数据分布的图像。
-
公式解释
- 符号解释
- p(x)p(x)p(x) 是图像 xxx 的总似然。
- p(xi∣x1,...,xi−1)p(x_i | x_1, ..., x_{i-1})p(xi∣x1,...,xi−1) 是第 iii 个像素值的条件概率,给定了该像素之前所有像素的值
- Likelihood 似然
- 这里的似然(likelihood) 指的是数据在模型中的概率。具体来说,给定训练数据 pdata(x)p_{data}(x)pdata(x),我们希望通过模型来估计新的图像样本的概率。
- 该公式表示,图像的整体似然是由各个像素的条件概率构成的,换句话说,每个像素的值是由它之前所有像素的值决定的。
- 符号解释
-
难点:确定像素顺序(图中上侧蓝字)
训练的目标是通过调整网络参数,最大化训练数据的似然性。这意味着生成模型会通过优化过程调整像素生成顺序和条件概率,使生成的图像与训练数据的分布尽可能相似。
12.3.2 PixelRNN
以一种如图的顺序性方式逐步生成每个像素。像素间的关系使用 RNN 建模。
在 PixelRNN 这样的模型中,图像的每个像素的生成是一个逐步的过程,每个像素的生成依赖于已经生成的其他像素。网络会根据已生成的像素反复调整生成的图像内容。所以这是迭代的,而不是前馈(无反馈的神经网络结构。每一层的输出仅依赖于前一层的输出,不涉及当前层或后续层的反馈)的。这就会导致他比较慢。
12.3.3 PixelCNN
- 仍然从角落开始生成图像像素
- 依赖于之前像素的生成,使用 CNN(而不再是 RNN)在上下文区域上建模
- 训练比 PixelRNN 更快(因为在训练时上下文区域的像素值是已知的,可以并行化卷积)
- 生成过程仍然需要顺序进行 => 仍然很慢
- 每个像素都有它的正确标注值(0 ~ 255),利用 softmax 损失函数来训练,最大化训练像素的似然
注:这里的正确标注值就是传入的图片的像素值,不需要人工去提供标签什么的,所以是无监督学习
12.3.4 PixelRNNs 和 PixelCNNs 总结
由于使用链式法则(Chain Rules),使得函数具有很好理解和效果也很好的优点。但是就是太慢了。
12.4 Variational Autoencoders (VAE) 变分自编码器
12.4.1 VAE 简介
PixelCNNs 定义了可处理的密度函数,优化训练数据的似然性:
pθ(x)=∏i=1npθ(xi∣x1,...,xi−1) p_{\theta}(x) = \prod_{i=1}^{n} p_{\theta}(x_i | x_1, ..., x_{i-1}) pθ(x)=i=1∏npθ(xi∣x1,...,xi−1)
VAE(变分自编码器) 定义了带有潜在变量(Lalent Variable)zzz的不可处理的密度函数:
pθ(x)=∫pθ(z)pθ(x∣z)dz p_{\theta}(x) = \int p_{\theta}(z) p_{\theta}(x | z) dz pθ(x)=∫pθ(z)pθ(x∣z)dz
不能直接优化,必须推导并优化似然性下界。
12.4.2 前置背景:Autoencoders 简介
12.4.2.1 Autoencoders 的训练
自编码器是一种无监督学习模型,目的是将高维输入数据压缩成低维的特征表示 zzz(即降维),然后再通过解码器将其恢复。自编码器的目的是学习到有用的特征表示,这些特征表示能够捕捉到数据中的关键变化因素。例如,输入图像 xxx 会被压缩为一个低维的表示 zzz,然后再从这个低维表示重建回原始的图像。
训练的目标是最小化输入数据与重建数据之间的差异。通常会使用 L2 损失函数来衡量输入数据和重建数据之间的误差。训练过程中,通过学习到的低维特征,模型能够将复杂的数据映射到更简洁的表示中。
注: Encoder 和 Decoder 通常是“对称的”
自编码器的训练目标是最小化输入数据 xxx 与通过解码器重建的图像 x^\hat{x}x^ 之间的误差。这个误差通常通过 L2 损失函数来计算。训练过程中的 L2 损失函数衡量了重建数据与原始数据之间的差异,目标是通过调整模型参数,使得重建图像尽可能接近原始输入图像。
So far, 自编码器通常由编码器和解码器两部分组成:
- 编码器:将输入数据 xxx 转换为低维特征表示 zzz(通过卷积层提取特征)。
- 解码器:通过上采样操作,将低维特征 zzz 转换回原始输入数据的重建版本 x^\hat{x}x^。
12.4.2.2 Autoencoders 在监督学习的应用
Decoder 干这些事就是为了重构输出,方便计算损失函数。所以一旦训练好了过后,就可以把他 throw away~
这时 Encoder 已经可以进行很好的特征映射。
编码器可以作为预训练模型,然后与分类器结合进行微调(fine-tune),以适应特定的监督学习任务。
在微调过程中,使用标准的监督学习方法(例如,Softmax 损失函数)来训练分类器,使得模型能够学习如何从特征 zzz 中预测标签 yyy。
通过这种方式,编码器部分能够有效地为最终的任务提供支持,特别是在数据量较小的情况下,能够提高训练效率。
12.4.3 由 Autoencoders 引出隐变量 z
自编码器将高维输入数据 xxx 映射到低维特征 zzz。特征 zzz 就是隐变量(latent variable),是数据的低维表示,用于保留数据中的关键信息,同时去除冗余部分。
自编码器的一个自然扩展问题是,是否可以通过学习到的特征 zzz,来生成新的图像。即,是否可以从这些低维的特征表示中重建出新的、合理的图像。
12.4.4 VAE 变分自编码器
VAE 是一种生成模型,目标是学习一个隐变量空间 zzz,从这个空间中可以采样出数据样本 xxx。
12.4.4.1 数学概念 review
先验分布是指在没有观察到任何数据之前,对一个变量(或者随机事件)可能取值的概率分布。
数学上,先验分布通常表示为 p(z)p(z)p(z),其中 zzz 是一个随机变量(在 VAE 中,它是潜在变量)。表示在观察数据之前,我们认为潜在变量 zzz 可能采取的所有值的概率。
例如,在 VAE 中,我们通常假设潜在变量 zzz 来自于一个标准正态分布: pθ∗(z)=N(z;0,I)p_{\theta^*}(z) = \mathcal{N}(z; 0, I)pθ∗(z)=N(z;0,I) 这表示我们认为潜在变量 zzz 的每个分量是独立的,且服从均值为 0、方差为 1 的高斯分布。
12.4.4.2 变分自编码器:怎么理解这个模型
变分自编码器通过引入潜在变量(latent variables)建模数据的生成过程。
-
上方两句话的翻译理解:
假设训练数据 {x(i)}i=1N\{ x^{(i)} \}^N_{i=1}{x(i)}i=1N 是由潜在变量 zzz 生成的。这里的 zzz 是潜在因素,它们是隐藏的,并没有在数据中直接观察到(这里先不管 zzz 是怎么来的)。
通过这个潜在空间来生成数据,有着可以帮助模型理解数据的潜在结构的好处。
通过 VAE 训练模型的目标就是学习潜在空间的结构,从而可以生成新的数据点。 -
采样过程:
-
(对应上面蓝色方框左边)从真实的条件分布 pθ∗(x∣z(i))p_{\theta^*}(x | z^{(i)})pθ∗(x∣z(i)) 进行采样,这意味着给定一个潜在变量 zzz,我们可以生成一个数据点 xxx。
-
(对应下面绿色方框左边)从真实的先验分布 pθ∗(z)p_{\theta^*}(z)pθ∗(z) 进行采样,意味着潜在变量 zzz 是根据某种分布(例如高斯分布)生成的(一个数)。
-
对“真实的”先验分布 p∗(z)p^*(z)p∗(z) 和条件分布 p∗(x∣z)p^*(x|z)p∗(x∣z)的理解:
指 真实世界中存在但我们无法观察到的“真实生成机制”:- 真实的先验分布 p∗(z)p^*(z)p∗(z):大自然中控制数据生成的隐变量的分布
比如:猫的姿态、毛色等分布规律,我们无法知道它是怎样的,只能假设它服从某个简单的分布(如高斯)。 - 真实的条件分布 p∗(x∣z)p^*(x|z)p∗(x∣z):给定一个特定的潜变量(比如“黑猫坐着”),大自然会如何“生成”一张符合这个设定的图像
——这个生成过程也是未知的、复杂的。
我们说“真实的”是强调:
这是真实世界中存在但我们无法直接访问的分布,我们只能通过模型来近似。
- 真实的先验分布 p∗(z)p^*(z)p∗(z):大自然中控制数据生成的隐变量的分布
-
-
直觉(Intuition) 的翻译理解:
考虑到自编码器的背景,xxx 是图像数据,zzz 是潜在因素,用来生成图像 xxx,例如属性、方向等。这表明,VAE 模型通过潜在变量 zzz 表示数据的关键特征,并通过条件分布生成新数据。
12.4.4.3 变分自编码器:怎么表示这个模型
- (目前,在不管 zzz 是怎么来的的时候)我们的目标是使得生成数据 xxx 的模型逼近真实数据分布,这是通过调整生成模型的真实参数 θ∗\theta^*θ∗ 实现的。
- 使用条件分布和先验分布来表示生成过程。先验分布通常选择简单的分布,比如高斯分布;条件分布表示怎么通过 zzz 来生成 xxx。
- 条件分布 p(x∣z)p(x | z)p(x∣z) 比较复杂,直接生成数据 xxx,通常需要使用神经网络来表示。神经网络能够通过训练学习如何从隐变量 zzz 中生成图像 xxx。
12.4.4.4 变分自编码器:如何训练生成模型
- 我们想建立一个生成模型,按理说应该是:从真实分布中采样 → 得到数据 → 拿来学习(上文提到,decoder 通常采用神经网络的形式)
VAE 还是采用通过从真实的条件分布中进行采样,来优化模型参数的策略。
-
采样:从真实的条件分布 pθ∗(x∣z(i))p_{\theta^*}(x | z^{(i)})pθ∗(x∣z(i)) 进行采样,从真实的先验 pθ∗(z)p_{\theta^*}(z)pθ∗(z) 进行采样。
-
公式:目标是最大化训练数据的似然函数。
pθ(x)=∫pθ(z)pθ(x∣z)dzp_\theta(x) = \int p_\theta(z) p_\theta(x | z) dzpθ(x)=∫pθ(z)pθ(x∣z)dz-
pθ(x∣z)p_\theta(x|z)pθ(x∣z):是解码器模型,给定潜变量 zzz 来生成 xxx 的概率(就是 decoder)
-
∫dz\int dz∫dz:是把所有可能的 zzz 都考虑进去,整合出生成 xxx 的总概率
也就是说,这个公式问的是:“一个图像 xxx,在我这个模型里能有多大的生成可能性?”
但是这个积分太难求导,求导后也太难算……
-
12.4.4.5 变分自编码器:不可计算性
-
数据似然函数不可计算(Data Likelihood Intractability)
θ(x)=∫pθ(z)pθ(x∣z)dz _\theta(x) = \int p_\theta(z)p_\theta(x|z)dz θ(x)=∫pθ(z)pθ(x∣z)dz
- 这个公式表示的是生成模型对输入数据 xxx 的边际概率。
- 尽管我们知道 pθ(z)p_\theta(z)pθ(z) 和 pθ(x∣z)p_\theta(x|z)pθ(x∣z)(解码器),但对 zzz 积分很难,导致 pθ(x)p_\theta(x)pθ(x) 很难计算。
-
后验分布也不可计算(Posterior Intractability)
θ(z∣x)=pθ(x∣z)pθ(z)pθ(x) _\theta(z|x) = \frac{p_\theta(x|z)p_\theta(z)}{p_\theta(x)} θ(z∣x)=pθ(x)pθ(x∣z)pθ(z)
- VAE 的最终目的是学会从潜在变量 zzz 生成数据 xxx,而学习后验分布 pθ(z∣x)p_\theta(z|x)pθ(z∣x) 是实现这个目标的关键桥梁(毕竟直接算又没法算),它告诉我们一个数据对应的隐因子是什么(x 对应到 z)。有了它,我们能反向训练生成器,让它学会“怎么从 z 生成 x”。
- 也就是说,后验分布 pθ(z∣x)p_\theta(z|x)pθ(z∣x) 是我们希望学习的,但它包含了同样不可计算的 pθ(x)p_\theta(x)pθ(x)。所以这个后验分布也不可直接获得。
-
解决方法:引入变分近似(Variational Approximation)
引入一个额外的编码器网络 qϕ(z∣x)q_\phi(z|x)qϕ(z∣x) 来近似 pθ(z∣x)p_\theta(z|x)pθ(z∣x)。
这个编码器是可以计算的,并且通过训练使其逼近真实后验(而不是用上面公式硬生生地计算后验)。
这样我们就引出了一个叫数据似然的下界(Evidence Lower Bound, ELBO)的东西,它是可计算、可优化的。 -
总结
- 原本想法是“采样训练”:
- 从先验 p(z)p(z)p(z) 中随机采样 zzz
- 用 decoder p(x∣z)p(x|z)p(x∣z) 得到生成样本 xxx
- 比较生成样本和(采样得到的)真实样本之间的差异(如概率分布)
- 然后反向传播更新参数 θ\thetaθ
但 pθ(x)p_\theta(x)pθ(x)那个积分算不出来,也不能求导。
- 于是我想学习后验分布 pθ(z∣x)p_\theta(z|x)pθ(z∣x) 来反推和优化我的生成模型 pθ(x∣z)p_\theta(x|z)pθ(x∣z),结果后验分布也算不成(因为包含了 pθ(x)p_\theta(x)pθ(x))。
- 引入 qϕ(z∣x)q_\phi(z|x)qϕ(z∣x) 作为替代,变成神经网络可以优化的目标。
- 原本想法是“采样训练”:
12.4.4.6 变分自编码器:都是概率模型
变分自编码器(Variational Autoencoders, VAE)中编码器和解码器的结构和输出内容都是概率模型,而不是确定性的函数。即 VAE 并不是直接把 xxx 映射到 zzz,再还原成 xxx,而是学会了这两步的“概率版本”。
左边是编码器网络 qϕ(z∣x)q_\phi(z|x)qϕ(z∣x);右边是解码器网络 pθ(x∣z)p_\theta(x|z)pθ(x∣z)。
-
编码器(左边)
我们给定输入数据 xxx,希望推断出其潜在表示 zzz 的分布 qϕ(z∣x)q_\phi(z|x)qϕ(z∣x)。
**这是一个分布!不是一个确定的值!**编码器输出的是这个分布的参数:- 均值 μz∣x\mu_{z|x}μz∣x:潜在变量的中心;
- 协方差 Σz∣x\Sigma_{z|x}Σz∣x:常假设是对角矩阵,即每个维度独立。
这些参数都是通过神经网络由 xxx 输出的。
-
解码器(右边)
给定潜在变量 zzz,我们希望生成数据 xxx,也用一个条件分布 pθ(x∣z)p_\theta(x|z)pθ(x∣z) 来建模。
解码器同样输出这个分布的参数:- 均值 μx∣z\mu_{x|z}μx∣z:重建图像/数据的“期望值”;
- 协方差 Σx∣z\Sigma_{x|z}Σx∣z:建模不确定性,通常也设为对角矩阵或固定值。
-
⭐ 背后的思想
因为我们建模的是概率生成过程,编码器和解码器的输出都代表了分布(比如高斯分布):- 编码器告诉我们:给定数据 xxx,潜变量 zzz 大概是什么样的分布;
- 解码器告诉我们:给定潜变量 zzz,重建的 xxx 应该是怎么样的分布。
-
⭐VAE 的训练步骤(有一些概念见后文):
- 给定训练样本 xxx
- 编码器 encoder 生成 q(z∣x)q(z|x)q(z∣x),即其 μ,σ\mu, \sigmaμ,σ,采样出潜变量 zzz(为了能反向传播,我们使用重参数化技巧(reparameterization trick)来采样 zzz)
- 用 zzz 输入 decoder 得到 p(x∣z)p(x|z)p(x∣z),即 x^\hat{x}x^
- 根据重建误差 + KL 散度 计算总损失
- 反向传播同时优化 encoder 和 decoder 参数(ϕ\phiϕ 和 θ\thetaθ)
这张图完整描述了一个 VAE 的工作流程:
-
前向推理阶段:
- 给定样本 xxx,编码器生成 μz∣x,Σz∣x\mu_{z|x}, \Sigma_{z|x}μz∣x,Σz∣x,并从中采样得到 zzz;
-
生成阶段:
- 给定 zzz,解码器生成 μx∣z,Σx∣z\mu_{x|z}, \Sigma_{x|z}μx∣z,Σx∣z,并从中采样或输出重建值 x^\hat{x}x^。
也就是说,所谓的生成网络就是图中的 Decoder,因为它将被用来执行生成模型。
12.4.4.7 变分自编码器:变分下界(ELBO)的数学推导
12.4.4.7.1 review:对数似然是什么
-
对数似然(Log-Likelihood)是什么?
-
定义:对数似然是似然函数(Likelihood)的自然对数,即:
nL(θ)=∑i=1nlnP(xi∣θ) n L(\theta) = \sum_{i=1}^n \ln P(x_i \mid \theta) nL(θ)=i=1∑nlnP(xi∣θ)其中,L(θ)L(\theta)L(θ) 是给定参数 θ\thetaθ 时观测数据 x1,…,xnx_1, \dots, x_nx1,…,xn 的联合概率。
-
作用:
- 计算优化:将概率连乘(∏\prod∏)转换为求和(∑\sum∑),避免数值下溢,简化求导和优化。
- 参数估计:在极大似然估计(MLE)中,通过最大化对数似然求解最优参数 θ\thetaθ
-
-
对数似然在 VAE(变分自编码器)中的应用(详情可见后文,此处仅作留印象)
-
重构损失:用 decoder 从隐变量 zzz 重建出原始数据 xxx 的误差。
-
解码器输出 P(x∣z)P(x \mid z)P(x∣z) ,计算出真实数据的对数似然,对数似然的值反映了生成质量。
-
常用的重构损失:
-
若数据服从高斯分布,重构损失近似均方误差(MSE):
nP(x∣z)∝−12∥x−Decoder(z)∥2 n P(x \mid z) \propto -\frac{1}{2} \| x - \mathrm{Decoder}(z) \|^2 nP(x∣z)∝−21∥x−Decoder(z)∥2也就是说,最大化 log likelihood 等价于最小化 MSE。
-
若数据服从伯努利分布(如二值图像),重构损失为交叉熵损失。
如果数据不是连续图像(而是二值图),那我们就用交叉熵而不是 MSE,这和分类任务中常见的损失类似。
-
-
-
证据下界(ELBO):VAE 的优化目标为最大化 ELBO,其包含两项:
extELBO=Eq(z∣x)lnP(x∣z)⏟对数似然(重构项)−KL(q(z∣x)∥p(z))⏟正则项 ext{ELBO} = \underbrace{\mathbb{E}_{q(z \mid x)}\ln P(x \mid z)}_{\text{对数似然(重构项)}} - \underbrace{\text{KL}(q(z \mid x) \parallel p(z))}_{\text{正则项}} extELBO=对数似然(重构项)Eq(z∣x)lnP(x∣z)−正则项KL(q(z∣x)∥p(z))其中:
- 第一项:对数似然,鼓励解码器生成接近原始数据 xxx 的输出。
- 第二项:KL 散度,约束潜在变量 zzz 的分布接近标准正态分布 p(z)p(z)p(z)。
-
12.4.4.7.2 散度是什么
-
散度(Divergence)的基本概念
- 定义:
散度是衡量两个概率分布差异的工具,表示一个分布相对于另一个分布的“距离”(注意:严格来说,散度不满足距离的公理,尤其是对称性)。 - 核心特性:
- 非对称性:一般 D(P∥Q)≠D(Q∥P)D(P \parallel Q) \neq D(Q \parallel P)D(P∥Q)=D(Q∥P)。
- 非负性:D(P∥Q)≥0D(P \parallel Q) \geq 0D(P∥Q)≥0,且当 P=QP = QP=Q 时取零。
- 不满足三角不等式:因此不是严格意义上的“距离”。
- 常见散度:
- KL 散度(Kullback-Leibler Divergence)
- JS 散度(Jensen-Shannon Divergence)
- Wasserstein 距离(Earth-Mover Distance)
- 定义:
-
KL 散度(Kullback-Leibler Divergence)
- 定义:
给定两个概率分布 PPP 和 QQQ,KL 散度衡量用 QQQ 近似 PPP 时的信息损失:
KL(P∥Q)=∑xP(x)logP(x)Q(x)(离散分布) _{KL}(P \parallel Q) = \sum_{x} P(x) \log \frac{P(x)}{Q(x)} \quad \text{(离散分布)} KL(P∥Q)=x∑P(x)logQ(x)P(x)(离散分布)
KL(P∥Q)=∫−∞∞P(x)logP(x)Q(x) dx(连续分布) _{KL}(P \parallel Q) = \int_{-\infty}^{\infty} P(x) \log \frac{P(x)}{Q(x)} \, dx \quad \text{(连续分布)} KL(P∥Q)=∫−∞∞P(x)logQ(x)P(x)dx(连续分布)
- 若 PPP 和 QQQ 完全一致,KL 散度为 0。
- 定义:
12.4.4.7.3 变分下界的数学推导
12.4.4.7.4 最大化变分下界
-
如何理解最大化 ELBO 的过程
- 最大化前一项 Ez[logpθ(x(i)∣z)]\mathbb{E}_{z} \left[ \log p_\theta(x^{(i)} \mid z) \right]Ez[logpθ(x(i)∣z)]意味着将 zzz 尽可能地重构为输入 xxx:
期望项 Ez[logpθ(x(i)∣z)]\mathbb{E}_{z} \left[ \log p_\theta(x^{(i)} \mid z) \right]Ez[logpθ(x(i)∣z)] 意思是从编码器给出的分布中采样 zzz(采样是因为我们没法对这个期望做解析积分(即没法“算出来”),所以我们就 采样一个或多个 ∼qϕ(z∣x)\sim q_\phi(z|x)∼qϕ(z∣x),把这个期望用蒙特卡洛估计近似计算),然后由解码器预测 x(i)x^{(i)}x(i),最后看这个 zzz 生成输入的概率有多高。如果模型能很好地重构 x(i)x^{(i)}x(i),那么 logpθ(x(i)∣z)\log p_\theta(x^{(i)}|z)logpθ(x(i)∣z) 会很大; - 最大化后一项 DKL(qϕ(z∣x(i)) ∥ pθ(z))D_{\mathrm{KL}}\left( q_\phi(z \mid x^{(i)}) \,\|\, p_\theta(z) \right)DKL(qϕ(z∣x(i))∥pθ(z)) 意味着将近似后验分布向先验分布靠拢。
- 最大化前一项 Ez[logpθ(x(i)∣z)]\mathbb{E}_{z} \left[ \log p_\theta(x^{(i)} \mid z) \right]Ez[logpθ(x(i)∣z)]意味着将 zzz 尽可能地重构为输入 xxx:
-
VAE 的前向传播及其和 ELBO 的对应关系
左下角提到 backprop 反向传播。但是为什么这些都是可微的?- 编码器 qϕ(z∣x)q_\phi(z|x)qϕ(z∣x) 和解码器 pθ(x∣z)p_\theta(x|z)pθ(x∣z) 都是普通的神经网络;它们的输出 μ,Σ\mu, \Sigmaμ,Σ 只是神经网络的输出层,即它们本身都是端到端可微的。
- “从分布中采样”这个操作本身不可导,但是我们采用了重参数化技巧,使得采样过程变形为一个可导的函数(“把整个采样过程“藏”进一个确定性、可微的公式中”)。
12.4.4.8 变分自编码器:生成图片
-
从先验分布中采样潜变量:
z∼N(0,I) z \sim \mathcal{N}(0, I) z∼N(0,I)从标准正态分布中随机取一个 zzz。
-
将这个 zzz 输入给解码器:
pθ(x∣z)=N(μx∣z,Σx∣z) p_\theta(x|z) = \mathcal{N}(\mu_{x|z}, \Sigma_{x|z}) pθ(x∣z)=N(μx∣z,Σx∣z)解码器网络根据 zzz 输出生成图像的分布参数。
-
从该分布中采样出一张图像 x^\hat{x}x^:
x^∼N(μx∣z,Σx∣z) \hat{x} \sim \mathcal{N}(\mu_{x|z}, \Sigma_{x|z}) x^∼N(μx∣z,Σx∣z)
我们在一个二维潜在空间中,令潜在变量 z=[z1,z2]z = [z_1, z_2]z=[z1,z2],然后系统地改变这两个维度的值,观察解码器 pθ(x∣z)p_\theta(x|z)pθ(x∣z) 生成图像的变化:
- 横轴(vary z2z_2z2):改变头部姿态(Head pose);
- 纵轴(vary z1z_1z1):改变微笑程度(Degree of smile);
- 每一张图像都是从相应的 z=[z1,z2]z = [z_1, z_2]z=[z1,z2] 解码得到的 x^\hat{x}x^,即:x^=Decoder(z)\hat{x} = \text{Decoder}(z)x^=Decoder(z)
注:隐变量 zzz 的维度由设计者决定
12.4.4.9 变分自编码器:总结与展望
-
概念总结:
- 是对传统自编码器的一种“概率化”扩展,引入了生成能力;
- 通过定义一个不可直接计算的密度函数,利用变分推断技术导出并优化其变分下界(ELBO)。
-
优点(Pros):
- 是一种有理论依据的生成模型方法;
- 学到的编码分布 q(z∣x)q(z|x)q(z∣x) 可以作为其他任务的特征表示,具有良好的泛化能力。
-
缺点(Cons):
- 只最大化对数似然的下界(ELBO),相比于 PixelRNN、PixelCNN 等模型在评估指标上不够精确;
- 生成的样本相比 GAN 来说往往更模糊、质量略低。
-
当前(当时)研究热点(Active Research Areas):
- 发展更灵活的变分分布(比如非对角高斯、流式模型)以提升表达能力;
- 引入潜变量之间的结构假设,提升表示的可解释性和生成的多样性。
12.5 GAN: Generative Adversarial Networks 生成对抗网络
舍弃显式地对密度函数建模,转而只追求采样并生成图片的能力……
12.5.1 训练 GAN:
12.5.1.1 “Two-Player Game”
生成器网络(Generator)和判别器网络(Discriminator)进行博弈。
- 生成器网络:它的目标是通过生成看起来像真实图片的虚假图片来欺骗判别器。
- 判别器网络:它的目标是区分输入的图片是“真实”还是“虚假”。
- 生成器网络接受随机噪声作为输入(代表潜在空间),并生成虚假的图像。
- 判别器网络接收来自训练集的真实图像以及生成器生成的虚假图像,并判断这些图像是否为“真实”还是“虚假”。
整个过程是一个不断竞争的循环,生成器通过不断改进生成的图像来迷惑判别器,而判别器则通过不断提高其区分真假图像的能力来提高自己。
12.5.1.2 公式
公式的形式是 min-max,即最小化-最大化问题(minimax game)。在数学上,min 和 max 表示两个对手(生成器和判别器)之间的博弈过程。
- 第一个部分(对应真实数据 xxx(real data)):
最大化"输入 xxx 是真实数据"的概率,使得判别器能够准确判断真实数据。 - 第二个部分(对应生成的数据 G(z)G(z)G(z)(fake data)):
最小化输入生成数据 G(z)G(z)G(z) 为真实数据的概率,意味着生成器希望判别器认为其生成的虚假数据是“真实”的。
判别器的目标是:
maxθdEx∼pdata[logDθd(x)]+Ez∼p(z)[log(1−Dθd(Gθg(z)))]θd
\max_{\theta_d} \mathbb{E}_{x \sim p_{\text{data}}} [\log D_{\theta_d}(x)] + \mathbb{E}_{z \sim p(z)} [\log(1 - D_{\theta_d}(G_{\theta_g}(z)))]θd
θdmaxEx∼pdata[logDθd(x)]+Ez∼p(z)[log(1−Dθd(Gθg(z)))]θd
最大化其区分真假图像的能力。
生成器的目标是:
minθgEz∼p(z)[log(1−Dθd(Gθg(z)))]θg
\min_{\theta_g} \mathbb{E}_{z \sim p(z)} [\log(1 - D_{\theta_d}(G_{\theta_g}(z)))]θg
θgminEz∼p(z)[log(1−Dθd(Gθg(z)))]θg
生成器通过不断调整其生成过程,使得 Dθd(Gθg(z))D_{\theta_d}(G_{\theta_g}(z))Dθd(Gθg(z)) 越接近 1(即生成器希望判别器认为它的假图像是真实的)。
一个对抗的博弈:判别器试图正确区分真假图像,而生成器试图欺骗判别器,使其无法区分真假图像。
12.5.1.3 具体的训练过程
训练过程的两个阶段:
- 判别器的梯度上升(Gradient ascent on discriminator):
maxθd[Ex∼pdata[logDθd(x)]+Ez∼p(z)[log(1−Dθd(Gθg(z)))]]θd \max_{\theta_d} \left[\mathbb{E}_{x \sim p_{\text{data}}} \left[\log D_{\theta_d}(x)\right] + \mathbb{E}_{z \sim p(z)} \left[\log(1 - D_{\theta_d}(G_{\theta_g}(z)))\right]\right]θd θdmax[Ex∼pdata[logDθd(x)]+Ez∼p(z)[log(1−Dθd(Gθg(z)))]]θd
- 生成器的梯度下降(Gradient descent on generator):
minθgEz∼p(z)[log(1−Dθd(Gθg(z)))]θg \min_{\theta_g} \mathbb{E}_{z \sim p(z)} \left[\log(1 - D_{\theta_d}(G_{\theta_g}(z)))\right]θg θgminEz∼p(z)[log(1−Dθd(Gθg(z)))]θg
在实际中,优化生成器的目标函数并不十分有效:这主要是因为生成器在某些区域的梯度信号较弱。例如,当生成器的样本已经接近真实图像时,生成器获得的梯度信号就会变得非常小,导致更新不充分,训练效果变差。
12.5.1.4 训练的改进
- 生成器:转变为 最大化判别器判断错误的概率,即:
maxθgEz∼p(z)[logDθd(Gθg(z))]θg \max_{\theta_g} \mathbb{E}_{z \sim p(z)} \left[\log D_{\theta_d}(G_{\theta_g}(z))\right]θg θgmaxEz∼p(z)[logDθd(Gθg(z))]θg
通过最大化判别器判断错误的概率,在生成的样本质量较差时生成器获得了更强的梯度信号。
12.5.1.5 GAN 训练过程总览
for number of training iterations(训练迭代次数) do
for k steps do
- 从噪声先验 pg(z)p_g(z)pg(z) 中采样 m 个噪声样本 z(1),...,z(m){z^{(1)}, ..., z^{(m)}}z(1),...,z(m)。
- 从数据生成分布 pdata(x)p_{data}(x)pdata(x) 中采样 m 个样本 x(1),...,x(m){x^{(1)}, ..., x^{(m)}}x(1),...,x(m)。
- 通过梯度上升更新判别器的随机梯度:∇θd1m∑i=1m[logDθd(x(i))+log(1−Dθd(Gθg(z(i))))]\nabla_{\theta_d} \frac{1}{m} \sum_{i=1}^{m} \left[ \log D_{\theta_d}(x^{(i)}) + \log \left( 1 - D_{\theta_d}(G_{\theta_g}(z^{(i)})) \right) \right]∇θdm1∑i=1m[logDθd(x(i))+log(1−Dθd(Gθg(z(i))))]
end for
- 从噪声先验 pg(z)p_g(z)pg(z) 中采样 m 个噪声样本:z(1),…,z(m)z^{(1)}, \dots, z^{(m)}z(1),…,z(m)。
- 通过梯度上升更新生成器(改进):
∇θg1m∑i=1mlog(Dθd(Gθg(z(i))))\nabla_{\theta_g} \frac{1}{m} \sum_{i=1}^{m} \log \left( D_{\theta_d} \left( G_{\theta_g} \left( z^{(i)} \right) \right) \right)∇θgm1∑i=1mlog(Dθd(Gθg(z(i))))
end for
12.5.2 优化 GAN:添加卷积层
生成器是一个使用分数步长卷积的上采样网络,判别器是一个卷积网络。
稳定的深度卷积 GANs 的架构指导原则:
- 用步长卷积(判别器)和分数步长卷积(生成器)替换任何池化层。
- 在生成器和判别器中都使用批归一化(batchnorm)。
- 移除全连接的隐藏层以获得更深的架构。
- 在生成器中对除输出层外的所有层使用 ReLU 激活函数,输出层使用 Tanh 激活函数。
- 在判别器的所有层使用 LeakyReLU 激活函数。
12.5.3 GAN 年:2017 年
12.6 生成模型总结
PixelRNN 和 PixelCNN
- 特点:显式的密度模型,优化精确的似然性,生成良好的样本。
- 缺点:生成过程效率较低,因为是顺序生成的。
变分自编码器(VAE)
- 特点:优化似然性的变分下界,适用于潜在表示的学习和推断查询。
- 缺点:当前生成的样本质量不如其他模型。
生成对抗网络(GANs)
- 特点:博弈理论方法,生成最佳样本!
- 缺点:训练过程可能复杂且不稳定,且没有推断查询。