当前位置: 首页 > news >正文

WGAN算法

Wasserstein GAN (WGAN) 是一种改进的生成对抗网络(GAN),由 Arjovsky 等人在 2017 年提出,用于解决原始 GAN 中的训练不稳定性和模式崩溃(Mode Collapse)问题。WGAN 的核心思想是使用Wasserstein 距离(也叫 Earth Mover’s 距离,EM 距离)来度量生成分布和真实分布之间的距离,代替原始 GAN 使用的 Jensen-Shannon (JS) 散度。

1. 原始 GAN 的问题

在原始 GAN 中,生成器 G G G 和判别器 D D D 通过博弈论的方式进行对抗性训练,目标是让 G G G 生成的假样本与真实样本尽可能相似,而 D D D 则要尽可能区分开真假样本。GAN 的损失函数基于交叉熵,具体公式如下:

  • 判别器损失
    L D = − E x ∼ P d a t a [ log ⁡ D ( x ) ] − E z ∼ P z [ log ⁡ ( 1 − D ( G ( z ) ) ) ] L_D = -\mathbb{E}_{x \sim P_{data}}[\log D(x)] - \mathbb{E}_{z \sim P_z}[\log (1 - D(G(z)))] LD=ExPdata[logD(x)]EzPz[log(1D(G(z)))]
  • 生成器损失
    L G = − E z ∼ P z [ log ⁡ D ( G ( z ) ) ] L_G = -\mathbb{E}_{z \sim P_z}[\log D(G(z))] LG=EzPz[logD(G(z))]

在训练过程中,GAN 使用的 Jensen-Shannon 散度(JS 散度)在两个分布不重叠的情况下为常数,这会导致生成器梯度消失,造成训练不稳定,模型难以收敛。此外,原始 GAN 经常会出现模式崩溃问题,即生成器只能生成一小部分样本,不能涵盖真实数据分布的所有模式。

2. WGAN 的改进:使用 Wasserstein 距离

WGAN 的关键改进是用 Wasserstein 距离来替代 JS 散度。Wasserstein 距离度量两个概率分布之间的距离,反映了从一个分布变换到另一个分布所需的最小“代价”,这个代价可以理解为将一个分布的质量搬运到另一个分布的总距离(类似于搬运土堆的工作量,因此也叫 Earth Mover’s 距离)。

Wasserstein 距离的定义:

给定两个概率分布 P r P_r Pr P g P_g Pg,它们的 Wasserstein 距离定义为:
W ( P r , P g ) = inf ⁡ γ ∈ Π ( P r , P g ) E ( x , y ) ∼ γ [ ∥ x − y ∥ ] W(P_r, P_g) = \inf_{\gamma \in \Pi(P_r, P_g)} \mathbb{E}_{(x, y) \sim \gamma} [\|x - y\|] W(Pr,Pg)=γΠ(Pr,Pg)infE(x,y)γ[xy]
其中 Π ( P r , P g ) \Pi(P_r, P_g) Π(Pr,Pg) 是所有将 P r P_r Pr 变为 P g P_g Pg 的联合分布, ∥ x − y ∥ \|x - y\| xy 表示从 P r P_r Pr 采样的 x x x 和从 P g P_g Pg 采样的 y y y 之间的距离。

Wasserstein 距离具有良好的性质:

  • 可微分:即使生成器和真实分布没有重叠,Wasserstein 距离仍然可以提供有意义的梯度。
  • 更稳定:WGAN 训练过程更加稳定,生成器和判别器的更新更加顺畅,避免了梯度消失问题。

3. WGAN 的损失函数

为了使用 Wasserstein 距离,WGAN 对判别器进行了修改。原始 GAN 的判别器输出为一个二值概率,判别样本是真实的还是生成的。而 WGAN 的判别器不再是输出概率,而是一个评分函数(score function),用来衡量样本的“真实程度”。

