GANs

生成对抗网络(Generative Adversarial Networks, GANs) 是一种用于捕获训练数据的**分布(distribution)**的神经网络。通过学习到的分布,可以创造新的数据。GAN由两个部分组成:

  • 生成器(generator):用G(z)G(z)G(z)表示,输入是(一般为正态分布采样的)随机噪声zzz,输出是和训练数据等大的“fake”数据;
  • 判别器(discriminator):用D(x)D(x)D(x)表示,用来判断输入数据xxx是否为真正的训练数据,输出是一个[0,1][0,1][0,1]区间的标量,输出值越大表示DDD判定xxx更可能是真实训练数据,越小则更可能是假的数据。

生成器和判别器之间是一个零和博弈的过程:生成器的效果越好,则判别器的正确率越低,反之亦然。在训练过程中,生成器的目的是“让判别器判断错误”,因此会生成越来越接近真实训练数据的假数据,这个过程也是学习训练数据分布的过程;判别器的目的则是“更好地区分真实数据和假数据”,因此学习过程会提高它的判别能力。

以上是一个感性的认知,在神经网络学习的框架下,需要定义一个具体的损失函数(loss),来对生成器和判别器的参数进行梯度更新。定义损失函数:
LGAN=Ex[logD(x)]+Ez[log(1−D(G(z)))],L_{GAN}=\mathbb{E}_{x}{[logD(x)]}+\mathbb{E}_{z}{[log(1-D(G(z)))]}, LGAN​=Ex​[logD(x)]+Ez​[log(1−D(G(z)))],
式中的x∼pdata(x)x \sim p_{data}(x)x∼pdata​(x)取自训练数据,z∼pnoise(z)z\sim p_{noise}(z)z∼pnoise​(z)为生成器GGG的随机噪声(一般满足正态分布)输入,E\mathbb{E}E表示期望。

对于判别器DDD,我们的目的是:真实数据xxx,D(x)D(x)D(x)尽量更大;假数据G(z)G(z)G(z),D(x)D(x)D(x)尽量更小,亦即1−D(x)1-D(x)1−D(x)尽量更大。因此判别器的训练过程的损失函数为−LGAN-L_{GAN}−LGAN​。

对于生成器GGG,我们的目的是:真实数据xxx,与GGG无关,可以当做一个常数;假数据G(z)G(z)G(z),希望判别器“认为它是真实数据”,也就是希望1−D(x)1-D(x)1−D(x)尽量更小。因此生成器的训练过程的损失函数为LGANL_{GAN}LGAN​。

综上,GAN的训练本质上是一种极大极小博弈(minimax game):
min⁡Gmax⁡DLGAN\min_{G}\max_{D} L_{GAN} Gmin​Dmax​LGAN​
理论上,训练最终会收敛于pnoise=pdatap_{noise}=p_{data}pnoise​=pdata​,也就是生成器学习的概率分布与训练数据的一致,而判别器的输出等价于随机判定真假。但实际上GAN的训练过程很不稳定。

一个例子

使用CelebA人脸数据集训练一个DCGAN。所谓DCGAN,就是生成器和判别器都是卷积神经网络的GAN。训练后的生成器可以用随机噪声生成和训练集相似的人脸图像。

