生成对抗网络GAN
前言
生成对抗网络 GAN 在 2014 年被 lan Goodfellow 提出,主要用于图像生成、图像风格迁移、数据增强、超分辨率重建等领域,是深度学习的重要分支。GAN 的出现彻底改变了生成模型的训练方式,不再依赖传统的似然函数优化,而是通过对抗训练实现对复杂数据分布的隐式建模。
一些需要用到的知识
散度
KL 散度
KL 散度又称为相对熵,是两个概率分布,真实分布 和近似分布 之间差异的核心指标,它的核心本质就是利用分布 近似分布 时,所产生的信息损失。KL 散度非对称(即 )且非负,当 和 完全相同时,散度值为 0。计算公式为
在信息论的视角下
- 信息熵 表示描述真实分布 所需的最小信息量
- 交叉熵 表示用近似分布 的编码方式描述真实分布 所需的信息量
- KL 散度的本质就是交叉熵与真实熵之间的差值,即
JS 散度
JS 散度是一种衡量两个概率分布 和 之间相似度的指标,它基于 KL 进行改进,解决了 KL 散度非对称和取值范围无上限的问题。它的核心本质就是通过引入一个平均分布 ,并且计算 和 相对于 的 KL 散度的平均值,从而得到一个对称且取值范围位于 之间的相似度分数
其中 是两个分布的平均分布, 衡量 相对于 的信息损失。JS 散度可以看作是 KL 散度的对称化版本,衡量了两个分布之间的平均信息差异,当两个分布完全相同时 JS 散度为 0,表示它们的信息是完全一致的,两个分布差异较大时,JS 散度接近于 1
图像生成评价指标
IS
IS(Inception Score)用于评估生成图像的可识别性和多样性,它的分数越高代表图像既清晰可辨又多样,它解决了图像生成质量难以自动化量化的问题。利用 KL 散度来计算,衡量两个分布之间的差异
IS 的计算是利用 Inception Net-V3 网络的输出经过 softmax 之后的结果,即将生成的图像输入到 Inception Net-V3 网络进行分类之后,得到的概率分布进行的计算。其中 是所有输入图像的平均类别分布, 表示给定输入图像 生成的类别分布。
所以 IS 实际上是结合了两个方面的评估:图像质量的期望值和图像质量分布的分歧度 KL。IS 的值越大越好
FID
FID(Frechet Inception Distance score)与 IS 类似,但是它并不使用 Inception Net-V3 的原本输出作为依据,它删除了在 Inception Net-V3 模型原本的输出层,于是输出层变为它的最后一个池化层。
其中 表示生成的图像, 表示真实的图像。另外 和 分别是图像输入 Inception Net 之后输出的特征向量的均值和协方差矩阵。较低的 FID 意味着生成分布与真实图像之间更接近,如果用于测试的真实图片清晰度高且种类多样,也就意味着生成图像的质量高、多样性好。因此 FID 的值越小越好
KID
KID(Kernel Inception Distance)是一种用于评估生成图像质量的指标,通过核方法衡量生成图像与真实图像在特征空间中的分布差异。需要用到 Inception Net-V3 模型提取图像的高层特征,之后使用最大平均差异 MMD 作为核函数,计算生成样本与真实样本特征分布的距离。
其中 表示真实图像的分布, 表示生成图像的分布, 是 Inception Net-V3 模型的中间层提取的图像高层特征向量, 表示真实图像特征的期望, 表示生成图像特征的期望
由于直接计算特征空间的范数难以实现,所以通过核函数的再生性,可将 展开为核函数的期望的形式,更容易实现,即
其中 表示核函数,通用使用高斯核函数,也可使用线性核函数和多项式核函数。KID 通过核函数避免分布假设,更适合非高斯分布的特征差异捕捉,KID 的值越小,说明真实与生成特征分布越接近,生成质量越高。另外,它的特征提取必须使用 Inception-V3 的 pool3 层输出,否则结果无可比性
LPIPS
LPIPS(Learned Perceptual Image Patch Similarity)是一种基于深度学习的图像相似度评估指标,通过学习人类视觉感知的特征表示,衡量两幅图像在感知层面上的差异。
它利用预训练的深度卷积神经网络提取图像的多层感知特征,在不同网络层计算特征之间的距离,并且通过可学习的权重融合各层的结果,最终输出一个标量值,表示两幅图像在感知上的相似度。LPIPS 相比于传统的指标,更符合人类视觉系统的感知特性,尤其在图像失真,风格迁移等任务中表现更好。它的流程如下
- 使用预训练的深度网络,提取两幅图像 和 的多层特征 和
- 对每层的特征进行通道归一化,以消除不同层特征尺度差异的影响
- 在每层计算归一化特征之间的 L2 距离
- 通过可学习的权重 对各层距离进行加权求和,得到最终的 LPIPS 分数
LPIPS 模拟人类视觉系统对图像的感知过程,权重可以通过训练适应特定的任务,提高评估的精度。但是它的计算复杂度较高,计算速率较慢,只能衡量两幅图像之间的相对差异,无法评估单幅图像的绝对质量
Lipschitz 连续
Lipschitz 连续是衡量函数变化率有界性的强连续性条件,它的核心本质是:函数在定义域内任意两点的函数值变化量,与自变量变化量的比值始终不超过一个固定常数。定义如下
对于函数 ,如果它是 K-Lipschitz 连续的,则需要满足
单变量函数的 Lipschitz 连续可理解为:函数图像上任意两点的连线斜率绝对值不超过 L,即函数图像被 “夹在” 两条斜率为 的直线之间,不会出现陡峭的突变。Lipschitz 是最强的连续性条件,满足 Lipschitz 连续的函数一定一致连续。
神经网络的 Lipschitz 常数与梯度范数直接相关:若网络 Lipschitz 常数有界,则梯度范数不会无限增大,可避免训练中的梯度爆炸问题
主要结构
一个生成对抗网络主要包含两个基础的网络:生成器和判别器,它们在训练的过程中相互博弈,形成一种零和博弈的关系
- 生成器 Generator:让生成的样本尽可能接近真实数据,从而欺骗判别器
- 输入随机噪声向量
- 输出与真实数据分布相似的假样本
- 判别器 Discriminator:尽可能准确地区分真实样本和生成样本
- 输入真实数据或生成器生成的假样本
- 输出样本为真实数据的概率
在训练的过程中,生成器和判别器的目标是是相互矛盾的。生成器的目标是生成尽量真实的数据,最好能够以假乱真,让判别器判断不出来,因此生成器的学习目标是让判别器上的判断准确性越来越低;而判别器的目标是尽量判别出真伪,因此判别器的学习目标是让自己的判断准确性越来越高。
在不断的训练过程中,当生成器的数据越来越真时,判别器为了维持住自己的准确性,就必须向判别能力越来越强的方向迭代,而生成器为了使自己生成的样本骗过判别器,就需要生成越来越真实的样本,两个结构同时训练,最终两个结构会越来越完善。
生成器
生成器是数据的伪造者,本质上是一个无监督的生成式 MLP,从随机噪声中生成与真实数据分布一致的假数据,最终让判别器无法区分。它的核心结构如下
- 输入:随机噪声向量,维度为低维,服从先验分布 ,噪声仅输入到生成器的最底层,中间层不额外添加噪声
- 输出:与真实数据维度完全一致的生成样本 ,输出值范围需要匹配真实数据,与真实数据的取值范围一致。其中 包含各层的权重矩阵和偏置向量,是生成器的可学习参数
- 激活函数:隐藏层使用 ReLU 激活函数,解决梯度消失问题,提升深层网络训练稳定性;在输出层使用 Sigmoid 激活函数,将输出值压缩到 区间,与真实数据分布匹配
生成器咋训练时,生成器自身不直接接触真实数据,仅通过判别器的梯度反馈学习
判别器
判别器的核心使命是区分输入样本来自真实数据还是生成器,本质上是一个有监督的二分类 MLP,多层全连接层逐步提取样本的抽象特征,结构设计服务于高精度区分真假的目标。它的结构如下
- 输入:样本向量,输入的真实数据和生成器输出的尺寸一致。输入无需额外预处理,因生成器输出已与真实数据范围相匹配
- 真实样本直接来自训练集
- 生成样本来自于生成器的输出
- 输出:输出为单个标量 ,取值范围为 ,本质时二分类任务的概率输出。其中 包含各层的权重矩阵和偏置向量,是判别器的可学习参数
- 输出越趋近于 1,判别器越认为输入是真实数据;而输出越接近 0,判别器越认为输入时生成数据
- 激活函数:在隐藏层使用 Maxout 单元替代 ReLU 和 Sigmoid,自带特征选择能力,避免梯度消失,且无需额外正则化即可提升泛化能力;输出层使用 Sigmoid 函数,将分类得分转化为概率,用以匹配二分类交叉熵损失的需求
- 正则化:训练中使用 Dropout,随机失活部分隐藏层神经元,防止判别器过拟合
训练流程
GAN 的训练过程是两者的动态博弈
- 生成器生成假数据,输入到判别器
- 判别器同时接收真实数据和假数据,计算两者的分类损失
- 交替优化
- 固定生成器,更新判别器参数,使其更擅长区分真假
- 固定判别器,更新生成器参数,使其生成更逼真的数据
- 最终训练达到 Nash Equilibrium,即生成器生成的数据与真实数据分布几乎一致,判别器无法区分真假
GAN 的优化目标是一个极小极大的问题
对应的损失函数如下
- 判别器的损失函数 ,即真实图像的判别结果接近 1,而生成图像的判别结果接近 0
- 生成器的损失函数 ,生成器的目标就是尽可能使得生成的图像判别结果接近 1
经典的 GAN 网络
CGAN
CGAN 是生成对抗网络的条件扩展,核心创新点是在生成器和判别器中均引入条件信息 ,通过条件约束引导数据生成过程,网络结构围绕双输入设计。它的结构如下

