type
status
date
slug
summary
tags
category
icon
password
#深度学习 #Intro2DL

监督学习与无监督学习

监督学习

数据

(x, y) 其中 x 是数据, y 是 label

目标

学习 x 到 y 的映射方式

举例

分类, 回归, 物体识别, 语义分割

无监督学习

数据

只有 x 作为数据, 没有标签

目标

学习数据背后的隐藏结构

举例

聚类 (Cluster), 特征提取或降维

生成模型

目标

从某个分布中获取训练样本作为输入,并学习一个能够表示该分布的模型

应用

消除偏见

在收集构建数据集时, 数据不一定按现实情况真实分布, 因此训练出的一些模型可能会出现"偏见" 利用生成模型, 我们可以学习潜在分布, 并引导模型学习去偏的分布

异常检测

使用生成模型, 我们可以将实时场景和模型学习到的隐藏的概率分布进行比对, 判断是否是小概率 (异常) 事件

生成新数据

生成模型可以从数据中学到概率分布, 通过对概率分布进行采样, 可以得到新的数据 如: 生成语句, 图片, 生物结构

自动编码器 Autoencoder

降维

对于一个无标签的输入数据, 我们可以通过几层神经网络将其压缩成一个向量, 称为编码/潜变量向量, 实现降维 这里降维并非要压缩到二维/三维这样真正意义上的"低维", 而是根据任务需要降低到合理的维度

重建

然后, 我们需要训练一个"升维", 其实叫做"编码",的神经网络, 用于使用压缩后的向量重构原始图像, 以实现对于隐空间的学习

优化

这里我们的 loss 是原始输入与重建输入的差值, 通过降低 loss 实现优化, 可以:
  1. 提升压缩效率和质量, 能够利用网络提取更重要的特征
  1. 优化用于建模/编码的网络, 从特征中构建更真实的数据. 如果隐空间学习效果较好, 可以利用隐空间向量做分类\聚类\生成, 不仅仅是还原

VAE 变分自编码器

引入概率分布

notion image
相较于传统的 AE, 我们再潜空间向量用两个向量替换: 均值向量 μ, 标准差向量 σ 相当于学到了一个概率分布 随后, 从这个概率分布中进行采样, 得到 z,  $z∼N(μ,σ^2)$

为何引入概率分布

这里其实和 zero to hero 中预测字母里我的困惑很类似: 在得到下一个字母后, 为什么不直接选择概率最高的字母, 而是针对分布进行采样
notion image

引入不确定性

现实世界的样本不是单一对应一个压缩向量,而是存在“模糊的、连续的潜在空间”

生成新样本

  • 传统 AE 没法直接生成新数据
  • VAE 可以在隐空间 z 上采样,生成完全新的、没见过的数据

损失函数

现在对于编码器, 解码器, 我们得到两个分布: $q_{ϕ}(z∣x)$ 和 $p_{θ}(x∣z)$ 现在我们的 loss 变为: $$L(ϕ,θ,x)=重建损失+正则化项$$

正则化项

1. 隐空间的“规范化”

  • 理想情况下,希望所有输入 x 编码成的 zz 的分布 $q_{ϕ}(z∣x)$,
  • 都接近一个固定的先验分布 p(z)。
  • 通常我们取 $p(z)=N(0,I)$ —— 标准正态分布。

2. KL 散度(Kullback–Leibler Divergence)

  • 用 KL 散度 $D_{KL}(q_{ϕ}(z∣x)∥p(z))$ 来度量这两个分布的差异
  • KL 散度越小,说明编码器学到的分布越接近标准正态分布。

为什么需要 KL 散度这个正则化项

如果没有

  • 编码器 qϕ(z∣x) 只需要让重建误差很小。
  • 它会把不同的 x 编码到随便哪个地方的 z
  • 结果就是:
    • 隐空间 z 会很稀疏断裂不连续
    • 一旦你随机在 zz 空间采样生成新样本,很大概率踩到"没人训练过的空洞区域" → 生成奇奇怪怪的假样本

有了之后

  • 强制要求编码器学到的 qϕ(z∣x)不要太散乱,要接近一个标准正态分布 p(z)=N(0,I)
  • 这样所有样本 x 被编码到 z 空间中时:
    • 会形成一个密集、连续、光滑的隐空间。
  • 将来在 z 空间随便采样一个点,经过解码器,基本上都会生成一个合理的新样本

反向传播

计算图

![[../../source/VAE computing graph.png]] 与其他神经网络不同的是, VAE 中我们引入了概率分布, 有一个从分布中采样的过程 这个过程导致我们无法实现正常的反向传播(采样不可导), 需要对模型做出一些修改

重参数化 Reparameterizing

为了顺利实现反向传播, 我们对于采样层进行重参数化, 把采样化成等效的形式 这是原有的采样: $$ z \sim \mathcal{N}(\mu, \sigma^2) $$ 重参数化后得到的线性方程: $$ z = \mu + \sigma \odot \epsilon, \quad \epsilon \sim \mathcal{N}(0, 1)
$$

重参数化的数学原理

