EBGAN, LSGAN, BEGAN_began和ebgan-程序员宅基地

技术标签: gans  

本文主要对EBGAN, LSGAN, BEGAN三个模型核心理论进行简单记录.

引言  

GAN的原理就是利用Discriminator作为Generator的引导,使得最终Generator生成的samples可以以假乱真,具体过程可以用下图表示.  ori
上图来自李宏毅深度学习PPT中,蓝色线表示Generator distribution, 绿色线表示data distribution,在优化过程中,对于real data我们 要使得最后的prob接近1,fake data最后的损失接近0,那么这个优化过程会使得G向real data的分布靠近,因为real data分布可以使得最后discriminator 的预测最大,当跑过头然后再往回更新,最终达到制衡.此时generator得到的samples与real data分布相近.  

以上是最为常见的GAN的做法,最后的evaluation function是binary classification,那这篇Post主要讲的GAN可以看作为enegry-based. 那么能量的度量与 分类相反,当两个分布接近的时候,能量达到平衡,也就是最小,可以看作classification-based GAN损失函数取反.我们首先来看看EBGAN.

EBGAN1

EBGAN网络结构如下图表示:  

ebgan
上图中,discriminator与以往的GAN不同,使用的结构为AutoEncoder, 这样的结构输入是Image, 输出也是image, 因此为了度量fake or real,这里选取了MSE最为损失函数. 同时,加入margin.如下面公式表示:  

LDx,z=D(x)+max(0,mD(G(z))) LDx,z=D(x)+max(0,m−D(G(z)))
LGz=D(G(z)) LGz=D(G(z))

上述都是最小化损失函数.对于real data, 在网络的输出我们得到对应的restruction loss, 如果用GAN原理来解释,可以看作generator的outputs输入到discriminator中,我们为 达到以假乱真,那么mse向较小的的方向更新,即此时G的分布应该趋近Data的分布. D的任务就是将这两种样本区分开.但这里有个缺点,就是real data的重构损失可以很小,最小到0,但 对于fake data,最大可以大到多大,无穷大,这对训练整个模型是不利的.因此引入margin, 由公式可以看出,引入margin之后,当 D(G(z)) D(G(z))大于m的时候,它对 LD LD的贡献为0,可以 理解为对于偏离太离谱的fake data直接忽略. 如此一来,当G生产的data distribution接近real data时,两者重构损失是接近的,因此 LD LD接近m, 此时mse在[0, m]之间.这说明引入margin之后 对于训练是有帮助的,而且可以使得G生产的data重构误差可以很小,自然可以解释为生成了可以看的图片.  

这里考虑极端情况,如果 D(x)+mD(G(x))0 D(x)+m−D(G(x))≈0,即 D(x)D(G(x))=m D(x)−D(G(x))=−m,这时G的重构误差小于D,这种情况会不会出现.由GAN的对抗训练,是不会出现的.因为如果G的重构误差比real data重构误差还小,那么discriminator的引导作用消失,因为G的最终目标是real data的分布, 因此两者极端情况就是相等.  

后续,作者为了增加样本多样性,利用code做文章,加入相似性的约束,这里主要对损失函数进行解读,可能有人会问margin可不可以自适应,可以的,MAGAN(Margin Adaptivation GAN),下面这篇GAN也可以看成自适应marginGAN.

LS-GAN2

同样的,先上公式:  

LD(x,z)=D(x)+max(0,Δ(x,G(x))+D(x)D(G(z))) LD(x,z)=D(x)+max(0,Δ(x,G(x))+D(x)−D(G(z)))
LG(z)=D(G(z)) LG(z)=D(G(z))

