WGAN - 瓦萨斯坦生成对抗网络

news2025/1/22 0:24:03

1. 背景与问题

生成对抗网络(Generative Adversarial Networks, GANs)是由Ian Goodfellow等人于2014年提出的一种深度学习模型。它包括两个主要部分:生成器(Generator)和判别器(Discriminator),两者通过对抗训练的方式,彼此不断改进,生成器的目标是生成尽可能“真实”的数据,而判别器的目标是区分生成的数据和真实数据

虽然传统GAN在多个领域取得了巨大成功,但它们也存在一些显著的问题,尤其是训练不稳定性和模式崩溃(Mode Collapse)。为了克服这些问题,Wasserstein Generative Adversarial Network(WGAN)应运而生,提出了一种新的损失函数,基于Wasserstein距离来衡量生成数据和真实数据之间的差异,从而提高训练的稳定性和生成效果。

推荐阅读:DenseNet-密集连接卷积网络

2. 传统GAN的局限性

在传统的GAN中,生成器和判别器之间的对抗过程是通过最小化生成器的损失函数来实现的。GAN的损失函数通常使用交叉熵来衡量生成数据与真实数据的差异,公式如下:

  • 生成器的损失:

    在这里插入图片描述

  • 判别器的损失:

在这里插入图片描述

问题:

  • 梯度消失:如果判别器过强,它会变得非常接近0或1,导致生成器的梯度几乎消失,训练陷入停滞。
  • 模式崩溃(Mode Collapse):生成器可能只生成非常有限的几种样本,无法覆盖真实数据的所有模式。
  • 训练不稳定:在某些情况下,生成器和判别器之间的博弈可能导致不收敛,难以调节超参数。
    在这里插入图片描述

3. WGAN简介

WGAN的提出旨在通过引入Wasserstein距离来解决传统GAN中的上述问题。Wasserstein距离是一种度量两个分布之间距离的方法,它可以有效地避免传统GAN中存在的梯度消失问题,并且提供更加稳定的训练过程。

WGAN的核心思想是在判别器中不使用标准的sigmoid激活函数,而是采用线性输出,并用Wasserstein距离来作为损失函数。Wasserstein距离的引入,使得生成器和判别器的训练变得更加平滑,且训练过程更为稳定。

4. WGAN的理论基础:Wasserstein距离

Wasserstein距离,也称为地球搬运人距离(Earth Mover’s Distance, EMD),是用于度量两个概率分布之间差异的一种方法。在生成对抗网络中,Wasserstein距离可以用来衡量生成数据分布和真实数据分布之间的距离。

Wasserstein距离的定义

给定两个分布PP和QQ,Wasserstein距离可以定义为:

W(P,Q)=inf⁡γ∈Π(P,Q)E(x,y)∼γ[∥x−y∥]W(P, Q) = \inf_{\gamma \in \Pi(P,Q)} \mathbb{E}_{(x,y) \sim \gamma} [ |x - y| ]

其中,Π(P,Q)\Pi(P,Q)表示所有可能的联合分布γ\gamma,其边缘分布分别是PP和QQ,而∥x−y∥|x - y|是样本之间的距离。

在WGAN中,Wasserstein距离的引入使得训练更加稳定,且相比于交叉熵损失函数,它能够提供更加有效的梯度信息。

证明Wasserstein距离的优势

WGAN的一个关键优势是,它避免了传统GAN中出现的梯度消失问题。具体来说,WGAN中的判别器(称为批量判别器)并不输出概率值,而是输出一个实数值,因此在优化过程中能够提供更加稳定的梯度信号。

5. WGAN的架构与优化

网络架构

WGAN的架构与传统GAN基本相同,主要包括两个网络:生成器和判别器。区别在于,WGAN中的判别器不再是一个概率分类器,而是一个逼近Wasserstein距离的网络。

生成器(Generator)

生成器的目标是生成能够尽可能接近真实数据的样本。它通过一个隐空间向量zz生成样本,输出与真实数据分布相似的样本。

判别器(Discriminator)

判别器的任务是区分真实数据和生成数据的差异,但它并不输出概率值,而是输出一个实数值,表示样本的Wasserstein距离

WGAN的损失函数

