当前位置:   article > 正文

李宏毅:GAN——基本思想和算法流程_gan算法

gan算法

Generative Adversarial Network

1. GAN的作用

输入一个vector 可以生成你想要的,输入的一个vector变成了一张张照片在这里插入图片描述
当然vector也会影响输出,从而输出不一样的人物

如果第一个数代表头发的长度,倒数第二个个数代表头发蓝色的程度,最后一个代表是否张开嘴,那么数值变换就会有如下的变换
在这里插入图片描述

2. GAN的基本idea

GAN的神奇之处,不止训练上述的生成器(generator),还训练了一个分辨器(discriminator),它的输入是你想要生成的东西,输出是一个数值,数值越大输入图片就越真实
在这里插入图片描述
一开始generator网络参数是随机的,它也不知道怎么产生二次元的头像,所以往往生成噪声图片,然后就把生成结果交给discriminator判断是真实的图片还是由discriminator生成的图片
接下来generator会想办法骗过第一代的discriminator,第一代的discriminator能分辨第一代的generator(比如真实图片颜色),所以第二代产生颜色来骗第一代discriminator,但是discriminator也会进化,通过比较二代generator生成的与真实图片的差异(比如真实图片有嘴巴)
所以最后generator和discriminator都越来越强,关系是一种对抗关系
在这里插入图片描述

3. 算法流程(固定一方训练另一方)

step1:固定generator,升级discriminator

会有两组图片,一组是database中真实图片采样出来的样本,另一组是generator生成的,接下来就要去调整discriminator参数来训练,怎么调呢?如果是真的就给高分数,如果是假的就给低分,也就是第一组真的丢进去要离1越近越好,而第二组假的离0越近越好
在这里插入图片描述

step2:固定discriminator,升级generator

现将vector丢入generator,产生一张图片,再给discriminator,之后会给出分数,我们希望输出分数越大越好
在这里插入图片描述
这个流程,虽然组成了一个连起来的大网络,但是在训练的时候要将后面的网络参数固定,只调整前面的(generator)的参数,同样我们需要分数越大越好所以使用梯度上升(这个与梯度下降只有一个正负号的区别)

正式算法

在这里插入图片描述
反复执行下面的算法

  1. database sample 出一个batch(m)的样本,
  2. 从某个分布sample出m个vector(比如正态高斯)
  3. 从而生成m个图片
  4. 升级discriminator最大化下面的函数(这是最开始的paper写的式子 ,最原始的方法),之后梯度上升(注意这里是加号)
  5. 某个分布sample出m个vector(比如正态高斯,不一定要与第2步一样)
  6. 运行式子,就像上面图片的大网络,G(x) 产生图片,D(G(x))生成图片,输出值取log,梯度上升调整参数使得式子越大越好

4. generator为什么一定要有discriminator而不是自己去学习呢?

可以自己学,用手写数字识别举例
在这里插入图片描述

传统的监督学习,就是输入vector,输出图片,在网络训练
我们将vector和图片做成一个pair也就是带有标签的database进行训练网络
在这里插入图片描述
训练完成之后,输入一个vector丢入网络中输出一个图片要和1越接近越好
在这里插入图片描述
(注:其实手写数字识别,输入图片输出类别就是上面的反流程,如下图)
在这里插入图片描述
问题是怎么产生这些vector,如果随机产生,会很难训练
采取相似图片,vector也要有相似之处,但是这样的vector怎么产生,我们可以训练一个产生vector的encoder
在这里插入图片描述
这个技术可以采用auto encoder(可以给一张图片变成code),但是encoder不能自己训练,必须需要decoder(给一个code变成一张图片)
在这里插入图片描述
训练的时候给encoder图片,encoder把图片变成code,code再给decoder,它会写回原来的图片,其实这里的dencoder就是generator的作用
在这里插入图片描述

