MCM520 ← 资料站首页 生成对抗网络 · 深度手册 打开交互阅读器 →

生成对抗网络 · 深度手册

分类:深度学习 | 难度:★★★ 高阶 | 编号:gan

一、这是什么(一句话用途)

图像生成 / 数据增广 / 风格迁移(从无标签数据学出生成分布)

二、核心思想

生成对抗网络(GAN)用"两个网络打擂台"的方式学生成。生成器 GG 负责从随机噪声画出假样本,判别器 DD 负责分辨"真样本 vs GG 的假样本"。二者对抗训练:DD 努力看穿造假,GG 努力骗过 DD。这种极小极大博弈的均衡点是 GG 生成的分布恰好等于真实数据分布——此时 DD 再也分不出真假(判为 0.5)。GAN 不需要成对标签,就能凭无监督方式生成以假乱真的图片、语音,是深度生成模型的里程碑(后续有 StyleGAN、扩散模型等)。

三、数学原理与推导

价值函数(零和博弈):

min⁡Gmax⁡D V(D,G)=Ex∼pdata[log⁡D(x)]+Ez∼pz[log⁡(1−D(G(z)))] \min_G\max_D\ V(D,G)=\mathbb{E}_{\mathbf{x}\sim p_{\text{data}}}\big[\log D(\mathbf{x})\big]+\mathbb{E}_{\mathbf{z}\sim p_z}\big[\log\big(1-D(G(\mathbf{z}))\big)\big]

固定 GG 时最优判别器 DG∗(x)=pdata(x)pdata(x)+pg(x)D_G^*(\mathbf{x})=\dfrac{p_{\text{data}}(\mathbf{x})}{p_{\text{data}}(\mathbf{x})+p_g(\mathbf{x})}。当 pg=pdatap_g=p_{\text{data}} 时 D∗=1/2D^*=1/2,达到纳什均衡。训练交替:判别器梯度上升最大化 VV,生成器梯度下降最小化 log⁡(1−D(G(z)))\log(1-D(G(\mathbf{z})))(常改写为最大化 log⁡D(G(z))\log D(G(\mathbf{z})) 以缓解初期梯度消失):

∇θg1m∑ilog⁡D(G(zi)),∇θd1m∑i[log⁡D(xi)+log⁡(1−D(G(zi)))] \nabla_{\theta_g}\frac{1}{m}\sum_i \log D\big(G(\mathbf{z}_i)\big),\qquad \nabla_{\theta_d}\frac{1}{m}\sum_i\big[\log D(\mathbf{x}_i)+\log(1-D(G(\mathbf{z}_i)))\big]

四、建模 / 求解步骤

  1. 准备真实样本 + 噪声采样
  2. 搭生成器 G 与判别器 D
  3. D 区分真假(最大化)
  4. G 骗过 D(最小化被识破)
  5. 交替训练至均衡(生成逼真)

五、关键公式速查

min_G max_D E[log D(x)]+E[log(1−D(G(z)))];均衡时 D=0.5

六、典型示例

随机噪声 → 生成器 → 手写数字图片,判别器难辨真假。

完整算例(数字演示,照着算一遍)

场景:生成器 G 与判别器 D 对抗,训练 5 万步生成 28×28 人脸。

过程:初期 D 轻易辨真假,后期 G 生成样本使 D 判别概率趋近 0.5(分不清)。

结论:GAN 达到纳什均衡时生成逼真样本,但训练不稳需调平衡。

七、Python 实现示例

import os, numpy as np
import pandas as pd
HERE = os.path.dirname(os.path.abspath(__file__))
df = pd.read_csv(os.path.join(HERE,"..","datasets","gan.csv"))
real = df["x"].to_numpy(dtype=float).reshape(-1,1)
rng = np.random.default_rng(19)
Wg = rng.normal(0,1,(1,1)); bg = 0; Wd = rng.normal(0,1,(1,1)); bd = 0
for _ in range(400):
    z = rng.normal(0,1,(len(real),1))
    fake = z@Wg + bg
    Dr = 1/(1+np.exp(-(real@Wd+bd)))
    Df = 1/(1+np.exp(-(fake@Wd+bd)))
    Wd += 0.1*((real*(1-Dr) - fake*Df).sum())/len(real)
    bd += 0.1*(((1-Dr)-Df).sum())/len(real)
    Wg += 0.1*((z*(Df*(1-Df))@Wd).sum())/len(real)
    bg += 0.1*((Df*(1-Df)).sum())/len(real)
gen = rng.normal(0,1,(200,1))@Wg + bg
print("真实均值=%.3f 生成均值=%.3f" % (real.mean(), gen.mean()))

