【生成式对抗网络GAN(上):基本概念介绍】李宏毅2021/2022春机器学习课程笔记EP16(P58)
从今天开始我将学习李宏毅教授的机器学习视频,下面是课程的连接(强推)李宏毅2021/2022春机器学习课程_哔哩哔哩_bilibili。一共有155个视频,争取都学习完成吧。
那么首先这门课程需要有一定的代码基础,简单学习一下Python的基本用法,还有里面的NumPy库等等的基本知识。再就是数学方面的基础啦,微积分、线性代数和概率论的基础都是听懂这门课必须的。
本次是对生成式对抗网络GAN的基本概念简介。
前面我们讲了如何把一个向量或者多个向量作为输入放到神经网络里面,还讲了输出是一个值或者一个类的问题。现在我们考虑将神经网络当作一个生成器。
下面这些图就是用GAN生成的:
把神经网络当作一个生成器的大致理念就是,把一个简单的Distribution通过神经网络变成一个复杂的Distribution。然后这个Distribution是一个我们知道的formulation,我们可以从这个Distribution里面采样(sample)出一些向量作为神经网络中输入的一部分。
我们神经网络的输入主要是有本身的输入x和distribution里面simple出来的向量组成。然后这个distribution的形状是我们自己来决定的,不过这个distribution最好要够简单。
这个Distribution有什么作用呢?为什么把神经网络作为生成器必须要有Distribution呢?
我们来看一个例子,我们让AI来自己玩吃豆人这个游戏,我们的想法是这个神经网络的输入是游戏里面前几帧的画面,然后输出的是下一帧的画面。
但是这样就会出现一个问题,就是有的时候可能下一帧向左走是可以的,向右走也是可以的,但是按照我们之前的做法,神经网络的输出结果就会是向左向右走,这样的后果可能就是会出现下一帧分裂的残影。所以我们想让神经网络输出一个概率分布,而不是一个单一的结果。
Distribution就可以达到让神经网络输出一个概率分布,而不是单一的结果的效果。
所以也可以说,Distribution适合用在一些需要创造力的场景中,也就是没有一个标准答案的场景中。
下面我们先来说一些Unconditional generation的情况,就是先把输入的x拿掉,只把Distribution里面simple出来的向量作为输入。然后Distribution也有很多种,比如正态分布(Normal Distribution),但是其实不同的Distribution的差异其实没有那么大,我们想的是可以让generation自己去选择Distribution。
接着再来介绍另外一个神经网络:Discriminator。它的作用是看生成器(generator)生成的图像是否符合要求,它输出一个Scalar值,这个值越大,代表输入的图像越符合要求。
你可以把generator想象成做假钞的人,然后discriminator看作是抓制作假钞的警察,他们互相“对抗”,但是又互相成长的这样子感觉。警察越抓品控不严的做假钞的人,做假钞的人就越是会迭代产品,把假钞越做越真这样。
没错,GAN就是两个神经网络generator和discriminator不断“对抗”然后不断进化的思想。
主要的做法就是这个样子:
1.generator先随机生成一些比较差的图像。
2.然后用discriminator去对比generator生成的图像与真正要求的图像之间的差别。
3.接着generator根据discriminator输出的结果去“进化“下一代的generator以更加接近要求的真实图像。
4.再来就是discriminator根据generator的输出”进化“下一代更加能判断生成图像与要求图像差别效果的神经网络。
5.最后就是如此往复,直到generator可以生成出我们理想中的图像。
最后我们来讲一下GAN实际上的训练步骤。
一开始我们先随机生成一个generator。
首先我们需要做的就是先固定住generator不变,然后更新discriminator。
第二步,我们再固定住discriminator,然后更新generator。generator要做的就是要”欺骗“discriminator,我们可以把discriminator输出的Scalar看作成-loss,这样就和我们之前训练神经网络的思路一样,不断更新generator,让其输出的图像通过discriminator的分数越大越好。
最后就是重复以上的步骤直至generator能输出我们理想中的图像。(这里要重复的次数可能要到达上万次这样子效果可能才会好。)
以上就是GAN的基本概念。