LogoLogo
  • README
  • 前端编程
    • 01 Node JS
    • 02-ES6详解
    • 03-NPM详解
    • 04-Babel详解
    • 05-前端模块化开发
    • 06-WebPack详解
    • 07-Vue详解
    • 08-Git详解
    • 09-微信小程序
  • 人工智能
    • 机器学习
      • 二次分配问题
      • 非负矩阵
      • 概率潜在语义分析
      • 概率图模型
      • 集成学习
      • 降维
      • 距离度量
      • 决策树
      • 逻辑回归
      • 马尔可夫决策过程
      • 马尔可夫链蒙特卡洛法
      • 朴素贝叶斯法
      • 谱聚类
      • 奇异值分解
      • 潜在狄利克雷分配
      • 潜在语义分析
      • 强化学习
      • 社区算法
      • 时间序列模型
      • 特征工程
      • 条件随机场
      • 图论基础
      • 线性分类
      • 线性回归
      • 信息论中的熵
      • 隐马尔科夫模型
      • 支持向量机
      • 主成分分析
      • EM算法
      • Hermite 矩阵的特征值不等式
      • k-means聚类
      • k近邻法
      • PageRank算法
    • 深度学习
      • Pytorch篇
        • 01-线性模型
        • 02-梯度下降法
        • 03-反向传播
        • 04-pytorch入门
        • 05-用pytorch实现线性回归
        • 06-logistic回归
        • 07-处理多维特征的输入
        • 08-加载数据集
        • 09-多分类问题
        • 10-卷积神经网络
        • 11-循环神经网络
    • 图神经网络
      • 图神经网络笔记01
        • 01-图(Graphs)的结构
        • 02-网络的性质和随机图模型
        • 03-网络工具
        • 04-网络中的主题和结构角色
        • 05-网络中的社区结构
      • 图神经网络笔记02
        • 01-深度学习引言
        • 02-神经网络基础
        • 03-卷积神经网络
        • 04-图信号处理与图卷积神经网络
        • 05-GNN的变体与框架-
        • [06-Google PPRGo 两分钟分类千万节点的最快GNN](人工智能/图神经网络/图神经网络笔记02/06-Google%20PPRGo 两分钟分类千万节点的最快GNN.md)
        • 07-序列模型
        • 08-变分自编码器
        • 09-对抗生成网络
  • 日常记录
    • 健身日记
    • 面经记录
    • 自动生成Summary文件
  • 实战项目
    • 谷粒商城
      • 00-项目概述
      • 01-分布式基础-全栈开发篇
      • 02-分布式高级-微服务架构篇
      • 03-高可用集群-架构师提升篇
  • 数据库
    • MySQL笔记
      • 01-MySQL基础篇
      • 02-MySQL架构篇
      • 03-MySQL索引及调优篇
      • 04-MySQL事务篇
      • 05-MySQL日志与备份篇
    • Redis笔记
      • 01-Redis基础篇
      • 02-Redis高级篇
    • 02-Redis篇
  • 算法笔记
    • 01-算法基础篇
    • 02-算法刷题篇
  • 职能扩展
    • 产品运营篇
  • Go编程
    • 01-Go基础
      • 01-Go基础篇
  • Java编程
    • 01-Java基础
      • 01-Java基础篇
      • 02-多线程篇
      • 03-注射与反解篇
      • 04-JUC并发编程篇
      • 05-JUC并发编程与源码分析
      • 06-JVM原理篇
      • 07-Netty原理篇
      • 08-设计模式篇
    • 02 Java Web
      • 01-Mybatis篇
      • 01-Mybatis篇(新版)
      • 02-Spring篇
      • 02-Spring篇(新版)
      • 03-SpringMVC篇
      • 04-MybatisPlus篇
    • 03-Java微服务
      • 01-SpringBoot篇
      • 01-SpringBoot篇(新版)
      • 02-SpringSecurity篇
      • 03-Shiro篇
      • 04-Swagger篇
      • 05-Zookeeper篇
      • 06-Dubbo篇
      • 07-SpringCloud篇
      • 08-SpringAlibaba篇
      • 09-SpringCloud篇(新版)
    • 04-Java中间件
      • 数据库篇
        • 01-分库分表概述
        • 02-MyCat篇
        • 03-MyCat2篇
        • 04-Sharding-jdbc篇
        • 05-ElasticSearch篇
      • 消息中间件篇
        • 01-MQ概述
        • 02-RabbitMQ篇
        • 03-Kafka篇
        • 04-RocketMQ篇
        • 05-Pulsar篇
    • 05-扩展篇
      • Dubbo篇
      • SpringBoot篇
      • SpringCloud篇
    • 06-第三方技术
      • 01-CDN技术篇
      • 02-POI技术篇
      • 03-第三方支付技术篇
      • 04-第三方登录技术篇
      • 05-第三方短信接入篇
      • 06-视频点播技术篇
      • 07-视频直播技术篇
    • 07-云原生
      • 01-Docker篇
      • 02-Kubernetes篇
      • 03-Kubesphere篇
  • Linux运维
    • 01-Linux篇
    • 02-Nginx篇
  • Python编程
    • 01-Python基础
      • 01.配置环境
      • 02.流程控制
      • 03.数值
      • 04.操作符
      • 05.列表
      • 06.元祖
      • 07.集合
      • 08.字典
      • 09.复制
      • 10.字符串
      • 11.函数
      • 12.常见内置函数
      • 13.变量
      • 14.异常和语法错误
      • 15.时间和日期
      • 16.正则表达式
    • 02 Python Web
      • flask篇
        • 01.前言
        • 02.路由
        • 03.模板
        • 04.视图进阶
        • 05.flask-sqlalchemy
        • 06.表单WTForms
        • 07.session与cookie
        • 08.上下文
        • 09.钩子函数
        • 10.flask 信号
        • 11.RESTFUL
        • 13.flask-mail
        • 14.flask+celery
        • 15.部署
        • 16.flask-login
        • 17.flask-cache
        • 18.flask-babel
        • 19.flask-dashed
        • 20.flask-pjax
        • 21.flask上传文件到第三方
        • 22.flask-restless
        • 23.flask-redis
        • 24.flask-flash
        • 25.消息通知
        • 26.分页
    • 03-Python数据分析
      • Matplotlib
      • Numpy
      • Pandas
      • Seaborn
    • 04-Python爬虫
      • 1.准备工作
      • 2.请求模块的使用
      • 3.解析模块的使用
      • 4.数据存储
      • 5.识别验证码
      • 6.爬取APP
      • 7.爬虫框架
      • 8.分布式爬虫