WGAN中的损失函数非常简单。生成器的目标是最小化Wasserstein距离,而判别器的目标是最大化Wasserstein距离。WGAN的损失函数如下:

  • 生成器的损失:

    LG=−Ez∼pz(z)[D(G(z))]\mathcal{L}G = - \mathbb{E}{z \sim p_z(z)} [D(G(z))]

  • 判别器的损失:

    LD=Ex∼pdata(x)[D(x)]−Ez∼pz(z)[D(G(z))]\mathcal{L}D = \mathbb{E}{x \sim p_{data}(x)} [D(x)] - \mathbb{E}_{z \sim p_z(z)} [D(G(z))]

判别器的权重剪切

为了确保Wasserstein距离的有效性,WGAN要求判别器的参数满足1-Lipschitz条件。为此,WGAN采用了权重剪切(weight clipping)的方法,即在每次训练判别器时,都将其权重限制在一个小的范围内。例如,假设权重剪切的最大值为cc,则每次更新判别器时都会将其权重强制限制在区间[−c,c][-c, c]内。

# 伪代码:判别器权重剪切
for p in discriminator.parameters():
    p.data.clamp_(-c, c)

这种操作是WGAN的关键所在,它确保了判别器的权重满足Lipschitz连续性,从而使得Wasserstein距离能够有效地度量生成数据和真实数据之间的差异。

6. WGAN的训练技巧

判别器与生成器的训练

WGAN的训练过程与传统GAN类似,但有以下几点不同:

  • 判别器训练:在每次更新判别器时,WGAN要求进行多个步骤的训练。一般来说,判别器的训练次数会比生成器的训练次数多。这是因为判别器需要更好地逼近真实数据和生成数据之间的Wasserstein距离。

    for i in range(n_critic):
        D.zero_grad()
        real_data = get_real_data()
        fake_data = generator(z)
        loss_d = discriminator_loss(real_data, fake_data)
        loss_d.backward()
        optimizer_d.step()
        clip_weights(discriminator)
    
  • 生成器训练:生成器的更新则是根据判别器的输出进行的。通过反向传播,生成器可以最小化其生成数据与真实数据之间的Wasserstein距离。

    G.zero_grad()
    fake_data = generator(z)
    loss_g = generator_loss(fake_data)
    loss_g.backward()
    optimizer_g.step()
    

权重剪切的局限性

虽然权重剪切可以保证Lipschitz条件,但它也有一定的局限性。过度的权重剪切可能导致判别器的能力受限,进而影响生成效果。因此,研究

人员提出了**梯度惩罚(Gradient Penalty)**作为改进方法,这将在后续部分讨论。

7. WGAN改进:WGAN-GP (Gradient Penalty)

WGAN-GP的动机

WGAN的一个问题在于权重剪切可能导致网络不稳定或训练过慢。为了解决这个问题,提出了WGAN-GP(Wasserstein GAN with Gradient Penalty)方法,它引入了梯度惩罚来代替权重剪切,从而保持Wasserstein距离的有效性。

WGAN-GP损失函数

WGAN-GP的损失函数相比WGAN有所改进,加入了梯度惩罚项,具体如下:

  • 判别器损失: LD=Ex∼pdata(x)[D(x)]−Ez∼pz(z)[D(G(z))]+λEx∼px[(∥∇xD(x)∥2−1)2]\mathcal{L}D = \mathbb{E}{x \sim p_{data}(x)} [D(x)] - \mathbb{E}{z \sim p_z(z)} [D(G(z))] + \lambda \mathbb{E}{\hat{x} \sim p_{\hat{x}}} \left[ (|\nabla_{\hat{x}} D(\hat{x})|_2 - 1)^2 \right]

其中,x^\hat{x}是从真实数据和生成数据之间的插值中采样得到的,λ\lambda是梯度惩罚项的系数。

训练过程

WGAN-GP的训练过程与WGAN相似,只是判别器的更新方式有所不同。具体来说,我们需要计算梯度惩罚,并将其加到判别器的损失函数中:

# 计算梯度惩罚
def compute_gradient_penalty(D, real_data, fake_data):
    alpha = torch.rand(real_data.size(0), 1, 1, 1).to(real_data.device)
    interpolated = alpha * real_data + (1 - alpha) * fake_data
    interpolated.requires_grad_(True)
    d_interpolated = D(interpolated)
    grad_outputs = torch.ones_like(d_interpolated)
    gradients = torch.autograd.grad(outputs=d_interpolated, inputs=interpolated, grad_outputs=grad_outputs, create_graph=True, retain_graph=True, only_inputs=True)[0]
    gradient_penalty = ((gradients.norm(2, dim=1) - 1) ** 2).mean()
    return gradient_penalty

优势与效果

