1. VAE 的核心思想
VAE 属于生成模型,目标是学习一个隐变量空间(latent space),把复杂的数据(比如图片、语音)映射到一个分布,然后能从这个空间中采样,再解码出新的数据。
它的特别之处在于:
- 不只是简单的压缩(像普通自编码器 AE),
- 而是学习一个概率分布,保证生成的新样本 连贯、多样,还能插值。
2. 基本结构
VAE 有两个主要部分:
-
编码器(Encoder)
输入:图片 xxx,
输出:潜变量的分布参数(均值 μ\muμ 和方差 σ\sigmaσ)。qϕ(z∣x)=N(z;μ(x),σ2(x)I) q_\phi(z|x)=\mathcal N(z;\mu(x),\sigma^2(x)I) qϕ(z∣x)=N(z;μ(x),σ2(x)I)
-
解码器(Decoder)
输入:潜变量 zzz,
输出:重建图像 x^\hat{x}x^。pθ(x∣z) p_\theta(x|z) pθ(x∣z)
-
采样(Reparameterization Trick)
- 直接采样会导致不可导,所以用:
z=μ+σ⋅ε,ε∼N(0,I) z=\mu+\sigma\cdot\varepsilon,\quad \varepsilon\sim \mathcal N(0,I) z=μ+σ⋅ε,ε∼N(0,I)
这样就能做反向传播。
3. 损失函数(ELBO)
训练目标是最大化证据下界(ELBO):
L=Eqϕ(z∣x)[logpθ(x∣z)]−DKL(qϕ(z∣x) ∥ p(z)) \mathcal{L} = \mathbb E_{q_\phi(z|x)}[\log p_\theta(x|z)] - D_{\text{KL}}(q_\phi(z|x)\,\|\,p(z)) L=Eqϕ(z∣x)[logpθ(x∣z)]−DKL(qϕ(z∣x)∥p(z))
其中两部分:
- 重建损失:保证解码器能还原输入(像素级 MSE 或交叉熵)。
- KL 散度:让学到的分布 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),保证潜空间有规律、可采样。
4. 举个例子(256×256 人脸)
-
输入:x∈R3×256×256x \in \mathbb R^{3\times256\times256}x∈R3×256×256
-
编码器:卷积 + 全连接 → 输出 μ,σ\mu, \sigmaμ,σ,假设维度 z∈R128z\in\mathbb R^{128}z∈R128
-
采样:z=μ+σ⋅εz=\mu+\sigma\cdot\varepsilonz=μ+σ⋅ε
-
解码器:反卷积 → 重建图片 x^∈R3×256×256\hat{x} \in \mathbb R^{3\times256\times256}x^∈R3×256×256
-
训练时优化:
- 还原差异 ∥x−x^∥\|x-\hat{x}\|∥x−x^∥
- KL 散度 DKL(q(z∣x) ∥ N(0,I))D_{KL}(q(z|x)\,\|\,\mathcal N(0,I))DKL(q(z∣x)∥N(0,I))
5. VAE 的优点
✅ 可以生成新样本(不像普通 AE 只能重建)。
✅ 潜空间连续、可解释,可做 插值、聚类、语义操作。
✅ 作为生成模型的基础模块,常用在 图像生成、异常检测、数据压缩。
6. 和扩散模型的关系
在 Stable Diffusion 里,VAE 用来:
- 把图片编码到低维潜空间(如 512×512×3 → 64×64×4),加速训练;
- 最后再解码回像素空间。
也就是说,扩散模型的训练其实不在原始像素空间上,而是在 VAE 的 latent space 里进行。
1. 普通自编码器(AE)的编码器
在普通 AE 里:
- 输入一张图片 xxx(比如 256×256×3256 \times 256 \times 3256×256×3),
- 编码器通过一堆卷积/全连接,把它压缩成一个固定向量 zzz(比如 128 维)。
👉 所以,AE 的编码器就是一个 “压缩器”:图片 → 固定向量。
2. VAE 的编码器
在 VAE 里,不是直接得到一个固定向量,而是:
-
输入一张图片 xxx,
-
编码器输出两个向量:
- 均值向量 μ(x)\mu(x)μ(x)(128 维),
- 标准差向量 σ(x)\sigma(x)σ(x)(128 维)。
也就是说,VAE 的编码器把一张图 映射成一个高斯分布:
qϕ(z∣x)=N(z;μ(x),σ2(x)I) q_\phi(z|x) = \mathcal{N}(z; \mu(x), \sigma^2(x) I) qϕ(z∣x)=N(z;μ(x),σ2(x)I)
这里:
- μ(x)\mu(x)μ(x):告诉模型这张图片对应的潜变量大概在什么位置;
- σ(x)\sigma(x)σ(x):告诉模型这个位置的“不确定性”有多大。
👉 所以,VAE 的编码器其实是一个 “分布生成器”:图片 → 一个高斯分布(参数是 μ\muμ 和 σ\sigmaσ)。
3. 高斯分布参数的意义
比如你有一张人脸:
- 编码器可能给出 μ=[1.2,−0.3,...,0.8]\mu = [1.2, -0.3, ..., 0.8]μ=[1.2,−0.3,...,0.8],
- σ=[0.1,0.5,...,0.3]\sigma = [0.1, 0.5, ..., 0.3]σ=[0.1,0.5,...,0.3]。
这就表示:
- 这张脸在潜空间的“中心点”大概在 μ\muμ,
- 但并不是精确在某个点,而是围绕 μ\muμ 服从正态分布。
所以,训练时我们会从这个分布里采样一个 zzz,再送到解码器。
4. 为什么要这么设计?
如果像 AE 一样,每张图都对应一个固定 zzz,那生成新图时只能从训练过的 zzz 里取,没法生成多样化的新样本。
但 VAE 用分布:
- 每张图 → 一个高斯分布,
- 这样整个训练集就能覆盖在一个“连续的潜空间”上,
- 你随便采一个 z∼N(0,I)z \sim \mathcal{N}(0, I)z∼N(0,I),解码器就能生成一张合理的新图。
👉 这是 VAE 能生成新样本的关键。
5. 一个形象比喻 🎯
- 普通 AE:像是“身份证号”,一张图就一个唯一编码。
- VAE:像是“模糊地址”,一张图对应一个中心点(μ\muμ),周围还有一定范围(σ\sigmaσ),允许生成一些变体。
🌰 举例:人脸数据集 (CelebA 256×256×3)
输入:
- 一张人脸图片 x∈R256×256×3x \in \mathbb{R}^{256 \times 256 \times 3}x∈R256×256×3
编码器结构(卷积网络)
-
卷积层 1:Conv(3 → 32, kernel=4, stride=2) → 输出 (128×128×32)
-
卷积层 2:Conv(32 → 64, kernel=4, stride=2) → 输出 (64×64×64)
-
卷积层 3:Conv(64 → 128, kernel=4, stride=2) → 输出 (32×32×128)
-
卷积层 4:Conv(128 → 256, kernel=4, stride=2) → 输出 (16×16×256)
-
Flatten:展平 → 向量大小 16×16×256 = 65,536
-
全连接层:FC → 输出两个 128 维向量
- μ(x)∈R128\mu(x) \in \mathbb{R}^{128}μ(x)∈R128 (均值向量)
- logσ2(x)∈R128\log \sigma^2(x) \in \mathbb{R}^{128}logσ2(x)∈R128 (方差向量,通常取对数方便计算)
输出:
-
对于每一张输入图片,编码器输出两个向量:
μ=[μ1,μ2,...,μ128] \mu = [\mu_1, \mu_2, ..., \mu_{128}] μ=[μ1,μ2,...,μ128]
σ=[σ1,σ2,...,σ128] \sigma = [\sigma_1, \sigma_2, ..., \sigma_{128}] σ=[σ1,σ2,...,σ128]
也就是说,每张脸都被压缩成一个 128 维高斯分布。
接下来:
- 在这个分布中随机采样一个 z∼N(μ,σ2I)z \sim \mathcal{N}(\mu, \sigma^2 I)z∼N(μ,σ2I),比如 z∈R128z \in \mathbb{R}^{128}z∈R128。
- 送给解码器,解码器把它还原成一张新的 256×256×3 的人脸。
📌 小结:
- 普通自编码器:一张脸 → 一个固定 128 维向量。
- VAE 编码器:一张脸 → 两个 128 维向量(μ,σ\mu, \sigmaμ,σ),定义一个高斯分布。
这样就能保证生成时具有 多样性(因为同一张脸可以采样出不同的 zzz,得到略微不同的结果)。
1. 卷积层到展平
- 最后一个卷积层输出 16 × 16 × 256 = 65,536 个数(feature map)。
- 这是一个大向量(可以看作 65,536 维的特征向量)。
2. 全连接层(Linear / Dense Layer)
全连接层(FC 层)就是一个矩阵乘法。
假设我们要从 65,536 维压缩到 128 维,它做的就是:
h=W⋅x+b h = W \cdot x + b h=W⋅x+b
- x∈R65536x \in \mathbb{R}^{65536}x∈R65536 (输入向量,展平后的特征)
- W∈R128×65536W \in \mathbb{R}^{128 \times 65536}W∈R128×65536 (权重矩阵)
- b∈R128b \in \mathbb{R}^{128}b∈R128 (偏置项)
- 输出 h∈R128h \in \mathbb{R}^{128}h∈R128
这样,原来 65,536 维的特征就被线性映射成了 128 维的向量。
3. 在 VAE 里是两个 128 维向量
VAE 不止要一个向量,还要得到 高斯分布的两个参数:
- 均值向量 μ∈R128\mu \in \mathbb{R}^{128}μ∈R128
- 方差向量 σ∈R128\sigma \in \mathbb{R}^{128}σ∈R128
所以实际上编码器最后会有 两层全连接层:
- FC1: 65,536 → 128 → 输出 μ\muμ
- FC2: 65,536 → 128 → 输出 logσ2\log \sigma^2logσ2
4. 举个类比
你可以理解为:
- 卷积层负责“提取图像特征” → 65,536 维
- 全连接层负责“压缩/映射到潜在空间” → 128 维
- VAE 比普通自编码器多了一步:把这个向量拆成 均值和方差两条支路。
1. 普通自编码器的编码器
在普通自编码器里,编码器(CNN 或 MLP)会把输入图片 xxx 压缩成一个固定的 向量 zzz(比如 128 维)。
👉 这样得到的 zzz 是一个点。
2. VAE 编码器的特别之处
在 VAE 里,编码器不会直接输出一个点,而是输出一个 分布。
这个分布通常假设为 高斯分布(正态分布)。
所以编码器要输出:
- 均值向量 μ(x)\mu(x)μ(x) (128 维)
- 方差向量 σ2(x)\sigma^2(x)σ2(x)(128 维,常用 log σ 来稳定计算)
👉 这样每一张图片 xxx,编码器都会对应一对参数:
μ(x),σ(x) \mu(x), \sigma(x) μ(x),σ(x)
然后用这两个参数定义一个分布:
q(z∣x)=N(z;μ(x),σ2(x)I) q(z|x) = \mathcal{N}(z; \mu(x), \sigma^2(x)I) q(z∣x)=N(z;μ(x),σ2(x)I)
3. 怎么算出来的?
均值 μ(x)\mu(x)μ(x) 和方差 σ(x)\sigma(x)σ(x) 不是手工算的,而是通过神经网络学出来的。
流程大致是:
-
输入一张图片(比如 256×256×3),经过 CNN / Transformer → 得到特征(比如 65,536 维展平 → 通过 FC 层 → 128 维)。
-
这 128 维会分成两份:
- 一份作为均值向量 μ(x)\mu(x)μ(x)(128 维)。
- 一份作为 log 方差向量 logσ2(x)\log \sigma^2(x)logσ2(x)(128 维)。
-
这两个向量就是编码器的输出。
4. 是每张图片对应一对参数吗?
✅ 对的!
- 每一张图片 x(i)x^{(i)}x(i),编码器都会输出它对应的 μ(i)\mu^{(i)}μ(i) 和 σ(i)\sigma^{(i)}σ(i)。
- 然后从这个分布里 随机采样 一个隐变量 z(i)∼N(μ(i),σ2(i))z^{(i)} \sim \mathcal{N}(\mu^{(i)}, \sigma^{2(i)})z(i)∼N(μ(i),σ2(i))。
- 这个 z(i)z^{(i)}z(i) 再送入解码器,生成一张新图片 x^(i)\hat{x}^{(i)}x^(i)。
5. 举个例子 🌰
假如一张猫脸图像输入到编码器:
-
网络输出:
- μ=[0.3,−0.7,...,1.2]\mu = [0.3, -0.7, ..., 1.2]μ=[0.3,−0.7,...,1.2](128 维)
- σ=[0.5,0.8,...,0.2]\sigma = [0.5, 0.8, ..., 0.2]σ=[0.5,0.8,...,0.2](128 维)
-
这就定义了一个 128 维的高斯分布。
-
从这里采样出一个 zzz,比如:
[0.1,−0.9,...,1.0][0.1, -0.9, ..., 1.0][0.1,−0.9,...,1.0]。 -
解码器就用这个 zzz 去生成一张合成的猫脸。
1. 普通 AE(自编码器)
- 编码器最后输出一个固定向量 z∈R128z \in \mathbb{R}^{128}z∈R128
- 这个 zzz 就是“压缩表示”
- 同一张输入图像,每次经过编码器,得到的 zzz 完全一样(确定性的)。
👉 所以 AE 的潜在空间是点 → 解码时只能生成“几乎一模一样的重构图”,缺少生成多样性。
2. VAE(变分自编码器)
-
编码器最后不直接给一个 zzz,而是给出两组参数:
μ(x)∈R128, σ(x)∈R128\mu(x) \in \mathbb{R}^{128}, \; \sigma(x) \in \mathbb{R}^{128}μ(x)∈R128,σ(x)∈R128 -
这两组参数定义的是一个分布:
q(z∣x)=N(z;μ(x),σ2(x)I) q(z|x) = \mathcal{N}(z;\mu(x),\sigma^2(x)I) q(z∣x)=N(z;μ(x),σ2(x)I)
-
从这个分布里采样出 zzz,才交给解码器。
👉 所以:
- 每张图像都有自己的 μ(x)\mu(x)μ(x) 和 σ(x)\sigma(x)σ(x),它们是固定的向量(由网络计算出来)。
- 但是 zzz 不是固定的,而是从分布里随机采样,每次可能不一样。
3. AE 和 VAE 的对比
| 模型 | 编码器输出 | 是否确定性 | 多样性 |
|---|---|---|---|
| AE | 直接输出 zzz(128维固定向量) | 确定的 | 无(只能重构) |
| VAE | 输出 μ(x),σ(x)\mu(x), \sigma(x)μ(x),σ(x) 两个向量(各128维) | 参数固定,但采样有随机性 | 有(同一张图可以生成多个不同样本) |
4. 举个例子 🌰
-
AE:一张猫 → 编码器 → 得到 z=[0.3,−0.8,1.1,...]z=[0.3,-0.8,1.1,...]z=[0.3,−0.8,1.1,...](固定)。
-
VAE:一张猫 → 编码器 → 得到 μ=[0.3,−0.8,1.1,...], σ=[0.2,0.1,0.5,...]\mu=[0.3,-0.8,1.1,...],\;\sigma=[0.2,0.1,0.5,...]μ=[0.3,−0.8,1.1,...],σ=[0.2,0.1,0.5,...]。
- 第一次采样 z=[0.25,−0.77,1.3,...]z=[0.25,-0.77,1.3,...]z=[0.25,−0.77,1.3,...]
- 第二次采样 z=[0.4,−0.85,0.9,...]z=[0.4,-0.85,0.9,...]z=[0.4,−0.85,0.9,...]
- 解码器生成的猫脸就可能长得不完全一样(更胖、更瘦、更毛茸茸)。
👉 结论:
- 是的,VAE 的均值和方差本身就是固定向量(128维),但它们不是潜在表示 z,而是潜在表示的分布参数。
- 真正的潜在表示 zzz,要从这个分布采样出来,因此 VAE 具备生成性。
1. 每张图像对应一组 μ 和 σ
-
输入一张图像 → 编码器输出两组 128 维向量:
- μ(x)=[μ1,μ2,...,μ128]\mu(x) = [\mu_1, \mu_2, ..., \mu_{128}]μ(x)=[μ1,μ2,...,μ128]
- σ(x)=[σ1,σ2,...,σ128]\sigma(x) = [\sigma_1, \sigma_2, ..., \sigma_{128}]σ(x)=[σ1,σ2,...,σ128]
这就定义了一个 128 维高斯分布:
q(z∣x)=N(z;μ(x),diag(σ2(x))) q(z|x) = \mathcal{N}(z; \mu(x), \text{diag}(\sigma^2(x))) q(z∣x)=N(z;μ(x),diag(σ2(x)))
2. 采样得到很多种 z
知道了 μ\muμ 和 σ\sigmaσ,我们可以通过重参数化采样:
z=μ(x)+σ(x)⊙ε,ε∼N(0,I) z = \mu(x) + \sigma(x) \odot \varepsilon, \quad \varepsilon \sim \mathcal{N}(0,I) z=μ(x)+σ(x)⊙ε,ε∼N(0,I)
- 也就是说:每次给定一组随机噪声 ε\varepsilonε,都会生成一组新的 zzz。
- 所以,一张图像 不是只有一个 128 维向量,而是有“无数个可能的 128 维向量”,都分布在 μ\muμ 附近。
3. 类比一下
想象 μ(x)\mu(x)μ(x) 是地图上的一个位置(中心点),σ(x)\sigma(x)σ(x) 是你手上拿的“导航误差范围”。
- 普通 AE:告诉你“猫在 固定点 A”。
- VAE:告诉你“猫大概在 A 附近一个区域,你每次走进去的点可能不一样”。
所以:VAE 的本质就是用分布替代固定点。
好的 👍 我帮你把刚才的 PCA 问答内容整理成一篇结构化、易懂的博客文章,适合直接发布。
主成分分析(PCA)通俗理解与实战指南
在数据分析和机器学习中,我们常常会遇到高维数据,比如一条样本有 10 个特征甚至上百个特征。但维度太高不仅计算复杂,还可能存在大量冗余信息。**主成分分析(PCA, Principal Component Analysis)**就是一种经典的降维方法。
1. PCA 的核心思想
一句话总结:
👉 PCA 通过线性变换,找到数据方差最大的方向作为新坐标轴,用前几个坐标轴来表示数据,从而实现降维。
- 方差大 = 信息量大
- 方差小 = 数据变化不大,可以丢弃
因此,PCA 既能 降低维度,又能 去除冗余特征。
2. PCA 的具体步骤
假设我们有一个 10 维的特征向量 [x1,x2,...,x10][x_1, x_2, ..., x_{10}][x1,x2,...,x10]。
-
去中心化
每个特征减去均值,让数据中心在 0 附近。 -
计算协方差矩阵
得到一个 10×1010 \times 1010×10 的矩阵,描述特征之间的相关性。 -
特征分解
计算协方差矩阵的特征向量(方向)和特征值(方差大小)。 -
排序选择主成分
按方差从大到小排序,选前几个主成分,作为新的坐标轴。 -
投影到新坐标轴
原始数据点投影到这些方向上,得到低维表示。
3. 降维后的新特征是不是原始特征?
很多人容易误解:
-
PCA 从 10 维降到 2 维,这 2 维 不是原始特征的子集。
-
它们是 10 个原始特征的线性组合,比如:
PC1=0.6x1+0.1x2−0.5x3+⋯+0.2x10 \text{PC}_1 = 0.6x_1 + 0.1x_2 - 0.5x_3 + \cdots + 0.2x_{10} PC1=0.6x1+0.1x2−0.5x3+⋯+0.2x10
👉 所以降维后的特征是 新特征,但保留了数据里最主要的信息。
4. 我能知道原始特征哪个重要吗?
答案是:可以的。
通过 主成分载荷(Loadings) 和 方差解释率(Explained Variance Ratio) 可以分析:
-
Loadings(系数大小)
每个主成分都是原始特征的线性组合,系数的绝对值越大,说明该特征对该主成分贡献越大。 -
方差解释率
每个主成分能解释多少整体信息。比如:- PC1 占 70%,PC2 占 20% → 前两个主成分解释了 90% 信息。
- 如果某个原始特征在 PC1 和 PC2 的系数都很大,那它就是“全局重要”的特征。
5. 举个例子
假设我们做 10 维 → 2 维 PCA,结果:
- PC1 = 0.7x1 + 0.6x2 + 0.05x3 + …
- PC2 = -0.2x1 + 0.1x2 + 0.9x3 + …
解释:
- PC1 主要由 x1 和 x2 决定 → 说明它们是数据最核心的特征。
- PC2 主要由 x3 决定 → 说明它是第二重要的维度。
6. 总结
- PCA 通过方差最大化找到新的坐标轴,用来表示数据。
- 降维后的特征是 新特征,不是原始特征的子集,而是 原始特征的线性组合。
- 可以通过 主成分系数(Loadings) + 方差解释率 来判断原始特征的重要性。
👉 记住一句话:
PCA = 降维 + 去冗余 + 保留信息最丰富的方向。
885

被折叠的 条评论
为什么被折叠?