- 条件信息 :可是任意辅助信息,作用是引导生成器生成符合特定条件的样本,同时让判别器在给条件下区分真假样本
- 生成器:负责生成复合条件 的伪造样本,本质是带条件约束的非线性映射
- 输入:两个部分的联合输入,先验噪声 和条件信息
- 中间结构: 和 分别经过独立的隐藏层,中间采用 ReLU 激活函数,再融合为联合隐藏表示,支持复杂的条件和噪声交互
- 输出:生成与真实数据维度一致的样本
- 判别器:负责判断给定条件 时,样本 是来自真实数据还是生成器伪造的。网路结构同样基于 MLP 实现
- 输入:两部分联合输入,带判断的样本 和与 匹配的条件信息
- 中间结构: 和 分别经过独立的隐藏层,再融合成联合隐藏层,中间利用 maxout 激活函数,增强判别器的表达能力
- 输出:输出结果为单个标量,用于表示在给定条件 时,样本 是来自真实数据的概率
CGAN 的训练的本质就是生成器和判别器的博弈,目标是让生成器学习在条件 下生成足以骗过判别器的真实样本,让判别器学习在条件 下精确区分真假样本。
- 训练的目标函数
- 判别器 的目标为最大化目标函数,即尽可能准确区分真实数据 + 条件 和生成数据 + 条件 ,使得 且
- 生成器 的目标是:最小化目标函数,尽可能生成让 误判的样本,使得
- 训练前预处理
- 准备训练数据,并且将条件 编码成可输入网络的向量形式
- 准备噪声分布
- 初始化生成器和判别器的参数,网络结构按照上述的结构设计,需要注意激活函数的选择
- 交替训练判别器和生成器采用 mini-batch 随机梯度下降 训练,迭代至收敛
- 生成器生成样本:从真实数据分布 中采样真实数据 ,对应的条件为 。从噪声分布 采样噪声 ,通过生成器生成伪造样本
- 判别器将所有样本接收,真实样本的标签为 1,从生成器生成的样本标签为 0
- 生成器训练:生成器的损失函数为 ,利用反向传播,更新生成器的参数
- 判别器训练:判别器的损失函数为 ,利用反向传播,更新判别器的参数
- 训练终止:迭代训练判别器和生成器,直到满足停止条件
- 生成样本质量达到预期
- 验证集的 Parzen 窗口对数似然趋于稳定
CGAN 的核心设计是 将条件信息融入双网络:通过在 G 和 D 中同时输入条件 ,使生成过程从无目标随机生成变为有条件可控生成,所有的训练和交互都在给定条件 的约束下进行的,最终实现输入条件 ,生成符合 的真实样本的目标
DCGAN
DCGAN 的核心创新是为 GAN 设计了稳定训练的卷积网络架构,通过移除全连接层、优化卷积操作和激活函数等,解决了传统的 GAN 训练不稳定、生成样本质量差的问题。