在 WGAN 中,判别器被称为批评器(Critic),其损失函数变为:

  • 批评器损失
    L C = − E x ∼ P r [ C ( x ) ] + E z ∼ P z [ C ( G ( z ) ) ] L_C = -\mathbb{E}_{x \sim P_r}[C(x)] + \mathbb{E}_{z \sim P_z}[C(G(z))] LC=ExPr[C(x)]+EzPz[C(G(z))]
    其中 C ( x ) C(x) C(x) 是批评器对真实样本 x x x 的打分, C ( G ( z ) ) C(G(z)) C(G(z)) 是对生成样本的打分。

  • 生成器损失
    L G = − E z ∼ P z [ C ( G ( z ) ) ] L_G = -\mathbb{E}_{z \sim P_z}[C(G(z))] LG=EzPz[C(G(z))]

批评器的目标是让 C ( x ) C(x) C(x) 尽可能大, C ( G ( z ) ) C(G(z)) C(G(z)) 尽可能小,从而拉开真实样本和生成样本的评分差距。

4. 1-Lipschitz 连续性和权重裁剪

为了保证 Wasserstein 距离的计算有效,批评器必须满足1-Lipschitz 连续性。也就是说,对于任何两个输入 x 1 x_1 x1 x 2 x_2 x2,都要求:
∣ C ( x 1 ) − C ( x 2 ) ∣ ≤ ∥ x 1 − x 2 ∥ |C(x_1) - C(x_2)| \leq \|x_1 - x_2\| C(x1)C(x2)x1x2
WGAN 通过**权重裁剪(weight clipping)**来强制批评器满足 1-Lipschitz 连续性。即在每次更新批评器的参数后,将权重限制在某个范围内,如 [ − 0.01 , 0.01 ] [-0.01, 0.01] [0.01,0.01]。虽然权重裁剪是 WGAN 中的一个重要步骤,但在实际应用中,裁剪会导致模型训练变得较为不稳定,因此 WGAN 后来被改进为 WGAN-GP(使用梯度惩罚替代权重裁剪,详见 WGAN-GP 部分)。

5. WGAN 的训练流程

WGAN 的训练流程与标准 GAN 相似,但有几点区别:

  1. 批评器更新次数增加:在每次更新生成器之前,批评器通常会进行多次更新(例如 5 次)。这有助于确保批评器能够提供有效的梯度给生成器。
  2. 权重裁剪:在更新批评器参数后,对批评器的权重进行裁剪,以保证 Lipschitz 连续性。
  3. 生成器更新:当批评器的训练充分后,才会更新生成器。

6. WGAN 的优势

  • 梯度消失问题缓解:WGAN 通过 Wasserstein 距离计算出连续可微的损失,即使生成分布和真实分布几乎不重叠,生成器仍能获得有效的梯度更新。
  • 模式崩溃问题缓解:由于 Wasserstein 距离提供了更精确的分布距离衡量标准,生成器更能学习到数据分布的多样性,从而避免模式崩溃。
  • 训练稳定性提升:WGAN 在训练过程中,生成器和判别器的更新更稳定,不容易出现发散或震荡的问题。

7. WGAN 的不足

  • 权重裁剪问题:虽然权重裁剪保证了 Lipschitz 连续性,但它也可能限制批评器的表示能力,使得训练变得较慢或不稳定。为此,WGAN-GP 提出了用梯度惩罚来代替权重裁剪。

8. WGAN-GP(WGAN with Gradient Penalty)

WGAN-GP 是 WGAN 的改进版本,提出了一种更有效的方式来保证批评器的 1-Lipschitz 连续性。它通过引入梯度惩罚(Gradient Penalty)来强制批评器的梯度满足 Lipschitz 条件,而不是使用权重裁剪。

梯度惩罚项
L G P = λ E x ^ ∼ P x ^ [ ( ∥ ∇ x ^ C ( x ^ ) ∥ 2 − 1 ) 2 ] L_{GP} = \lambda \mathbb{E}_{\hat{x} \sim P_{\hat{x}}} \left[ \left( \|\nabla_{\hat{x}} C(\hat{x}) \|_2 - 1 \right)^2 \right] LGP=λEx^Px^[(x^C(x^)21)2]
其中 x ^ \hat{x} x^ 是从生成数据和真实数据的线性插值中采样的, λ \lambda λ 是惩罚系数,通常设置为 10。

