Files
Notes/机器学习/深度学习模型/03-生成模型/2-GAN-对抗生成网络.md
2026-05-16 17:16:51 +08:00

227 lines
11 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
title: 2-GAN-对抗生成网络
draft: false
tags:
- GAN
- 生成对抗网络
- 生成模型
- 深度学习
---
### 一、 核心直觉与博弈论视角
GAN 由两个核心神经网络组成:
1. **生成器Generator, $G$** 它的任务是接收一个随机噪声 $z$(通常采样自高斯分布或均匀分布),并将其映射到数据空间,生成假数据 $G(z)$。它的目标是“造假”,尽可能骗过判别器。
2. **判别器Discriminator, $D$** 它的任务是接收一个样本 $x$,判断这个样本是来自真实数据分布 $p_{data}$ 还是由生成器伪造的分布 $p_g$。它输出一个 $[0, 1]$ 之间的标量 $D(x)$,表示样本为“真”的概率。
**博弈过程:**
- $D$ 想要最大化区分真假数据的能力。
- $G$ 想要最小化 $D$ 区分真假数据的能力。
两者在训练中相互博弈,共同进化,最终理想状态下,$G$ 生成的数据分布完美拟合真实数据分布($p_g = p_{data}$),而 $D$ 面对真假难辨的数据,只能给出 $50\%$ 的瞎蒙概率($D(x) = 0.5$)。
---
### 二、 目标函数Value Function与严谨推导
我们可以定义一个价值函数 $V(D, G)$。GAN 的目标是一个 Minimax 优化问题:
$$\min_{G} \max_{D} V(D, G) = \mathbb{E}_{x \sim p_{data}(x)}[\log D(x)] + \mathbb{E}_{z \sim p_z(z)}[\log(1 - D(G(z)))]$$
- $\mathbb{E}_{x \sim p_{data}(x)}[\log D(x)]$:真实数据通过 $D$ 的期望。$D$ 希望这部分尽可能大(趋近于 $\log 1 = 0$)。
- $\mathbb{E}_{z \sim p_z(z)}[\log(1 - D(G(z)))]$:生成数据通过 $D$ 的期望。$D$ 希望 $D(G(z))$ 小(趋近于 $0$),从而让整体变大;而 $G$ 希望 $D(G(z))$ 大(趋近于 $1$),从而让这部分变小(趋近于 $-\infty$)。
为了理解这个优化的本质,我们需要将其拆解为两步进行**严谨的数学推导**。
#### 1. 固定生成器 $G$,求解最优判别器 $D_G^*$
假设 $G$ 已经固定,我们要找到一个 $D$ 使得 $V(D, G)$ 最大化。
首先,将期望写成积分形式。考虑到生成器将噪声分布 $p_z(z)$ 映射为数据空间的分布 $p_g(x)$,我们可以将第二项的积分变量从 $z$ 替换为 $x$
$$V(D, G) = \int_{x} p_{data}(x) \log(D(x)) dx + \int_{x} p_g(x) \log(1 - D(x)) dx$$
$$V(D, G) = \int_{x} \left[ p_{data}(x) \log(D(x)) + p_g(x) \log(1 - D(x)) \right] dx$$
要最大化这个积分,只需要最大化积分号内的每一项。对于任意给定的 $x$,我们定义 $a = p_{data}(x)$$b = p_g(x)$$y = D(x)$。问题转化为求函数 $f(y)$ 的最大值:
$$f(y) = a \log(y) + b \log(1 - y)$$
对 $y$ 求导并令其为 $0$
$$\frac{df}{dy} = \frac{a}{y} - \frac{b}{1 - y} = 0$$
解得最优的判别器输出为:
$$D_G^*(x) = \frac{a}{a + b} = \frac{p_{data}(x)}{p_{data}(x) + p_g(x)}$$
_直觉:当真实数据密度远大于假数据密度时($p_{data} \gg p_g$$D \to 1$;当两者相等时(纳什均衡),$D = 0.5$。_
#### 2. 将最优 $D_G^*$ 代回,最小化 $G$
现在,判别器已经达到了最优 $D_G^*$,生成器 $G$ 的目标是最小化此时的 $V(D_G^*, G)$。我们将其代入原方程:
$$\max_{D} V(D, G) = V(D_G^*, G)$$
$$= \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]$$
接下来进行巧妙的恒等变形,分子分母同除以 $2$
$$= \mathbb{E}_{x \sim p_{data}} \left[ \log \left( \frac{p_{data}(x)}{\frac{p_{data}(x) + p_g(x)}{2}} \cdot \frac{1}{2} \right) \right] + \mathbb{E}_{x \sim p_g} \left[ \log \left( \frac{p_g(x)}{\frac{p_{data}(x) + p_g(x)}{2}} \cdot \frac{1}{2} \right) \right]$$
利用对数的性质 $\log(A \cdot \frac{1}{2}) = \log A - \log 2$
$$= -\log 4 + KL\left(p_{data} \parallel \frac{p_{data} + p_g}{2}\right) + KL\left(p_g \parallel \frac{p_{data} + p_g}{2}\right)$$
_(注:$KL$ 表示 Kullback-Leibler 散度)_
两个 $KL$ 散度之和刚好定义了 **Jensen-Shannon 散度 (JSD)**
$$C(G) = -\log 4 + 2 \cdot JSD(p_{data} \parallel p_g)$$
**核心推论:** JS 散度恒大于等于 $0$。因此,当且仅当 $p_g(x) = p_{data}(x)$ 时JS 散度为 $0$,生成器达到全局最优解,此时损失函数的最小值为 $-\log 4$。这就是 GAN 能够拟合任意分布的数学基石。
---
### 二.5 纳什均衡的深入分析
#### 均衡的存在性与唯一性
GAN 的 Minimax 优化问题存在唯一的纳什均衡点(当 $p_g = p_{data}$ 时),但均衡的收敛性并不保证。
**纳什均衡的定义**:在二人零和博弈中,策略 $(G^*, D^*)$ 构成纳什均衡,当且仅当:
$$V(G^*, D) \leq V(G^*, D^*) \leq V(G, D^*), \quad \forall G, D$$
即:$G^*$ 已经是在 $D^*$ 下的最优反应,$D^*$ 已经是在 $G^*$ 下的最优反应。
**GAN 均衡条件**
- 当 $p_g = p_{data}$ 时,$D^*(x) = 0.5$ 对所有 $x$
- 此时 $G$ 无法通过调整来提高 $V$$D$ 也无法通过调整来提高 $V$
#### 训练动力学的稳定性分析
交替梯度下降的更新可以写为:
$$\theta_d^{t+1} = \theta_d^t + \eta \nabla_{\theta_d} V(G^t, D^t)$$
$$\theta_g^{t+1} = \theta_g^t - \eta \nabla_{\theta_g} V(G^t, D^t)$$
**问题 1同步更新的不稳定性**
如果 $G$ 和 $D$ 更新步长不匹配,可能导致:
- $D$ 过于强大时,$G$ 的梯度消失
- $G$ 过于强大时,$D$ 无法区分真假
**问题 2梯度振荡**
即使在均衡点附近,如果使用动量优化器(如 Adam参数更新可能围绕均衡点振荡而非收敛。这与 GAN 的损失曲面(非凸非凹)有关。
**问题 3模式崩溃的数学描述**
当 $G$ 将所有质量集中在单点 $x_0$ 时($p_g = \delta_{x_0}$$D$ 的最优判别器为:
$$D^*(x) = \frac{p_{data}(x)}{p_{data}(x) + \delta_{x_0}(x)}$$
这意味着 $D(x_0) \to 1$(真实数据点)而 $D(x_0) \to 0$(生成点)。$G$ 只需生成 $x_0$ 即可骗过当前的 $D$,但这远非真实分布。
---
### 二.6 Non-saturating Loss 的深入理解
原始 GAN 的损失函数(对 $G$)为:
$$\mathcal{L}_G = \mathbb{E}_{z \sim p_z(z)}[\log(1 - D(G(z)))]$$
**问题**:当 $D(G(z)) \to 0$ 时,$\log(1 - D) \to -\infty$,梯度 $\nabla_G \log(1 - D) \to 0$,导致训练初期 $G$ 无法学习。
**改进**:使用 Non-saturating loss
$$\mathcal{L}_G^{NS} = -\mathbb{E}_{z \sim p_z(z)}[\log D(G(z))]$$
**数学解释**
设 $D(G(z)) = \sigma(f(z))$,其中 $f(z)$ 是判别器的 logit 输出,$\sigma$ 是 sigmoid 函数。
$$\log(1 - \sigma(f)) = -\log(1 + e^{-f}) = -\text{softplus}(-f)$$
当 $f \to -\infty$(即 $D \to 0$)时,$\text{softplus}(-f) \approx -f$,所以 $\log(1 - D) \approx f$。
但实际计算中,$\log(1 - D)$ 的梯度在 $D \to 0$ 处几乎为 0而 $\log D$ 的梯度始终为 $1/f$ 量级(只要 $f$ 不过分大)。
**更直观的理解**:将 $G$ 的目标从"让 $D$ 输出低概率"改为"让 $D$ 输出高概率"。前者对应 $\log(1 - D)$(饱和),后者对应 $-\log D$(非饱和)。
---
### 三、 训练过程 (Alternating Gradient Descent)
由于这是个 Minimax 游戏,我们不能像常规网络那样一次性更新所有参数,而是采用**交替梯度下降**的方法。
**每次迭代Epoch/Step**
1. **训练判别器 $D$(通常进行 $k$ 步,原始论文中 $k=1$**
- 从真实数据 $p_{data}$ 中采样 $m$ 个样本 $\{x^{(1)}, ..., x^{(m)}\}$。
- 从先验噪声 $p_z$ 中采样 $m$ 个样本 $\{z^{(1)}, ..., z^{(m)}\}$,通过 $G$ 生成假样本 $\{G(z^{(1)}), ..., G(z^{(m)})\}$。
- 利用梯度**上升**更新 $D$ 的参数 $\theta_d$(最大化 $V$
$$\nabla_{\theta_d} \frac{1}{m} \sum_{i=1}^m \left[ \log D(x^{(i)}) + \log(1 - D(G(z^{(i)}))) \right]$$
2. **训练生成器 $G$(进行 $1$ 步):**
- 从先验噪声 $p_z$ 中重新采样 $m$ 个样本 $\{z^{(1)}, ..., z^{(m)}\}$。
- 利用梯度**下降**更新 $G$ 的参数 $\theta_g$(最小化 $V$
$$\nabla_{\theta_g} \frac{1}{m} \sum_{i=1}^m \log(1 - D(G(z^{(i)})))$$
_(在工程实现中,为了防止训练初期梯度消失,这步通常会被替换为最大化 $\log D(G(z))$)_
---
### 四、 常见训练病理与崩溃问题
尽管数学推导非常完美,但 GAN 在实际的高维空间训练中极度不稳定。
#### 1. 梯度消失 (Vanishing Gradients)
**现象:** 训练初期,生成器很弱,生成的全是噪声。判别器可以极其轻易地将真假分开,导致 $D(x) \to 1$ 且 $D(G(z)) \to 0$。
**数学本质:** 如果判别器太完美,它给出的概率会趋近于 $0$ 或 $1$。此时 $\log(1 - D(G(z)))$ 曲线在 $D \to 0$ 处的导数趋近于 $0$。生成器拿不到梯度,直接“僵死”在原地无法更新。
**解法:** 使用 Non-saturating loss即上文提到的将 $G$ 的目标从最小化 $\log(1-D)$ 改为最大化 $\log D$),或者引入 Wasserstein GAN (WGAN) 利用 Earth Mover 距离(又称 Wasserstein-1 距离)替代 JS 散度。
**Wasserstein 距离的优势**
$$W(p_{data}, p_g) = \inf_{\gamma \in \Pi(p_{data}, p_g)} \mathbb{E}_{(x,y) \sim \gamma}[|x - y|]$$
其中 $\Pi(p_{data}, p_g)$ 表示所有以 $p_{data}$ 和 $p_g$ 为边缘分布的联合分布集合。
与 JS 散度不同Wasserstein 距离对分布完全不重叠的情况仍有梯度(连续可微),这从根本上避免了梯度消失问题。
**实现方式**:通过 $D$ 的输出近似 Critic 值,移除最后的 sigmoid 层使用权重裁剪Weight Clipping或梯度惩罚Gradient Penalty来满足 1-Lipschitz 约束。
#### 2. 模式崩溃 (Mode Collapse)
**现象:** 真实数据有多个峰(比如手写数字有 0-9 十个类别),但生成器发现只生成某一种数据(比如只生成极其逼真的数字 "1")就能最高效地骗过判别器。最终生成器失去了多样性,只能输出单一或极少数的样本。
**数学本质:** 在 Minimax 博弈中,如果先优化 $G$ 再优化 $D$$G$ 倾向于将所有质量集中在 $D$ 当前认为最像真实数据的单一点上(退化为狄拉克分布)。
**解法:** 引入谱归一化Spectral Normalization、Minibatch Discrimination或使用 Unrolled GAN 让 $G$ 能够“预见” $D$ 的几步更新。
#### 3. 难以收敛 (Non-convergence)
**现象:** 损失函数不下降,反而开始剧烈震荡。$G$ 和 $D$ 陷入无限循环的“猫鼠游戏”中。
**数学本质:** 使用基于动量的梯度下降求解纳什均衡时参数更新轨迹可能围绕均衡点画圈Limit Cycle而不是收敛进去。这在纯理论博弈论中是一个经典的动力学不稳定性问题。