GAN如何使用的 Jensen-Shannon 散度

ops/2024/9/24 13:33:17/

GAN 在其原始形式中使用 Jensen-Shannon 散度(JS 散度) 来衡量生成器生成的分布与真实数据分布之间的差异。这是在 GAN 的对抗性损失函数设计中自然而然出现的。具体来说,GAN 的目标是让生成器 G G G 生成的分布 P g P_g Pg 尽可能接近真实数据分布 P r P_r Pr,判别器 D D D 则尝试区分生成样本和真实样本。

在原始 GAN 中,GAN 的目标可以通过以下的 min-max 博弈来描述:

min ⁡ G max ⁡ D V ( D , G ) = E x ∼ P r [ log ⁡ D ( x ) ] + E z ∼ P z [ log ⁡ ( 1 − D ( G ( z ) ) ) ] \min_G \max_D V(D, G) = \mathbb{E}_{x \sim P_r}[\log D(x)] + \mathbb{E}_{z \sim P_z}[\log (1 - D(G(z)))] GminDmaxV(D,G)=ExPr[logD(x)]+EzPz[log(1D(G(z)))]

判别器损失和生成器损失的推导

  • 判别器 D D D 的目标是最大化上述损失函数,它希望将真实样本 x x x 分类为真实 ( D ( x ) ≈ 1 D(x) \approx 1 D(x)1),将生成样本 G ( z ) G(z) G(z) 分类为假 ( D ( G ( z ) ) ≈ 0 D(G(z)) \approx 0 D(G(z))0)。

  • 生成器 G G G 的目标是最小化该损失函数,使得 D ( G ( z ) ) ≈ 1 D(G(z)) \approx 1 D(G(z))1,也就是让判别器尽可能无法区分生成样本与真实样本。

在理论上,当判别器 D D D 最优时,它可以表达为:

D ∗ ( x ) = P r ( x ) P r ( x ) + P g ( x ) D^*(x) = \frac{P_r(x)}{P_r(x) + P_g(x)} D(x)=Pr(x)+Pg(x)Pr(x)

此时,生成器和判别器的损失函数 V ( D ∗ , G ) V(D^*, G) V(D,G) 就可以被表达为 Jensen-Shannon 散度,即:

V ( D ∗ , G ) = 2 ⋅ JS ( P r ∥ P g ) − log ⁡ 4 V(D^*, G) = 2 \cdot \text{JS}(P_r \| P_g) - \log 4 V(D,G)=2JS(PrPg)log4

其中,JS 散度用来衡量两个分布 P r P_r Pr P g P_g Pg 的相似性。当 P r = P g P_r = P_g Pr=Pg 时,JS 散度为 0,表示两个分布完全相同;当两个分布几乎没有重叠时,JS 散度达到其最大值。

JS 散度在 GAN 中的作用

JS 散度作为一种对称的概率分布差异度量方法,在 GAN 中自然地出现,用来衡量生成器生成的分布与真实分布之间的差距。然而,原始 GAN 使用 JS 散度存在一些问题:

  1. 梯度消失:当生成器和真实分布之间的重叠很小时,JS 散度可能不提供有效的梯度信息,导致训练过程中生成器无法得到足够的反馈来改进样本生成质量。
  2. 训练不稳定:由于 JS 散度在生成器和真实分布差异较大时的非连续性,这使得 GAN 的训练变得不稳定,容易出现震荡或发散的现象。

总结

  • GAN 使用 Jensen-Shannon 散度 来衡量生成分布 P g P_g Pg 和真实数据分布 P r P_r Pr 的差异,这是原始 GAN 损失函数的核心。
  • 然而,由于 JS 散度的梯度消失问题和训练不稳定性,后来如 WGAN(Wasserstein GAN)通过 Wasserstein 距离代替了 JS 散度,解决了这些问题。

http://www.ppmy.cn/ops/115310.html

相关文章

npm run build报Cannot find module错误的解决方法

目录 一、问题描述二、解决方法一、问题描述 执行 npm run build 报 Cannot find module 错误: npm run build> vite-vue3@0.0.0 build > vite buildfailed to load config from D:\Workspaces\PhpProjects\jjj-edu-master\jjj_edu_admin\vite.config.js error during…

若依Nodejs后台、实现90%以上接口,附体验地址、源码、拓展特色功能

背景 前端的宝子们代码写累了吗?那就一起研究下后端吧! 体验地址:http://106.54.233.63:5000 Gitee源码:https://gitee.com/ruirui-study/ruoyi_nodejs_open 本项目的前端基于若依Vue3.0版本,后端是基于MidwayJs框…

nodejs基于vue电子产品商城销售网站的设计与实现 _bugfu

目录 技术栈具体实现截图系统设计思路技术可行性nodejs类核心代码部分展示可行性论证研究方法解决的思路Express框架介绍源码获取/联系我 技术栈 该系统将采用B/S结构模式,开发软件有很多种可以用,本次开发用到的软件是vscode,用到的数据库是…

基于51单片机的自动清洗系统(自动洗衣机)

目录 一、主要功能 二、硬件资源 三、程序编程 四、实现现象 一、主要功能 基于AT89C52单片机,采用DS18B20温度传感器检测温度,通过LCD1602显示屏显示,并且按键 可以加减温度的上限; 点击清洗按键后,倒计时1分钟&…

jvm 内存结构

文章目录 jvm 内存结构1.JVM原理2.JVM的生命周期3.JVM 内存区域3.1方法区3.2程序计数器(PC寄存器)3.3java栈3.4堆内存3.5本地方法栈3.6元空间 4.JVM内存溢出的情况4.1程序计数器(Program Counter Register)4.2Java虚拟机栈(Java Virtual Mach…

CSS文档流以及脱离文档流的方法

文档流 文档流是文档中可显示对象在排列时占用的位置/空间。例如&#xff1a;块元素自上而下摆放&#xff0c;内联元素从左到右摆放。&#xff08;文档流中限制非常的多&#xff0c;导致很多页面效果无法实现)。 常见文档流限制 高低不齐&#xff0c;底边对齐 <head>&…

使用 Puppeteer-Cluster 和代理进行高效网络抓取: 完全指南

文章目录 一、介绍&#xff1f;二、什么是 Puppeteer-Cluster&#xff1f;三、为什么代理在网络抓取中很重要&#xff1f;四、 为什么使用带代理的 Puppeteer-Cluster&#xff1f;五、分步指南&#xff1a; 带代理的 Puppeteer 群集5.1. 步骤 1&#xff1a;安装所需程序库5.2. …

31. RabbitMQ顺序消费

1. 前言 上个小节中我们介绍了 RabbitMQ 中如何防止消息丢失,即保证消息发送的 At Least Once 性质,除此之外,如何防止消息被重复消费,即保证消息消费的 Exactly Once 性质,也是业务逻辑中需要考虑的问题。 2. 消息消费顺序 面试官提问:业务中使用了 RabbitMQ 消息队列…