这个decoder输入某个vector的输出是固定的了,当我们输如一系列的vector发生下面右图的神奇现象数字连续的变化,比如越往左越与圈圈有关,越右越与棍子有关,纵轴与歪的方向有关在这里插入图片描述
但是这样的方法有什么缺陷呢
因为训练数据有限,所以可能会遇到一些无法产生的理想中的图片
在这里插入图片描述
这个也可以用variational auto encoder 解决
在这里插入图片描述
这里encoder不止产生一个vector(m),它还会产生每一个维度的variance( σ \sigma σ),并从normal 分布sample出一些noise(e),e和 σ \sigma σ相乘 后与vetcor(m)相加,最后将有noise的vector丢入decoder产生原来的数字。
这样机器就不知看到某个vector产生数字,也要看到vector加一些noise也要产生数字,这样decoder更加稳定,这样以后输入训练没见过的,就不会奇怪了

那我们还有什么缺陷呢?我们输出的图片需要和某张图片越像越好,也就是计算两种图片像素的差距,也就是需要这个差距越小越好
在这里插入图片描述
但是事实上generator完全复制,但是在训练的时候会犯一些错,他会在某些地方不一样,但是选择在某些地方变就非常重要,比如下面产生了心四张图片,前两个差1个像素,后两个差6个像素在这里插入图片描述
但是第二幅图虽然只有一个像素差但是感觉比6个像素的不好,也就是单纯越像越好,可能就会犯错,并且每个组件之间是很难配合的,如果要把相联度考虑进去,可能需要更深的网络,也就是说用auto encoder 做生成比GAN做生成需要层次更深

输出是蓝色的,绿色是学习的目标,我们需要generator生成绿色,学习下去之后,我们最好也就产生蓝色的点,因为我们考虑像素的差距,我们不太容易学到几个绿色的分布之间是由间隙的

在这里插入图片描述

5. 为什么discriminator知道真实图片,为什么不自己生成呢?

它可以自己产生
generator是每一个component独立去产生的,要考虑component之间的关系是困难的,但对discriminator来说是容易的,因为输入是一张完整的图片,由discriminator评价,discriminator能够轻易告诉图片的好坏
在这里插入图片描述怎么做到的呢因为,discriminator是CNN的话,它可能有这样一个filter,一个像素店旁边上面像素都没有的,如果图片有这种就给低分,所以检查就很容易,这就是discriminator的优势
那么怎么产生呢?用下面的方法,穷举所有可能的x,丢入discriminator里面,看哪一个可以产生很高的分数,高分的就是理想的图片
在这里插入图片描述

discriminator擅长的是批评,让他想一个好的东西是很痛苦的,那我们假设他可以想出一个,那么我们怎么训练呢?
我们可以用一些好的二次元图片和不好的二次元图像,但是不好似乎没有数据,这样都用好的就会导致模型看到什么图片都是好的。
在这里插入图片描述

有什么办法找好的不好的图片呢?哈哈哈,似乎还没有很好的方法,但是,我们可以用下面的方法
在这里插入图片描述
我们有一堆好的画和一些noise坏的话,然后给这些打分真的打高分,假的打低分,之后我们使用discriminator产生一些图片,使得这些图片图片的分数足够高,之后下一次迭代,我们用上一次迭代的图片代替noise图片,之后反复循环
但是也会有问题,我们如果有些真实图片没有涉及到,那么就会使得这些没有涉及到的真实图片认为是差的(Dx是真图片的分布)最后discriminator只认为训练集上设计到高分
在这里插入图片描述

6. 比较与综合

generatordiscriminator
生成快能考虑到大局
无法考虑到component的关系,学不到全局但是去生成困难

所以argmax就用generator来代替,来解argmaxD(x)的问题
在这里插入图片描述
这样两种的优点就互补了
对于discriminator来说,使用generator产生坏的图片
对于generator来说,虽然仍然component by component的产生图片,但是通过discriminator学习全局信息

稳但不好

本文内容由网友自发贡献,转载请注明出处:https://www.wpsshop.cn/w/不正经/article/detail/318183
推荐阅读
相关标签
  

闽ICP备14008679号