WGAN-GP的引入梯度惩罚后,训练过程显著更加稳定,避免了WGAN中因权重剪切带来的不稳定性和训练速度较慢的问题。WGAN-GP已成为生成对抗网络中常用的变体之一。

8. WGAN应用案例

WGAN和WGAN-GP已被广泛应用于图像生成、文本生成、音乐生成等多个领域。以下是一些实际的应用案例:

  1. 图像生成:WGAN常用于高分辨率图像的生成,尤其是在超分辨率图像生成、图片到图片的转换等任务中表现优异。
  2. 文本生成:WGAN也可以用于自然语言处理领域,通过生成器生成自然语言文本,判别器判断文本的质量。
  3. 数据增强:WGAN被用作数据增强技术,通过生成更多的训练数据来提高模型的泛化能力。

9. WGAN与传统GAN对比

优点

  • 训练稳定性:WGAN通过引入Wasserstein距离,使得训练过程更加稳定,避免了梯度消失和模式崩溃的问题。
  • 优化效果:WGAN优化过程中生成器和判别器之间的博弈更加平衡,从而生成质量更高的样本。

缺点

  • 计算成本:WGAN的计算成本较传统GAN更高,尤其是在判别器训练阶段,计算Wasserstein距离和梯度惩罚需要更多的计算资源。
  • 收敛速度:尽管WGAN的训练稳定性较强,但它的收敛速度可能比其他类型的GAN稍慢。

10. 总结与展望

WGAN为生成对抗网络的训练提供了一种新的优化策略,通过引入Wasserstein距离来替代传统的交叉熵损失函数,显著提高了训练的稳定性和生成质量。尽管WGAN在许多方面具有优势,但仍存在一些计算成本和收敛速度上的挑战。

未来,随着硬件的进步和算法的优化,WGAN及其变种(如WGAN-GP)有望在更广泛的应用中得到进一步的推广与发展。同时,研究人员也在不断探索新的方法来优化WGAN的训练过程,进一步提升其在生成任务中的表现。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2280082.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【数学建模美赛速成系列】O奖论文绘图复现代码

文章目录 引言折线图 带误差棒得折线图单个带误差棒得折线图立体饼图完整复现代码 引言 美赛的绘图是非常重要得,这篇文章给大家分享我自己复现2024年美赛O奖优秀论文得代码,基于Matalab来实现,可以直接运行出图。 折线图 % MATLAB 官方整理…

兼职全职招聘系统架构与功能分析

2015工作至今,10年资深全栈工程师,CTO,擅长带团队、攻克各种技术难题、研发各类软件产品,我的代码态度:代码虐我千百遍,我待代码如初恋,我的工作态度:极致,责任&#xff…

svn tag

一般发布版本前,需要在svn上打个tag。步骤如下: 1、空白处右击,选择TortoiseSVN->Branch/tag; 2、填写To path,即tag的路基以及tag命名(一般用版本号来命名);填写tag信息;勾选cr…

项目开发实践——基于SpringBoot+Vue3实现的在线考试系统(七)

文章目录 一、题库管理模块实现1、新增题目功能实现1.1 页面设计1.2 前端功能实现1.3 后端功能实现1.4 效果展示2、题目列表功能实现2.1 页面设计2.2 前端功能实现2.3 后端功能实现2.3.1 后端查询题目列表接口实现2.3.2 后端编辑试题接口实现2.4 效果展示二、代码下载一、题库管…

【Cesium入门教程】第一课:Cesium简介与快速入门详细教程

Cesium概述 Cesium是一个基于JavaScript开发的WebGL三维地球和地图可视化库。 它利用了现代Web技术,如HTML5、WebGL和WebAssembly,来提供跨平台和跨浏览器的三维地理空间数据可视化。 Cesium的主要特点包括: 跨平台、跨浏览器&#xff1a…

Unity中实现伤害跳字效果(简单好抄)

第一步骤安装并导入Dotween插件(也可以不用导入之后直接下载我的安装包) 官网DOTween - 下载 第二步: 制作跳字预制体 建议把最佳适应打开,这样就不怕数字太大显示不全了。 第三步:创建一个空对象并编写脚本JumpNumbe…

AI与低代码发展下的程序员就业展望:经济环境对就业市场的影响

AI与低代码发展下的程序员就业展望:经济环境对就业市场的影响 随着人工智能(AI)技术的不断进步和低代码平台的日益成熟,软件开发行业正在经历一场深刻的变革。与此同时,全球经济环境的变化也对程序员的就业市场产生了…