- 核心架构设计原则:在 DCGAN 中,提出了几条关键架构的约束原则,是稳定训练的核心
- 移除池化层:判别器利用卷积实现下采样,生成器利用反卷积实现上采样,让网络自主学习采样规则
- 批量归一化:在生成器和判别器的所有层中使用 BN,稳定训练的过程,避免梯度消失或梯度爆炸
- 移除全连接层:深层架构中取消隐藏层的全连接层
- 激活函数选择:生成器中除了输出层使用 Tanh 之外,其余全用 ReLU 激活函数,而判别器中所有层都使用 LeakyReLU 激活函数
- 生成器结构:生成器目标是从随机噪声 生成与真实数分布一致的图像
- 输入层:输入的随机分布的噪声,通过全连接层扩映射为低分辨率且高通道数的 4 维张量,作为输入
- 上采样:通过 4 层反卷积层,逐步扩大特征图的尺寸,同时减少通道数,最终生成目标所需图像
- 无池化、全连接层:全程通过卷积层实现维度转换,保证特征的空间关联性
- 激活函数:生成器中除了输出层使用 Tanh 以外,激活函数全部使用 ReLU
- 判别器结构:判别器的目标是区分真实图像和生成器生成的假图像
- 输入层:输入为真实的图像或生成器的输出,保证图像的维度一致
- 下采样:通过 4 层卷积层逐步缩小特征图尺寸,同时增加通道数,提取图像的层级特征
- 输出层:最后一层的卷积输出经过展平之后,接入单个 sigmoid 节点,输出样本 是来自真实数据的概率
- 激活函数:判别器所有层的激活函数都使用 LeakyReLU,斜率选择 0.2
DCGAN 的训练流程与 GAN 一致,但通过数据预处理、优化器调优和稳定性措施,得到了相比 GAN 更好的效果
- 训练前预处理:
- 将输入图像缩放到 区间
- 将数据去重处理,避免生成器记忆训练样本
- 初始化参数:将所有权重都设置为从零中心正态分布中采样,标准差为 0.02
- 优化器选择 Adam,设定学习率为 0.0002,避免训练震荡,且设置 ,提升稳定性
- 训练过程:训练采用交替迭代方式,核心是最小化生成器与判别器的对抗损失
- 生成器生成样本:从真实数据分布 中采样真实数据 ,对应的条件为 。从噪声分布 采样噪声 ,通过生成器生成伪造样本
- 判别器接收所有图像,真实图像标签为 1,生成器生成的图像标签为 0
- 生成器训练:计算判别器对该假图像的判断损失 ,通过反向传播更新生成器的权重
- 判别器训练:判别器的损失函数为 ,利用反向传播,更新判别器的参数
- 迭代收敛:循环训练过程,直到满足停止条件
- 生成器生成的图像在视觉上接近真实数据
- 生成的样本无明显噪声、语义连贯,判别器的损失趋于稳定
DCGAN 的主要核心就是为 GAN 设计了适配卷积网络的稳定架构,通过全卷积 + BN + 特定激活函数的组合,让 GAN 能深度学习图像的层级特征
Wasserstein GAN
WGAN 在 2017 年提出,是对传统 GAN 的改进算法,核心目标是通过 Wasserstein 距离替代 JS/KL 散度来衡量分布差异,解决了传统的 GAN 训练不稳定等问题。
WGAN 的网络结构延续了 GAN 的生成器+判别器的两部分的结构,但对判别器的约束和输出做了关键的修改,同时保留生成器的核心功能,在 Wasserstein GAN 的论文中将修改后的判别器称为 Critic,用以区分其与传统的 GAN 判别器的差异
- 生成器:输入随机噪声 ,噪声满足固定的先验分布,例如满足高斯分布,通过参数化函数生成样本 ,目标是让生成样本的分布 逼近真实的数据分布 。网络有两种架构
- 卷积架构:沿用 DCGAN 的深度卷积结构
- MLP 架构:使用 4 层的 ReLU-MLP,每层有 512 个隐藏单元,使用 ReLU 激活函数
- 激活函数支持使用 ReLU、Tanh、ELU 等光滑 Lipschitz 函数
- 生成器的结构设计与传统的 GAN 一致,无需额外约束,仅通过梯度更新优化参数
- Critic:不再输出数据是真实的概率,而是对输入的样本进行打分,反映样本与真实分布之间的距离,目标是学习一个 Lipschitz 函数,以逼近 Wasserstein 距离。网络结构也有两种架构,输出为
- 卷积架构:沿用 DCGAN 的结构,但移除了输出层的 Sigmoid 激活,输出连续的分数
- MLP 架构:使用与生成器一致的 4 层 512 隐藏单元结构,使用 ReLU 激活函数
- 约束 1-Lipschitz 条件:对任意的输入 和 ,满足 ,保证函数光滑,避免梯度爆炸或消失。在每次更新权重时,将权重限制在区间 之内,默认 ,使其强制满足 Lipschitz 约束
- 输出形式为连续值,无范围限制,利用上述对权重的约束来限制打分范围
- Wasserstein 距离:用于表示两个分布的相似程度,Wasserstein 距离衡量了把数据从分布 移动成分布 时所需要移动的平均距离的最小值。
- 计算公式为
- 其中 表示两个分布组合起来的所有可能的联合分布的集合,对于每一个可能的联合分布,可以从中采样得到一个样本 和 ,计算这对样本的距离 ,所以可以计算在该联合分布下,样本对距离的期望。在所有可能的联合分布中能够对这个期望值取到的下界就是 Wasserstein 距离
WGAN 的训练流程的核心设计为在单词训练循环中,先多次训练 Critic 到最优,再更新生成器,确保每次生成器更新时都能获得可靠的 Wasserstein 距离梯度
- 训练前预处理
- 初始化生成器参数
- 初始化 Critic 参数
- 使用 RMSProp 优化器,针对非平稳损失的表现更好,避免 Adam 动量的副作用,学习率设置为 0.00005
- 裁剪权重
- 迭代 Critic 次数
- 训练 Critic k 次:每次训练 Critic 的目标都是最大化真实样本打分 - 生成样本打分
- 从真实分布采样真实数据
- 从先验分布 采样得到的噪声 ,经过生成器得到的生成样本
- 计算损失 ,目标是最大化
- 通过计算损失对 的梯度,利用 RMSProp 优化器更新参数
- 将更新后的权重限制在 之内,强制满足 1-Lipschitz 约束
- 更新生成器:生成器的目标是最小化 Wasserstein 距离
- 从先验分布 采样得到的噪声 ,经过生成器得到的生成样本
- 计算生成器损失 ,对于 Wasserstein 距离 生成器需要最小化这个距离,即最小化
- 通过计算损失对 的梯度,利用 RMSProp 优化器更新参数
- 观察 Critic 的损失曲线,当损失稳定且生成样本质量不再提升时停止。另外由于 WGAN 的损失曲线与样本的质量强相关,可直接通过损失判断训练进度
WGAN 的核心创新是用 Wasserstein 距离替代传统散度,并通过 Critic + 权重裁剪实现该距离的优化
WGAN-GP
WGAN-GP 是 2017 年提出的对原始 WGAN 的核心改进方法,它的核心创新点是利用梯度惩罚来替代 WGAN 的权重裁剪,解决了权重裁剪导致的网络容量不足、梯度消失或爆炸等问题,实现了更稳定、泛化性更强的 GAN 训练
WGAN-GP 的核心目标是在保留 WGAN 基于 Wasserstein 距离的稳定训练特性基础上,通过 1-Lipschitz 约束方式,支持深层网络训练,同时无需复杂参数调优。WGAN-GP 的网络结构分为生成器和判别器两个部分,如下
- 生成器结构:将已知先验分布的随机噪声向量映射到目标数据空间,生成与真实数据分布接近的假样本
- 论文提到三个典型框架
- 卷积架构:沿用 DCGAN 的结构,但移除了输出层的 Sigmoid 激活,输出连续的分数
- MLP 架构:使用与生成器一致的 4 层 512 隐藏单元结构,使用 ReLU 激活函数
- ResNet 结构,使用残差连接的网络
- 上采样:在图像生成任务中的上采样操作用最近邻上采样配合 卷积层,避免信息丢失
- 输出层图像任务用 Tanh 激活,文本任务用逐点卷积 + Softmax 激活函数
- 论文提到三个典型框架
- 判别器结构:评估输入样本的 Wasserstein 距离分数,区分真实样本和生成样本,但输出的不是概率,而是对输入的样本进行打分,反映样本与真实分布之间的距离,目标是学习一个 Lipschitz 函数,以逼近 Wasserstein 距离
- 禁用批量归一化,使用层归一化代替
- 它支持的架构与生成器的对称
- 卷积架构:沿用 DCGAN 的结构,但移除了输出层的 Sigmoid 激活,输出连续的分数
- MLP 架构:使用与生成器一致的 4 层 512 隐藏单元结构,使用 ReLU 激活函数
- ResNet 结构,使用残差连接的网络
- 激活函数与生成器一致,使用 ReLU 和 LeakyReLU
- 下采样:图像任务使用均值池化配合 卷积,保持梯度平滑
- 输出层:无激活函数,直接输出连续分数,匹配 Wasserstein 距离的数值特性
WGAN-GP 的训练流程遵循在单次训练循环中判别器多轮更新+生成器单轮更新的交替策略,核心是梯度惩罚的计算与优化,流程固定且超参数无需调优
- 训练前预处理
- 优化器选择使用 Adam,定义它的优化器学习率 ,动量系数为
- 生成器参数和判别器参数随机初始化,它们均使用 Adam 优化器
- 判别器训练:判别器的损失函数是 WGAN 原始损失与梯度惩罚项的结合,目标是强制判别器满足 1-Lipschitz 约束
- 损失函数为
- 是梯度惩罚项:强制判别器在 处的梯度范数接近于 1,避免梯度过大,也避免梯度过小。其中 是真实样本和生成样本之间所有线性插值点的集合 。当 从 0 到 1 遍历,所有可能的 构成了直线连接区域
- 目标是最小化损失函数,等价于最大化 WGAN 的价值函数,WGAN 的原损失项为假样本分数 - 真实样本分数
- 生成器训练:生成器的目标是最小化 Wasserstein 距离
- 损失函数为
- 生成器期望判别器对假样本的分数尽可能高,目标是最小化损失函数
- 过拟合检测:WGAN-GP 的损失曲线具有明确意义,即训练损失与验证损失发散时,表明判别器过拟合,需终止训练或增加数据
LSGAN
LSGAN 是针对传统的 GAN 训练中梯度消失的问题提出的改进模型,它的核心创新点在于将判别器的 Sigmoid 交叉熵损失替换为最小二乘损失。最小二乘损失会惩罚在决策边界正确侧但远离真实数据的生成样本,迫使生成器产出更接近真实数据分布的样本,另外它也缓解了传统 GAN 的梯度消失问题,即使无批量归一化(BN)也能收敛,且不易出现模式崩溃
LSGAN 设计了两种针对性架构,分别适配通用图像生成和多类别任务,核心延续了 DCGAN 的卷积和反卷积的框架,但在层结构和适配性上做了优化
对于通用图像生成版本:参考 VGG 网络设计,重点优化了特征提取和分辨率恢复能力