训练使用二进制交叉熵损失函数(BCELoss):
BCELoss(x,y)=−1n∑i[yilogxi+(1−yi)log(1−xi)],BCELoss(x,y)=-\frac{1}{n}\sum_{i}{[y_ilogx_i+(1-y_i)log(1-x_i)]}, BCELoss(x,y)=−n1​i∑​[yi​logxi​+(1−yi​)log(1−xi​)],
这和之前讲到的LGANL_{GAN}LGAN​非常相似,通过合理地选择标签yyy就可以等价的表示LGANL_{GAN}LGAN​。训练过程的一个iter的过程如下(关键步骤):

  1. 输入数据x1x_1x1​从训练图像数据中得到,为真实数据,取标签y=1y=1y=1,前向传播(forward)得到D(x1)D(x_1)D(x1​),得到损失L1=BCELoss(D(x1),y=1)=−1n∑ilogDi(x1)L_1=BCELoss(D(x_1),y=1)=-\frac{1}{n}\sum_ilogD_i(x_1)L1​=BCELoss(D(x1​),y=1)=−n1​∑i​logDi​(x1​);
  2. 输入数据x2=G(z1)x_2=G(z_1)x2​=G(z1​),为假数据,取标签y=0y=0y=0,前向传播得到D(x2)D(x_2)D(x2​),得到损失L2=−1n∑ilog(1−Di(x2))L_2=-\frac{1}{n}\sum_{i}log(1-D_i(x_2))L2​=−n1​∑i​log(1−Di​(x2​)); (上面的DiD_iDi​为单个图像的输出,DDD为一个batch的输出。
  3. 从1和2我们得到了判别器DDD的损失LD=L1+L2=−LGANL_{D}=L_1+L_2=-L_{GAN}LD​=L1​+L2​=−LGAN​,对判别器进行参数更新;
  4. 更新后的判别器重新对x2x_2x2​进行判定,得到输出D′(x2)D'(x_2)D′(x2​),取标签y=1y=1y=1,得到损失LG=−1n∑ilogDi′(x2)L_G=-\frac{1}{n}\sum_ilogD_i'(x_2)LG​=−n1​∑i​logDi′​(x2​),前面我们说了生成器的目的是最小化LGANL_{GAN}LGAN​,而logD(x)logD(x)logD(x)这一项为常数项,因此生成器的目的等价于最小化log(1−D(G(z)))log(1-D(G(z)))log(1−D(G(z))),又等价于最小化−logD(G(z))-logD(G(z))−logD(G(z)),这正好对应LGL_GLG​;
  5. 从4我们得到了生成器GGG的损失LGL_GLG​,对生成器进行参数更新。

训练后的模型的生成器的输出和原始图片数据的对比:

代码在这里。

参考资料

  1. DCGAN TUTORIAL;
  2. 网络资料。

生成对抗网络(GANs)相关推荐

  1. 生成对抗网络GANs理解(附代码)

    生成对抗网络GANs理解(附代码) 原文地址: http://blog.csdn.net/sxf1061926959/article/details/54630462 生成模型和判别模型 理解对抗网络 ...

  2. 判别两棵树是否相等 设计算法_一文看懂生成对抗网络 - GANs?(附:10种典型算法+13种应用)...

    生成对抗网络 – GANs 是最近2年很热门的一种无监督算法,他能生成出非常逼真的照片,图像甚至视频.我们手机里的照片处理软件中就会使用到它. 本文将详细介绍生成对抗网络 – GANs 的设计初衷.基 ...

  3. 掌握生成对抗网络(GANs),召唤专属二次元老婆(老公)不是梦

    全文共6706字,预计学习时长12分钟或更长 近日,<狮子王>热映,其逼真的外形,几乎可以以假乱真,让观众不禁大呼:awsl,这也太真实了吧! 实体模型.CGI动画.实景拍摄.VR等技术娴 ...

  4. 生成对抗网络GANs

    生成对抗网络GANs(Generative Adversarial Nets from datetime import datetime import tensorflow as tf import ...

  5. 一文读懂生成对抗网络GANs(附学习资源)

    原文标题:AnIntuitive Introduction to Generative Adversarial Networks 作者:KeshavDhandhania.ArashDelijani 翻 ...

  6. 【干货】生成对抗网络GANs算法在医学图像领域应用总结

    Goodfellow等人,介绍了生成对抗网络(GAN)以模拟数据分布.由于与两个基本属性相关的原因,GAN可以合成真实图像. GAN是一种无监督的训练方法,可以通过类似于人类学习图像特征的方式获取信息 ...

  7. 小说生成对抗网络GANs

    1.前言 机器学习可以分为两类模型,一种是判别模型(discrimination model),给定一个输入,通过模型判别输入的类别.另一种是生成模型(generative model),给定输入,通 ...

  8. Nikolai Yakovenko大佬:深度学习的下一个热点:生成对抗网络(GANs)将改变世界

    生成式对抗网络-简称GANs-将成为深度学习的下一个热点,它将改变我们认知世界的方式. 准确来讲,对抗式训练为指导人工智能完成复杂任务提供了一个全新的思路,某种意义上他们(人工智能)将学习如何成为一个 ...

  9. 深度学习的下一个热点:生成对抗网络(GANs)将改变世界

    本文作者 Nikolai Yakovenko 毕业于哥伦比亚大学,目前是 Google 的工程师,致力于构建人工智能系统,专注于语言处理.文本分类.解析与生成. 生成式对抗网络-简称GANs-将成为深 ...

  10. 训练生成对抗网络的一些需要关注的问题

    Utkarsh Desai 2020-09-22 Tuesday ➤ 01导读 生成对抗网络是个好东西,不过训练比较麻烦,这里有一些技巧和陷阱,分享给大家. 生成对抗网络(GANs)是当前深度学习研究 ...

最新文章

  1. 新东方王强老师的感悟
  2. 20155212 2017-2018-1 《信息安全系统设计》第8周课下作业
  3. 使用高级程序设计语言实现集合的交并差运算
  4. Flowable学习笔记(一、入门)
  5. 3-6Tensor的属性稀疏的变量的编程
  6. 一个模型搞定十大自然语言任务:NLP全能选手来了 | 论文+代码
  7. Property Bags Object Model中的小“陷阱”
  8. 批处理(bat)文件中输出中文乱码怎么办?
  9. matlab hspice联合仿真,HSPICE TOOLBOX FOR MATLAB
  10. zipOutputStream压缩后用RAR解压出现“不可预料的压缩文件末端”错误
  11. 故事版冲突The document me.storyboard could not be opened. Unrecognized file content.
  12. 永洪BI配置测试及遇到的一些问题
  13. 入门之:如何在腾讯云服务器上部署自己的静态前端项目(服务器系统:centos7)
  14. [深度学习] - 网络模型训练过程的 loss 变化分析 (loss / val_loss / test_loss)
  15. 第四章 证券投资基金的监管
  16. python和C++语言哪个难学
  17. ip地址的概念和作用
  18. 思迈特软件Smartbi完成C轮融资,推动国产BI加速进入智能化时代
  19. 单片机开发—呼吸灯的三种实现方法
  20. 开机计算机丢失opencl.dll,win10无法修复Opencl.dll的解决方法教程|win10修复Opencl.dll的方法教程...

热门文章

  1. 渐进式web应用程序_如何使用渐进式Web应用程序更快,更便宜地构建新应用程序...
  2. 《新一代SDN——VMware NSX 网络原理与实践》——第1章 SDN与网络虚拟化的起源与现状 1.1SDN的起源和发展历程...
  3. 数据结构 - 拓展突破(C++实现中缀表达式转前缀表达式,中缀表达式转后缀表达式,前缀表达式求值,中缀表达式求值)
  4. 详解ImageNet 2017夺冠架构SENet
  5. 控制使用计算机时间怎么解除,Win7本次操作由于这台计算机的限制而被取消怎么办?...
  6. HDRI/IBL的一些想法
  7. *python解决狼羊菜过河问题
  8. 暴力的边界--Leo与跆拳道(3)
  9. 1.JVM的初步介绍(宋红康笔记)
  10. 【python】matplotlib 实现双(多)Y轴图