由 GitBook 提供支持
在本页
  • 简述
  • 什么是生成(generation)
  • 生成模型VS判别模型
  • GAN为什么重要?
  • 损失函数
  • BCE:二分类交叉熵损失函数
  • CE
  • Wasserstein Loss
  • 基本思路
  • 算法步骤
  • 图像处理
  • 采样
  • 转置卷积
  • GAN目前存在的主要问题
  • 作业一
  • 条件生成对抗网络
  • 通过文本生成图片
  • 通过图像生成图像
  • 作业二
  • 拓展阅读
  • 无监督条件生成对抗网络
  • 算法思路
  • 案例

这有帮助吗?

在GitHub上编辑
  1. 人工智能
  2. 图神经网络
  3. 图神经网络笔记02

09-对抗生成网络

上一页08-变分自编码器下一页日常记录

最后更新于3年前

这有帮助吗?

简述

​ 生成对抗网络(Generative Adversarial Network,GAN)是当前功能最强大的机器学习模型之一,其能够生成逼真的图像、视频和语音输出结果。基于 GAN 的应用十分广泛,比如防御对抗攻击和数据匿名化来保护隐私,以提升网络安全性,再比如生成新图像,为黑白图像着色、提高图像分辨率、2D 图像转 3D 等技术。

**GAN,即生成对抗网络,主要包含两个模块:生成器(Generative Model)和判别器(Discriminative Model)。**生成模型和判别模型之间互相博弈、学习产生相当好的输出。

​ 随着算力的增强,GAN 的普及程度和功能也不断提升,开启了许多新的方向:比如生成大量数据用来训练模型,让无监督模型生成更加清晰、准确的输出图像,同时也为相近研究领域提供了对抗学习、对抗样本、模型鲁棒性等方面的启示。

​ 例子:

  • 举个例子,可以用于自然图像的生成。假设给定1000万张图片之后,生成模型可以自动学习到其内部分布,能够解释给定的训练图片,并同时生成新的图片。

什么是生成(generation)