- 生成器
- 输入:1024 维随机噪声向量
- 全连接层和反卷积层堆叠而成,后接 BN 层归一化
- 激活函数使用 ReLU
- 判别器
- 输入真实图像或生成器伪造的图像
- 层级结构以卷积层堆叠而成
- 损失函数使用最小二乘损失
- 激活函数使用 LeakyReLU
多类别任务:

- 标签处理:输入标签编码为 one-hot 编码。将高维标签向量映射为低维向量,论文中映射为 256 维向量,再与生成器或判别器的中间层特征拼接,建立输入与输出的确定性关联
- 生成器
- 输入 1024 维噪声 + 映射之后的 256 维标签向量
- 层结构:全连接层连接,多个反卷积层堆叠,每一层后接 BN 批次归一化,输出最终反卷积
- 激活函数使用 ReLU
- 判别器
- 输入真实或伪造的数据与映射之后的 256 维标签向量
- 层结构:由多个卷积层堆叠而成,后接全连接层输出 1 维结果
- 损失函数使用最小二乘损失
- 激活函数使用 LeakyReLU
LSGAN 遵循 GAN 经典的生成器-判别器交替训练的框架,在目标函数和参数设置中有一定优化
- 训练前准备
- 优化器使用 Adam,选择 ,学习率在场景数据中使用 0.001 ,多类别汉字数据中使用 0.0002
- 判别器训练
- 从真实数据分布采样真实样本 ,并获取对应的标签
- 从噪声分布 采样噪声 ,通过生成器 生成伪造样本
- 损失函数为
- 最小化损失函数,反向传播更新判别器参数,提升分辨准确率
- 生成器训练
- 从噪声分布采集新噪声 ,生成
- 损失函数为
- 最小化损失函数,反向传播更新生成器参数,提升伪造样本的逼真度
- 迭代训练,直到单类别场景中生成图像细节清晰,或在多类别场景中生成样本可读且对应标签正确
LSGAN 的核心价值是用最小二乘损失解决了传统 GAN 的梯度消失和训练不稳定问题,通过两种针对性网络架构,分别适配了通用图像生成和多类别任务。训练流程延续了 GAN 的交替训练逻辑,但通过损失函数和标签处理的优化,实现了更高质量生成 + 更稳定训练的双重目标,尤其在场景图像和多类别字符生成中表现突出。
Pix2Pix
Pix2Pix 是基于条件生成对抗网络的通用图像到图像的翻译框架,核心优势是通过统一的架构适配多种任务,无需针对具体任务设计损失函数
Pix2Pix 的网络结构由生成器和判别器构成,均采用卷积神经网络,并且对图像翻译任务做了特殊设计
- 生成器结构:生成器的核心目标是通过输入图像 ,生成与真实输出 一致的目标图像 ,其中的 是噪声。它的结构基于 U-Net,核心结构就是编码器-解码器,中间设置跳跃连接
- 编码器:用于下采样,逐步压缩空间维度,提升通道维度,提取高层语义特征。内部是多层结构,每一层都是卷积+BN+ReLU 堆叠而成。其中所有的卷积核尺寸都为 ,步长为 2;编码器的 ReLU 激活函数都是带泄露的 ReLU,斜率为 0.2
- 解码器:用于上采样,逐步恢复空间维度,降低通道维度,生成目标函数。内部也是多层结构,每一层的结构为卷积+BN+Dropout+ReLU 堆叠成。其中解码器中的 ReLU 激活函数都是普通的 ReLU 函数
- 输出:解码器的最后一层输出通过 卷积映射到输出通道数,再经过 Tanh 处理后输出
- 跳跃连接:将编码器的第 层与解码器的第 层( 为总层数)的特征图按通道拼接,作用是直接传递输入与输出共享的低层次信息,避免信息丢失
- 引入的噪声 不直接输入随机噪声向量,而是在解码器多个层中加入 Dropout,避免生成器忽略噪声
- 判别器:判别器主要用于区分真实样本和伪造样本。它不判断整幅图像的真实性,而是判断每个图像块的真实性,再对所有块的判断结果取平均作为最终输出。
- 核心层:通过多层网络结构堆叠而成,每一层都是卷积+BN+ReLU 的结构。另外就是第一层没有 BN;ReLU 激活函数是带泄露的 ReLU,斜率为 0.2
- 输出:最后一层的输出通过 的卷积映射到单通道,经过 Sigmoid 输出每个块的真实概率,之后对所有块的真实概率取均值,得到最终输出
Pix2Pix 的训练核心就是对抗学习+重建损失的结合,通过不断优化生成器和判别器,实现生成结构足够真实
- 目标函数为 ,目标函数分为两个部分,如下
- 条件 GAN 损失 ,用于学习区分真实或伪造的样本对。其中 表示 D 判断 为真的概率,目标是最大化 ;其中 是判断伪造样本为真实的概率,目标是最小化
- 重建损失 ,用于约束生成图像与真实图像的像素级差异,避免 GAN 生成的结果与输入无关。选择使用 而非是 是因为 损失鼓励生成锐利图像, 易导致模糊;默认 选择为 100
- 训练前预处理
- 随机抖动:将输入图像
resize到大尺寸,再随机裁剪回原尺寸,提升泛化能力 - 镜像增强:随机水平反转图像,扩充训练数据
- 权重初始化:将所有权重都设置为从零中心正态分布中采样,标准差为 0.02
- 随机抖动:将输入图像
- 训练流程
- 生成器生成伪造样本 ,其中 通过 Dropout 引入, 为输入图像
- 将生成器的生成的样本标记为 0,将真实样本标记为 0
- 训练生成器:根据损失函数 通过反向传播更新生成器的权重
- 训练判别器:根据损失函数 ,利用反向传播,更新判别器的参数
- 重复上述步骤,直到收敛
- 生成图像的视觉质量稳定
- 损失曲线收敛达到预设阈值
在 Pix2Pix 论文中,还提到了 PatchGAN 全卷积判别器架构,核心特点是输出 的概率矩阵,而非单个标量,每个元素对应输入图像中一个局部 patch 的真伪判断结果,最终通过平均所有的 patch 结果得到整体判断
核心设计理念
- 专注于图像的局部高频细节而非全局结构,能更好捕捉纹理和边缘等细节特征
- 马尔可夫假设:假设图像中的距离超过 patch 直径的像素是相互独立的,这有效地降低了计算复杂度
- 全卷积实现:通过卷积层滑动计算所有的 patch,比逐个 patch 单独处理更高效
- 支持任意大小的图像输入
PatchGAN 在 Pix2Pix 中采用四层结构,如下
- 采用 的卷积层和 LeakyReLU 激活函数,无 BN 层
- 采用 的卷积层,后接 BN 批归一化和 LeakyReLU 激活函数
- 采用 的卷积层,后接 BN 批归一化和 LeakyReLU 激活函数
- 采用 的卷积层,后接 BN 批归一化和 LeakyReLU 激活函数
输入时通常将条件图像与生成图像拼接之后输入
CycleGAN
CycleGAN 是在 2017 年提出的无监督图像到图像转换模型,无需配对训练数据就能学习两个图像域 X 和 Y 之间的双向转换规则。它的核心结构是双生成器+双判别器的对称结构,同时通过循环一致性约束关联两个生成器
- 生成器结构:两个生成器结构完全一致 ,它们仅训练目标相反,均采用适用于图像风格迁移和超分辨率的残差网络架构,核心是通过下采样-特征提取-上采样的结构,同时保留图像内容一致性
- 用于把源域 的真实图像转换为目标域 风格的假图像
- 用于把源域 的真实图像转换为目标域 风格的假图像
- 采用实例归一化:替代批量归一化,减少对批次大小的依赖,提升风格迁移的稳定性和一致性
- 反射填充:在图像边界进行镜像填充,以保持图像尺寸并适应卷积操作。在卷积层前使用,避免图像边缘出现拉伸或 artifacts,保持图像内容的完整性
- 残差块:解决深层网络梯度消失的问题,确保内容特征不丢失,残差块数量根据输入分辨率调整
- 生成器采用全卷积结构,支持任意尺寸输入图像,仅需要调整残差块数量即可适配不同分辨率
- 判别器结构:两个判别器结构一致 ,均采用 PatchGAN,核心是局部判别而全局判别,通过判断图像中 的 patch 是否为真实样本,实现对生成图像真实性的评估
- 用于区分 域的真实图像和生成器生成的假 图像
- 用于区分 域的真实图像和生成器生成的假 图像
- 利用全卷积设计,可处理任意尺寸和输入图像
- 网络结构为上述的 PatchGAN 结构
- 输出每个 patch 的真伪概率,最终通过平均得到整体判别结果
CycleGAN 的训练通过生成器与判别器的对抗博弈以及循环损失的约束,实现稳定训练
- 核心目标函数 分为四个部分
- 对抗损失:目的是让生成器的输出分布与目标分布域一致,采用最小二乘损失。对抗损失分为两部分,生成器和判别器的目标都与上述的 GAN 中的一致
- 对于 和 ,对抗损失为
- 对于 和 ,对抗损失为
- 循环一致性损失:损失采用 L1 范数
- 前向循环:
- 后向循环:
- 身份映射损失:针对需要保持颜色一致性的任务,额外添加约束 ,即生成器对目标域真实样本的转换应接近原样本
- 对抗损失:目的是让生成器的输出分布与目标分布域一致,采用最小二乘损失。对抗损失分为两部分,生成器和判别器的目标都与上述的 GAN 中的一致
- 训练前预处理
- 数据准备:输入无配对的两个域的数据集 和 ,无需标注样本对应关系
- 初始化生成器 ,判别器 和 的权重
- 训练流程
- 对于 ,用真实 域的样本 和生成的样本 计算损失,反向传播更新参数
- 对于 ,用真实 域的样本 和生成的样本 计算损失,反向传播更新参数
- 对于生成器,需要计算对抗损失、循环一致性损失和身份映射损失,总的损失反向传播,同步更新 和
- 迭代终止,直到满足条件停止
- 生成图像的视觉质量稳定
- 损失曲线收敛达到预设阈值
生成器的网络结构核心差异在于残差块数量,需根据输入图像分辨率选择
适配 128×128 分辨率,包含 6 个残差块,层级顺序如下
| c7s1-64 | d128 | d256 | R256 | u128 | u64 | c7s1-3 |
|---|---|---|---|---|---|---|
| 1 | 1 | 1 | 6 | 1 | 1 | 1 |
适配 256×256 及更高分辨率,包含 9 个残差块,层级顺序如下
| c7s1-64 | d128 | d256 | R256 | u128 | u64 | c7s1-3 |
|---|---|---|---|---|---|---|
| 1 | 1 | 1 | 9 | 1 | 1 | 1 |
其中关键层的定义如下
c7s1-k是 卷积核+实例归一化+ReLU,其中卷积步长为 1dk是 卷积+实例归一化+ReLU,其中卷积步长为 2Rk是 2 个 卷积+实例归一化+ReLU,其中卷积的步长为 1,中间包含残差连接,也就是层级输入与输出相连uk是反卷积,是由 的反卷积+实例归一化+ReLU,其中反卷积的步长为 0.5
ProGAN
ProGAN 是在 2018 年发表的生成对抗网训练方法,核心创新点是渐进式增长的生成器与判别器,它解决了传统 GAN 训练不稳定、高分辨率图像生成质量低、多样性不足等问题。传统 GAN 直接训练高分辨率图像生成时,因细节建模难度大、梯度不稳定,易出现模式崩溃和生成图像模糊的问题;ProGAN 提出从低分辨率开始,逐步向网络中添加层以建模更精细的细节,让模型先学习图像的全局结构,再逐步优化局部细节

