Generative Adversarial Nets论文阅读笔记

2023-10-31 08:50

本文主要是介绍Generative Adversarial Nets论文阅读笔记,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

先附上本人使用pytorch实现的GAN:

https://github.com/1991yuyang/GAN

如果觉得有用大家可以给个star。

这篇博客用于记录Generative Adversarial Nets这篇论文的阅读与理解。对于这篇论文,第一感觉就是数学推导很多,于是下载了一些其他有关GAN的论文,发现GAN系列的论文的一大特点就是基本都是数学推导,因此,第一眼看上去还是比较抵触的,不过还是硬着头皮看了下来。

废话不多说,下面就介绍GAN的基本原理。

一.摘要

摘要部分主要说明了,作者通过一个对抗训练过程来估计生成模型,其过程如下:首先需要建立一个生成模型G用于捕捉数据分布,其次还需要建立一个判别模型D用于给出一个样本是来自于真实样本而非生成器G生成的假样本的概率。而作为生成器,希望其生成的假样本越逼真越好,因此其训练目标就是使得判别器D犯错误的概率越大越好,也就是将G生成的样本大概率的判别为真样本。对于所有的G和D,存在唯一解,G的唯一解能够回复真实数据的分布;而D的唯一解就是不能够判别样本是真实样本还是生成器G生成的样本,即给出的概率为0.5。

以上这个过程类似于假画作者和鉴宝专家,假画作者一开始画工拙劣,其画作难以骗过鉴宝专家。于是假画作者便提升自己的画功,随后能够成功骗过鉴宝专家,而鉴宝专家随后也提升了自身的鉴宝能力,便又能够识破假画作者的画作。如此循环往复,最后假画作者便可以创作出一幅足够真的假画。假画作者就是生成器G,而鉴宝专家就是判别器D。

二.对抗网络

如上图所示,通过为生成器输入符合某种先验分布p_z的随机噪音z,生成器产生出假的图片,将假图片和真图片同时输入至判别器,判别器针对每个样本输出0或1,如果输出1则表示对应样本为真实数据采样得到,如果输出0则表示为生成器生成的假样本。这里我们使用p_g表示生成器生成的样本空间分布,使用p_{data}表示真实样本分布。对于生成器G的训练目标是使得p_g尽可能的接近p_{data},即最小化log(1-D(G(z))),这是因为我们希望生成器生成的样本足够逼真骗过判别器,其中G(z)是输入随机噪音z生成器G生成的服从分布p_{g}的假图片,如果能够骗过判别器,则D(G(z))便会输出1,此时(1-D(G(z)))为0,而log(1-D(G(z)))则为负无穷。而判别器D的训练目标是能够准确区分真实样本和生成的假样本,实际上就是最大化log(D(x))+log(1-D(G(z))),这是因为,当判别器能够正确区分真样本和假样本时,D(x)会输出1,其中x是来自于真实样本分布的样本,而D(G(z))会输出0,此时表达式能够达到最大值0。通过数学表达式表示训练目标如下所示:

论文中提到,限于计算能力以及数据量的不足,每训练k次判别器D,训练1次生成器G。并提出,只要生成器G变化的足够慢,判别器D则会长时间维持在其最优解附近。

整个过程的伪代码如上所示。注意,在训练判别器D的内层循环中,对于目标函数使用的是梯度上升(ascending),而对于生成器G使用的是梯度下降(descending),这在前面已经提到,判别器是最大化目标,而生成器是最小化目标。

但随后论文中马上提到,上述最小最大目标函数可能在训练初期可能不会为生成器提供足够的梯度去训练。这是因为,在训练年初期,生成器生成的样本是很糟糕的,判别器一眼就能识别出真实样本和生成器生成的样本,此时D(G(z))基本为0。而G此时目标函数log(1-D(G(z)))对于G的参数(G网络中的权重)求导如下所示:

\frac{\partial log(1-D(G(z)))}{w_g}=\frac{\partial log(1-D(G(z)))}{\partial D(G(z))}*\frac{D(G(z))}{\partial G(z)}*\frac{G(z)}{\partial w_g}

上式的第一部分形式为log(1-x)对x求导,x在[0,1]之间,在x=0处的梯度很小,log(1-x)的函数图像如下所示:

因此G的目标函数对w求导的第一项中的D(G(z))就相当于上图中的x,并且在判别器足够好时其值接近于0,因此对于G的参数梯度很小。

因此,这时我们修改G的目标函数,将最小化log(1-D(G(z)))改变为最大化log(D(G(z))),此时目标函数对于G的参数求导如下所示:

