VAE模型

1. VAE 的核心思想

VAE 属于生成模型,目标是学习一个隐变量空间(latent space),把复杂的数据(比如图片、语音)映射到一个分布,然后能从这个空间中采样,再解码出新的数据

它的特别之处在于:

  • 不只是简单的压缩(像普通自编码器 AE),
  • 而是学习一个概率分布,保证生成的新样本 连贯、多样,还能插值。

2. 基本结构

VAE 有两个主要部分:

  1. 编码器(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ϕ(zx)=N(z;μ(x),σ2(x)I)

  2. 解码器(Decoder)
    输入:潜变量 zzz
    输出:重建图像 x^\hat{x}x^

    pθ(x∣z) p_\theta(x|z) pθ(xz)

  3. 采样(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)[log⁡pθ(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ϕ(zx)[logpθ(xz)]DKL(qϕ(zx)p(z))

其中两部分:

  1. 重建损失:保证解码器能还原输入(像素级 MSE 或交叉熵)。
  2. KL 散度:让学到的分布 qϕ(z∣x)q_\phi(z|x)qϕ(zx) 靠近先验 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}xR3×256×256

  • 编码器:卷积 + 全连接 → 输出 μ,σ\mu, \sigmaμ,σ,假设维度 z∈R128z\in\mathbb R^{128}zR128

  • 采样: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}\|xx^
    • KL 散度 DKL(q(z∣x) ∥ N(0,I))D_{KL}(q(z|x)\,\|\,\mathcal N(0,I))DKL(q(zx)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ϕ(zx)=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)zN(0,I),解码器就能生成一张合理的新图。

👉 这是 VAE 能生成新样本的关键。


5. 一个形象比喻 🎯

  • 普通 AE:像是“身份证号”,一张图就一个唯一编码。
  • VAE:像是“模糊地址”,一张图对应一个中心点(μ\muμ),周围还有一定范围(σ\sigmaσ),允许生成一些变体。


🌰 举例:人脸数据集 (CelebA 256×256×3)

输入:
  • 一张人脸图片 x∈R256×256×3x \in \mathbb{R}^{256 \times 256 \times 3}xR256×256×3
编码器结构(卷积网络)
  1. 卷积层 1:Conv(3 → 32, kernel=4, stride=2) → 输出 (128×128×32)

  2. 卷积层 2:Conv(32 → 64, kernel=4, stride=2) → 输出 (64×64×64)

  3. 卷积层 3:Conv(64 → 128, kernel=4, stride=2) → 输出 (32×32×128)

  4. 卷积层 4:Conv(128 → 256, kernel=4, stride=2) → 输出 (16×16×256)

  5. Flatten:展平 → 向量大小 16×16×256 = 65,536

  6. 全连接层: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 维高斯分布


接下来:
  1. 在这个分布中随机采样一个 z∼N(μ,σ2I)z \sim \mathcal{N}(\mu, \sigma^2 I)zN(μ,σ2I),比如 z∈R128z \in \mathbb{R}^{128}zR128
  2. 送给解码器,解码器把它还原成一张新的 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=Wx+b

  • x∈R65536x \in \mathbb{R}^{65536}xR65536 (输入向量,展平后的特征)
  • W∈R128×65536W \in \mathbb{R}^{128 \times 65536}WR128×65536 (权重矩阵)
  • b∈R128b \in \mathbb{R}^{128}bR128 (偏置项)
  • 输出 h∈R128h \in \mathbb{R}^{128}hR128

这样,原来 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(zx)=N(z;μ(x),σ2(x)I)


3. 怎么算出来的?

均值 μ(x)\mu(x)μ(x) 和方差 σ(x)\sigma(x)σ(x) 不是手工算的,而是通过神经网络学出来的。

流程大致是:

  1. 输入一张图片(比如 256×256×3),经过 CNN / Transformer → 得到特征(比如 65,536 维展平 → 通过 FC 层 → 128 维)。

  2. 这 128 维会分成两份:

    • 一份作为均值向量 μ(x)\mu(x)μ(x)(128 维)。
    • 一份作为 log 方差向量 log⁡σ2(x)\log \sigma^2(x)logσ2(x)(128 维)。
  3. 这两个向量就是编码器的输出。


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}zR128
  • 这个 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(zx)=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(zx)=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]

  1. 去中心化
    每个特征减去均值,让数据中心在 0 附近。

  2. 计算协方差矩阵
    得到一个 10×1010 \times 1010×10 的矩阵,描述特征之间的相关性。

  3. 特征分解
    计算协方差矩阵的特征向量(方向)和特征值(方差大小)。

  4. 排序选择主成分
    按方差从大到小排序,选前几个主成分,作为新的坐标轴。

  5. 投影到新坐标轴
    原始数据点投影到这些方向上,得到低维表示。


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.1x20.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 = 降维 + 去冗余 + 保留信息最丰富的方向。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值