深度学习 - 生成对抗网络

目录

1 GAN产生背景

2 GAN模型

3 CGAN

4 InfoGAN

5 Improved Techniques for Training GANs

 6 DCGAN -- Deep convolutional generative adversarial networks

 7 GAN应用


1 GAN产生背景

1. 机器学习方法

        生成方法,所学到的模型称为生成式模型

                生成方法通过观测数据学习样本与标签的联合概率分布P(X, Y),训练好的模型,即生成模型,能够生成符合样本分布的新数据

                生成式模型在无监督深度学习方面占据主要位置,可以用于在没有目标类标签信息的情况下捕捉观测到或可见数据的高阶相关性

        判别方法,所学到的模型称为判别式模型

                判别方法由数据直接学习决策函数f(X)或者条件概率分布P(Y|X)作为预测的模型,即判别模型;

                判别模型经常用在有监督学习方面;

                判别方法关心的是对给定的输入X,应该预测什么样的输出Y

2. 困难和前景

        有监督学习经常比无监督学习获得更好的模型,但是有监督学习需要大量的标注数据,从长远看无监督学习更有发展前景;

        支持无监督学习的生成式模型遇到两大困难

                首先是人们需要大量的先验知识去对真实世界进行建模,而建模的好坏直接影响着我们的生成模型的表现;

                真实世界的数据往往很复杂,人们要用来拟合模型的计算量往往非常庞大,甚至难以承受;

3. 生成对抗网络的提出

        2014年,生成对抗网络(Generative Adversarial Networks,GAN)由当时还在蒙特利尔读博士的Ian Goodfellow(导师Bengio)提出;

                2016年,GAN热潮席卷AI领域顶级会议,从ICLR到NIPS,大量高质量论文被发表和探讨;

                2017年入选MIT评论35岁以下创新人物

4. GAN基本原理

        GAN起源于博弈论中的二人零和博弈(获胜1,失败-1)

        由两个互为敌手的模型组成:

                生成模型(假币制造者团队);

                判别模型(警察团队);

        竞争使得两个团队不断改进他们的方法直到无法区分假币与真币

5. Yann LeCun评价

        我们一直在错过一个关键因素就是无监督/预测学习,这是指:机器给真实环境建模、预测可能的未来、并通过观察和演示来理解世界是如何运行的能力;

        GAN为创建无监督学习提供了强有力的算法框架,有望帮助我们为AI加入常识,我们认为,沿着这条路走下去,有不小的成功的机会能开发出更智慧的AI;

6. GAN的发展

        The GAN Zoo -- GitHub - hindupuravinash/the-gan-zoo: A list of all named GANs!

深度学习 - 生成对抗网络_第1张图片

深度学习 - 生成对抗网络_第2张图片

 7. 生成模型中的问题

        自编码器:同样一个像素的差异,但是不同的接受度

深度学习 - 生成对抗网络_第3张图片

         概率模型

                按照某种概率分布生成数据,得到最能覆盖训练样本的概率分布;

                需要确定样本的概率模型,即显式地定义概率密度函数

                        例如:深度玻尔兹曼机采用对比散度(Gibbs采样),样本可能会具有很强的相关性,尤其是在高维的情况下;

2 GAN模型

1. 估计样本概率分布却不需要显示定义概率分布

深度学习 - 生成对抗网络_第4张图片

 生成模型

        捕捉样本数据的分布,用服从某一分布(均匀分布,高斯分布)的噪声z生成一个类似真实训练数据的样本,追求效果是越像真实的数据越好;

                p_{data}(x) 表示真实数据的分布;

                p_z(z)表示输入噪声变量的分布;

                p_g表示在数据上学习得到的生成样本的分布;

                G(z,\theta_g)表示生成模型(多层感知器)

        可以看做一种映射函数;

        当数据集是图片的时候,那么我们输入的随机噪声其实就是相当于低维的数据(也就是图片所对应的低维的特征,因为图片中有很多数据是冗余的,通过低维特征就可以映射为图片高维的数据),经过生成模型G的映射就变成了一张生成的图片

深度学习 - 生成对抗网络_第5张图片

 判别模型

        一个二分类器,估计一个样本来自训练数据(而非生成数据)的概率,如果样本来自真实的训练数据,输出大概率,否则,输出小概率;

        D(x;\theta _d)表示判别模型(多层感知器);

        D(x)表示来自真实数据而非生成数据的概率;

用网络代替概率模型:P_g(x;\theta ), P_{data}(x )

