郭震 AI公众号:郭震AI

3 生成对抗网络基础回顾之GAN的损失函数

发布日期:

最近更新:

分类: GANs进阶

预计阅读: 5 分钟

阅读次数: 0

预计阅读5 分钟
结构重点6 个
图文要点6 张
正文规模2.1k 字

整理说明

这篇内容怎么整理

郭震 · 2026-06-04

独立整理围绕 6 个结构重点拆成环境、步骤、验证点和常见误区,尽量让读者能照着复现。
图文对照保留 6 张和配置、流程、判断结果有关的图片,方便快速定位正文重点。
持续校对工具、模型和命令变化较快,后续优先修正入口、参数和风险提醒。

阅读路线

先按这条路线读

先抓住主线,再回到代码、配置和图文细节,读起来会更稳。

图文要点

先看本文图文节点

按图先建立主线,再跳回正文核对步骤、配置和判断标准。

生成对抗网络基础回顾之GAN的损失函数结构图查看大图
生成对抗网络基础回顾之GAN的损失函数结构图

GAN 进阶内容要围绕稳定性、条件控制、架构变化和评估方法建立判断框架。阅读时可以按「GAN的基本损失函数 -> 生成器和判别器的损失 -> 损失函数解读 -> 损失函数的变体」建立结构,再回到正文里的代码、案例或指标做验证。

生成对抗网络基础回顾之GAN的损失函数核对图查看大图
生成对抗网络基础回顾之GAN的损失函数核对图

读完后,用一个真实小任务复查:输入是什么,处理环节在哪里,输出是否可验收;失败时先查「GAN的基本损失函数」,再查「生成器和判别器的损失」。

在上一篇文章中,我们讨论了生成对抗网络(GAN)的基本架构,包括其主要组成部分——生成器(Generator)和判别器(Discriminator)。在本篇文章中,我们将深入探讨GAN的损失函数。损失函数是GAN训练过程中的核心组成部分,它直接影响到模型的学习效果和生成样本的质量。接下来,我们将回顾GAN的损失函数的基本概念、各种损失函数的变体以及它们对模型性能的影响。

GAN的基本损失函数

在原始GAN的框架中,生成器和判别器通过一个对抗过程进行训练。其目标是生成器尽可能生成真实的样本,而判别器则努力区分真实样本与生成样本。其损失函数可以用如下公式表示:

GAN损失函数判断卡查看大图
GAN损失函数判断卡

理解 GAN 损失函数时,先看生成器想骗过判别器,判别器想分清真假。两个目标互相拉扯,训练稳定性才会成为难点。

