监督学习 vs 无监督学习分类、captioning、检测、分割等都属于监督学习,因为训练数据中显式包含 ( x , y ) (x,y) ( x , y ) ,要做的事情可以理解为学习一个函数去近似训练集中已有的 x → y x \rightarrow y x → y 映射,并且泛化到新样本。 聚类、降维以及密度估计等则属于无监督学习,训练数据中只包含 x x x ,目标也不是对齐某个现成的标签,而是需要模型自身从数据中去挖掘结构。 判别式 vs 生成式判别模型的建模对象是条件概率分布 P ( Y ∣ X ) P(Y | X) P ( Y ∣ X ) ,给定输入观测数据 X X X , 预测其对应标签 Y Y Y 的概率分布,其目标是学习特征与标签之间的映射关系,以寻找不同类别的数据在特征空间中的决策边界。
判别模型的竞争更多是标签之间的竞争,在判别模型 P ( Y ∣ X ) P(Y|X) P ( Y ∣ X ) 中,概率归一化是针对标签 Y Y Y 的,即对于每个固定的输入 X X X ,所有可能标签的概率之和为 1:
∑ y ∈ L a b e l s P ( Y = y ∣ X ) = 1 \sum_{y \in Labels}P(Y=y | X)=1 y ∈ L ab e l s ∑ P ( Y = y ∣ X ) = 1 模型只需要分辨当前图片更像是猫还是更像是狗,图片A 的分类结果与图片B 毫无关系,模型不需要比较图片A 和图片B 谁更像是一张真实的图片,因此即便不是猫也不是狗,模型也会输出相应的概率,即便实际上二者都不是,不符合真实世界的分布结构:
判别模型无法分辨是否为真实图片,只能分出二分类结果 生成模型的建模对象是联合概率分布 P ( X , Y ) P(X,Y) P ( X , Y ) 或边缘概率分布 P ( X ) P(X) P ( X ) ,在无标签的情况下学习 P ( X ) P(X) P ( X ) ,即数据本身的分布密度;而在有标签的情况下学习 P ( X ∣ Y ) P ( Y ) P(X|Y)P(Y) P ( X ∣ Y ) P ( Y ) ,即先学习每个类别的数据分布,再结合先验概率。其目标是学习数据在特征空间中的真实分布结构,模型需要理解什么样子的 X X X 是合理的,而不仅仅是这个 X X X 属于哪一类。
在生成模型 P ( X ) P(X) P ( X ) 中,概率归一化是针对输入空间 X X X 的,在整个高维数据空间中,所有可能输入样本 X X X 的概率密度积分(或求和)为 1:
∫ x ∈ D a t a S p a c e P ( x ) d x = 1 ∫_{x \in DataSpace} P(x)dx = 1 ∫ x ∈ D a t a Sp a ce P ( x ) d x = 1 模型必须给真实的、自然的图像分配较高的概率密度,同时必须压低那些不自然的、噪声的图像的概率密度。难点就在于数据空间极其巨大,模型必须精确地将概率密度集中在极小部分的真实数据流形上,如果模型给噪声图片分配了概率,那么真实图片的概率就必然会下降。
而条件生成模型 P ( X ∣ Y ) P(X|Y) P ( X ∣ Y ) 用于连接判别模型与生成模型,其不是在预测 Y Y Y , 而是在给定 Y Y Y 的条件下对 X X X 的分布进行建模。其将高维的数据空间划分为了多个子空间,模型要在 Y Y Y 指定的子空间中让符合条件的 X X X 竞争概率密度,这也是实践中最常用的方法。
条件生成模型在条件制定的子空间中输出符合条件的概率密度 虽然三者的功能不同,但是在数学上是完全耦合的:
根据贝叶斯公式,如果想要得到左边的条件生成模型,可以使用判别模型、无条件生成模型以及类别先验来计算出来。判别模型代表了有监督学习的能力(利用标签),生成模型代表了无监督学习的能力(理解数据分布),条件生成模型则是两者的结合体。
Taxonomy of Generative ModelsTaxonomy of Generative Models 根据能不能显式建模 P ( X ) P(X) P ( X ) ,可以将生成模型分为显式密度模型和隐式密度模型。
显式密度模型:模型可以明确地定义并优化密度函数 P ( X ) P(X) P ( X ) 的值。如果可以直接计算 P ( X ) P(X) P ( X ) 的值,则这一类模型可被划分到可解密度类别,代表模型是自回归模型。 如果 P ( X ) P(X) P ( X ) 难以直接计算,需要使用变分推断或者马尔科夫链蒙特卡洛近似,则这一类模型被划分到近似密度模型,代表模型是变分自编码器。 隐式密度模型:模型不直接定义密度函数 P ( X ) P(X) P ( X ) ,而是学习一个生成过程,能够从分布中采样。如果能够通过单次前向传播生成样本,则划分到直接采样模型,代表模型是生成对抗网络。 如果通过多步迭代过程生成样本,则比划分到迭代采样模型,代表模型为扩散模型。 Autoregressive Models在生成建模中,假设存在一个真实的、未知的概率分布 P d a t a ( x ) P_{data}(x) P d a t a ( x ) ,它生成了在现实世界中看到的图像,我们的目标是构建一个由参数 θ \theta θ 控制的模型分布 P m o d e l ( x , θ ) P_{model}(x, \theta) P m o d e l ( x , θ ) ,使得这个模型分布尽可能逼近真实的 P d a t a ( x ) P_{data}(x) P d a t a ( x ) 。而最大似然估计的思想就是,寻找一组参数 θ \theta θ ,使得在该组参数下,观察到的训练数据出现的概率最大。
具体的数学推导如下:假设我们的训练集 X X X 包含 N N N 个样本 ( x ( 1 ) , x ( 2 ) , … , x ( N ) (x^{(1)},x^{(2)},\dots,x^{(N)} ( x ( 1 ) , x ( 2 ) , … , x ( N ) ,且假设这些样本是独立同分布的。对于给定的参数 θ \theta θ ,整个数据集出现的联合概率(即似然 L L L )为每个样本概率的乘积:
L ( θ ) = ∏ i = 1 N P m o d e l ( x ( i ) ; θ ) L(\theta)=\prod^{N}_{i=1}P_{m o d el}(x^{(i)};\theta) L ( θ ) = i = 1 ∏ N P m o d e l ( x ( i ) ; θ ) 直接优化上述乘积在数值上非常不稳定,多个小于 1 的概率相乘会迅速趋近于 0 而导致下溢,因此通常对似然函数取自然对数。由于似然函数是递增的,最大化似然等价于最大化对数似然:
θ ∗ = arg max θ ∑ i = 1 N log P m o d e l ( x ( i ) ; θ ) \theta^{*} = \arg \max_{\theta} \sum_{i=1}^{N} \log P_{model}(x^{(i)}; \theta) θ ∗ = arg θ max i = 1 ∑ N log P m o d e l ( x ( i ) ; θ ) 这也是自回归模型的直接损失函数,在实际中沿用最小化 loss 的惯例,通常会将其写成最小化负对数似然:
min W − ∑ i = 1 N l o g P m o d e l ( x ( i ) ; θ ) \min_{W}-\sum_{i=1}^N log P_{model}(x^{(i)}; \theta) W min − i = 1 ∑ N l o g P m o d e l ( x ( i ) ; θ ) 为了理解为什么最大似然能够让模型学习到东西,需要引入 KL 散度的概念:KL 散度用于衡量两个概率分布之间的差异,在生成模型中,希望最小化真实数据分布 P d a t a P_{data} P d a t a 和模型分布 P m o d e l P_{m o de l} P m o d e l 之间的差异:
D K L ( P d a t a ∣ ∣ P m o d e l ) = ∑ x P d a t a ( x ) log P d a t a ( x ) P m o d e l ( x ) = ∑ x P d a t a ( x ) log P d a t a ( x ) − ∑ x P d a t a ( x ) log P m o d e l ( x ) \begin{aligned}
D_{KL}(P_{data}||P_{model}) &= \sum_{x} P_{data}(x) \log \frac{P_{data}(x)}{P_{model}(x)} \\
&= \sum_{x} P_{data}(x) \log P_{data}(x) - \sum_{x} P_{data}(x) \log P_{model}(x)
\end{aligned} D K L ( P d a t a ∣∣ P m o d e l ) = x ∑ P d a t a ( x ) log P m o d e l ( x ) P d a t a ( x ) = x ∑ P d a t a ( x ) log P d a t a ( x ) − x ∑ P d a t a ( x ) log P m o d e l ( x ) 其中第一项 ∑ x P d a t a ( x ) log P d a t a ( x ) \sum_{x} P_{data}(x) \log P_{data}(x) ∑ x P d a t a ( x ) log P d a t a ( x ) 是数据的熵,仅与数据集有关,对于模型参数 θ \theta θ 来说是常数。第二项 − ∑ x P d a t a ( x ) log P m o d e l ( x ) - \sum_{x} P_{data}(x) \log P_{model}(x) − ∑ x P d a t a ( x ) log P m o d e l ( x ) 是在最大似然中计算的对数似然的期望(取负号)。最大化自然估计在数学上严格等价于最小化真实数据分布与模型分布之间的 KL 散度。
自回归模型的基石是概率论中的链式法则。对于一张包含 n n n 个像素的图像 X X X ,将其展平为一个一维向量 X = ( x 1 , x 2 , … , x n ) X=(x_{1},x_{2},\dots,x_{n}) X = ( x 1 , x 2 , … , x n ) ,要建模的是联合概率分布 P ( X ) P(X) P ( X ) 。根据链式法则,任何联合分布都可以分解为条件概率的乘积
P ( X ) = ∏ i = 1 n P ( x i ∣ x 1 , x 2 , … , x i − 1 ) P(X)=\prod^{n}_{i=1}P(x_i|x_{1},x_{2},\dots,x_{i-1}) P ( X ) = i = 1 ∏ n P ( x i ∣ x 1 , x 2 , … , x i − 1 ) 即当前像素 x i x_{i} x i 的值,完全取决于它之前所有像素 x < i x_{<i} x < i 的值,而建模的目的就是构建一个函数,输入所有之前的像素 ( x 1 , x 2 , … , x i − 1 ) (x_{1},x_{2},\dots,x_{i-1}) ( x 1 , x 2 , … , x i − 1 ) ,输出是当前像素 x i x_{i} x i 的概率分布。
RNN 的结构刚好满足这一特点,很容易实现这种只看前缀的依赖关系,而 Transformer 也可以通过 masked attention 将注意力矩阵遮住,从而强制每个位置只能够依赖更早的 token,同样可以用于做自回归建模。自回归在语言处理中更加自然,因为语言本身就是 1D 序列,并且 token 本来就是离散的,而图像不是天然 1D,并且常常将图像当作连续值信号。为了简化问题,模型不将像素视为连续数值,而是将其视为离散分类问题:每个像素中有 RGB 三个通道,每个通道为 0-255,模型输出的是一个 256 维的 Softmax 概率分布,表示当前位置取值为 0-255 的值的概率。
有两种比较典型的自回归模型:PixelRNN 和 PixelCNN。
PixelRNN:图像是二维的,RNN 是一维的,通常采用光栅扫描顺序,从左上角开始一行一行扫描到右下角。模型的输入是当前像素 x i x_{i} x i ,隐藏状态 h i h_{i} h i 编码了之前所有像素的信息,输出是预测下一个像素 x i + 1 x_{i+1} x i + 1 的 Softmax 分布。在扫描顺序上的不同,又有两种不同的变体:利用 LSTM 层进行逐行处理的 Row LSTM,这种方式的上下文呈三角形,即某个像素只能够看到它正上方三家形区域内的像素,无法有效利用其左侧或右侧的完整上下文信息;按照图像的对角线方向进行扫描和计算的 Diagonal BiLSTM,优点是其能够捕获全图的依赖关系,但是计算极其昂贵,难以并行。 PixelCNN:为了解决 RNN 计算速度慢的问题,引入了 PixelCNN。其使用标准的卷积神经网络来对 P ( x i ∣ x < i ) P(x_{i}| x_{<i}) P ( x i ∣ x < i ) 进行建模,对于图像中的某个位置 ( h , w ) (h,w) ( h , w ) ,使用一个卷积核在该位置提取特征,并将特征映射为一个 256 维的向量。标准的卷积核会同时覆盖中心像素,违反了自回归的定义,因此需要通过掩码强行将卷积核中未来位置的权重变为 0,例如对于一个 3 × 3 3\times 3 3 × 3 的卷积核,中心点极其右下方所有的权重在计算前通过一个二进制掩码乘法强制变为 0,这样在预测当前像素时,只能利用到其左上方的信息。 可是实际上如果真的把图像当作子像素序列,那么当分辨率变大时,序列长度会爆炸,一张 1024 × 1024 1024 \times 1024 1024 × 1024 的图像是 3M 个像素的序列,生成时需要一步一步预测 300 万次,在推理延迟上是无法接受的。
Variational Autoencoders自回归模型属于显示密度并且能够给出真实的 p ( x ) p(x) p ( x ) :将序列逐步分解为条件概率并连乘,就能得到一个样本的精确密度值,但是其代价是采样需要逐步生成,速度受限于序列长度与自回归依赖结构。VAE 也会围绕 p ( x ) p(x) p ( x ) 进行建模,但是其得到的是对数似然的下界(近似)。
Autoencoders普通自编码器将图像 x x x 映射为低维特征向量 z z z ,解码器将 z z z 还原为重建图像 x ^ \hat{x} x ^ 。对应的损失函数是重建损失,通常是 L2 范数 ∣ ∣ x = x ^ ∣ ∣ 2 ||x = \hat{x}||^2 ∣∣ x = x ^ ∣ ∣ 2 。
但是普通的 Autoencoders 的隐空间 z z z 是不规则的、不连续的。如果在训练好的隐空间中随机采样一个点,解码器通常会输出无意义的噪声,因此普通 Autoencoders 只能做特征压缩,不能做生成模型(因为不知道 z z z 的分布 P ( z ) P(z) P ( z ) ,无法从中采样)。
Variational Autoencoders(VAE)VAE 对隐变量 z z z 做了一个强假设:所有图像 x x x 都是由一个潜在的随机变量 z z z 生成的,且 z z z 服从某个先验分布 P ( z ) P(z) P ( z ) (通常假设为标准正态分布 N ( 0 , I ) \mathcal{N}(0,I) N ( 0 , I ) )。
目标是最大化观测数据 x x x 的对数似然 l o g P θ ( x ) logP_{\theta}(x) l o g P θ ( x ) ,根据全概率公式:
P θ ( x ) = ∫ P θ ( x ∣ z ) P θ ( z ) d z P_{\theta}(x)=∫P_{\theta}(x|z)P_{\theta}(z)dz P θ ( x ) = ∫ P θ ( x ∣ z ) P θ ( z ) d z 但是这个积分是不可解的,因为 z z z 是高维向量,遍历所有可能的 z z z 进行积分在计算量上是不可能的,并且如果试图求真实的后验分布P ( z ∣ x ) = P ( x ∣ z ) P ( z ) P ( x ) P(z|x)=\frac{P(x|z)P(z)}{P(x)} P ( z ∣ x ) = P ( x ) P ( x ∣ z ) P ( z ) ,由于分母 P θ ( x ) P_{\theta}(x) P θ ( x ) 不可解,导致后验分布也不可解。既然不可解,那就使用神经网络去拟合,可以定义近似后验分布 Q ϕ ( z ∣ x ) Q_{\phi}(z|x) Q ϕ ( z ∣ x ) ,由参数为 ϕ \phi ϕ 的编码器网络输出。这样就能够得到一对网络:解码器 P θ ( x ∣ z ) P_{\theta}(x|z) P θ ( x ∣ z ) 负责从隐变量生成数据,编码器 Q ϕ ( z ∣ x ) Q_{\phi}(z|x) Q ϕ ( z ∣ x ) 负责从数据反推隐变量的分布,并且两者共同训练。
利用后验分布 ∫ Q ϕ ( z ∣ x ) d z = 1 ∫Q_{\phi}(z|x)dz=1 ∫ Q ϕ ( z ∣ x ) d z = 1 的性质,可以将 l o g P θ ( x ) logP_{\theta}(x) l o g P θ ( x ) 写成期望的形式:
log P θ ( x ) = log P θ ( x ) ⋅ ∫ Q ϕ ( z ∣ x ) d z = ∫ Q ϕ ( z ∣ x ) log P θ ( x ) d z ( 因为 P ( x ) 与 z 无关,可移入积分内 ) \begin{aligned}
\log P_{\theta}(x) &= \log P_{\theta}(x) \cdot \int Q_{\phi}(z|x)dz \\
&= \int Q_{\phi}(z|x) \log P_{\theta}(x)dz \quad (\text{因为 } P(x) \text{ 与 } z \text{ 无关,可移入积分内})
\end{aligned} log P θ ( x ) = log P θ ( x ) ⋅ ∫ Q ϕ ( z ∣ x ) d z = ∫ Q ϕ ( z ∣ x ) log P θ ( x ) d z ( 因为 P ( x ) 与 z 无关,可移入积分内 ) 利用贝叶斯公式 P ( x ) = P ( x , z ) P ( z ∣ x ) P(x)=\frac{P(x,z)}{P(z|x)} P ( x ) = P ( z ∣ x ) P ( x , z ) 带入上式:
log P θ ( x ) = ∫ Q ϕ ( z ∣ x ) log ( P θ ( x , z ) P θ ( z ∣ x ) ) d z \log P_{\theta}(x)=∫Q_{\phi}(z|x)\log\left( \frac{P_{\theta}(x,z)}{P_{\theta}(z|x)} \right)dz log P θ ( x ) = ∫ Q ϕ ( z ∣ x ) log ( P θ ( z ∣ x ) P θ ( x , z ) ) d z 接着在分数上下同时乘以 Q ϕ ( z ∣ x ) Q_{\phi}(z|x) Q ϕ ( z ∣ x ) :
log P θ ( x ) = ∫ Q ϕ ( z ∣ x ) log ( P θ ( x , z ) Q ϕ ( z ∣ x ) ⋅ Q ϕ ( z ∣ x ) P θ ( z ∣ x ) ) d z = ∫ Q ϕ ( z ∣ x ) log ( P θ ( x , z ) Q ϕ ( z ∣ x ) ) d z ⏟ 第一部分 + ∫ Q ϕ ( z ∣ x ) log ( Q ϕ ( z ∣ x ) P θ ( z ∣ x ) ) d z ⏟ 第二部分 \begin{aligned}
\log P_{\theta}(x) &= \int Q_{\phi}(z|x) \log \left( \frac{P_{\theta}(x, z)}{Q_{\phi}(z|x)} \cdot \frac{Q_{\phi}(z|x)}{P_{\theta}(z|x)} \right) dz \\
&= \underbrace{\int Q_{\phi}(z|x) \log \left( \frac{P_{\theta}(x, z)}{Q_{\phi}(z|x)} \right) dz}_{\text{第一部分}} + \underbrace{\int Q_{\phi}(z|x) \log \left( \frac{Q_{\phi}(z|x)}{P_{\theta}(z|x)} \right) dz}_{\text{第二部分}}
\end{aligned} log P θ ( x ) = ∫ Q ϕ ( z ∣ x ) log ( Q ϕ ( z ∣ x ) P θ ( x , z ) ⋅ P θ ( z ∣ x ) Q ϕ ( z ∣ x ) ) d z = 第一部分 ∫ Q ϕ ( z ∣ x ) log ( Q ϕ ( z ∣ x ) P θ ( x , z ) ) d z + 第二部分 ∫ Q ϕ ( z ∣ x ) log ( P θ ( z ∣ x ) Q ϕ ( z ∣ x ) ) d z 其中第一部分为 ELBO (Evidence Lower Bound):
E L B O = ∫ Q ϕ ( z ∣ x ) log ( P θ ( x , z ) Q ϕ ( z ∣ x ) ) d z ELBO=\int Q_{\phi}(z|x) \log \left( \frac{P_{\theta}(x, z)}{Q_{\phi}(z|x)} \right) dz E L BO = ∫ Q ϕ ( z ∣ x ) log ( Q ϕ ( z ∣ x ) P θ ( x , z ) ) d z 第二部分为近似后验 Q Q Q 与真实后验 P P P 之间的 KL 散度(D K L ≥ 0 D_{KL}\geq 0 D K L ≥ 0 ):
D K L ( Q ϕ ( z ∣ x ) ∣ ∣ P θ ( z ∣ x ) ) = ∫ Q ϕ ( z ∣ x ) log ( Q ϕ ( z ∣ x ) P θ ( z ∣ x ) ) d z D_{KL}(Q_{\phi}(z∣x)∣∣P_{\theta}(z∣x))=\int Q_{\phi}(z|x) \log \left( \frac{Q_{\phi}(z|x)}{P_{\theta}(z|x)} \right) dz D K L ( Q ϕ ( z ∣ x ) ∣∣ P θ ( z ∣ x )) = ∫ Q ϕ ( z ∣ x ) log ( P θ ( z ∣ x ) Q ϕ ( z ∣ x ) ) d z 因为无法计算 D K L D_{KL} D K L (其包含未知的真实后验 P ( z ∣ x ) P(z|x) P ( z ∣ x ) ,无法直接最大化 log P ( x ) \log P(x) log P ( x ) ),但是可以最大化 ELBO,如果将 ELBO 最大化,真实的对数似然的下界也就最大化,并且当 ELBO 最大化时,同时也意味着 D K L D_{KL} D K L 最小化,此时近似分布 Q Q Q 也就越来越接近真实分布 P P P 。
为了进一步得到 loss function,可以将 ELBO 展开:
E L B O = E z ∼ Q [ log P θ ( x , z ) − log Q ϕ ( z ∣ x ) ] = E z ∼ Q [ log ( P θ ( x ∣ z ) P θ ( z ) ) − log Q ϕ ( z ∣ x ) ] = E z ∼ Q [ log P θ ( x ∣ z ) + log P θ ( z ) − log Q ϕ ( z ∣ x ) ] = E z ∼ Q [ log P θ ( x ∣ z ) ] ⏟ 重建项 − D K L ( Q ϕ ( z ∣ x ) ∣ ∣ P θ ( z ) ) ⏟ 正则化项 \begin{aligned}
ELBO &= \mathbb{E}_{z \sim Q} [\log P_{\theta}(x, z) - \log Q_{\phi}(z|x)] \\
&= \mathbb{E}_{z \sim Q} [\log (P_{\theta}(x|z)P_{\theta}(z)) - \log Q_{\phi}(z|x)] \\
&= \mathbb{E}_{z \sim Q} [\log P_{\theta}(x|z) + \log P_{\theta}(z) - \log Q_{\phi}(z|x)] \\
&= \underbrace{\mathbb{E}_{z \sim Q} [\log P_{\theta}(x|z)]}_{\text{重建项}} - \underbrace{D_{KL}(Q_{\phi}(z|x)||P_{\theta}(z))}_{\text{正则化项}}
\end{aligned} E L BO = E z ∼ Q [ log P θ ( x , z ) − log Q ϕ ( z ∣ x )] = E z ∼ Q [ log ( P θ ( x ∣ z ) P θ ( z )) − log Q ϕ ( z ∣ x )] = E z ∼ Q [ log P θ ( x ∣ z ) + log P θ ( z ) − log Q ϕ ( z ∣ x )] = 重建项 E z ∼ Q [ log P θ ( x ∣ z )] − 正则化项 D K L ( Q ϕ ( z ∣ x ) ∣∣ P θ ( z )) 其中 E z ∼ Q \mathbb{E}_{z\sim Q} E z ∼ Q 为在 z z z 服从 Q Q Q 分布下的数学期望,有 E z ∼ Q [ f ( z ) ] = ∫ Q ϕ ( z ∣ x ) f ( z ) d x \mathbb{E}_{z\sim Q}[f(z)]=\int Q_{\phi}(z|x)f(z) \, dx E z ∼ Q [ f ( z )] = ∫ Q ϕ ( z ∣ x ) f ( z ) d x ,即积分转期望。 这样就得到了 Loss function:
L o s s = − Reconstruction + KL Divergence Loss = - \text{Reconstruction} + \text{KL Divergence} L oss = − Reconstruction + KL Divergence 这两项对于潜空间的参数几乎是相反的,重建项希望编码器输出的分布尽可能退化为确定值 ∑ z ∣ x → 0 \sum_{z|x} \rightarrow 0 ∑ z ∣ x → 0 ,并且每个样本 μ z ∣ x \mu_{z|x} μ z ∣ x 都是独一无二的编码,这样解码器可以根据特征来近乎无损地从 z z z 确定性重建回 x x x ;而正则化项目希望无论输出是什么,编码器输出的 Q ϕ ( z ∣ x ) Q_{\phi}(z|x) Q ϕ ( z ∣ x ) 都尽量接近规定的先验 p ( z ) = N ( 0 , I ) p(z)=\mathcal{N}(0,I) p ( z ) = N ( 0 , I ) ,将均值推向 0,方差推向 1,这会强行让潜空间更加规整、连续、可采样。VAE 训练实际上是在这两种偏好之中寻找一个平衡,既要能够重建,又要让潜空间整体贴近一个简单先验,从而支持生成。
在具体的训练过程中,需要对编码器的参数 ϕ \phi ϕ 求偏导 ∇ ϕ \nabla_{\phi} ∇ ϕ ,ELBO 中包含期望项 E z ∼ Q \mathbb{E}_{z\sim Q} E z ∼ Q ,因此需要从分布 Q ϕ ( z ∣ x ) Q_{\phi}(z|x) Q ϕ ( z ∣ x ) 中采样一个 z z z 。假设编码器输出均值 μ \mu μ 和方差 σ 2 \sigma^2 σ 2 ,如果直接采样 z ∼ N ( μ , σ 2 ) z \sim \mathcal{N}(\mu,\sigma^2) z ∼ N ( μ , σ 2 ) ,这个采样是随机且不可微的,这就导致计算图在这里断开了,梯度无法通过 z z z 传回 μ \mu μ 和 σ \sigma σ 。为了解决这个问题,需要将随机性从网络时间线中剥离出来,引入一个独立的辅助噪声变量 ϵ \epsilon ϵ ,其服从正态分布,且不依赖于网络参数:
ϵ ∼ N ( 0 , I ) \epsilon \sim \mathcal{N}(0,I) ϵ ∼ N ( 0 , I ) 然后将 z z z 重写为一个关于 μ , σ , ϵ \mu,\sigma,\epsilon μ , σ , ϵ 的确定性函数 g g g :
z = g ( μ , σ , ϵ ) = μ + σ ⊙ ϵ z = g(\mu, \sigma, \epsilon)=\mu + \sigma \odot \epsilon z = g ( μ , σ , ϵ ) = μ + σ ⊙ ϵ 这样反向传播就能够工作了,对于 μ \mu μ 有 ∂ L ∂ μ = ∂ L ∂ z ⋅ ∂ z ∂ μ \frac{\partial L}{\partial \mu} = \frac{\partial L}{\partial z} \cdot \frac{\partial z}{\partial \mu} ∂ μ ∂ L = ∂ z ∂ L ⋅ ∂ μ ∂ z , 根据公式 z = μ + σ ⊙ ϵ z =\mu + \sigma \odot \epsilon z = μ + σ ⊙ ϵ ,有 ∂ z ∂ μ = 1 \frac{\partial z}{\partial \mu}=1 ∂ μ ∂ z = 1 ,梯度可以无损流过去;对于 σ \sigma σ ,有 ∂ L ∂ σ = ∂ L ∂ z ⋅ ∂ z ∂ σ \frac{\partial L}{\partial \sigma} = \frac{\partial L}{\partial z} \cdot \frac{\partial z}{\partial \sigma} ∂ σ ∂ L = ∂ z ∂ L ⋅ ∂ σ ∂ z ,显然 ∂ z ∂ σ = ϵ \frac{\partial z}{\partial \sigma} = \epsilon ∂ σ ∂ z = ϵ ,梯度也可以流过去,且受到当前噪声强度 ϵ \epsilon ϵ 的调节。
Generative Adversarial Networks (GANs) Generative Adversarial Networks (GANs)显式模型视图直接对概率分布 P ( x ) P(x) P ( x ) 进行建模,而 GAN(隐式模型)则放弃了显式计算 P ( x ) P(x) P ( x ) 的具体数值,其主张是通过构建一个系统,从分布 P ( x ) P(x) P ( x ) 中采样出样本 z z z ,然后将 z z z 输入到生成器网络 G G G 中,输出一张图 x = G ( z ) x=G(z) x = G ( z ) ,这会在数据空间中诱导出一个生成器分布 p G ( x ) p_{G}(x) p G ( x ) (无法将其写成一个可计算的密度函数,但是其确实定义了会采样到什么样的样本)。GAN 的训练目标就是让 p G p_{G} p G 逐渐逼近真实数据分布 p d a t a p_{data} p d a t a 。
既然无法显式计算出 p G ( x ) p_{G}(x) p G ( x ) ,评判生成器 G G G 生成图像的质量就需要使用另外一个网络判别器 D D D 。判别器接收一张图 x x x ,输出一个标量 D ( x ) D(x) D ( x ) ,并且将其解释为“生成图像来自于真实数据的概率”:
D ( x ) = P ( x i s r e a l ) D(x)=P(\mathrm{x \ is\ real}) D ( x ) = P ( x is real ) 即 D ( x ) = 1 D(x)=1 D ( x ) = 1 则图像越“真实”,D ( x ) = 0 D(x)=0 D ( x ) = 0 则图像越“假”。
因此 GAN 主要由两个独立的神经网络组成,它们在一个博弈的框架下同时训练:
生成器:输入是从一个简单的先验分布(通常是标准正态分布或均匀分布)采样的随机噪声向量 z z z ,即 z ∼ p z z \sim p_{z} z ∼ p z ;输出是生成的图像 x f a k e = G ( z ) x_{fake}=G(z) x f ak e = G ( z ) ;其功能是学习一个映射函数,将低维的随机噪声空间映射到高维的数据(图像)空间,其目的是欺骗判别器。 判别器:输入是一张图像 x x x (可能是真实的,也可能是生成的), 输出是一个标量概率值 D ( x ) ∈ [ 0 , 1 ] D(x) \in [0,1] D ( x ) ∈ [ 0 , 1 ] ,表示输入图像是“真实数据”的概率;其本质上是一个二分类器,若输出接近 1,表示它认为输入是真图,若接近 0,表示是假图。 GAN 的训练过程被建模为一个极小极大问题,目标函数为: min G max D ( E x ∼ p d a t a [ log D ( x ) ] + E z ∼ p ( z ) [ log ( 1 − D ( G ( z ) ) ) ] ) \min_G \max_D (\mathbb{E}_{x \sim p_{data}}[\log D(x)]+\mathbb{E}_{z \sim p(z)}[\log(1-D(G(z)))]) G min D max ( E x ∼ p d a t a [ log D ( x )] + E z ∼ p ( z ) [ log ( 1 − D ( G ( z )))]) 从判别器 D D D 的视角来看,判别器希望最大化上述目标函数,第一项 E x ∼ p d a t a [ log D ( x ) ] \mathbb{E}_{x \sim p_{data}}[\log D(x)] E x ∼ p d a t a [ log D ( x )] 对于真实的数据 x x x ,D ( x ) D(x) D ( x ) 应当趋近于 1,从而使 log D ( x ) \log D(x) log D ( x ) 最大,第二项 E z ∼ p ( z ) [ log ( 1 − D ( G ( z ) ) ) ] \mathbb{E}_{z \sim p(z)}[\log(1-D(G(z)))] E z ∼ p ( z ) [ log ( 1 − D ( G ( z )))] 对于生成的数据 G ( z ) G(z) G ( z ) ,D ( G ( z ) ) D(G(z)) D ( G ( z )) 应当趋近于 0,从而使 1 − D ( G ( z ) ) 1-D(G(z)) 1 − D ( G ( z )) 趋近于 1,进而使得对数项最大。
而从生成器的视角来看,生成器希望最小化上述目标函数,第一项与 G G G 无关,第二项 G G G 希望生成的图像被判别器误判为真,即希望 D ( G ( z ) ) D(G(z)) D ( G ( z )) 趋近于 1。这会导致 log ( 1 − D ( G ( z ) ) ) \log (1-D(G(z))) log ( 1 − D ( G ( z ))) 趋向于 log ( 0 ) \log(0) log ( 0 ) ,即负无穷,从而最小化目标函数。
在实际训练时,由于一边是 max D \max_{D} max D ,一边是 min G \min_G min G ,因此训练时不会像分类网络一样只做一次梯度下降,而是对 D D D 做梯度上升,对 G G G 做梯度下降,并且交替进行。通常的训练策略是固定 G G G ,更新 k k k 次 D D D ,然后固定 D D D ,更新 1 次 G G G 。在理论上当且仅当生成数据的分布 p g p_{g} p g 完全等同于真实数据分布 p d a t a p_{data} p d a t a 时,博弈达到纳什均衡,此时判别器无法区分真假,对于任何输入,其输出恒为 D ( x ) = 0.5 D(x)=0.5 D ( x ) = 0.5 ,具体的数学推导可见文章末尾处。
在训练初期时,生成器很差,判别器很容易分辨真伪,此时 D ( G ( z ) ) D(G(z)) D ( G ( z )) 会很接近 0,当 D ( G ( z ) ) ≈ 0 D(G(z)) ≈ 0 D ( G ( z )) ≈ 0 时,log ( 1 − D ( G ( z ) ) ) \log(1-D(G(z))) log ( 1 − D ( G ( z ))) 的梯度非常平缓,即生成器在训练初期会很难获得足够大的梯度来更新参数,导致学习停滞。
为了解决这个问题,提出的改进是不再最小化 log ( 1 − D ( G ( z ) ) ) \log(1-D(G(z))) log ( 1 − D ( G ( z ))) ,而是改为最大化 log ( D ( G ( z ) ) ) \log (D(G(z))) log ( D ( G ( z ))) ,两者在数学逻辑上都在表达欺骗判别器,但是函数 l o g ( D ( G ( z ) ) ) log(D(G(z))) l o g ( D ( G ( z ))) 在 D ( G ( z ) ) D(G(z)) D ( G ( z )) 接近 0 时的梯度非常大,这保证了训练初期生成器能够获得强大的梯度信号,加速收敛。
典型 GAN 架构 DC-GAN生成器 G 和判别器 D 在实现上就是两个神经网络,当时最主流的选择是 CNN,而 DCGAN 是第一个在 nontoy 数据上给出非平凡结果的经典 GAN 架构。
DC-GAN 所做的是将 GAN 这一套对抗训练第一次与一套相对可复现的卷积神经网络绑定在一起,用卷积堆叠来做判别器的逐步下采样,用转置卷积和卷积堆叠来做生成器的逐步放大,并且配合一系列稳定训练的细节。
Style GANStyle GAN 使用更加复杂的结构,并且通过自适应归一化将噪声/风格信息注入到不同层里。
公式 A d a I N ( x , w , b ) i AdaIN(x,w,b)_{i} A d a I N ( x , w , b ) i 先把特征 x i x_{i} x i 做归一化(去均值,除方差),然后再用来自风格/控制信号的 ( w , b ) (w,b) ( w , b ) 来做逐通道的缩放与平移,这在每一层都向模型注入了信息,能够获得更强的可控性与可解释的变化方向,且能够得到更高质量、更稳定的生成细节。
潜空间往往是平滑的,因此可以从随机两个潜空间变量 z 0 , z 1 z_{0},z_{1} z 0 , z 1 出发做插值
z t = t z 0 + ( 1 − t ) z 1 , x t = G ( z t ) z_{t}=tz_{0}+(1-t)z_{1}, \ \ x_{t}=G(z_{t}) z t = t z 0 + ( 1 − t ) z 1 , x t = G ( z t ) 这样能够看到生成图像 x t x_{t} x t 随着 t t t 的变化呈现连续、平滑的过渡,生成器学习到的映射在潜空间中具有连续的语义结构。
但是 GAN 的缺点也很明显:没有显式的、可解释的 loss 曲线、训练不稳定、难以扩展到更大的模型和更大的数据,例如训练过程中可能或会突然模式崩塌、突然出现 NaN/Inf、判别器/生成器发散等。
Diffusion ModelsDiffusion Model 做的事情是将从简单的噪声分布 p n o i s e p_{noise} p n o i se 采样逐步变成真实的数据分布 p d a t a p_{data} p d a t a 这件事写成一个训练特别像监督学习回归的模型以及采样可以用固定步数迭代的生成过程。 传统的生成模型试图直接学习噪声 Z Z Z 到数据 X X X 的映射,而扩散模型的核心是定义一个过程。假设模型有两个状态:
X 0 X_{0} X 0 :真实的数据分布,例如清晰的猫的照片。X 1 X_{1} X 1 :先验噪声分布,例如标准高斯分布 N ( 0 , I ) \mathcal{N}(0,I) N ( 0 , I ) 。 假设数据与噪声之间存在一条直接路径,并且对于任意时间步 t ∈ [ 0 , 1 ] t \in [0,1] t ∈ [ 0 , 1 ] ,可以定义一个中间状态 X t X_{t} X t :X t = ( 1 − t ) X 0 + t X 1 X_{t}=(1-t)X_{0}+tX_{1} X t = ( 1 − t ) X 0 + t X 1 当 t = 0 t=0 t = 0 时,X t X_{t} X t 是纯数据;当 t = 1 t=1 t = 1 时,X t X_{t} X t 是纯噪声。对时间 t t t 求导,得到这条路径上的速度:
d X t d t = X 1 − X 0 \frac{d X_{t}}{d t}=X_{1}-X_{0} d t d X t = X 1 − X 0 X 1 − X 2 X_{1}-X_{2} X 1 − X 2 即为要学习的目标向量,其指示了前向传播中如何从当前混合状态向噪声移动,而为了变成真实的图像,会在推理时沿着这个向量的负方向移动。
在训练阶段,由于无法预知测试时的噪声,因此还需要训练一个神经网络 v θ v_{\theta} v θ 来拟合速度场。网络的输入为当前的含噪图像 X t X_{t} X t 和当前的时间步 t t t ,输出为预测的速度向量 v θ ( X t , t ) v_{\theta}(X_{t},t) v θ ( X t , t ) ,这个向量指向 X 1 − X 0 X_{1}-X_{0} X 1 − X 0 的方向。训练的目标是一个均方误差回归问题:
L ( θ ) = E t , X 0 , X 1 [ ∣ ∣ v θ ( X t , t ) − ( X 1 − X 0 ) ∣ ∣ 2 ] \mathcal{L}(\theta)=\mathbb{E}_{t,X_{0},X_{1}}[|| v_{\theta}(X_{t}, t) - (X_{1}-X_{0})|| ^2] L ( θ ) = E t , X 0 , X 1 [ ∣∣ v θ ( X t , t ) − ( X 1 − X 0 ) ∣ ∣ 2 ] 使用 MSE 去拟合一个目标时,模型最终收敛到的最优解是目标的条件期望:
v ∗ ( X t , t ) = E [ X 1 − X 0 ∣ X t ] v^*(X_{t},t)=\mathbb{E}[X_{1}-X_{0}|X_{t}] v ∗ ( X t , t ) = E [ X 1 − X 0 ∣ X t ] 在训练过程中,同一个中间状态 X t X_{t} X t 可能由多种不同的真实数据 X 0 X_{0} X 0 和噪声 X 1 X_{1} X 1 组合生成,由于神经网络对固定的输入 X t X_{t} X t 只能输出一个确定的预测值,无法同时指向所有的可能的方向,因此模型学习到的不是某一个具体的真实图像的方向,而是可能所有来源的加权平均值。模型相当于在预测考虑当前模糊的图像,原本清晰图像最有可能的平均形态是什么。
扩散过程在不同时间步 t t t 的学习价值是不均等的,标准的训练流程中采用均匀分布进行时间步采样,即 t ∼ U n i f o r m ( 0 , 1 ) t \sim \mathrm{Uniform(0,1)} t ∼ Uniform ( 0 , 1 ) ,这意味着模型在训练过程中花费了等量的计算资源在简单的边界条件 (t ≈ 0 t \approx 0 t ≈ 0 和 t ≈ 1 t \approx 1 t ≈ 1 )与复杂的中间状态 (t ≈ 0.5 t \approx 0.5 t ≈ 0.5 )上。
在纯噪声端,v ∗ ( X t , t ) = E [ X 1 − X 0 ∣ X t ] = E [ X 1 ∣ X 1 ] − E [ X 0 ∣ X 1 ] v^*(X_{t},t)=\mathbb{E}[X_{1}-X_{0}|X_{t}]=\mathbb{E}[X_{1}|X_{1}]-\mathbb{E}[X_{0}|X_{1}] v ∗ ( X t , t ) = E [ X 1 − X 0 ∣ X t ] = E [ X 1 ∣ X 1 ] − E [ X 0 ∣ X 1 ] ,第一项 E [ X 1 ∣ X 1 ] \mathbb{E}[X_{1}|X_{1}] E [ X 1 ∣ X 1 ] 因为已知 X 1 X_{1} X 1 ,因此期望就是 X 1 X_{1} X 1 本身;第二项 E [ X 0 ∣ X 1 ] \mathbb{E}[X_{0}|X_{1}] E [ X 0 ∣ X 1 ] 因为数据 X 0 X_{0} X 0 和噪声 X 1 X_{1} X 1 是相互独立的,噪声不包含任何关于图片的信息,因此最好的猜测就是整个数据集的均值,通常数据会归一化,因此均值为 0。因此在纯噪声端最优预测就退化为 v ∗ ≈ X 1 − 0 = X 1 v^* \approx X_{1}-0=X_{1} v ∗ ≈ X 1 − 0 = X 1 ,模型只需要学习一个简单的恒等映射而在纯数据端的推导几乎同理,只不过最优预测退化为了 v ∗ ≈ 0 − X 0 = − X 0 v^* \approx 0 - X_{0}=-X_{0} v ∗ ≈ 0 − X 0 = − X 0 。而在中间阶段,输入是一张带噪的模糊图,既不能忽略 X 0 X_{0} X 0 ,也不能忽略 X 1 X_{1} X 1 ,一个模糊的 X t X_{t} X t 可能源自不同的数据和不同的噪声组合,因此模型需要根据隐约的纹理去猜测输入到底是什么,这就变成了一个高度非线性的、依赖于语义信息内容的复杂函数,理应分配更多算力。
为了解决这个算力不均匀的问题,引入非均匀的采样分布 p ( t ) p(t) p ( t ) 。通过调整采样概率密度函数(通常是 Logit-Normal 分布或 Beta 分布),将重心位于中间噪声,通过人为提高中间时间步的采样概率,降低两端极端情况的采样概率,迫使模型在训练过程中更多地暴露与高难度的混合状态。
具体的训练步骤为先从数据集中采样一张真实图片 X 0 X_{0} X 0 ,从高斯分布中采样一个噪声 X 1 X_{1} X 1 ,随机采样一个时间 t ∈ [ 0 , 1 ] t \in [0,1] t ∈ [ 0 , 1 ] ,根据线性插值公式构造输入 X t = ( 1 − t ) X 0 + t X 1 X_{t}=(1-t)X_{0}+tX_{1} X t = ( 1 − t ) X 0 + t X 1 ,计算 Ground Truth 的速度 V = X 1 − X 0 V=X_{1}-X_{0} V = X 1 − X 0 ,让神经网络预测 v p r e d = v θ ( X t , t ) v_{pred}=v_{\theta}(X_{t},t) v p re d = v θ ( X t , t ) ,并且计算与 V V V 的 MSE 损失进行反向传播。
训练完成之后,神经网络 v θ v_{\theta} v θ 学会了定义在整个空间上的速度场,推理过程就是顺着这个速度场流动,初始化时从标准正态分布采样纯噪声 X 1 ∼ N ( 0 , I ) X_{1} \sim \mathcal{N}(0,I) X 1 ∼ N ( 0 , I ) ,要从 t = 1 t=1 t = 1 逆向走向 t = 0 t=0 t = 0 , 这在本质上是在求解一个常微分方程:
d X t = v θ ( X t , t ) d t dX_{t}=v_{\theta}(X_{t},t)dt d X t = v θ ( X t , t ) d t 最简单的方式是使用欧拉法进行离散化迭代:
X t − Δ t = X t − Δ t ⋅ v θ ( X t , t ) X_{t-\Delta t}=X_{t}-\Delta t \cdot v_{\theta}(X_{t},t) X t − Δ t = X t − Δ t ⋅ v θ ( X t , t ) 重复上述步骤 N N N 次后,最终得到的 X 0 X_{0} X 0 就是生成的清晰图像。
GAN 是一次前向传播生成,而扩散模型是多次迭代生成,这就导致扩散模型推理速度较慢,但是生成的质量更高,且训练极其稳定。
Classifier-Free Guidance (CFG)在条件扩散模型中,需要学习的是条件概率分布 p ( x ∣ c ) p(x|c) p ( x ∣ c ) ,其中 x x x 是图像,c c c 是条件(例如文本嵌入)。如果只是简单地将条件 c c c 作为输入用于训练神经网络 v θ ( x t , t , c ) v_{\theta}(x_{t},t,c) v θ ( x t , t , c ) ,模型往往会忽略 c c c ,这是因为在训练集中,图像 x x x 包含的信息往往远多于文本 c c c ,模型即使忽略 c c c ,仅依靠学习无条件分布 p ( x ) p(x) p ( x ) 也能够将损失函数降到很低。结果就是生成的图像质量很高,但是跟输入的条件无关(如 Prompt)。
早期的解决方案是分类器引导:通过额外训练一个噪声图像分类器 f ( x t , t ) → y f(x_{t},t) \rightarrow y f ( x t , t ) → y ,推理时,计算分类器的梯度 ∇ x t log p ( y ∣ x t ) \nabla_{x_{t}}\log p(y|x_{t}) ∇ x t log p ( y ∣ x t ) ,用这个梯度去推扩散生成的方向,强迫图像包含特定的类别,但是缺点是需要训练额外的分类器,分类器在强噪声下很难训练且计算成本高。
而 CFG 采取的策略是训练一个神经网络,使其同时具有“有条件生成”和“无条件生成”的能力。具体的方式是在训练过程中,以一定的概率 p u n c o n d p_{uncond} p u n co n d 将条件 c c c 替换为一个特殊的空向量,这样一部分时间用于训练 v θ ( x , t , Θ ) v_{\theta}(x,t,\Theta) v θ ( x , t , Θ ) ,学习无条件分布 p ( x ) p(x) p ( x ) ;一部分时间用于训练 v θ ( x t , t , c ) v_{\theta}(x_{t},t,c) v θ ( x t , t , c ) ,学习条件分布 p ( x ∣ c ) p(x|c) p ( x ∣ c ) 。这样训练结束之后,同一个权重 θ \theta θ 的模型实际上包含了无条件估计器 ϵ u n c o n d = v θ ( x , t , Θ ) \epsilon_{uncond}=v_{\theta}(x,t,\Theta) ϵ u n co n d = v θ ( x , t , Θ ) 和条件估计器 ϵ c o n d = v θ ( x t , t , c ) \epsilon_{cond}=v_{\theta}(x_{t},t,c) ϵ co n d = v θ ( x t , t , c ) 。
而在 CFG推理阶段,在生成过程的每一步,都不直接使用模型输出的条件预测,而是人为构造一个新的引导预测。每一步计算两个向量:
v u n c o n d v_{uncond} v u n co n d :模型认为合理图像应当移动的方向(指一般图像流形的中心)。v c o n d v_{cond} v co n d :模型认为符合文本的图像应该移动的方向。 定义最终的更新方向为:v f i n a l = v u n c o n d + w ⋅ ( v c o n d − v u n c o n d ) v_{final}=v_{uncond}+w \cdot (v_{cond}-v_{uncond}) v f ina l = v u n co n d + w ⋅ ( v co n d − v u n co n d ) 可以将以上公式等价写成:
v f i n a l = v c o n d + ( w − 1 ) ⋅ ( v c o n d − v u n c o n d ) v_{final} = v_{cond}+(w-1)\cdot(v_{cond} - v_{uncond}) v f ina l = v co n d + ( w − 1 ) ⋅ ( v co n d − v u n co n d ) 其中 w w w 是一个标量超参数(通常 > 1 >1 > 1 )。差分向量 v c o n d − v u n c o n d v_{cond}-v_{uncond} v co n d − v u n co n d 代表了条件 c c c 带来的纯增量信息,消除了图像的通用特征,只保留了与文本 c c c 强相关的语义方向。而权重 w w w 在 w = 1 w=1 w = 1 时,v f i n a l = v c o n d v_{final}=v_{cond} v f ina l = v co n d ,这是标准的条件生成;而在 w > 1 w>1 w > 1 时,是在放大这个差分向量,是在提醒模型,需要更加强调文本特征,甚至牺牲一部分图像的自然度。
Latent Diffusion Models(LDM)潜在扩散模型是为了解决直接在像素空间训练扩散模型计算代价过高的问题而提出的架构。传统的扩散模型直接在像素空间进行操作。假设有一张 512 × 512 × 3 512 \times 512 \times 3 512 × 512 × 3 的 RGB 图像,这张图像会包含 $786432$ 个维度,在这个高维空间中进行数千步的迭代去噪,无论是训练还是推理,对 GPU 的显存和计算能力要求都极高,并且图像中包含大量人类视觉不敏感的高频细节,模型在像素空间花费大量算力去建模对语义理解不重要的信息,是一种资源浪费。 LDM 提出,可以先将模型压缩到一个低维的、语义密集的潜在空间,然后在该空间内进行扩散训练。
LDM 的第一阶段是训练一个自编码器,用于在像素空间 X X X 和潜在空间 Z Z Z 之间建立双射关系,这个过程在扩散模型训练之前独立完成,训练好后参数即被冻结。编码器 E \mathcal{E} E 将输入图像 x ∈ R H × W × 3 x \in \mathbb{R}^{H \times W \times 3} x ∈ R H × W × 3 映射为潜在编码 z = E ( x ) z = \mathcal{E}(x) z = E ( x ) ,解码器 D \mathcal{D} D 将潜在编码重构回图像 x ~ = D ( z ) \tilde{x} = \mathcal{D}(z) x ~ = D ( z ) 。为了克服传统 VAE 生成图像模糊的问题,LDM 在训练自编码器时引入了两个关键的损失函数:
感知损失:不止比较像素级的差异,而是比较图像在预训练网络中的特征图差异,确保纹理清晰。 对抗损失:引入一个类似 GAN 的判别器,强制要求解码器生成的 x ~ \tilde{x} x ~ 具有逼真的细节。 这个自编码器能够将高分辨率的图像压缩为低分辨率的特征图,同时保留了图像的语义结构和纹理信息。
自编码器训练完成后在潜在空间 Z Z Z 中训练扩散模型。给定一张图像 x x x ,利用编码器得到 z 0 = E ( x ) z_{0}=\mathcal{E}(x) z 0 = E ( x ) ,然后在低分辨率的特征图上逐步添加高斯模糊,得到 z t z_{t} z t 。训练一个时变去噪神经网络 ϵ θ \epsilon_{\theta} ϵ θ ,其输入是噪声化的潜在编码 z t z_{t} z t 和时间步 t t t ,目标是预测添加时的噪声,损失函数为:
L L D M = E E ( x ) , ϵ ∼ N ( 0 , 1 ) , t [ ∣ ∣ ϵ − ϵ θ ( z t , t ) ∣ ∣ 2 ] L_{LDM}=\mathbb{E}_{\mathcal{E}(x),\epsilon \sim \mathcal{N}(0,1),t}[||\epsilon - \epsilon_{\theta}(z_{t},t)||^2] L L D M = E E ( x ) , ϵ ∼ N ( 0 , 1 ) , t [ ∣∣ ϵ − ϵ θ ( z t , t ) ∣ ∣ 2 ] 因为 Z Z Z 空间的维度远小于 X X X 空间,训练和推理时的矩阵运算量也就大幅减少,并且潜在空间过滤了高频的像素噪声,扩散模型可以专注于学习图像的结构、物体关系等高级语义。
为了实现文生图、类别生成等任务,LDM 需要将条件信息 y y y 注入到网络中。
DiT 是用于与 Vision Transformer 非常相似,输入不是原始像素,而是加噪后的潜在特征图,并且经典切分小块展平为一维 token 序列经过 embed 将 patch 序列映射为向量嵌入同时加入位置编码,经过 N 层堆叠的 Transformer 模块,在这个过程中将时间步 t t t 和标签 y y y 作为条件注入网络。输出经过线性层和 reshape,还原回 2D 空间结构,最终输出噪声和协方差。 条件注入的方式主要有三种:
自适应层归一化:专门用于处理全局条件(如时间步 t t t 和类别标签 y y y ),其不改变 Transformer 的注意力机制,而是修改 Layer Norm(层归一化)层。网络使用一个 MLP 根据条件 t t t 和 y y y 预测出六个参数:γ 1 , β 1 , α 1 , γ 2 , β 2 , α 2 \gamma_{1},\beta_{1},\alpha_{1},\gamma_{2},\beta_{2},\alpha_{2} γ 1 , β 1 , α 1 , γ 2 , β 2 , α 2 ,这些参数用于对 Layer Norm 后的特征进行缩放和平移:A d a L N ( x , c ) = γ ( c ) ⋅ N o r m ( x ) + β ( c ) AdaLN(x,c)=\gamma(c) \cdot Norm(x) + \beta(c) A d a L N ( x , c ) = γ ( c ) ⋅ N or m ( x ) + β ( c ) 。 交叉注意力:在标准的 Self-Attention 插入 Cross-Attention,图像 Token 作为 Query,条件作为 Key 和 Value。当条件信息非常复杂且具有空间/序列结构,通常使用这种方式。 Token 拼接:直接将条件信息视为额外的 Token,将条件 Token 拼接到图像 Token 序列的末尾,将整个长序列送入标准的 Transformer Block,通过 Self-Attention 机制,图像 Token 回自动去关注条件 Token。这种方式的架构最简单,不需要修改 Transformer 内部结构。 Text-to-Image以 flux 为例,系统的输入包括两个模态的数据,文本和图像/噪声。文本流是一段复杂的自然语言 Prompt,编码器为 T5 和 CLIP,CLIP 擅长捕捉图像和文本的全局语义对齐,而 T5 则擅长理解复杂的语法结构和长文本细节。输出为文本嵌入,维度为 D × L D \times L D × L ;图像流是随机高斯噪声,维度为 128 × 128 × 16 128 \times 128 \times 16 128 × 128 × 16 。输入到 Diffusion Transformer 后利用 Self-Attention 处理图像内部关联,利用 Cross Attention 处理图文关联,经过多步迭代后,模型输出 Clean latents,为了得到人类可视的图像,需要进行最后一步解码。通过一个预训练好的 VAE 解码器,将低维的潜在特征图上采样回像素空间。
Text-to-Video与 Text-to-Image 不同的是,处理对象从 2D 的静态图像变为了 3D 的动态视频。
其他的思路与 Text-to-Video 大抵相同。
Diffusion Distillation标准的扩散模型在推理时,必须沿着学习到的速度场小心移动,步长太大或步长太少都会导致离散化误差,生成的图像会模糊或崩坏。因此希望训练一个新模型,能够减少迭代的次数同时保证图片的质量。目前主要有两种方法:
渐进式蒸馏:假设 Teacher模型需要 N N N 步生成一张图,训练Student 模型让 Student 的 1 步拟合 Teacher 的 2 步,同时进行迭代减半,例如训练 Student 将 1024 步压缩为 512 步,新的 Student 变为 Teacher,再去训练新的 Student 进一步压缩,最终在理想的情况下可以将步数压缩到 4 步或 8 步,而肉眼几乎看不出质量损失。 一致性模型:在常微分方程的视角下,对于同一条生成轨迹,无论在哪个时间点 t t t 观察,这条轨迹最终指向的起点 x 0 x_{0} x 0 是同一个,因此可以定义一个函数 f 0 ( x t , t ) f_{0}(x_{t},t) f 0 ( x t , t ) ,无论输入的 t t t 是多少,函数的输出都应该直接等于 x 0 x_{0} x 0 。因此不需要像是渐进式蒸馏一样一轮一轮进行训练,而是直接强制模型学习一致性映射,让模型预测从当前状态 x t x_{t} x t 沿着轨迹一步跳回原点 x 0 x_{0} x 0 的能力,这样可以实现单步生成。 Generalized Diffusion从传统的随机微分方程(SDE)视角来看,扩散模型的演化过程可以用通用的形式 d X t = f ( t ) X t d t + g ( t ) d W t d X_t = f(t) X_t d t + g(t) d W_t d X t = f ( t ) X t d t + g ( t ) d W t 来描述,其中漂移项 f ( t ) X t f(t) X_t f ( t ) X t 决定了数据均值的变化趋势,而扩散项 g ( t ) d W t g(t) d W_t g ( t ) d W t 则决定了噪声注入的强度。在这一框架下,VP(Variance Preserving,方差保持)和 VE(Variance Exploding,方差爆炸)代表了两种针对不同物理约束设计的特殊路径。
VP 过程的核心理念在于“能量守恒”,即旨在确保在加噪过程中信号与噪声的总方差始终保持在单位球面上,以维持神经网络训练的数值稳定性。其离散形式满足 X t = α ˉ t X 0 + 1 − α ˉ t X 1 X_t = \sqrt{\bar{\alpha}_t}X_0 + \sqrt{1 - \bar{\alpha}_t}X_1 X t = α ˉ t X 0 + 1 − α ˉ t X 1 ,且严格遵循系数约束 ( α ˉ t ) 2 + ( 1 − α ˉ t ) 2 = 1 (\sqrt{\bar{\alpha}_t})^2 + (\sqrt{1 - \bar{\alpha}_t})^2 = 1 ( α ˉ t ) 2 + ( 1 − α ˉ t ) 2 = 1 。为了在连续时间的随机微分方程(SDE)中维持这一性质,必须引入一个向原点收缩的漂移项来抵消注入噪声带来的能量发散。在 VP 设定下,噪声注入的速率实际上对应于信号衰减速率的负值,因此扩散项可表示为 g ( t ) = − d log α ˉ t d t g(t)=\sqrt{-\frac{\mathrm{d} \log \bar{\alpha}_t}{\mathrm{d} t}} g ( t ) = − d t d l o g α ˉ t ;为了平衡这一方差增长,漂移项必须设计为线性负反馈形式 f ( X t , t ) = 1 2 d log α ˉ t d t X t f(X_t, t) = \frac{1}{2} \frac{\mathrm{d} \log \bar{\alpha}_t}{\mathrm{d} t} X_t f ( X t , t ) = 2 1 d t d l o g α ˉ t X t 。
将该漂移项代入通用公式,即可得到基于 α \alpha α 表述的 VP-SDE 方程:
d X t = 1 2 d log α ˉ t d t X t d t + − d log α ˉ t d t d W t d X_t = \frac{1}{2} \frac{\mathrm{d} \log \bar{\alpha}_t}{\mathrm{d} t} X_t d t + \sqrt{-\frac{\mathrm{d} \log \bar{\alpha}_t}{\mathrm{d} t}} d W_t d X t = 2 1 d t d log α ˉ t X t d t + − d t d log α ˉ t d W t 这一方程在几何物理上具有明确的含义:由于信号强度 α ˉ t \bar{\alpha}_t α ˉ t 随时间单调递减,其对数导数 d log α ˉ t d t \frac{\mathrm{d} \log \bar{\alpha}_t}{\mathrm{d} t} d t d l o g α ˉ t 恒为负值,因此漂移项 1 2 d log α ˉ t d t X t \frac{1}{2} \frac{\mathrm{d} \log \bar{\alpha}_t}{\mathrm{d} t} X_t 2 1 d t d l o g α ˉ t X t 依然作为一个指向原点的回复力,不断将数据点拉回,以对抗扩散项造成的向外膨胀趋势。这种由信号衰减率决定的径向收缩与切向扩散的动态平衡,强制数据点在相空间中沿着一个弯曲的四分之一圆弧轨迹从数据分布向噪声分布移动。虽然这种几何约束成功保证了全过程的方差恒定,但其高度弯曲的轨迹特性成为了推理效率的瓶颈——在反向求解常微分方程(ODE)时,简单的数值积分方法(如欧拉法)若步长过大便会飞出圆弧流形,因此必须采用极小的步长以精确逼近曲线,从而导致了推理速度显著缓慢。
相比之下,VE 过程的核心理念在于“多尺度扰动”,即旨在通过单纯叠加幅度不断增大的噪声来覆盖数据分布的各个频段,从而完全放弃了对方差守恒的约束。其离散形式满足 X t = X 0 + σ t ϵ X_t = X_0 + \sigma_t \epsilon X t = X 0 + σ t ϵ ,其中噪声标准差 σ t \sigma_t σ t 随时间单调递增趋向于无穷大,且信号项 X 0 X_0 X 0 的系数始终保持为 1。为了在连续时间的随机微分方程(SDE)中维持这一性质,模型不再需要引入任何向原点收缩的漂移项来抑制能量,而是任由扩散项主导方差的增长。具体而言,在 SDE 的通用形式 d X t = f ( X t , t ) d t + g ( t ) d W t d X_t = f(X_t, t) d t + g(t) d W_t d X t = f ( X t , t ) d t + g ( t ) d W t 中,由于不需要漂移项来平衡扩散,因此直接设定 f ( X t , t ) = 0 f(X_t, t) = 0 f ( X t , t ) = 0 ;同时,为了匹配离散过程中方差 σ t 2 \sigma_t^2 σ t 2 的增长速率,扩散项系数必须设计为 g ( t ) = d σ t 2 d t g(t) = \sqrt{\frac{\mathrm{d} \sigma_t^2}{\mathrm{d} t}} g ( t ) = d t d σ t 2 。
将这些设定代入通用公式,即可得到经典的 VE-SDE 方程:
d X t = d σ t 2 d t d W t d X_t = \sqrt{\frac{\mathrm{d} \sigma_t^2}{\mathrm{d} t}} d W_t d X t = d t d σ t 2 d W t 这一方程在几何物理上同样具有明确的含义:由于漂移项为零,相空间中不存在任何将数据拉回原点的回复力,数据点仅受扩散项驱动,沿着噪声增强的方向做纯粹的布朗运动。这种不受束缚的扩散机制,使得数据点在几何上沿着一条垂直于数据流形的射线向外飞奔,形成一种发散的轨迹。虽然这种直线型的发散结构避免了 VP 过程中的曲线弯曲问题,但其代价是方差的剧烈爆炸——在反向求解 ODE 时,由于涉及的数值范围跨度极大(从几百到零),极易引发数值计算上的不稳定或精度溢出,且对步长调度极其敏感,这同样构成了高效推理的巨大障碍。
无论是 VP 的圆弧还是 VE 的射线,本质上都是基于特定物理直觉(如防溢出或纯加噪)所人为设定的固定路径,在几何传输效率上并非最优。广义扩散(Generalized Diffusion)视角,即 Rectified Flow,则打破了这种对特定物理约束的依赖,将问题重构为寻找两个任意分布 π 0 \pi_0 π 0 (数据)与 π 1 \pi_1 π 1 (先验噪声)之间的最优传输映射。为了实现这一目标,该视角直接选取几何上连接起点的最短路径——直线,定义中间状态为线性插值形式 X t = ( 1 − t ) X 0 + t X 1 X_{t}=(1-t)X_{0}+tX_{1} X t = ( 1 − t ) X 0 + t X 1 ,其中 t ∈ [ 0 , 1 ] t \in[0,1] t ∈ [ 0 , 1 ] 为时间系数。
在此线性框架下,描述传输过程的速度场 v v v 可以通过对上述状态方程关于时间 t t t 求导直接推导得出:v t = d X t d t = d d t [ ( 1 − t ) X 0 + t X 1 ] = X 1 − X 0 v_t = \frac{d X_{t}}{d t} = \frac{d}{d t}\left[(1-t) X_{0}+t X_{1}\right] = X_{1}-X_{0} v t = d t d X t = d t d [ ( 1 − t ) X 0 + t X 1 ] = X 1 − X 0 。这推导结果说明神经网络 v θ ( X t , t ) v_{\theta}(X_{t}, t) v θ ( X t , t ) 的核心学习任务发生了根本性转变:模型不再需要像经典 DDPM 那样去拟合复杂的得分函数或隐晦的噪声项,而是直接学习流动的方向,即源分布与目标分布之间的差值向量。这种基于直线的广义设定在理论上统一了 ODE 与 SDE 视角,同时也在工程上带来了巨大优势——由于理想的传输轨迹被拉直为直线,速度场在传输过程中保持恒定或变化极度平缓,极大地降低了数值积分的难度,使得推理过程不再需要为了拟合曲线而进行数十步的精细迭代,往往仅需数步甚至单步即可实现高质量生成,从而解决了扩散模型推理效率低下的瓶颈。
附:GANs最优判别器与最优生成器的证明将原始目标函数的期望形式写为积分形式:
V ( G , D ) = ∫ x [ p d a t a ( x ) log D ( x ) + p g ( x ) log ( 1 − D ( x ) ) ] d x V(G,D)=\int_{x}[p_{data}(x)\log D(x)+p_{g}(x)\log (1-D(x))] \, dx V ( G , D ) = ∫ x [ p d a t a ( x ) log D ( x ) + p g ( x ) log ( 1 − D ( x ))] d x 要找到函数 D ( x ) D(x) D ( x ) 最大化该积分,因为积分是累加求和,要让总积分最大,只需要让积分符号中的每一项都达到最大即可。定义积分内部的函数为 f ( y ) f(y) f ( y ) ,其中 y = D ( x ) y=D(x) y = D ( x ) 是标量,a = p d a t a ( x ) a=p_{data}(x) a = p d a t a ( x ) ,b = p g ( x ) b=p_{g}(x) b = p g ( x ) 为常数:
f ( y ) = a log ( y ) + b log ( 1 − y ) f(y)=a\log(y)+b\log(1-y) f ( y ) = a log ( y ) + b log ( 1 − y ) 求导并且令导数为 0:
f ′ ( y ) = a y − b 1 − y = 0 ⇒ a ( 1 − y ) = b y ⇒ a − a y = b y ⇒ a = ( a + b ) y ⇒ y = a a + b \begin{aligned}
&f'(y)= \frac{a}{y} - \frac{b}{1 - y} = 0 \\
\Rightarrow \quad &a(1 - y) = by \\
\Rightarrow \quad &a - ay = by \\
\Rightarrow \quad &a = (a + b)y \\
\Rightarrow \quad &y = \frac{a}{a + b}
\end{aligned} ⇒ ⇒ ⇒ ⇒ f ′ ( y ) = y a − 1 − y b = 0 a ( 1 − y ) = b y a − a y = b y a = ( a + b ) y y = a + b a 得到最优判别器,将 a a a 和 b b b 代回原来的定义:
D G ∗ ( x ) = p d a t a ( x ) p d a t a ( x ) + p g ( x ) D^*_{G}(x)=\frac{p_{data}(x)}{p_{data}(x)+p_{g}(x)} D G ∗ ( x ) = p d a t a ( x ) + p g ( x ) p d a t a ( x ) 直观的解释是如果某处的真实概率大,结果趋近 1;如果生成概率大,结果趋近 0。 现在假设判别器已经达到了最优状态,将 D G ∗ ( x ) D^*_{G}(x) D G ∗ ( x ) 代回原来的目标函数,现在的目标是找到生成器 G G G 来最小化这个函数:
C ( G ) = max D V ( G , D ) = E x ∼ p d a t a [ log p d a t a ( x ) p d a t a ( x ) + p g ( x ) ] + E x ∼ p g [ log p g ( x ) p d a t a ( x ) + p g ( x ) ] C(G) = \max_D V(G, D) = \mathbb{E}_{x \sim p_{data}}\left[\log \frac{p_{data}(x)}{p_{data}(x) + p_g(x)}\right] + \mathbb{E}_{x \sim p_g}\left[\log \frac{p_g(x)}{p_{data}(x) + p_g(x)}\right] C ( G ) = D max V ( G , D ) = E x ∼ p d a t a [ log p d a t a ( x ) + p g ( x ) p d a t a ( x ) ] + E x ∼ p g [ log p d a t a ( x ) + p g ( x ) p g ( x ) ] 对原式进行代数变换,在分子分母同时除以 2:
log P P + Q = log ( P ( P + Q ) / 2 ⋅ 1 2 ) = log P ( P + Q ) / 2 − log 2 \log \frac{P}{P+Q} = \log \left( \frac{P}{(P+Q)/2} \cdot \frac{1}{2} \right) = \log \frac{P}{(P+Q)/2} - \log 2 log P + Q P = log ( ( P + Q ) /2 P ⋅ 2 1 ) = log ( P + Q ) /2 P − log 2 应用到上述的式子中:
C ( G ) = E x ∼ p d a t a [ log p d a t a p d a t a + p g 2 − log 2 ] + E x ∼ p g [ log p g p d a t a + p g 2 − log 2 ] C(G) = \mathbb{E}_{x \sim p_{data}}\left[\log \frac{p_{data}}{\frac{p_{data} + p_g}{2}} - \log 2\right] + \mathbb{E}_{x \sim p_g}\left[\log \frac{p_g}{\frac{p_{data} + p_g}{2}} - \log 2\right] C ( G ) = E x ∼ p d a t a [ log 2 p d a t a + p g p d a t a − log 2 ] + E x ∼ p g [ log 2 p d a t a + p g p g − log 2 ] 将常数项 − log 2 -\log 2 − log 2 提出来,得到:
C ( G ) = − log 4 + E x ∼ p d a t a [ log p d a t a p d a t a + p g 2 ] ⏟ K L ( p d a t a ∥ p d a t a + p g 2 ) + E x ∼ p g [ log p g p d a t a + p g 2 ] ⏟ K L ( p g ∥ p d a t a + p g 2 ) C(G) = -\log 4 + \underbrace{\mathbb{E}_{x \sim p_{data}}\left[\log \frac{p_{data}}{\frac{p_{data} + p_g}{2}}\right]}_{KL(p_{data} \| \frac{p_{data} + p_g}{2})} + \underbrace{\mathbb{E}_{x \sim p_g}\left[\log \frac{p_g}{\frac{p_{data} + p_g}{2}}\right]}_{KL(p_g \| \frac{p_{data} + p_g}{2})} C ( G ) = − log 4 + K L ( p d a t a ∥ 2 p d a t a + p g ) E x ∼ p d a t a [ log 2 p d a t a + p g p d a t a ] + K L ( p g ∥ 2 p d a t a + p g ) E x ∼ p g [ log 2 p d a t a + p g p g ] 进一步得到 Jensen-Shannon 散度的定义形式:
C ( G ) = − log 4 + 2 ⋅ J S D ( p d a t a ∥ p g ) C(G) = -\log 4 + 2 \cdot JSD(p_{data} \| p_g) C ( G ) = − log 4 + 2 ⋅ J S D ( p d a t a ∥ p g ) Jensen-Shannon 散度是衡量两个概率分布差异的指标。其主要性质包括值总是非负的: J S D ( P ∥ Q ) ≥ 0 JSD(P \| Q) \ge 0 J S D ( P ∥ Q ) ≥ 0 ,以及当且仅当两个分布完全相等时取最小值 0:J S D ( P ∥ Q ) = 0 ⟺ P = Q JSD(P \| Q) = 0 \iff P = Q J S D ( P ∥ Q ) = 0 ⟺ P = Q 。因此要让 C ( G ) C(G) C ( G ) 最小,唯一的解就是让 J S D ( p d a t a ∥ p g ) = 0 JSD(p_{data} \| p_g) = 0 J S D ( p d a t a ∥ p g ) = 0 ,即:p g ( x ) = p d a t a ( x ) p_g(x) = p_{data}(x) p g ( x ) = p d a t a ( x ) 。
参考如下:
https://cs231n.stanford.edu/index.html