深度学习 - 生成对抗网络_第6张图片

 GAN 目标函数

        训练GAN的时候,判别模型希望目标函数最大化,也就是使判别模型判断真实样本为“真”判断生成样本为“假”的概率最大化,要尽量最大化自己的判别准确率;(用到了真实数据和生成数据)

        D(x) 越接近1,表明数据越为真实数据,越接近0,表示越为生成数据。

\min_{G} \max_{D} = E_{x~p_{data}(x)}[logD(x)] + E_{z~p_{z}(z)}[log(1 - D(G(z))]

        判别模型也可以写成损失函数的形式:

L(G,D) = -E_{x~p_{data}(x)}[logD(x)] - E_{z~p_z(z)}[log(1-D(G(z)))]

        这样,在最大化D的分数的时候,损失值最小;

        与之相反,生成模型希望该目标函数最小化,也就是降低判别模型对数据来源判断正确的概率,要最小化判别模型的判别准确率;

        生成模型训练目标: -- 训练目标就是让D(G(z))升高

                V(G,D) = E_{z\sim p_z(z)}[log(1-D(G(z)))]

        也是最小化上面的函数;

        但上面的目标函数,实际中效果并不好,开始时梯度小收敛慢,因此使用如下目标:

                V(G,D) = E_{z\sim p_z(z)}[-log(D(G(z)))]

深度学习 - 生成对抗网络_第7张图片

2. GAN模型训练

        GAN在训练的过程中固定一方,更新另一方的网络权重;

        交替迭代,在这个过程中,双方都极力优化自己的网络,从而形成竞争对抗,直到双方达到一个动态的平衡(纳什均衡);

        此时生成模型的数据分布无限接近训练数据的分布(造出了和真实数据一模一样的样本),判别模型再也判别不出来真实数据和生成数据,准确率为50%

深度学习 - 生成对抗网络_第8张图片

        固定G,训练D时,最优的判别器为

        

深度学习 - 生成对抗网络_第9张图片

 上述结论证明:

        

深度学习 - 生成对抗网络_第10张图片

 3. GAN优势:

        任何一个可微分函数都可以参数化D和G(如深度神经网络);

        支持无监督方法实现数据生成,减少了数据标注工作;

        生成模型G的参数更新不是来自于数据样本本身(不是对数据的似然性进行优化),而是来自于判别模型D的一个反传梯度;

4. GAN不足

        无需预先建模,数据生成的自由度太大

        得到的是概率分布,但是没有表达式,可解释性差;

        D与G训练无法同步,训练难度大,会产生梯度消失问题;

5. GAN的优化和改进

        限定条件优化 -- CGAN,InfoGAN, GPGAN, Text to image

        迭代式生成优化 -- LAPGAN, StackGAN, PPGN

        结构优化 -- DCGAN, Pix2Pix

3 CGAN

1. 在生成模型中,先验输入噪声p(z)和条件信息y联合组成了联合隐层表征;

        y是一些附加信息,可以是one-hot向量,也可以是图像或者分类标签;

        条件GAN的目标函数是带有条件概率的二人极小极大值博弈(two-player minimax game)

2. 传统有监督训练方法:

        直接输入是条件信息如文字描述,输出为一张图片,然后标签也是图片,两个做损失,更新模型参数;

        问题: 用这种方法存在的问题就是标签图片是不只有一个的,比如输入文字为"train",但是对应train的图片有很多种,有正向的,侧面的,但如果用多种标签去做更新的话,那么模型参数需要拟合这么多种图片,那么最后做测试的时候,生成的图片会很模糊,可能是正向与侧向火车图片的融合,最后生成的图片什么都不像;

        

深度学习 - 生成对抗网络_第11张图片

        3. 因此,可以用GAN训练的方法解决:

                在训练生成器的时候加入一个条件约束,比如加入“train”这个描述进去,还有初始化的噪声变量分布(也就是前面GAN中输入不同向量得到不同图片输出的噪声变量分布)联合去训练生成器;

                然后生成的图片放入判别器去判别,那么此时就又有一个问题:

                如果仅仅将生成的图片输入判别器,那么判别器就只用去管生成的图片是否像真的图片就可以了,即使生成器的图片不是train标签要求的,判别器也会给其很高的分数,那么这就存在一个问题,因此要为判别器也加入一个"train"约束;

                为判别器加入约束后,也就是说输入“train”+生成的图像对应的标签应该是0,“不为train的其他约束” + 真实图像对应标签为0,“train”+真实图像标签为1,这样就有两种负例样本;

                对应训练示意图如下图:

4. 那么加入了另一种负例样本以及约束数据,模型该如何训练生成器与判别器

        首先固定生成器:

                选取m个标准数据(真实的),构成正例:\begin{Bmatrix} (c^1,x^1) &(c^2,x^2) &... &(c^m,x^m) \end{Bmatrix};

                选取噪声向量:\begin{Bmatrix} z^1 &z^2 &... &z^m \end{Bmatrix};

                用噪声向量生成生成数据(假的图片):\widetilde{x}^i = G(c^i,z^i)

                准备另外m个真实数据,但其约束数据与真实图片不对应:(c^i,\widehat{x}^i)

                放入判别器训练:

                        最大化判别函数:V = \frac{1}{m}\sum_{i =1}^{m}logD(c^i,x^i) + \frac{1}{m}\sum_{i =1}^{m}log(1-D(c^i,\widetilde{x}^i)) + \frac{1}{m}\sum_{i=1}^{m}log(1-D(c^i,\widehat{x}^i))

                        相较于前面最原始的GAN,判别函数多了另一种负样例去训练;

                        更新判别器内参数:\theta _d = \theta _d + \eta \bigtriangledown V(\theta _d)

        再固定判别器:

                选取噪声向量:\begin{Bmatrix} z^1 &z^2 &... &z^m \end{Bmatrix};

                选取其对应的标签:\begin{Bmatrix} c^1 & c^2 & ... & c^m \end{Bmatrix};

                最小化下面函数:

                        V = \frac{1}{m}\sum_{i=1}^{m}log(1-D(G(c^i,z^i)))

                        更新参数:\theta _g = \theta _g - \lambda \bigtriangledown V(\theta _g)

深度学习 - 生成对抗网络_第12张图片

 关于判别器的构造有多种方法:

        比如下面两种: 一种是随机噪声向量x输入网络得到一个对应表示,约束条件输入网络得到另一个表示,这两种表示联合输入判别器,得到一个对应标量分数,这个分数是来判断生成的图片是否为真以及约束条件与生成图像是否匹配; -- 这样模型可能会感觉很困惑

        另一种是将生成的图像输入一个网络得到一个分数,这个分数是判断生成的图片是否为真;生成图片联合约束条件共同输入一个网络这个网络来判断约束条件与生成图片是否吻合,这是又得到一个分数;-- 实际上这个可能更符合常人思考方式

深度学习 - 生成对抗网络_第13张图片

4 InfoGAN

1. 解决的问题:

        输入随机向量,GAN生成模型缺乏解释性;

        例如:修改输入向量某个维度生成图像变化可能没有规律,可能是随机的;如下图改变输入向量想要的维度,下图变化不明显,不知道这个维度代表何种特征

深度学习 - 生成对抗网络_第14张图片

        InfoGAN:希望能够让输入向量的不同维度代表不同的特征,具有可解释性

2. InfoGAN基本原理

        利用z寻找一个可解释的表达,将z进行拆解; -- z = c + z' (c中是可解释的向量)

                不可压缩的噪声z’;

                可解释的隐变量c, 称为latent code;

        通过约束c与生成数据的关系,使得c里面可以包含某些语义特征;

                比如MNIST实验的c就可以由一个取值范围为0-9的离散随机变量(用于表示数字)和两个连续的随机变量(分别用于表示倾斜度和粗细度)构成;
       

         下图为InfoGAN的网络结构:

深度学习 - 生成对抗网络_第15张图片

                 将随机生成的向量z划分为两部分输入生成器,生成相应的图片;

                 这个图片再输入分类器,用分类器预测产生c;

                 其实生成器与分类器构成类似于编码器与解码器的结构,不过其输入输出与encoder - decoder正好相反, encoder-decoder输入是图片,通过encoder得到相应的编码,再通过decoder得到图片,而这里是通过生成器得到图片,通过分类器得到编码;

                那么这个分类器在这里的作用是什么呢?

                        分类器主要就是在图片中找规律,然后从图片中解码出对应的c向量;

                那么只要分类器,不要判别器行不行?

                        不行,因为如果仅仅只要分类器的话,只需要这个生成器把c学习得了,生成的图片就是c的分布,分类器直接把c拿出来输出就可,那么中间生成的图片可能什么都不是;

                        但是有了判别器,生成器就要兼顾判别器,生成真实的图片,又要兼顾判别器,让生成的图片有规律可循,能够从中找出c的分布;

3. 效果展示:

        从左到右变化c1, c2, c3 : c1控制数字类型, c2控制向右倾斜, c3控制字体粗细

深度学习 - 生成对抗网络_第16张图片

         可以看到c是真的学习到东西了的;

5 Improved Techniques for Training GANs

1. 提出了一些训练技巧,提高网络的收敛

        Feature matching:是指把D 学到特征f(x)也“传”给G,让G 不仅能知道D 的输出,还能知道D 是基于什么输出的;

                生成器把判别器的中间层输出作为目标,尽量使生成样本的中间输出和真实样本的中间输出相似;

                ||E_{x\sim p_{data}}f(x) - E_{z\sim p_z(z)}(f(G(z)))||_2^2   函数f表示D网络最后输出层的前一层特征图。f(x)由真实数据抽取而来,f(G(z))为G网络生成的图片抽取而来

                Minibatch discrimination:D 在判断当前传给它的样本是真是假的同时,不要只关注当前的,也要关注其他的样本;

                        (GAN训练过程中经常会出现G网络生成的图片为了能够欺骗D网络,而生成仅仅能够让D网络认为是真实的图片。也就是G网络生成的图片都太相似了,没有多样性。这是因为D网络没有一个能够告诉G网络,应该生成不相似的图片。为此作者提出了一个minibatch discrimination来解决这个问题)

                        minibatch disrimination通过计算一个minibath中样本D网络中某一层特征图之间的差异信息,作为D网络中下一层的额外输出,达到每个样本之间的信息交互目的

                Historical averaging (正则项):参数和他过去的时刻有关:||\theta - \frac{1}{t}\sum_{i =1}^{t}\theta [i]||^2

                半监督学习:增加了一个类别K+1表示GAN生成的图像 -- 在D网络中加入一个图片类别预测(比如imageNet的1000个类别)

2. 实验结果

        Minibatch discrimination可以提高主观质量:

深度学习 - 生成对抗网络_第17张图片

 动物皮毛比较相似,但是结构还存在欠缺

 6 DCGAN -- Deep convolutional generative adversarial networks

1. 将卷积网络和GAN结合的经典论文;

        考虑GAN训练起来非常不稳定,经常会使得生成器产生没有意义的输出,DCGAN为CNN的网络拓扑结构设置了一系列的限制来使得它可以稳定的训练

2. DCGAN的生成器和鉴别器都利用CNN架构替换了原始GAN的全连接网络

        DCGAN的生成器和鉴别器都舍弃了CNN的pooling层(池化层),鉴别器保留CNN的整体架构,生成器则是将卷积层替换成了反卷积层(ConvTranspose2d)

        在鉴别器和生成器中使用了BN(Batch Normalization)层,加速模型训练,提升了训练的稳定性。但是在生成器的输出层和鉴别器的输入层不使用BN层【直接应用batchnorm到所有层会导致样本振荡和模型不稳定】

        生成器网络中使用ReLU作为激活函数,最后一层使用Tanh()【使用有界激活(a bounded activation)可以让模型更快地学习,以饱和和覆盖训练分布的颜色空间】

        鉴别器网络中使用LeakyReLU作为激活函数;

        对于更深的架构移除全连接隐藏层

生成器网络结构图:

深度学习 - 生成对抗网络_第18张图片

 判别器网络结构图:

深度学习 - 生成对抗网络_第19张图片

 7 GAN应用

1. 图像转换 -- 风格转换

        Image-to-Image Demo - Affine Layer

深度学习 - 生成对抗网络_第20张图片

深度学习 - 生成对抗网络_第21张图片

 2. 图像迁移

        CycleGAN Project Page

 3. 图像生成

深度学习 - 生成对抗网络_第22张图片

https://arxiv.org/abs/1704.04086https://arxiv.org/abs/1704.04086

4. 图像预测

https://arxiv.org/abs/1702.01983https://arxiv.org/abs/1702.019835. 图像修复

https://arxiv.org/abs/1604.07379https://arxiv.org/abs/1604.07379

 参考: 国科大-深度学习课件

深度学习之GAN图像生成:DCGAN原理(第1节)_哔哩哔哩_bilibili

李宏毅对抗生成网络(GAN)国语教程(2018)_哔哩哔哩_bilibili

你可能感兴趣的:(深度学习,生成对抗网络,人工智能)