1. 设计思路
1.1 自编码器基础
自编码器(Autoencoder)是一种神经网络模型,由编码器和解码器组成。编码器将输入数据压缩成一个潜在空间的表示(即编码),解码器则将这种表示重构为原始数据。
设定:
- 输入数据为 x \mathbf{x} x
- 编码器将 x \mathbf{x} x 映射到潜在空间中的潜在变量 z \mathbf{z} z
- 解码器从 z \mathbf{z} z重构出 x \mathbf{x} x
自编码器的目标是使得输入数据和重构数据之间的差异最小化,通常使用均方误差(MSE)或交叉熵作为损失函数。
1.2. 变分自编码器的引入
VAE 引入了概率建模的概念,通过在潜在空间上施加概率分布,使得生成的样本更加具有多样性。
- 潜在变量:VAE 假设潜在变量 $\mathbf{z} $ 遵循一个先验分布 p ( z ) p(\mathbf{z}) p(z),通常选择为标准正态分布 N ( 0 , I ) \mathcal{N}(0, I) N(0,I)。
- 变分推断:为了进行有效的推断,VAE 通过变分推断方法来近似潜在变量的后验分布。
1.3. 变分下界(ELBO)
为了训练 VAE,需要最大化边际似然 p x p\mathbf{x} px的下界,即变分下界(Evidence Lower Bound, ELBO)。数学上,边际似然可以表示为:
p ( x ) = ∫ p ( x ∣ z ) p ( z ) d z p(\mathbf{x}) = \int p(\mathbf{x} \mid \mathbf{z}) \, p(\mathbf{z}) \, d\mathbf{z} p(x)=∫p(x∣z)p(z)dz
计算这个积分通常是不可行的,因此我们使用变分分布 q ( z ∣ x ) q(\mathbf{z} \mid \mathbf{x}) q(z∣x) 来近似真实的后验分布 p ( z ∣ x ) p(\mathbf{z} \mid \mathbf{x}) p(z∣x)。ELBO 的形式如下:
log p ( x ) ≥ E q ( z ∣ x ) [ log p ( x ∣ z ) ] − KL ( q ( z ∣ x ) ∥ p ( z ) ) \log p(\mathbf{x}) \geq \mathbb{E}_{q(\mathbf{z} \mid \mathbf{x})} \left[ \log p(\mathbf{x} \mid \mathbf{z}) \right] - \text{KL}(q(\mathbf{z} \mid \mathbf{x}) \| p(\mathbf{z})) logp(x)≥Eq(z∣x)[logp(x∣z)]−KL(q(z∣x)∥p(z))
其中,KL 散度(Kullback-Leibler divergence)衡量了近似后验分布 q ( z ∣ x ) q(\mathbf{z} \mid \mathbf{x}) q(z∣x)和先验分布 p ( z ) p(\mathbf{z}) p(z)之间的差异。
1.4. 模型训练
- 编码器:学习一个神经网络 q ( z ∣ x ) q(\mathbf{z} \mid \mathbf{x}) q(z∣x),输出潜在变量 z \mathbf{z} z的均值和方差。
- 解码器:学习另一个神经网络 p ( x ∣ z ) p(\mathbf{x} \mid \mathbf{z}) p(x∣z),从潜在变量 z \mathbf{z} z重构数据 x \mathbf{x} x。
- 优化:通过最大化 ELBO 来训练模型。
- 损失函数包括重构误差(通常是 MSE 或交叉熵)和 KL 散度的和
模型架构:
设定:
输入数据为
x
\mathbf{x}
x
编码器将
x
\mathbf{x}
x映射到潜在空间中的潜在变量
z
\mathbf{z}
z解码器从
z
\mathbf{z}
z 重构出 (
x
\mathbf{x}
x自编码器的目标是使得输入数据和重构数据之间的差异最小化,通常使用均方误差(MSE)或交叉熵作为损失函数。
1.5. PCA与VAE的区别
主成分分析(PCA)和变分自编码器(VAE)都是降维技术,但它们在理论基础、模型结构和应用场景上有显著的差异。:
1.5.1 主成分分析(PCA)
基本概念
主成分分析(PCA)是一种线性降维技术,旨在通过线性变换将数据投影到低维空间中,同时尽可能保留数据的方差。PCA 主要用于特征提取和数据压缩。
数学原理
PCA 的目标是找到数据中的主成分(即主要的方向),以最大化投影后的数据方差。具体步骤如下:
-
计算协方差矩阵:
C = 1 n − 1 ( X − X ˉ ) T ( X − X ˉ ) \mathbf{C} = \frac{1}{n-1} (\mathbf{X} - \mathbf{\bar{X}})^T (\mathbf{X} - \mathbf{\bar{X}}) C=n−11(X−Xˉ)T(X−Xˉ)
其中, X \mathbf{X} X 是数据矩阵, X ˉ \mathbf{\bar{X}} Xˉ 是数据的均值, n n n 是样本数量。 -
计算特征值和特征向量:
对协方差矩阵 C \mathbf{C} C进行特征值分解,得到特征值 λ i \lambda_i λi 和对应的特征向量 v i \mathbf{v}_i vi。 -
选择主成分:
选择前 k k k个最大的特征值对应的特征向量,形成投影矩阵 V k \mathbf{V}_k Vk。 -
数据投影:
将数据投影到主成分空间:
Z = X V k \mathbf{Z} = \mathbf{X} \mathbf{V}_k Z=XVk
优缺点
- 优点:
- 计算简单,线性时间复杂度。
- 结果易于解释。
- 缺点:
- 仅适用于线性数据。
- 对噪声和异常值敏感。
两者异同
相同点
- 降维功能:两者都能将高维数据映射到低维空间中,虽然方式不同。
- 特征学习:两者都可以用来学习数据的潜在结构。
不同点
- 线性 vs 非线性:PCA 是线性的,仅能处理线性关系;VAE 是非线性的,能捕捉复杂的非线性数据结构。
- 模型类型:PCA 是一种经典的数学方法,基于SVD实现,不涉及深度学习;VAE 是深度生成模型,结合了神经网络和概率推断,基于神经网络强大的拟合能力来实现。
- 输出:PCA 主要输出数据的主成分;VAE 除了降维外,还可以生成新样本,并能学习潜在空间的结构。
PCA架构
自编码器雏形:
核心思想
变分自编码器(Variational Autoencoder, VAE)的核心思想是通过引入概率建模和变分推断的方法,将图像编码的离散点变成连续概率分布,从而更好地处理潜在空间中的失真问题。下面是这个思想的详细总结:
2. 核心思想总结
核心思想
变分自编码器(VAE)的核心思想是通过引入连续的潜在变量分布和噪声,使得编码空间不再是离散的点,而是一个连续的概率分布。这种方法使得解码器可以更好地在潜在空间中进行平滑过渡,从而生成高质量的图像,并有效地覆盖潜在空间中的失真区域。这种方法通过优化变分下界(ELBO),实现了生成模型的训练和优化,从而解决了传统自编码器在潜在空间中可能遇到的问题。
2.1. 潜在空间的连续性
-
问题描述:在标准自编码器中,潜在空间是离散的点之间的映射,因此在潜在空间中的某些区域可能无法良好地映射回图像空间。例如,两个图像(如全月图和半月图)的编码点之间可能会出现无法良好还原的失真区域。
-
解决方法:VAE 通过将潜在空间建模为一个连续的概率分布,而不是单独的离散点。这样,潜在空间中的每一个点都有一定的概率密度,可以更好地平滑地过渡和生成连续的样本。
2.2. 引入噪声
-
引入噪声:为了处理潜在空间中的失真点,VAE 在编码过程中引入了噪声。编码器输出的是潜在变量的分布(通常是高斯分布),而不是具体的点。这种方法使得每个图像的编码点会带有噪声,形成一个包含多个潜在变量的区域(例如,绿色箭头范围)。
-
覆盖整个编码空间:通过引入噪声,使得编码点覆盖整个潜在空间,这样解码器在训练过程中会看到整个区域的样本,从而能够更好地学习如何将每个区域内的点还原成合适的图像。
2.3. 变分下界(ELBO)
-
优化目标:VAE 通过优化变分下界(ELBO)来训练模型。ELBO 是边际似然的下界,用于最大化数据的边际似然,同时最小化编码分布与先验分布之间的 KL 散度。ELBO 包含两个部分:
- 重构误差:衡量解码器生成的图像与真实图像之间的差异。
- KL 散度:衡量变分分布与先验分布之间的差异,鼓励潜在变量的分布接近一个先验分布(通常是标准正态分布)。
-
优化过程:通过最小化 ELBO 的负值,模型学习到在潜在空间中如何生成合理的图像,同时保持编码分布的连续性。
2.4. 生成连续图像
- 生成样本:在训练完成后,VAE 可以从潜在空间中采样,并生成新的图像。由于潜在空间是连续的,生成的图像也会具有连续的变化。这样,即使在潜在空间的编码点之间,生成的图像也是平滑和有意义的。
模型架构
- VAE模型架构图
变分自编码器(VAE)是一种生成模型,通过对编码器和解码器的概率建模来学习数据的潜在分布。VAE 的设计不仅仅包括网络架构的选择,还包括如何通过损失函数来优化模型。下面是对 VAE 设计的详细总结,包括编码器输出、噪声处理、损失函数的设计及其理论依据:
3. VAE 设计总结
3.1 编码器输出
-
编码器输出两个参数:
- 均值参数 μ \mu μ:编码器输出的均值,表示潜在变量的期望值。
- 对数方差参数 log ( σ 2 ) \log(\sigma^2) log(σ2):编码器输出的对数方差,控制潜在变量的分布的扩散程度。实际中,方差 σ 2 \sigma^2 σ2 是通过 exp ( log ( σ 2 ) ) \exp(\log(\sigma^2)) exp(log(σ2))得到的,以确保方差是正值。
-
潜在变量的生成:
- 噪声采样:从标准正态分布 N ( 0 , I ) \mathcal{N}(0, I) N(0,I) 中采样噪声 ϵ \epsilon ϵ。
- 潜在变量
z
z
z:将噪声
ϵ
\epsilon
ϵ 与均值
μ
\mu
μ 和方差
σ
2
\sigma^2
σ2 结合,得到潜在变量:
z = μ + σ ⋅ ϵ z = \mu + \sigma \cdot \epsilon z=μ+σ⋅ϵ - 计算:在实际实现中,使用对数方差 log ( σ 2 ) \log(\sigma^2) log(σ2) 来避免计算中的数值问题,并通过指数函数来获取正方差。
3.2 损失函数
VAE 的损失函数由两部分组成:
-
重构损失:
- 目标:最小化生成图像与真实图像之间的差异,确保解码器能够将潜在变量 ( z ) 解码回原始图像。
- 实现:通常使用交叉熵损失或均方误差来衡量生成图像和真实图像之间的差异。
-
KL 散度损失:
- 目标:最小化编码器输出的潜在变量分布与先验分布(通常是标准正态分布)之间的差异。
- 表达式:
KL ( q ( z ∣ x ) ∥ p ( z ) ) = − 1 2 ∑ i = 1 d ( 1 + log ( σ i 2 ) − μ i 2 − σ i 2 ) \text{KL}(q(z \mid x) \| p(z)) = -\frac{1}{2} \sum_{i=1}^{d} \left(1 + \log(\sigma_i^2) - \mu_i^2 - \sigma_i^2\right) KL(q(z∣x)∥p(z))=−21i=1∑d(1+log(σi2)−μi2−σi2)
其中, μ i \mu_i μi 和 σ i 2 \sigma_i^2 σi2 分别是第 i i i 维的均值和方差。
3.3 理论依据
-
变分推断:
- 目的:通过变分推断方法,优化变分下界(ELBO),最大化数据的边际似然。ELBO 包括重构误差和 KL 散度损失。
- 公式:
ELBO = E q ( z ∣ x ) [ log p ( x ∣ z ) ] − KL ( q ( z ∣ x ) ∥ p ( z ) ) \text{ELBO} = \mathbb{E}_{q(z \mid x)}[\log p(x \mid z)] - \text{KL}(q(z \mid x) \| p(z)) ELBO=Eq(z∣x)[logp(x∣z)]−KL(q(z∣x)∥p(z)) - 优化:通过优化 ELBO 的负值,VAE 在潜在空间中学习到一个平滑的分布,同时能够生成与真实图像相似的图像。
-
避免极端解:
- 问题:如果没有 KL 散度损失,编码器可能会选择将方差 σ 2 \sigma^2 σ2 设为非常小或负无穷大,从而使得噪声对生成图像的影响几乎为零。这会导致潜在空间中只有少数点被有效利用。
- 解决方案:KL 散度损失通过最小化 KL ( q ( z ∣ x ) ∥ p ( z ) ) \text{KL}(q(z \mid x) \| p(z)) KL(q(z∣x)∥p(z)) 来避免编码器将方差设为极端值,从而保持潜在空间的连续性和分布平滑。
- VAE 编码器:输出均值 μ \mu μ 和对数方差 log ( σ 2 ) \log(\sigma^2) log(σ2) ,用于生成潜在变量 z z z。
- 损失函数:包含重构损失和 KL 散度损失,确保生成图像的质量,并保持潜在空间的分布平滑。
- 理论依据:变分推断和优化 ELBO 确保模型能够有效地学习数据的潜在表示,同时避免极端的编码解,以实现更好的生成质量和潜在空间的合理利用。
作用原理
对于生成模型而言,主流的理论模型可以分为隐马尔可夫模型 HMM、朴素贝叶斯模型 NB 和高斯混合模型 GMM,而 VAE 的理论基础就是高斯混合模型。什么是高斯混合模型呢?就是说,任何一个数据的分布, 都可以看作是若干高斯分布的叠加。如下图:
- 如果 P ( X ) P(X) P(X)代表一种分布的话,存在一种拆分方法能让它表示成图中若干浅蓝色曲线对应的高斯分布 的叠加。
- 这种拆分方法已经证明出,当拆分的数量达到512 时,其叠加的分布相对于原始分布而言,误差是非常非常小的了。
一种最直接的思路是, 直接用每一组高斯分布的参数作为一个编码值实现编码。
如上图所示, m m m 代表着编码维度上的编号, 譬如实现一个 512 维的编码, m m m 的取值范是, 每采样一个 m , 其对应到一个小的高斯分布 N ( μ m , Σ m ) , P ( X ) N\left(\mu^m, \Sigma^m\right), \mathrm{P}(\mathrm{X}) N(μm,Σm),P(X) 就可以等价为所有的这些高斯分布的叠加,即:
P ( x ) = ∑ m P ( m ) P ( x ∣ m ) P(x)=\sum_m P(m) P(x \mid m) P(x)=m∑P(m)P(x∣m)
其中, m ∼ P ( m ) , x ∣ m ∼ N ( μ m , Σ m ) m \sim P(m), x \mid m \sim N\left(\mu^m, \Sigma^m\right) m∼P(m),x∣m∼N(μm,Σm) 。
上述编码方式是非常简单粗暴的, 它对应的是我们之前提到的离散的、有大量失真区域的编码方式。于是我们需要对目前的编码方式进行改进, 使得它成为连续有效的编码。
将编码换成一个连续变量 z , 规定 z 服从正态分布
N
(
0
,
1
)
N(0,1)
N(0,1) (实际上并不一定要选用
N
(
0
,
1
)
N(0,1)
N(0,1), 其他的连续分布都是可行的)。每对于一个采样
z
z
z, 会有两个函数
μ
\mu
μ 和
σ
\sigma
σ,分别决定 z 对应到的高斯分布的均值和方差, 然后在积分域上所有的高斯分布的累加就成为了原始分布
P
(
X
)
P(X)
P(X),即:
P
(
x
)
=
∫
z
P
(
z
)
P
(
x
∣
z
)
d
z
P(x)=\int_z P(z) P(x \mid z) d z
P(x)=∫zP(z)P(x∣z)dz
其中
z
∼
N
(
0
,
1
)
,
x
∣
z
∼
N
(
μ
(
z
)
,
σ
(
z
)
)
z \sim N(0,1), \quad x \mid z \sim N(\mu(z), \sigma(z))
z∼N(0,1),x∣z∼N(μ(z),σ(z)) 。
由于
P
(
z
)
P(z)
P(z) 是已知的,
P
(
x
∣
z
)
\mathrm{P}(x \mid z)
P(x∣z) 未知, 而
x
∣
z
∼
N
(
μ
(
z
)
,
σ
(
z
)
)
x \mid z \sim N(\mu(z), \sigma(z))
x∣z∼N(μ(z),σ(z)),于是我们真正需要求解的, 是
μ
\mu
μ 和
σ
\sigma
σ 两个函数的表达式。又因为
P
(
x
)
\mathrm{P}(x)
P(x) 通常非常复杂, 导致
μ
\mu
μ 和
σ
\sigma
σ 难以计算, 我们需要引入两个神经网络来帮助我们求解。