就是模型通过学习一些数据,然后生成类似的数据。让机器看一些动物图片,然后自己来产生动物的图片,这就是生成。

生成模型VS判别模型

生成模型:学习得到联合概率分布$P(x,y)$,即特征x和标记y共同出现的概率,然后求条件概率分布。能够学习到数据生成的机制。简单说, 概率生成模型的目的,就是找出给定观测数据内部的统计规律,并且能够基于所得到的概率分布模型,产生全新的,与观测数据类似的数据。

深度学习新星:GAN的基本原理、应用和走向 | 雷锋网公开课

现在比较流行的生成模型,其实可以分为三类:

  • 生成对抗网络(GAN)。这个是我们今天要重点介绍的内容。

  • 变分自动编码模型(VAE)。它依靠的是传统的概率图模型的框架,通过一些适当的联合分布的概率逼近,简化整个学习过程,使得所学习到的模型能够很好地解释所观测到的数据。

  • 自回归模型(Auto-regressive)。在这种模型里,我们简单地认为,每个变量只依赖于它的分布,只依赖于它在某种意义上的近邻。例如将自回归模型用在图像的生成上。那么像素的取值只依赖于它在空间上的某种近邻。现在比较流行的自回归模型,包括最近刚刚提出的像素CNN或者像素RNN,它们可以用于图像或者视频的生成。

判别模型:学习得到条件概率分布$P(y|x)$,即在特征$x$出现的情况下标记$y$出现的概率。

​ 这三种生成模型都有各自的优缺点,然后也在不同的领域上得到广泛的关注。而今天我们要介绍的GAN实际上是一种比较年轻的方法。两年半之前, Ian Goodfellow的一篇论文首次将其引入,虽然时间很短,但我们看Google的搜索热度和Google学术上论文引用的次数,它一直受到学术界广泛的关注,而且热度一直快速增长。

除了学术界,GAN还受到工业界的广泛关注。有许多做人工智能研究的公司正在投入大量的精力来发展和推广GAN模型。其中包括 Ian Goodfellow 如今所在的 OpenAI 公司。这个公司一直在致力于研究推广GAN,并将其应用在不同的任务上。同时 Facebook 和 Twitter 最近两年也投入了大量的精力来研究,并将GAN应用在了图像生成和视频生成上。尤其值得一提的是,Apple最近发表了其关于人工智能研究的首篇论文,恰恰是应用GAN来做数据的生成,帮助更好地训练机器学习模型。

GAN为什么重要?

GAN是更好的生成模型,在某种意义上避免了马尔科夫链式的学习机制,这使得它能够区别于传统的概率生成模型。传统概率生成模型一般都需要进行马可夫链式的采样和推断,而GAN避免了这个计算复杂度特别高的过程,直接进行采样和推断,从而提高了GAN的应用效率,所以其实际应用场景也就更为广泛。

其次GAN是一个非常灵活的设计框架,各种类型的损失函数都可以整合到GAN模型当中,这样使得针对不同的任务,我们可以设计不同类型的损失函数,都会在GAN的框架下进行学习和优化。

再次,最重要的一点是,当概率密度不可计算的时候,传统依赖于数据自然性解释的一些生成模型就不可以在上面进行学习和应用。但是GAN在这种情况下依然可以使用,这是因为GAN引入了一个非常聪明的内部对抗的训练机制,可以逼近一些不是很容易计算的目标函数。

Facebook人工智能研究院的Yann LeCun也一直是GAN的积极倡导者。其中一个最重要的原因就是GAN为无监督学习提供了一个强有力的算法框架,而无监督学习被广泛认为是通往人工智能重要的一环。就像Yann LeCun所给出的一个比喻一样:

“如果人工智能是一块蛋糕,那么强化学习是蛋糕上的一粒樱桃,监督学习是外面的一层糖霜,无监督/预测学习则是蛋糕胚。目前我们只知道如何制作糖霜和樱桃,却不知如何制作蛋糕胚。“

虽然还在快速的发展当中,但是GAN确实为无监督学习,提供了一个非常有潜力的解决方案。

损失函数

GAN试图通过最小化衡量分布差异的基础成本函数,使生成的分布看起来与实际分布类似。

BCE损失函数只能看到事物的表面,实际上没有看到任何关于真实的东西。

BCE:二分类交叉熵损失函数