minGmaxDV(D,G)=Expdata[logD(x)]+Ezpz[log(1D(G(z))]\text{min}_G \text{max}_D V(D, G) = \mathbb{E}_{x \sim p_{\text{data}}}[\log D(x)] + \mathbb{E}_{z \sim p_z}[\log(1 - D(G(z))]
  • 其中,D(x)D(x) 表示判别器对真实样本的输出,G(z)G(z) 表示生成器生成的样本,zz 是从随机噪声分布中采样的。
  • Expdata\mathbb{E}_{x \sim p_{\text{data}}} 表示对真实数据分布的期望,而 Ezpz\mathbb{E}_{z \sim p_z} 则是对生成器输入噪声分布的期望。

生成器和判别器的损失

在训练过程中,判别器需要最大化其损失函数,来更好地识别真实样本与生成样本。而生成器则需要最小化其损失函数,以生成更具“真实性”的样本。

损失函数解读

  • 当判别器的性能较差时,即 D(x)D(x)D(G(z))D(G(z)) 的输出较低,生成器的损失将会较低,因为生成器生成的样本能够欺骗判别器。
  • 当判别器的性能较好时,生成器生成的样本将无法被判别器所接受,从而导致其损失增加。

这就形成了一个动态对抗的过程。

损失函数的变体

随着GAN的发展,研究者们提出了多种损失函数变体,以解决原始GAN在训练过程中的不稳定性。如:

GAN 进阶应用拆解卡查看大图
GAN 进阶应用拆解卡

《生成对抗网络基础回顾之GAN的损失函数》这类内容容易被细节带偏。先看图里的主线,再回到正文核对环境、输入、输出和判断标准。

  1. Wasserstein GAN (WGAN): WGAN通过使用Wasserstein距离替代JS散度,极大改善了模型训练的稳定性。其损失函数为:

    LD=Expdata[D(x)]Ezpz[D(G(z))]L_D = \mathbb{E}_{x \sim p_{\text{data}}}[D(x)] - \mathbb{E}_{z \sim p_z}[D(G(z))]

    生成器的目标是最大化而非最小化,从而引导训练过程更平滑。

  2. Least Squares GAN (LSGAN): LSGAN引入了最小二乘损失,使得生成器和判别器的输出更加接近于真实值。其损失函数为:

    LD=12Expdata[(D(x)1)2]+12Ezpz[(D(G(z)))2]L_D = \frac{1}{2} \mathbb{E}_{x \sim p_{\text{data}}}[(D(x) - 1)^2] + \frac{1}{2} \mathbb{E}_{z \sim p_z}[(D(G(z)))^2]

    这样做的好处在于,判别器的输出可以通过回归来学习,减小梯度消失的问题。

  3. Hinge Loss GAN: 在一些场景中,Hinge损失也被广泛使用,尤其是在图像生成任务中。其损失函数为:

    LD=Expdata[max(0,1D(x))]+Ezpz[max(0,1+D(G(z)))]L_D = \mathbb{E}_{x \sim p_{\text{data}}}[\max(0, 1 - D(x))] + \mathbb{E}_{z \sim p_z}[\max(0, 1 + D(G(z)))]

    Hinge损失的形式使得模型更加鲁棒,特别是在样本不平衡的情况下。

实例代码

下面是一个使用PyTorch实现WGAN的简单示例代码:

import torch
import torch.nn as nn

class Generator(nn.Module):
    def __init__(self):
        super(Generator, self).__init__()
        self.model = nn.Sequential(
            nn.Linear(100, 256),
            nn.ReLU(),
            nn.Linear(256, 512),
            nn.ReLU(),
            nn.Linear(512, 784),
            nn.Tanh(),
        )

    def forward(self, z):
        return self.model(z)

class Discriminator(nn.Module):
    def __init__(self):
        super(Discriminator, self).__init__()
        self.model = nn.Sequential(
            nn.Linear(784, 512),
            nn.ReLU(),
            nn.Linear(512, 256),
            nn.ReLU(),
            nn.Linear(256, 1),
        )

    def forward(self, x):
        return self.model(x)

# 假设我们已实现WGAN的训练循环
生成对抗网络基础回顾之GAN的损失函数应用复盘卡查看大图
生成对抗网络基础回顾之GAN的损失函数应用复盘卡

如果《生成对抗网络基础回顾之GAN的损失函数》还没完全消化,可以从这张卡片的四个动作重新走一遍。

生成对抗网络基础回顾之GAN的损失函数应用检查卡查看大图
生成对抗网络基础回顾之GAN的损失函数应用检查卡

回看《生成对抗网络基础回顾之GAN的损失函数》时,不必一次做大项目,先用一条简单样例确认主线是否清楚。

小结

在本篇文章中,我们回顾了生成对抗网络的损失函数,并探讨了不同变体的特点及其带来的优势。理解GAN的损失函数对于提升生成模型的性能至关重要。在下一篇文章中,我们将继续探讨有关GAN的训练技巧,特别是如何在训练过程中实现稳定性和有效性。

通过这些内容,你将对生成对抗网络有更深入的理解,为后面的模块打下坚实的基础。

继续阅读

从这篇继续找到相关教程

AI 教程总索引

常见问题

读前先确认这三点

生成对抗网络基础回顾之GAN的损失函数适合谁读?

这是 生成对抗网络高级 系列第 3 / 21 篇,适合正在学习生成对抗网络高级,并且需要把概念落到操作步骤或判断标准里的读者。

读这篇生成对抗网络高级教程要多久?

按中文技术文章阅读速度估算,通读大约 5 分钟;如果要跟着复现,建议把命令、配置和结果检查分开做。

这篇文章里的图文节点怎么用?

正文里有 6 个图文节点,可以先用它们抓住流程、配置和判断点,再回到对应段落细读。

分享文章

转发到常用平台

微信/朋友圈可先复制链接

相关教程

AI 教程总索引

继续阅读

继续找到相关 AI 教程

返回栏目

Reader Messages

读者留言

有问题、补充资料或实测结果,可以直接留下。这里不需要登录。

最多 800 字

为了防刷,每条留言会做长度、链接数量和提交频率限制。

0/800

留言列表

0
正在加载留言...