上上个星期连续干了一周的深度学习视频,狂写手写笔记,居然每个观看量也才100+,好吧好吧,我承认,这段时间确实没有好好学习,CSDN都看出来了(汗颜)
时隔一个星期(摆大烂一周后),今天终于瞅到了GAN,那就开干吧!
老规矩了,先把GitHub上面之前的pdf发出来:https://github.com/Bessie-Lee/Deep-Learning-Recodes-LiHongyi
注:本文中的全部图片来源于李宏毅老师2021/2022年春的讲课视频,有些言语也是李宏毅老师的官方原话(我只是李宏毅老师文字理解搬运工[还是没有被正主认可的袴])
今天不一样的是,全手工敲入内容,不想写字了,极其麻烦
在李宏毅老师的视频中,并没有一开始就讲解什么是GAN,他先引入一个问题,为什么会有生成式对抗网络呢?
他采用了一个小游戏进行介绍。
游戏说明:一个小精灵可以从一个出发点出发到任意画面的位置去,我们根据小精灵的到达位置去训练一个network模型,从而预测到小精灵的位置。
然而,出现了一个很离谱的画面:
小精灵在转弯的时候居然分裂成了两个,还带上了虚影(??这是什么离谱位置,转弯不成,直接分裂人物??)
为什么会有这种分裂的问题出现呢?
因为在预测的时候,有可能出现向左向右的概率是0.5和0.5,导致预测也不知道应该是左边还是右边,然后它干脆就直接分裂了(确实蛮"拟人化"的hhha)
- 出现概率相同的原因是:训练集中有可能给的数据就是在这个拐角,存在向左向右的选择,而模型训练的时候正好也训练到了,故而出现这种原因
于是乎,就有人提出在输入的时候加上一些东西,让模型不是单一的输出,而是输出一个概率的分布,如图1所示。
好的,现在已经有一个小例子去表示生成对抗网络大概是什么,那具体我们在什么时候需要用到呢?如图2所示
无条件生成[见图3]
什么是无条件生成?
原本输入的应该是X+Z经过一个Generator得到最后的概率分布Y,但是在无条件生成里面删去了X,只保留Z的输入
在本文的例子中,Z是一个Normal Distribution(正态分布),当然可以使用其他的分布,如均匀分布,伽马分布等,在后文中,我们都将采用正态分布进行例子介绍。
图片是如何根据向量进行输出呢?
输入的是一个低纬度的向量(维度可自己控制),Generator的目的是将低纬度的向量转换成高纬度的向量,从而达到输出彩色图片的要求(彩色图片是RGB格式,有三层)
对于GAN而言,比前面讲的无条件生成多一个Discriminator部分,这个部分是将一个图片通过Discriminator后生成一个数值(数值越大结果越好)
Discriminator是一个function(函数),一般这个function可以依据所需进行选取,比如如果是做图像的可以采用CNN(如图4所示),如果是做文字的可以采用transformer。
GAN的通俗理解:
可以将Generator理解为小偷,Discriminator理解为警察,小偷不断的偷东西,警察不断的抓小偷,小偷为了躲避警察的追捕会进行战术更新,警察为了抓住小偷也进行战术改进
但是其实Generator与Discriminator是亦师亦友的关系,互相进步。
对图5进行解释:
第一代Generator绘制的图片,通过第一代Discriminator进行真实图片对比,假设对比用的是有没有眼球,效果并不好;
随后第二代Generator进行改进,输出的图片都有眼球,此时骗过了第一代Discriminator,但是效果还是不行,第一代Discriminator发现大事不妙,被骗了?!于是第二代Discriminator在原来的基础上对鼻子、嘴巴进行进一步对比;
第二代Generator无法骗过第二代Discriminator,于是变更新为第三代Generator(重点对鼻子、嘴巴部分)骗过第二代Discriminator,第二代Discriminator不甘心又进行更新,变成第三代Discriminator(对头发进行对比),成功抓住第二代Generator把柄
就这样一次一次的循环重复操作,直到最后这个第n代的Generator效果极其的好,可以骗过目前全部的Discriminator为止(这可是一个无尽的坑hhhha)
具体的GAN步骤:
GAN的真实例子:
有些生成的比较奇奇怪怪hhhhhha~