因为高斯分布的采样可以写成: $$ z=μ+σ⋅标准正态样本 $$ 这样:
  • μ 和 σ 都是网络输出,可以反向传播;
  • ϵ 是采样固定的随机噪声,不依赖参数;
  • 从而整个采样过程变成了可微分的,能进行端到端训练

GAN 生成对抗网络

notion image

结构

  1. 随机噪声 z
  1. 生成器 G, 用于把噪声 z 转化为 X_fake
  1. 判别器 D, 用于分离 X_real 和 X_fake
  1. 概率 y, 表示输入是真实概率的可能性

流程

  1. 生成噪声 z 这个随机向量, 传给 G
  1. G 经过运算, 把噪声转化为伪造的样本 X_fake
  1. 把 X_real 和 X_fake 一同传递给 D
  1. D 接受真假数据, 经过运算输出预测概率 y, 表示真实的概率

目标

  • 判别器 D 尽量最大化分类准确率(maximize):
    • D(x_real)→1(真的数据输出接近1)
    • D(x_fake)→0(假的数据输出接近0)
  • 生成器 G 尽量最小化判别器的判断准确率(minimize):
    • 让 D(x_fake)→1,即让假的也被判为真的。
这就是该网络被称为**"对抗"网络** 的原因 感觉和 minimax 的思想有点类似? [[../CS50 AI/Week 0 - Search/Lecture - Search]]

损失函数

$$ \min_G \max_D \; \mathbb{E}{x \sim p{\text{data}}(x)} \left[ \log D(x) \right] + \mathbb{E}_{z \sim p(z)} \left[ \log (1 - D(G(z))) \right] $$

详细讲解

  1. 这里的 x 服从真实数据分布, 也就是真实数据, 对于接受 x 的分离器 D, 我们希望其使整个 loss 函数越大越好
  1. 这里的 z 是随机噪声, 输入生成器 G 中, G 需要通过调整自身让 loss 降低, 越低越好
  1. 因此其实 GAN 中的 loss 不再是单一地"越低越好", 而是需要在对抗中找到一个平衡点

关于 min 和 max

这里其实我最开始理解错了, 公式中的 min, max 并不是指的让某个分离器/生成器自身的值取最大, 最小 而是对应的分离器/生成器的目标是让整个函数取最大/最小

训练目标

  • 判别器 D 训练时:
    • 固定 G,不动。
    • 优化 D,让整个 loss 变大
    • 希望真样本 D(x)D(x) 趋近 1,假样本 D(G(z)) 趋近 0。
  • 生成器 G 训练时:
    • 固定 D,不动。
    • 优化 G,让整个 loss 变小
    • 希望生成的假样本 D(G(z)) 趋近 1(让判别器被骗)。

理想状态

上面已经说了, 这里的 loss 并非越小越好, 也并非越大越好, 而是要在二者之间找一个平衡点, 使得 G 和 D 的最终训练表现都尽可能最优 因此, 最优状态应该是: 当生成器 G 训练得非常好时,生成的数据分布 p_g 和真实数据分布 p_data 是一模一样的 这个时候:
  • 判别器 DD 已经分不出来真假了
  • 对每一个输入 x,D(x)=0.5,也就是说:
    • 不管是真图还是假图,判别器只能瞎猜。 此时, 把 0.5 代入, 这个状态下的 loss = -log 4

G 训练好了, 那 D 呢?

这是我的困惑, 因为我发现最优条件仅仅是对于 G, 而此时 D 已经无法分辨, 也无法继续训练优化了
D 最优并不意味着它输出正确的1或0;而是它在面对无可分辨的真假数据时,做出了最佳的随机猜测。 这其实是D的“博弈最优”(best response in game),而不是通常机器学习意义下的分类器最优。

我们是否需要考虑 D

我认为, 对于 GAN, 我们更强调的是生成, 而非分离/分辨 因此相较于 D, G 才是我们的主要目的. D 大概更多的是我们采用博弈方法的一个伴随产物 (虽然有很大的作用)

修改下 loss ?

了解到最优状态下 loss = -log 4 后, 我在想能否把 loss 函数优化为: 原函数和-log 4 的距离, 这样可以使得 loss 变成传统意义上的"越低越好". 随后, 我与 GPT 交流了一番: 把 loss 修改后, 向 0 逼近, 会有很多潜在的问题:

训练早期不平衡

  • 训练初期 D 强 G 弱
  • 对距离进行惩罚可能导致优化方向很奇怪

丧失了博弈的优势

  • GAN 的 min-max 结构是两方博弈。
  • 单纯让 loss 接近一个数值(比如 -log4)忽略了 D 和 G 是在相互对抗、动态变化
  • 你如果强行只看总loss,会失去对 D 和 G 各自独立优化的控制。

一个例子

  • 可以有两种不同的 G 和 D,得到同样的 loss。
  • 但是一个是好的博弈状态,一个是坏的“假平衡”。

常用的 loss 变体

$$ \max_D \; \mathbb{E}{x \sim p{\text{data}}(x)} \left[ \log D(x) \right] + \mathbb{E}_{z \sim p(z)} \left[ \log (1 - D(G(z))) \right] $$
Lecture 5 - Deep Reinforcement LearningLecture 3 - Deep Computer Vision
Loading...