复古怀旧美感35mm胶片模拟色调颗粒汽车商业摄影Lightroom调色预设 Mike Crawat 2024 35MM FILM LOOK PRESETS

10个电脑端手机端35mm胶片模拟汽车摄影风光人像扫街LR预设 Mike Crawat 2024 35MM FILM LOOK PRESETS 这个精心制作的 10 个预设集合旨在为您的数码照片提供 35 毫米胶片的丰富、怀旧美感。每个预设都复制了标志性胶片的独特色调、颗粒和颜色配置文件,让您只需单击…

Hadoop 和 Spark 的内存管理机制分析

💖 欢迎来到我的博客! 非常高兴能在这里与您相遇。在这里,您不仅能获得有趣的技术分享,还能感受到轻松愉快的氛围。无论您是编程新手,还是资深开发者,都能在这里找到属于您的知识宝藏,学习和成长…

Linux容器(初学了解)

目录 一、容器 1.1、容器技术 1.2、容器和虚拟机之间的差异 1.3、Rootless 和 Rootful 容器 1.4、设计基于容器的架构 1.5、容器管理工具 1.6、容器镜像和注册表 1.7、配置容器注册表 1.8、使用容器文件构建容器镜像 二、部署容器 2.1、Podman 实用程序 2.2、安装容…

.Net Core微服务入门全纪录(二)——Consul-服务注册与发现(上)

系列文章目录 1、.Net Core微服务入门系列(一)——项目搭建 2、.Net Core微服务入门全纪录(二)——Consul-服务注册与发现(上) 3、.Net Core微服务入门全纪录(三)——Consul-服务注…

成就与远见:2024年技术与思维的升华

个人主页:chian-ocean 前言: 2025年1月17日,2024年博客之星年度评选——创作影响力评审的入围名单公布。我很荣幸能够跻身Top 300,虽然与顶尖博主仍有一定差距,但这也为我提供了更加明确的发展方向与指引。展望崭新的2025年&…

记一次数据库连接 bug

整个的报错如下: com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Could not create connection to database server. Attempted reconnect 3 times. Giving up. at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Metho…

力扣 搜索二维矩阵

二分查找,闭区间与开区间的不同解法。 题目 乍一看,不是遍历一下找到元素就可以了。 class Solution {public boolean searchMatrix(int[][] matrix, int target) {for (int[] ints : matrix) {for (int ans : ints) {if (ans target) return true;}}…

Linux 使用 GDB 进行调试的常用命令与技巧

GDB 调试的常用命令与技巧 1. GDB 常用命令1.1 安装 GDB1.2 启动 GDB1.3 设置程序的参数1.4 设置断点1.5 启动程序并运行至断点1.6 执行一步1.7 打印变量值1.8 查看函数调用栈 2. GDB 调试 Core 文件2.1 生成 Core 文件2.2 使用 GDB 调试 Core 文件 3. GDB 调试正在运行的程序3…

微服务网关,如何选择?

什么是API网关 API网关(API Gateway)是微服务架构中的一个关键组件,它充当了客户端与后端服务之间的中间层。其主要功能包括请求路由、协议转换、负载均衡、安全认证、限流熔断等。通过API网关,客户端无需直接与多个微服务交互&a…

Spring 6 第3章——容器:IoC

一、IoC容器 IoC是Inversion of Control的简写,翻译为“控制反转”.它不是一门技术,而是一种设计思想 Spring通过IoC容器来管理(1)所有Java对象的实例化和初始化,(2)控制对象与对象之间的依赖…

Docker:基于自制openjdk8镜像 or 官方openjdk8镜像,制作tomcat镜像

一、制作openjdk8基础镜像【基于自定义alpine-3.18.0:v1 】 docker pull maven:3.5.0-jdk-8-alpine 78.56 MB https://hub.docker.com/_/maven/tagspage8&namealpine openjdk二进制下载地址 https://blog.csdn.net/fenglllle/article/details/124786948 https://adoptope…

数据结构漫游记:动态实现栈(stack)

嘿,各位技术潮人!好久不见甚是想念。生活就像一场奇妙冒险,而编程就是那把超酷的万能钥匙。此刻,阳光洒在键盘上,灵感在指尖跳跃,让我们抛开一切束缚,给平淡日子加点料,注入满满的pa…

鸿蒙系统 将工程HarmonyOS变成OpenHarmony

DevEco Studio软件创建工程后需要修改两个地方: 修改第二个build-profile.json5文件 将原先内容: {"app": {"signingConfigs": [],"products": [{"name": "default","signingConfig": &q…