ProGAN 的生成器和判别器的结构为镜像对称结构,同步渐进式增长,所有已经存在的层在训练全程都保持可训练的状态
- 生成器:从 4×4 分辨率开始,通过上采样 + 新增卷积层逐步提升分辨率,最终通过 toRGB 层映射为 RGB 图像
- 输入: 维度向量,向量中每个值都服从 分布,归一化到单位超球面
- 上采样操作:采用 最近邻插值,将分辨率翻倍,将分辨率翻倍
- 卷积块:每个分辨率阶段都包含 2 个 卷积层,激活函数为 Leaky ReLU,负斜率为 0.2
- toRGB 层:是逐点卷积层,将高维特征映射为 3 通道的 RGB 图像
- 像素归一化:在每个卷积层之后使用,将每个像素的特征向量归一化到单位长度,防止信号幅度失控
- 判别器:从当前最高分辨率开始,通过下采样 + 卷积层逐步降低分辨率,最终通过全连接层输出真假判断
- 输入:RGB 图像,将实际图像下采样到当前训练的分辨率
- 下采样操作:与生成器对称,采用平均池化层,将分辨率减半
- fromRGB 层:是逐点卷积层,将 RGB 图像映射为高维特征
- Minibatch Stddev 层:在 分辨率阶段插入,计算每个特征在批次内的标准差并拼接为新特征,强制判别器关注批次内的多样性,避免模式崩溃
- 像素级归一化:防止信号幅度过大
- 对每个像素的特征向量做 归一化
- 限制图像生成质量,仅约束信号的幅度,稳定性提升明显
- Minibatch Stddev 层:即批次标准差,用于提升图像的多样性,避免模式崩溃
- 计算每个特征图在每个空间位置上的批次标准差
- 对所有特征和空间位置的标准差取平均值,得到一个标量
- 将标量复制后拼接为新的特征图,输入到后续层
ProGAN 的训练核心是逐步提升分辨率 + 平滑过渡新层,全程保持网络参数可训练