\frac{\partial log(D(G(z))}{\partial w_g}=\frac{\partial log(D(G(z))}{\partial D(G(z))}*\frac{\partial D(G(z))}{\partial G(z)} * \frac{\partial G(z)}{\partial w_g}

其中第一部分符合log(x),x在[0,1]之间的形式,log(x)的函数图像如下所示:

可见当D(G(z))趋近于0时,也就是x趋近于0时其梯度是足够大的。因此将G的目标函数改变后在训练初期可以提供更充足的梯度。

三.证明全局最优为p_g=p_{data}

3.1证明当G给定时,D的最优解为\frac{p_{data}}{p_{data} + p_g}

当给定G时,D训练就是要使下式最大化

即log(D(x))的期望与log(1-D(G(z)))的期望之和最大化,令G(z)=x,则x的分布为p_g,则log(1-D(G(z)))的期望便可以表示为

E_{x \sim p_g}[log(1-D(x))]

当x为连续型随机变量时,log(D(x))和log(1-D(G(z)))也为连续型随机变量,因此D训练需要最大化下式(连续型随机变量求期望为概率密度与随机变量乘积求积分):

于上式中被积函数的形式为alog(y) + blog(1-y)的形式,则其求导为\frac{a-(a+b)y}{y(1 - y)}。令上式等于0可得y=\frac{a}{a + b},容易证明其就是alog(y) + blog(1-y)的最大值点(根据y取值范围在0到1之间,因此求导后分母大于0,因此根据分子的符号确定原函数增减......)。

因此可知当生成器G确定时,最优判别器为

D^*=\frac{p_{data}}{p_g+p_{data}}

3.2证明G达到全局最优时p_g=p_{data}

根据3.1中的证明,将最优判别器D带入优化的目标函数

则目标函数转化为

实际上式子为判别器D的对数似然函数,前半部分为正样本(来自于真实样本)的对数似然,后半部分为样本为负样本(来自于生成器)的对数似然(提示:因为求期望就是求和后除以样本个数,而对数求和就是真数相乘取对数,真数相乘的结果就是似然函数)。

目标函数进一步可表示为:

\int p_{data}log\frac{2 * p_{data}}{p_{data} + p_g} - p_{data}log2 + p_glog\frac{2 * p_g}{p_{data} + p_g} - p_glog2dx \newline=\int p_{data}log\frac{2 * p_{data}}{p_{data} + p_g} + p_glog\frac{2 * p_g}{p_{data} + p_g} - (p_{data} + p_g)log2dx

目标函数再进一步可以化简表示为

KL(p_{data}||\frac{p_{data} + p_g}{2}) + KL(p_g||\frac{p_{data} + p_g}{2}) - log4

其中KL(A||B)表示分布A和分布B的KL散度,可以衡量两个分布的距离,其公式如下所示:

KL散度大于等于0,当两个分布距离越近时KL散度越小,两个分布相等时达到最小为0(log1=0)

因此想要最小化目标函数,只需要使p_{data}\frac{p_{data} + p_g}{2}尽可能的相近,以及p_g\frac{p_{data} + p_g}{2}尽可能相近,因此可以得知使得目标函数最小既是使得p_{data}p_g相等,此时目标函数的值为-log4,也就是G达到最优时其目标函数值应当为-log4。

当然也可以将目标函数进一步表示为JS散度的形式,即

2(\frac{1}{2}KL(p_{data}||\frac{p_{data} + p_g}{2}) + \frac{1}{2}KL(p_g||\frac{p_{data} + p_g}{2})) - log4\newline=2JS(p_{data}||p_g)-log4

由于JS散度非负,因此当p_{data}p_g相等相等时JS散度达到最小值0,目标函数达到最小值-log4。

在这里多说一点此论文之外的,实际上这个目标函数是GAN的一个重大缺陷,因为如果p_{data}p_g极度不相似时,亦或者说p_{data}p_g没有重叠部分时JS散度是收敛到一个常数的,此时目标函数的值就是一个常数,其提供不了任何梯度供生成器学习。然而这样的情况在训练初期时很容易出现的,因为训练初期生成器生成的样本空间分布并不一定能够与真实样本空间分布很相似,所以JS散度可能趋近于常数。这也就是为什么说GAN很难训练的原因,有关这部分内容可以看Wasserstein GAN论文里的相关内容,其给出了有效的解决办法并使得GAN的训练变的更加容易、稳定。

最后文章证明了算法的收敛性,这里就不在细说,感兴趣的可以自己看一下。

好了,以上便是对于论文Generative Adversarial Nets的一些理解,希望能够帮到大家。

这篇关于Generative Adversarial Nets论文阅读笔记的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/314193

相关文章

JAVA智听未来一站式有声阅读平台听书系统小程序源码

智听未来,一站式有声阅读平台听书系统 🌟 开篇:遇见未来,从“智听”开始 在这个快节奏的时代,你是否渴望在忙碌的间隙,找到一片属于自己的宁静角落?是否梦想着能随时随地,沉浸在知识的海洋,或是故事的奇幻世界里?今天,就让我带你一起探索“智听未来”——这一站式有声阅读平台听书系统,它正悄悄改变着我们的阅读方式,让未来触手可及! 📚 第一站:海量资源,应有尽有 走进“智听

AI hospital 论文Idea

一、Benchmarking Large Language Models on Communicative Medical Coaching: A Dataset and a Novel System论文地址含代码 大多数现有模型和工具主要迎合以患者为中心的服务。这项工作深入探讨了LLMs在提高医疗专业人员的沟通能力。目标是构建一个模拟实践环境,人类医生(即医学学习者)可以在其中与患者代理进行医学

【学习笔记】 陈强-机器学习-Python-Ch15 人工神经网络(1)sklearn

系列文章目录 监督学习:参数方法 【学习笔记】 陈强-机器学习-Python-Ch4 线性回归 【学习笔记】 陈强-机器学习-Python-Ch5 逻辑回归 【课后题练习】 陈强-机器学习-Python-Ch5 逻辑回归(SAheart.csv) 【学习笔记】 陈强-机器学习-Python-Ch6 多项逻辑回归 【学习笔记 及 课后题练习】 陈强-机器学习-Python-Ch7 判别分析 【学

系统架构师考试学习笔记第三篇——架构设计高级知识(20)通信系统架构设计理论与实践

本章知识考点:         第20课时主要学习通信系统架构设计的理论和工作中的实践。根据新版考试大纲,本课时知识点会涉及案例分析题(25分),而在历年考试中,案例题对该部分内容的考查并不多,虽在综合知识选择题目中经常考查,但分值也不高。本课时内容侧重于对知识点的记忆和理解,按照以往的出题规律,通信系统架构设计基础知识点多来源于教材内的基础网络设备、网络架构和教材外最新时事热点技术。本课时知识

论文翻译:arxiv-2024 Benchmark Data Contamination of Large Language Models: A Survey

Benchmark Data Contamination of Large Language Models: A Survey https://arxiv.org/abs/2406.04244 大规模语言模型的基准数据污染:一项综述 文章目录 大规模语言模型的基准数据污染:一项综述摘要1 引言 摘要 大规模语言模型(LLMs),如GPT-4、Claude-3和Gemini的快

论文阅读笔记: Segment Anything

文章目录 Segment Anything摘要引言任务模型数据引擎数据集负责任的人工智能 Segment Anything Model图像编码器提示编码器mask解码器解决歧义损失和训练 Segment Anything 论文地址: https://arxiv.org/abs/2304.02643 代码地址:https://github.com/facebookresear

数学建模笔记—— 非线性规划

数学建模笔记—— 非线性规划 非线性规划1. 模型原理1.1 非线性规划的标准型1.2 非线性规划求解的Matlab函数 2. 典型例题3. matlab代码求解3.1 例1 一个简单示例3.2 例2 选址问题1. 第一问 线性规划2. 第二问 非线性规划 非线性规划 非线性规划是一种求解目标函数或约束条件中有一个或几个非线性函数的最优化问题的方法。运筹学的一个重要分支。2

【C++学习笔记 20】C++中的智能指针

智能指针的功能 在上一篇笔记提到了在栈和堆上创建变量的区别,使用new关键字创建变量时,需要搭配delete关键字销毁变量。而智能指针的作用就是调用new分配内存时,不必自己去调用delete,甚至不用调用new。 智能指针实际上就是对原始指针的包装。 unique_ptr 最简单的智能指针,是一种作用域指针,意思是当指针超出该作用域时,会自动调用delete。它名为unique的原因是这个

查看提交历史 —— Git 学习笔记 11

查看提交历史 查看提交历史 不带任何选项的git log-p选项--stat 选项--pretty=oneline选项--pretty=format选项git log常用选项列表参考资料 在提交了若干更新,又或者克隆了某个项目之后,你也许想回顾下提交历史。 完成这个任务最简单而又有效的 工具是 git log 命令。 接下来的例子会用一个用于演示的 simplegit

记录每次更新到仓库 —— Git 学习笔记 10

记录每次更新到仓库 文章目录 文件的状态三个区域检查当前文件状态跟踪新文件取消跟踪(un-tracking)文件重新跟踪(re-tracking)文件暂存已修改文件忽略某些文件查看已暂存和未暂存的修改提交更新跳过暂存区删除文件移动文件参考资料 咱们接着很多天以前的 取得Git仓库 这篇文章继续说。 文件的状态 不管是通过哪种方法,现在我们已经有了一个仓库,并从这个仓