引入梯度惩罚后,WGAN-GP 保留了 WGAN 的所有优势,同时避免了权重裁剪的缺点,使训练更加稳定高效。


总结:

WGAN 通过 Wasserstein 距离代替 JS 散度,解决了原始 GAN 中的训练不稳定和模式崩溃问题,并显著提升了生成模型的性能和稳定性。尽管 WGAN 存在一些权重裁剪方面的问题,但它为生成模型的发展提供了一个重要的理论基础,后续的 WGAN-GP 改进版进一步提升了其性能。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • ZooKeeper远程连接超时排查与解决
  • 【bug】通过lora方式微调sdxl inpainting踩坑
  • 后门账号从入门到应急响应
  • 9.17 DFS中等 200 Number of Islands
  • 【系统架构设计师】虚拟机架构风格
  • 使用Mockito进行单元测试
  • 【Linux】查看操作系统开机时初始化的驱动模块列表的一个方法
  • AI教你学Python 第10天 :参数与返回值
  • HarmonyOS 速记
  • 18、Python如何读写csv文件
  • Netty笔记09-网络协议设计与解析
  • 佛山网站制作与设计
  • [掌握API速率限制:如何高效管理请求频率]
  • Simulink仿真理想二极管模型
  • 【C#生态园】虚拟现实与增强现实:C#开发库全面评估
  • iOS动画编程-View动画[ 1 ] 基础View动画
  • JavaScript工作原理(五):深入了解WebSockets,HTTP/2和SSE,以及如何选择
  • leetcode46 Permutation 排列组合
  • spring-boot List转Page
  • swift基础之_对象 实例方法 对象方法。
  • Webpack 4 学习01(基础配置)
  • 给自己的博客网站加上酷炫的初音未来音乐游戏?
  • 简单数学运算程序(不定期更新)
  • 近期前端发展计划
  • 聊一聊前端的监控
  • 深入浏览器事件循环的本质
  • 适配iPhoneX、iPhoneXs、iPhoneXs Max、iPhoneXr 屏幕尺寸及安全区域
  • 3月7日云栖精选夜读 | RSA 2019安全大会:企业资产管理成行业新风向标,云上安全占绝对优势 ...
  • scrapy中间件源码分析及常用中间件大全
  • ​虚拟化系列介绍(十)
  • # 执行时间 统计mysql_一文说尽 MySQL 优化原理
  • #、%和$符号在OGNL表达式中经常出现
  • #pragma pack(1)
  • ${factoryList }后面有空格不影响
  • (6)STL算法之转换
  • (力扣记录)235. 二叉搜索树的最近公共祖先
  • (七)Java对象在Hibernate持久化层的状态
  • (四)事件系统
  • (学习日记)2024.04.04:UCOSIII第三十二节:计数信号量实验
  • (转)linux自定义开机启动服务和chkconfig使用方法
  • .dat文件写入byte类型数组_用Python从Abaqus导出txt、dat数据
  • .dwp和.webpart的区别
  • .java 9 找不到符号_java找不到符号
  • .NET Compact Framework 3.5 支持 WCF 的子集
  • .net dataexcel winform控件 更新 日志
  • .net MySql
  • .NET 中 GetProcess 相关方法的性能
  • .NET(C#、VB)APP开发——Smobiler平台控件介绍:Bluetooth组件
  • .NET/MSBuild 中的发布路径在哪里呢?如何在扩展编译的时候修改发布路径中的文件呢?
  • .net6解除文件上传限制。Multipart body length limit 16384 exceeded
  • .netcore 获取appsettings
  • .secret勒索病毒数据恢复|金蝶、用友、管家婆、OA、速达、ERP等软件数据库恢复
  • .w文件怎么转成html文件,使用pandoc进行Word与Markdown文件转化
  • /etc/fstab和/etc/mtab的区别
  • @cacheable 是否缓存成功_Spring Cache缓存注解