L=−∑i=1N[y(i)log⁡y^(i)+(1−y(i))log⁡(1−y^(i))]L = - \sum\limits_{i=1}^N [y^{(i)}\log{\hat y}^{(i)} + (1-y^{(i)}) \log{(1-\hat y^{(i)})}]L=−i=1∑N​[y(i)logy^​(i)+(1−y(i))log(1−y^​(i))]

其中,$\hat y^{(i)}$是预测数据,$y^{(i)}$是label。

CE

R(W)=−1N∑n=1N∑c=1Cyc(n)log⁡y^c(n)\mathcal{R}(W) = -\frac{1}{N}\sum\limits_{n=1}^N \sum\limits_{c=1}^C y_c^{(n)}\log{\hat y_c^{(n)}}R(W)=−N1​n=1∑N​c=1∑C​yc(n)​logy^​c(n)​

Wasserstein Loss

W(Pr,Pg)=infγ∈∏(Pγ,Pg)E(x,y)∼γ[∣∣x−y∣∣]W(\mathbb{P_r},\mathbb{P}_g) = \mathcal{inf}_{\gamma\in \prod{(\mathbb{P}_\gamma},\mathbb{P_g})}\mathbb{E}_{(x,y) \sim \gamma}[||x-y||]W(Pr​,Pg​)=infγ∈∏(Pγ​,Pg​)​E(x,y)∼γ​[∣∣x−y∣∣]

其中$ \prod(\mathbb{P_r}, \mathbb{P_g}) $代表 $(\mathbb{P_r}, \mathbb{P_g})$ 所有可能的联合概率分布的集合。$\gamma(x,y)$ 代表了在 $\mathbb{P_r}$ 中出现$x$同时在$\mathbb{P_g}$中出现$ y$的概率,$\gamma$ 的边缘分布分别为 $\mathbb{P_r}$和$\mathbb{P_g}$。

在这个联合分布下可以求得所有$ x $与$ y $距离的期望,存在某个联合分布使这个期望最小,这个期望的下确界(infimum)就是$(\mathbb{P_r}, \mathbb{P_g})$的 Wasserstein 距离。

用该损失函数能够防止模式崩溃以及梯度消失的问题

基本思路

Generator与Discriminator之间不断进行对抗从而达到理想的想过,可以将generator当成学生,在学习如何绘画,Discriminator当成老师,负责教导学生学习绘画。当学生绘画不好的时候,老师会对学生进行批评。

思考:为啥老师自己不来画画,就喜欢纸上谈兵。

算法步骤

G和D可以看做成一个巨大的network,比如G有5层,D有5层,那么这个网络有10层,其中hidden layer看作为图片的生成数据。

图像处理

采样

转置卷积

GAN目前存在的主要问题

  • 解决不收敛(non-convergence)的问题 目前面临的基本问题是:所有的理论都认为 GAN 应该在纳什均衡(Nash equilibrium)上有卓越的表现,但梯度下降只有在凸函数的情况下才能保证实现纳什均衡。当博弈双方都由神经网络表示时,在没有实际达到均衡的情况下,让它们永远保持对自己策略的调整是可能的【OpenAI Ian Goodfellow的Quora】。

  • 难以训练:崩溃问题(collapse problem) GAN模型被定义为极小极大问题,没有损失函数,在训练过程中很难区分是否正在取得进展。GAN的学习过程可能发生崩溃问题(collapse problem),生成器开始退化,总是生成同样的样本点,无法继续学习。当生成模型崩溃时,判别模型也会对相似的样本点指向相似的方向,训练无法继续。【Improved Techniques for Training GANs】

  • 无需预先建模,模型过于自由不可控 与其他生成式模型相比,GAN这种竞争的方式不再要求一个假设的数据分布,即不需要formulate p(x),而是使用一种分布直接进行采样sampling,从而真正达到理论上可以完全逼近真实数据,这也是GAN最大的优势。然而,这种不需要预先建模的方法缺点是太过自由了,对于较大的图片,较多的 pixel的情形,基于简单 GAN 的方式就不太可控了。在GAN[Goodfellow Ian, Pouget-Abadie J] 中,每次学习参数的更新过程,被设为D更新k回,G才更新1回,也是出于类似的考虑。

作业一

条件生成对抗网络

通过文本生成图片

通过文字描述来生成图片。

算法步骤:

模型架构:

算法提升:

通过图像生成图像

实际应用

  • 语言增强

  • 视频生成

作业二

拓展阅读

无监督条件生成对抗网络

算法思路

案例

比如把人像转换成二次元风格图像

如果用GAN的思路,就是从原图采样,生成后放图D和动漫图库佐渡滴鼻,就结束了

G可以为了骗过D生成卡通图,但是生成的图片可能和我们的输入x没有关系,所以这种做法是不够的,那么如何强化输入和输出的问题呢,我们无法套用conditonal GAN,因为我们没有成对的资料做监督

Cycle GAN可以解决这一问题,在生成图片后,我们需要把他还原成原图,经过两次转换,输入和输出越接近越好,这样前面的G就有了限制

但是机器可能也会学习到一些奇怪的转换,并没有按照我们想要的方式生成图片,他只有保证最后输出和输入相近,中间生成方式未必是我们期待的,比如把眼镜特征转换为别的东西,在转换回来,目前没有特别好的解法,但是实际上一般不会遇到,因为网络一般不会学习太复杂的转换。

CycleGAN算法的整体示意图,整体上包含2个GAN网络。

假设现在有X和Y两个域,可以简单理解为X为斑马,Y为马。在CycleGAN中有2个生成器,分别用G和F表示,如Figure3(a)所示,生成器G用来基于X域的图像生成Y域的图像(斑马->马);生成器F用来基于Y域的图像生成X域的图像(马->斑马),这2个生成器的定位是相反的过程,通过(b)和©中的cycle-consistency loss进行约束。同时CycleGAN中有2个判别器,分别用DX和DY表示,用来判断输入的X域或Y域图像是真还是假。因此CycleGAN可以看做是2个GAN的融合,一个GAN由生成器G和判别器DY构成,实现从X域到Y域的图像生成和判别;另一个GAN由生成器F和判别器DX构成,实现从Y域到X域的图像生成和判别,两个网络构成循环(cycle)的过程

深度学习新星:GAN的基本原理、应用和走向 | 雷锋网公开课
深度学习新星:GAN的基本原理、应用和走向 | 雷锋网公开课
深度学习新星:GAN的基本原理、应用和走向 | 雷锋网公开课
image-20210530095605984
image-20210531163123977
image-20210531174038686
image-20210531163854361
image-20210531163902008
image-20210531163914083

image-20210603104443348
image-20210603105002227
image-20210603105815810
image-20210603110140205
image-20210603110422126
image-20210603110854462
image-20210603111157663
image-20210603111225122
image-20210603111240423

​ 与其他生成式模型相比,GAN这种竞争的方式不再要求一个假设的数据分布,即不需要formulate p(x),而是使用一种分布直接进行采样sampling,从而真正达到理论上可以完全逼近真实数据,这也是GAN最大的优势。然而,这种不需要预先建模的方法缺点是太过自由了,对于较大的图片,较多的 pixel的情形,基于简单 GAN 的方式就不太可控了。为了解决GAN太过自由这个问题,一个很自然的想法是给GAN加一些约束,于是便有了。这项工作提出了一种带条件约束的GAN,在生成模型(D)和判别模型(G)的建模中均引入条件变量y(conditional variable y),使用额外信息y对模型增加条件,可以指导数据生成过程。这些条件变量y可以基于多种信息,例如类别标签,用于图像修复的部分数据[2],来自不同模态(modality)的数据。如果条件变量y是类别标签,可以看做CGAN 是把纯无监督的 GAN 变成有监督的模型的一种改进。这个简单直接的改进被证明非常有效,并广泛用于后续的相关工作中[3,4]。 的工作是在MNIST数据集上以类别标签为条件变量,生成指定类别的图像。作者还探索了CGAN在用于图像自动标注的多模态学习上的应用,在MIR Flickr25000数据集上,以图像特征为条件变量,生成该图像的tag的词向量。

img
img
img
img
在这里插入图片描述
第一节视频
pytorch torch.nn 实现上采样——nn.Upsample
转置卷积
作业
GAN入门理解及公式推导
作业
提示
GAN原理学习笔记
深度学习新星:GAN的基本原理、应用和走向 | 雷锋网公开课
GAN动物园
Conditional Generative Adversarial Nets(CGAN)【Mirza M, Osindero S. Conditional】
Mehdi Mirza et al.