- 训练前预处理
- 生成器和判定器仅包含 分辨率的基础卷积块,整体的网络结构比较简单,生成器生成 的 RGB 图像,而判别器接收 的 RGB 图像,输出图像真伪概率
- 均衡学习率:权重初始化采用简单的 ,运行时通过层特定常数缩放权重 ,其中 是来自 He 初始化方法的每层归一化常数,用以确保所有层的学习速度一致
- 分辨率提升阶段:当 分辨率训练稳定之后,开始逐步提高分辨率
- 添加新层:在生成器的上采样之后且 toRGB 层前添加对应高分辨率的卷积块;在判别器的 fromRGB 之后且下采样之前添加对应高分辨率的卷积块
- 生成器平滑过渡:生成器的输出为 。训练过程中 从 0 开始,每迭代一次就线性增加,直到 。过渡之后继续训练新分辨率层,直到稳定进入下一轮过渡
- 判别器平滑过渡:融合新旧分辨率特征 。训练过程中 从 0 开始,每迭代一次就线性增加,直到 。过渡之后由新层作为主导继续训练
- 稳定训练。当 时,新层完全生效,继续训练该分辨率直到稳定
- 循环训练,当目标分辨率训练稳定,且连续迭代中生成图像的质量和多样性不再提升时,训练终止。最终生成器可输出高质量且高多样性的高分辨率图像
上述的生成器的上采样中,利用了最近邻插值,这里介绍一下图像处理中的插值
- 最近邻插值即零阶插值法:目标图像像素值与原图像最近像素完全一致
- 线性插值:对于目标插值点 ,它的值为
- 双线性插值:与线性插值一样,这里的参考点数量是周围的 4 个点
- 双三次插值:相当于最近的 16 个采样点的加权平均,权重为 ,其中 为距离
StackGAN
StackGAN 是一种用于文本到高分辨率图像合成的深度学习模型,在 2017 年被提出。核心目标是解决传统文本到图像生成模型中分辨率低、细节缺失、训练不稳定的痛点,实现了从纯文本描述生成图像
StackGAN 的核心结构由条件增强模块,草图生成阶段和细节细化阶段组成

- 文本编码:首先通过预训练的文本编码器将文本描述 转换为固定维度的稠密向量:文本嵌入
- 条件增强模块:直接将词嵌入向量变换得到的条件编码当作潜在变量的方式是不妥的
- 高斯分布建模:将文本嵌入 输入到全连接层,输出高斯分布的均值 和对角协方差矩阵
- 随机采样:从该高斯分布中随机采样得到条件潜变量 ,其中 引入可控随机性
- 正则化约束:在生成器损失中加入 KL 散度项 ,强制采样分布接近标准高斯分布,避免过拟合并保证潜空间平滑
- Stage-1:基于文本描述,生成低分辨率图像,捕捉物体的基本形状、颜色和背景布局,为后续细化提供基础框架
- 生成器 结构
- 输入:前置条件增强模块输出的条件潜变量 ,引入随机噪声 ,两者拼接输入
- 通过上采样模块+BN+ReLU 激活函数,逐步提升特征图分辨率,最终输出低分辨率图像 。上采用使用最近邻插值法上采样
- 上采样模块包含最邻近插值与 卷积层
- 判别器 结构:
- 输入:输入真实图像 和生成器 生成图像 ,并且引入文本编码输出的文本嵌入
- 文本嵌入 经全连接层压缩之后,空间复制为与图像下采样后尺寸匹配的张量
- 图像经过下采样模块降低分辨率,与文本张量沿通道维度拼接
- 通过逐点卷积融合图像图文特征,最终经过全连接层输出图像真实度和图像与文本匹配度的判别分数
- 生成器 结构
- Stage-2:以 Stage-1 生成的图像和文本描述为输入,修正 Stage-1 的缺陷,并为图像添加细节,最终生成高分辨率图像
- 生成器 结构:结构设计为编码器-残差块-解码器
- 编码器:接收第一阶段生成器生成的图像 ,经过下采样降低分辨率,提取特征
- 文本融合:将文本条件潜变量 空间复制后,与图像编码器的输出拼接
- 残差块:通过 个残差块深度融合图文特征,修正结构缺陷。其中每个残差块的结构为 卷积+BN+ReLU
- 解码器:经上采样块逐步提升分辨率,最终输出高分辨率图像
- 判别器 结构:与 Stage-1 中的判别器类似,但它输入图像的分辨率更高,增加了额外的下采样模块
- 输入真实图像 和 生成图像 ,经过下采样之后与文本嵌入 拼接,之后接全连接层输出真实度和图像与文本匹配度的判别分数
- 生成器 结构:结构设计为编码器-残差块-解码器
StackGAN 采用分阶段训练策略,先固定 Stage-2 的训练,训练 Stage-1 GAN 以建立文本到低分辨率草图的映射,再固定 Stage-1 的训练,开始训练 Stage-2 GAN 以完成草图到高分辨率细节的细化
- Stage-1 GAN 训练:固定 Stage-2 网络参数,仅迭代训练 和
- 生成器的目标函数为
- 判别器的目标函数为
- 训练时最小化 的损失 ,最大化 的损失
- Stage-2 GAN 训练:固定 Stage-1 网络参数,迭代训练 和
- 生成器的目标函数为
- 判别器的目标函数为
- 训练时最小化 的损失 ,最大化 的损失
BigGAN
BigGAN 是在 2019 年提出的大规模生成对抗网络。传统的 GAN 难以在图像网络等复杂数据集上生成高分辨率和高多样性的图像,核心的瓶颈在于训练的规模不足和稳定性较差。而 BigGAN 的核心目标是通过规模化训练来突破性能上限,同时解决大规模训练带来的特有不稳定性,缩小生成图像与真实图像的差距
BigGAN 的网络结构基于 ResNet 的架构设计,分为生成器和判别器,结构设计如下

- 生成器结构:核心是从输入向量到高分辨率图像的渐进式生成
- 输入层包含两个输入
- latent 向量 ,将向量 按通道拆分,每个块与类嵌入拼接之后,传入对应分辨率的残差块中,通过线性映射层输入到残差块的各个 BN 中
- 类嵌入 ,将类别标签映射为向量。类嵌入通过线性投影将共享类嵌入映射到残差块的各个的 BN 层中
- 残差块:是核心生成单元,包含 卷积+BN+ReLU,通过上采样逐步提升图像分辨率,网络结构如图中 b 所示
- Non-Local Block:插入单个分辨率阶段,建模长距离依赖,提升全局结构一致性
- 跨设备 BN:在大规模训练时,BN 统计量从所有设备聚合,而非单设备计算,避免小批次统计量偏差
- 输出层:利用 卷积将通道数量压缩到 3,通过 Tanh 激活输出 范围的图像
- 输入层包含两个输入
- 判别器结构;判别器的核心任务是区分真实图像与生成器生成的图像
- 输入图像+类别标签
- 残差块:是核心单元,通过下采样逐步降低分辨率、提升图像通道数,提取多尺寸特征,网络结构如图中 c 所示
- Non-Local Block:与生成器对应,插入单个分辨率阶段,增强全局特征捕捉
- 投影条件:将类嵌入与最后一层特征进行点积,再叠加线性层输出判别分数,强化类别与图像特征的关联
- 谱归一化:对所有卷积层权重进行普归一化,确保 Lipschitz 连续性,稳定对抗训练。
- 谱归一化:利用矩阵的谱范数调整,使得普范数被限制在一个特定的值,从而控制函数的 Lipschitz 常数
- 公式为 ,最终得到的 ,保证了该层的变换不会过渡放大输入
- 条件 BN:流程图中所用的 BN 为条件 BN,这里使用条件 BN 是为了保证条件信息不再只影响第一层,而是逐层控制图像生成的过程,它的结构如下
- 首先是标准化的 BN 步骤,计算 (在一般的 BN 里,后面要进行仿射变换输出 ,其中 和 是可学习的参数)这里不进行仿射变换,直接输出 ,所以需要在定义 BN 时设置
affine=False - 条件 BN 与原来的 BN 的区别就在于,它将条件信息嵌入到了 和 中
- 输出变为
- 其中
- 首先是标准化的 BN 步骤,计算 (在一般的 BN 里,后面要进行仿射变换输出 ,其中 和 是可学习的参数)这里不进行仿射变换,直接输出 ,所以需要在定义 BN 时设置
- Non-Local Block:标准卷积的感受野的增长是局部 + 逐层扩展的,如果想要建模长距离依赖或全局一致性,就需要很多层。于是引入 Non-Local Block,利用它可以实现任意位置的特征,都可以直接和所有其它位置建立联系
- 输入
- 计算三个投影(利用逐点卷积) ,并且将它们三个展平,其中 ,通常会选择
- 计算相似度矩阵,计算点积 ,之后进行 Softmax 归一化
- 全局特征聚合,计算点积 ,之后将维度转置为 ,之后展开为
- 利用逐点卷积将 映射到
- 最终残差连接,输出
BigGAN-deep 是 BigGAN 的深度优化版本,参数更少但性能更优,相比 BigGAN,它的核心改进如下