配套文件:py_gan.py(需 numpy / pandas;与下方数据集配套练习)

八、MATLAB 实现示例

%% 生成对抗网络(GAN)示例(MATLAB/Octave)
df = readtable('..\datasets\gan.csv');
real = table2array(df(:,1)); rng(19);
Wg=randn(1,1); bg=0; Wd=randn(1,1); bd=0;
for it=1:400
  z = randn(length(real),1);
  fake = z*Wg + bg;
  Dr = 1./(1+exp(-(real*Wd+bd)));
  Df = 1./(1+exp(-(fake*Wd+bd)));
  Wd = Wd + 0.1*((real.*(1-Dr) - fake.*Df)./length(real));
  bd = bd + 0.1*(((1-Dr)-Df)./length(real));
  Wg = Wg + 0.1*((z.*(Df.*(1-Df))*Wd)./length(real));
  bg = bg + 0.1*(sum(Df.*(1-Df))./length(real));
end
gen = randn(200,1)*Wg + bg;
fprintf('真实均值=%.3f 生成均值=%.3f\n', mean(real), mean(gen));

配套文件:m_gan.m(基础 MATLAB / Octave 即可运行)

九、练手数据集(可下载)

一维实数样本(双峰分布)。用于 GAN 让生成器逼近真实数据分布,对比生成/真实均值。

  • 字段:x
  • 行数:80 行
  • 下载:gan.csv

十、常见误区与避坑清单

  • 训练不稳定易崩塌(mode collapse)
  • 需平衡 G/D 强度
  • 评估生成质量难

十一、结果怎么解读

看生成样本逼真度与多样性;D 输出接近 0.5 即均衡。

十二、常与谁搭配

与自编码器同属生成模型;可用卷积神经网络搭建。

十三、论文写作技巧(怎么把它写进论文)

把 生成对抗网络 写进论文,核心不是堆公式,而是讲清「为什么用它、结果怎么呈现、如何对比」三件事。

1. 动机怎么写(为什么用它而不是别的)

强调端到端 / 表示学习优势:无需手工特征,生成对抗网络 直接从数据学表征。交代输入形式、网络结构(层数 / 宽度 / 激活)与规模(参数量、FLOPs),并说明相比传统模型的增益。

2. 结果怎么写(图表与指标)

给训练 / 验证损失与指标曲线、混淆矩阵 / 预测对比图;若有可视化(特征图 / CAM / 注意力)必放;做消融实验(去掉某模块性能掉多少)最能服人。

3. 可直接套用的写作话术

  • 中文模板:针对<问题>,本文采用 生成对抗网络 进行图像生成 / 数据增广 / 风格迁移(从无标签数据学出生成分布)。该方法能够自动刻画<优势>,在处理<场景>时相较<对比方法>更具<特点>。
  • 英文模板:To address , we adopt 生成对抗网络 to 图像生成 / 数据增广 / 风格迁移(从无标签数据学出生成分布). Benefiting from its ability to , it outperforms on .

4. 同类易踩的写作坑

写明超参、优化器、随机种子与硬件,保证可复现;警惕数据泄漏与测试集调参;样本少时给出正则 / 数据增强策略。

5. 典型论文段落范例(可直接参考 / 改写)

下面是一段可直接套用的论文表述,已按本算法定制,填空处(…)替换成你的真实数值即可。

本文采用 生成对抗网络 从原始图像端到端学习特征,在测试集上达到 94.3% 准确率,较 ResNet-18 基线提升 2.1 个百分点;Grad-CAM 可视化显示模型关注病灶区域,符合医学先验。

We employ 生成对抗网络 to learn features end-to-end from raw images, reaching 94.3% test accuracy—a 2.1-point gain over the ResNet-18 baseline; Grad-CAM visualizations show the model attends to lesion regions, consistent with medical prior.

6. 消融实验怎么写(深度学习必备)

深度学习论文几乎必备消融实验(ablation study):逐次移除一个模块(如注意力、数据增强、预训练),报告性能变化,量化每个组件的贡献。写作范式:① 列出「完整模型」与若干「删减变体」的指标对照表;② 用一句话解释每项移除带来的下降(如「去掉注意力后 mAP 降 3.4,说明全局依赖建模关键」);③ 训练技巧(学习率预热、标签平滑)若有增益也单列。注意:消融必须控制变量——一次只动一处,避免把多个改动混在一起导致无法归因。

十四、相关手册(延伸阅读)

十五、本手册导航


本手册由「算法深度手册生成器」自动产出,配套提供 Python / MATLAB 双版本示例与可下载练手数据集。