上面公式如何理解,我们可以用下图来说明:  ebgan
在优化时, margin=Δ(x,G(x))+D(x) margin=Δ(x,G(x))+D(x), 自适应反映在第一项.baseline为 D(x) D(x),每次优化的margin为G生产的图片和real data之间的差异,这个差异可以使用mse等度量函数.当两者差异较大是margin就会很大,当随着优化的进行,两者差异会减小,此时二者margin就会很小.当达到理想情况,即G得到的data distribution接近real data,此时两者margin是此时discriminator对real data的重构损失,与 D(G(z)) D(G(z))很接近,此时 LD LD达到理想的最小值.   LS-GAN较EBGAN优点在于margin自适应,当然可以看作EBGAN的一种.  

BEGAN3

直接上公式:  

LD(x,z)=D(x)ktD(G(z)) LD(x,z)=D(x)-ktD(G(z))
LG(z)=D(G(z)) LG(z)=D(G(z))

其中 kt kt初始化为0,即D在训练最开始只针对real data进行建模,直到满足 D(x) D(x)大于 D(G(z)) D(G(z)),也就是不能让G生产的数据被认为是real data.目标还是使得G最后的分布接近real data,但不能超越real data.整个训练过程相当于以逸待劳,每次当满足上述条件时,更新 kt kt, 然后在下一次满足条件是再次更新,这样可以达到逐步迁移分布的效果.更新公式如下:  

kt+1=kt+λ(γD(x)D(G(z))) kt+1=kt+λ(γD(x)−D(G(z)))

γ γ的值可以设置,可以设想一下,如果 γ γ的不断减小逼近0,那么最后G得到的图片可以看成real data,因为此时一直在更新 kt kt.

下图是实验结果:  

res

这里BEGAN结构使用与EBGAN相同,不同之处在于loss function的设计,可以看到,BEGAN生成的图片有点厉害.

这篇post就到这里,主要讲Enegry-based GAN以及margin的GAN的损失函数,没有对模型具体细节进行探讨,具体还需参看论文.

References

  1. Zhao J, Mathieu M, Lecun Y. Energy-based Generative Adversarial Network[J]. 2017. 

  2. Qi G J. Loss-Sensitive Generative Adversarial Networks on Lipschitz Densities[J]. 2017. 

  3. Boundary Equilibrium Generative Adversarial Networks 

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/c2a2o2/article/details/78963497

智能推荐

c# 调用c++ lib静态库_c#调用lib-程序员宅基地

文章浏览阅读2w次,点赞7次,收藏51次。四个步骤1.创建C++ Win32项目动态库dll 2.在Win32项目动态库中添加 外部依赖项 lib头文件和lib库3.导出C接口4.c#调用c++动态库开始你的表演...①创建一个空白的解决方案,在解决方案中添加 Visual C++ , Win32 项目空白解决方案的创建:添加Visual C++ , Win32 项目这......_c#调用lib

deepin/ubuntu安装苹方字体-程序员宅基地

文章浏览阅读4.6k次。苹方字体是苹果系统上的黑体,挺好看的。注重颜值的网站都会使用,例如知乎:font-family: -apple-system, BlinkMacSystemFont, Helvetica Neue, PingFang SC, Microsoft YaHei, Source Han Sans SC, Noto Sans CJK SC, W..._ubuntu pingfang

html表单常见操作汇总_html表单的处理程序有那些-程序员宅基地

文章浏览阅读159次。表单表单概述表单标签表单域按钮控件demo表单标签表单标签基本语法结构<form action="处理数据程序的url地址“ method=”get|post“ name="表单名称”></form><!--action,当提交表单时,向何处发送表单中的数据,地址可以是相对地址也可以是绝对地址--><!--method将表单中的数据传送给服务器处理,get方式直接显示在url地址中,数据可以被缓存,且长度有限制;而post方式数据隐藏传输,_html表单的处理程序有那些

PHP设置谷歌验证器(Google Authenticator)实现操作二步验证_php otp 验证器-程序员宅基地