- 瓶颈残差块:在残差块的 卷积之前添加一个 卷积层,将通道数压缩,后添加一个 卷积恢复通道数。以减少计算量
- 每个分辨率阶段包含两个残差块,在 BigGAN 中每个阶段仅包含一个残差块,整体的深度比 BigGAN 更深,但是由于引入了瓶颈残差块,所以整体参数更少
- 隐藏向量 输入到生成器中时,不再拆分,而是直接将完整的隐藏向量与类嵌入拼接之后输入到所有残差块
BigGAN 的训练流程分为五个关键步骤
- 训练前预处理
- 利用面积重采样将图像缩放到目标分辨率
- 像素归一化:将图像的像素值映射到 范围
- 类别标签处理:将类别标签转换为 one-hot 编码,再通过线性层映射为 128 维的类嵌入向量,用于后续条件生成
- 模型权重初始化:G 和 D 均采用 正交初始化,减少训练初期参数震荡;同时类嵌入层、线性投影层的权重同样遵循正交初始化,保证类别信息传递的稳定性
- latent 向量 的维度随着分辨率调整,采样自标准正态分布
- 生成器生成假图像
- 输入:latent 向量 ,还有类嵌入向量 ,将它们分别传输到对应的残差块中(在 BigGAN 中,它们拼接之后再分别传输到对应的残差块中)
- 前向传播:latent 向量 也作为输入,通过生成器的残差块、Non-Local Block、BN 等,逐步上采样到目标分辨率
- 最后通过 卷积将通道数压缩到 3,后用 Tanh 激活函数输出 范围的假图像
- 另外在采样时,使用 G 权重的指数移动平均 EMA,提升图像的一致性
- 判别器训练
- 输入从数据采集的真实图像 ,搭配对应的标签 ,还有上述生成器生成的
- 图像经过判别器的残差块下采样、Non-Local Block、谱归一化之后,输出判别分数 和
- 用 Hinge Loss 计算判别损失 ,最后一项 R1 梯度惩罚项, 为正则化强度,通常取
- 利用损失函数,反向传播计算梯度,利用 Adam 优化器更新 D 的权重,重复更新两次判别器的权重。在更新 D 时,将 G 的权重固定
- 生成器训练
- 输入:使用生成器生成的假图像 以及判别器对其判别分数
- 用 Hinge Loss 计算生成器损失 ,最小化 。损失函数无需通过 函数转换,避免了梯度消失
- 清空 G 的梯度,反向传播计算梯度,利用 Adam 优化器更新 G 的参数。另外更新 G 的 EMA 权重
- 迭代训练,每轮迭代之后检测关键指标
- 奇异值检测:利用 Arnoldi 迭代计算 G 和 D 各层权重的前 3 个奇异值 ,G 的第一层容易出现 的持续增长,是训练坍塌的前兆
- 损失与准确率检测:D 的训练准确率若 ,但验证集的准确率仅在 之间,说明 D 过拟合训练集,需早停
在大规模训练时,会不可避免地出现训练坍塌,G 地部分层起义值爆炸,生成图像的质量骤降。所以在检测到坍塌前兆之前,保存性能最优的 checkpoint;或者可以尝试 R1 梯度惩罚,可稳定训练,但会导致 IS 下降 ,最终选择早停。
StyleGAN
StyleGAN-V1
StyleGAN 是在 2018 年被提出的基于风格迁移思想的 GAN 生成器架构,核心目标是解决传统的 GAN 生成器的缺乏对图像合成过程的直观控制、latent 空间纠缠严重、随机细节生成不自然等问题
StyleGAN 彻底重构了传统的 GAN 生成器的输入与特征调制方式,核心模块包含映射网络、生成器、判别器三大模块

- 映射网络:打破原始 latent 空间 对训练数据分布的依赖,将 映射到解纠缠的中间空间 ,其中 无需服从特定分布,可自由编码独立的变异因子
- 输入:原始 latent 向量 ,通常为 512 维标准正态分布
- 结构:8 层全连接层结构,无归一化,中间使用 Leaky ReLU 激活函数
- 输出:中间 latent 向量
- 风格基础的生成器:从低分辨率到高分辨率逐步生成图像,每层通过风格调制 AdaIN 和噪声注入控制细节
- 输入:并非原始 latent 向量,而是一个可学习的常数张量,维度为
- 结构:18 层卷积,每个分辨率中包含两个卷积层,上采样使用双线性插值代替最近邻插值,网络分辨率从 不断扩展到
- 输出:卷积层之后连接逐点卷积将特征图转为 RGB 图像
- 风格调制 AdaIN:StyleGAN 借鉴风格迁移中的 AdaIN 操作,实现风格对特征的调制。将 编码的风格注入每一层卷积,实现尺度特定的风格控制(如低分辨率层的风格控制姿态,高分辨率层控制纹理)
- 公式为
- 其中 是第 层特征图,特征图就是每一层卷积神经网络的输出,而 和 是特征图的均值和方差
- 其中 是风格向量:由中间的 latent 向量 经学习的仿射变换得到,其中 控制缩放, 控制偏移
- 噪声注入:为合成网络的每一层卷积后注入单通道高斯噪声,通过学习的逐特征图缩放因子(B 层)调整噪声强度,再叠加到特征图上。用于影响图像的随机细节,不改变高层属性,实现全局结构与随机细节额定分离
- 风格混合:训练时随机选择部分图像,用两个不同的 latent 向量 和 分别映射到 和 ,代表两种不同的风格,然后在网络中随机选择一个中间的交叉点 ,交叉点前半层使用 ,交叉点后半层使用 。用于打破相邻层风格的相关性,提升生成图像的多样性和可控性
- 判别器结构:继承自 ProGAN 的架构,网络结构与生成器对称
StyleGAN 基于 ProGAN 的训练框架,从低分辨率的训练逐步到高分辨率的训练,优化了超参数、损失函数和正则化策略
- 渐进式训练:从 分辨率开始,逐步提升到 ,每个阶段训练时,先冻结已有层,仅训练新增的高分辨率层,再微调所有层,保证网络稳定性
- 判别器的损失函数:使用两种结构的损失函数,一般会选择 R1 正则化
- WGAN-GP 类似的,添加梯度惩罚项 ,其中 是真实样本和生成样本之间所有线性插值点的集合 。当 从 0 到 1 遍历,所有可能的 构成了直线连接区域
- R1 正则化:在传统的 GAN 的损失函数之后添加 R1 正则化项
- 生成器的损失函数:与一般的 GAN 一致
- 训练时随机选择部分图像,用两个不同的 latent 向量 和 分别映射到 和 ,在合成网络的随机交叉点切换风格,用于打破相邻层风格的相关性,强制网络学习局部化的风格表示,提升生成图像的多样性和可控性
- 截断:由于中间空间 中部分区域对应低概率训练数据,生成图像容易失真
- 计算 空间的质心 ,对新采样的 缩放处理: ,通常
- 用于限制 偏离质心的程度,提升生成图像的平均质量,避免极端样本失真
在 StyleGAN 中,通过 映射 + AdaIN + 噪声分离,在不改变 GAN 对抗框架的前提下,实现了多尺度、可解释、可控的图像生成
StyleGAN-V2
StyleGAN-V2 的核心目标是解决 StyleGAN 存在的图像伪影、生成器映射不平滑、分辨率利用不足等问题,通过架构重构和训练策略优化,在保持风格可控性的同时,显著提升了图像质量和训练效率

StyleGAN2 针对性的重构了生成器和判别器的结构
- 生成器的归一化操作:使用权重调制解调操作代替 AdaIN,是 StyleGAN2 最关键的架构创新,直接解决了 StyleGAN 的水滴状伪影的问题
- StyleGAN 用 AdaIN 实现风格控制,其会单独归一化每个特征图的均值和方差,破坏了特征间的相对强度信息。生成器为了绕过这种限制,会刻意制造局部强尖峰即水滴状伪影,来隐性传递信号强度
- 将 StyleGAN 的网络重构为调制—卷积—解调
- 调制 Modulation:通过风格向量 缩放卷积权重
- 解调 Demodulation:对调制之后的权重计算 L2 范数,再将权重除以该范数,即 ,本质是基于统计假设抵消调制带来的信号放大,而非强制归一化特征图
- 这操作能完全消除水滴伪影,同时保留 StyleGAN 核心的风格混合能力
- 移除渐进式增长,改用跳连接+残差连接。利用训练时从低分辨率逐步过渡到高分辨率,虽然能稳定训练,但是会导致相位伪影,和移位不变性差
- 生成器采用输出跳连接,将不同分辨率的 RGB 输出上采样之后求和,形成最终图像
- 判别器采用残差连接,通过驻点卷积调整特征图数量,避免梯度消失
- 训练时网络结构固定,仅通过训练过程自然过渡:初期聚焦低分辨率特征,后期逐步转向高分辨率细节
- 提升网络容量,充分利用高分辨率:StyleGAN 中生成的 的图像,实际上仅相当于是 图像的锐化版本,无法充分利用目标分辨率。此时增加生成器和判别器的最高分辨率层的特征图数量,从而得到较高的分辨率细节
- 训练流程创新:StyleGAN 的训练存在两个关键问题:生成器映射不平滑、正则化计算成本高、图像难以反向投影到 latent 空间,StyleGAN2 针对这些问题优化了训练策略
- 路径长度正则化:StyleGAN2 中路径长度正则化的损失函数为
- 其中 是生成器映射 在 处的雅可比矩阵,描述 微小变化时,生成图像 各像素的灵敏度。但是实际上直接计算 计算太困难,一般的计算公式为 ,其中的 是随机噪声图像,像素值服从标准的高斯分布,图像维度与生成器输出维度一致,作用是模拟图像空间的随机扰动方向
- 其中 不是固定值,是随着训练动态调整的梯度长度取值,采用指数移动平均更新 , 是 EMA 衰减系数,本质是控制历史值和当前均值的权重,核心是让 缓慢适应梯度尺度
- 惰性正则化:传统的正则化与主损失函数同步优化,计算成本较高,占用 GPU 内存大。StyleGAN2 通过降低正则化计算频率,每计算 16 个 batch 时仅计算 1 次正则化;另外通过缩放正则化权重、Adam 优化器的 和 ,平衡主损失与正则化的梯度贡献
- 路径长度正则化:StyleGAN2 中路径长度正则化的损失函数为
- 感知路径长度:感知路径长度是衡量生成对抗网络的 latent 空间平稳性的关键指标。PPL 的计算流程如下
- 从生成器的输入分布中随机采样两对 latent 向量 ,初步处理得到中间 latent 向量 ,一般使用 的情况比较多
- 计算 latent 空间插值(也可以使用 ),在 和 之间定义一条插值路径
- 球面插值:适用于归一化的 latent 空间,避免线性插值导致的径向尺度失真
- 线性插值:适用于解耦之后的中间 latent 空间,例如 空间,计算更简洁
- 取极小步长 ,在插值路径上取两个无限接近的点 和 ,通过生成器生成对应的图像,即 和
- 计算感知距离:用感知距离衡量两张生成图像的差异,核心目标是让距离与人类视觉感知一致,最常用 LPIPS 方法。计算两张图像之间的感知距离,记作
- 统计平均与缩放:为消除步长 的影响,需对感知距离进行缩放,并对大量采样对取期望,得到最终的 PPL 值
StyleGAN-V3
StyleGAN3 的核心是通过信号处理优化解决 StyleGAN2 的纹理粘贴问题,实现平移和旋转等变性,网络结构基于 StyleGAN2 改进,训练流程聚焦逐步优化等变性与生成质量平衡。StyleGAN3 的判别器沿用 StyleGAN2 的结构,对映射网络和合成网络都做了改进

- 映射网络:简化结构,深度从 StyleGAN2 的 8 层减少到 2 层,禁用混合正则化和路径长度正则化
- 生成器架构:StyleGAN3 重构生成器架构,确保细节位置完全继承自粗粒度特征,实现平移等变性和旋转等变性
- 输入替换:傅里叶特征替代固定常数。StyleGAN 使用 的固定常数作为输入,边界信息会泄露绝对坐标。所以改用傅里叶特征,通过固定频率的正弦或余弦信号定义输入,避免边界依赖
- 抗锯齿滤波器:替换双线性上采样,采用 Kaiser 窗 sinc 滤波器。一般选择 ,每个输出像素受 6 个输入像素影响,平衡抗锯齿效果和计算效率。一般滤波器部署在两个位置:替代 StyleGAN2 的双线性上采样和过滤非线性的封装流程中的下采样结构,而且只部署在生成器合成网络中,判别器中无部署
- 过滤非线性:非线性激活函数会产生任意高频信号,破坏频域一致性,所以将其包裹在 2×上采样—激活函数—2×下采样的流程中,确保激活后的高频信号被低通滤波压制
- 平移等变优化:放弃 StyleGAN2 固定的 2× 上采样 + 两层卷积的结构,采用 14 层固定结构,每一层的截止频率、阻带频率、采样频率都按照几何级数递进
- 旋转等变优化:为了实现任意角度旋转等变,做了如下修改
- 卷积核:将所有的 卷积修改为 卷积,通过加倍特征图数量补偿容量损失
- 滤波器径向化:下采样时使用 jinc 滤波器,替代 sinc 滤波器,确保旋转之后频率特性一致
- 移除 StyleGAN2 中的跳跃连接、混合正则化、路径长度正则化等,使用 EMA 归一化,避免信号幅度漂移,提升频谱可控性,同时避免正则化对等地性的干扰
- Kasier 窗:定义为 ,输出第 个数据的权重
- 的取值范围为 , 为窗的长度
- 其中 是第一类 bessel 函数,它被定义为贝塞尔微分方程的解 , 是当 时的解
- 通过调整 和 可以在旁瓣幅度和主瓣宽度之间进行权衡。当 增大时主瓣宽度增加,旁瓣衰减增强
- sinc 滤波器是由 sinc 函数构造的滤波器
- 归一化的函数定义为
- 非归一化的函数定义为
- jinc 滤波器是一种基于第一类 bessel 函数的特殊函数,广泛应用于图像处理和信号处理领域
- 函数的数字表达式为 ,其中 为一阶的第一类 bessel 函数
后记
感觉有些网络我记录的并不是很好,特别是对于 StyleGAN3,我确实理解的不是很好。对于上述的那些网络,大部分都把它们的代码用 pytorch 实现了,也都在自己的电脑上稍微跑了跑。这东西就先告一段落吧,到现在深度学习的板块基本上都学习过了,接下来打算先做做强化学习去了,后续再看到有关的论文啥的就再来补充吧。