文章浏览阅读1.2k次。使用说明:开启Google的登陆二步验证(即Google Authenticator服务)后用户登陆时需要输入额外由手机客户端生成的一次性密码。实现Google Authenticator功能需要服务器端和客户端的支持。服务器端负责密钥的生成、验证一次性密码是否正确。客户端记录密钥后生成一次性密码。下载谷歌验证类库文件放到项目合适位置(我这边放在项目Vender下面)https://github.com/PHPGangsta/GoogleAuthenticatorPHP代码示例://引入谷_php otp 验证器

【Python】matplotlib.plot画图横坐标混乱及间隔处理_matplotlib更改横轴间距-程序员宅基地

文章浏览阅读4.3k次,点赞5次,收藏11次。matplotlib.plot画图横坐标混乱及间隔处理_matplotlib更改横轴间距

docker — 容器存储_docker 保存容器-程序员宅基地

文章浏览阅读2.2k次。①Storage driver 处理各镜像层及容器层的处理细节,实现了多层数据的堆叠,为用户 提供了多层数据合并后的统一视图②所有 Storage driver 都使用可堆叠图像层和写时复制(CoW)策略③docker info 命令可查看当系统上的 storage driver主要用于测试目的,不建议用于生成环境。_docker 保存容器

随便推点

网络拓扑结构_网络拓扑csdn-程序员宅基地

文章浏览阅读834次,点赞27次,收藏13次。网络拓扑结构是指计算机网络中各组件(如计算机、服务器、打印机、路由器、交换机等设备)及其连接线路在物理布局或逻辑构型上的排列形式。这种布局不仅描述了设备间的实际物理连接方式,也决定了数据在网络中流动的路径和方式。不同的网络拓扑结构影响着网络的性能、可靠性、可扩展性及管理维护的难易程度。_网络拓扑csdn

JS重写Date函数,兼容IOS系统_date.prototype 将所有 ios-程序员宅基地

文章浏览阅读1.8k次,点赞5次,收藏8次。IOS系统Date的坑要创建一个指定时间的new Date对象时,通常的做法是:new Date("2020-09-21 11:11:00")这行代码在 PC 端和安卓端都是正常的,而在 iOS 端则会提示 Invalid Date 无效日期。在IOS年月日中间的横岗许换成斜杠,也就是new Date("2020/09/21 11:11:00")通常为了兼容IOS的这个坑,需要做一些额外的特殊处理,笔者在开发的时候经常会忘了兼容IOS系统。所以就想试着重写Date函数,一劳永逸,避免每次ne_date.prototype 将所有 ios

如何将EXCEL表导入plsql数据库中-程序员宅基地

文章浏览阅读5.3k次。方法一:用PLSQL Developer工具。 1 在PLSQL Developer的sql window里输入select * from test for update; 2 按F8执行 3 打开锁, 再按一下加号. 鼠标点到第一列的列头,使全列成选中状态,然后粘贴,最后commit提交即可。(前提..._excel导入pl/sql

Git常用命令速查手册-程序员宅基地

文章浏览阅读83次。Git常用命令速查手册1、初始化仓库git init2、将文件添加到仓库git add 文件名 # 将工作区的某个文件添加到暂存区 git add -u # 添加所有被tracked文件中被修改或删除的文件信息到暂存区,不处理untracked的文件git add -A # 添加所有被tracked文件中被修改或删除的文件信息到暂存区,包括untracked的文件...

分享119个ASP.NET源码总有一个是你想要的_千博二手车源码v2023 build 1120-程序员宅基地

文章浏览阅读202次。分享119个ASP.NET源码总有一个是你想要的_千博二手车源码v2023 build 1120

【C++缺省函数】 空类默认产生的6个类成员函数_空类默认产生哪些类成员函数-程序员宅基地

文章浏览阅读1.8k次。版权声明:转载请注明出处 http://blog.csdn.net/irean_lau。目录(?)[+]1、缺省构造函数。2、缺省拷贝构造函数。3、 缺省析构函数。4、缺省赋值运算符。5、缺省取址运算符。6、 缺省取址运算符 const。[cpp] view plain copy_空类默认产生哪些类成员函数

推荐文章

热门文章

相关标签