资料整理自:李宏毅2021春机器学习课程
深度学习有两种模式:
一种是判别式模型,一种是生成式模型。
前面我们接触的大多是判别式模型,简单说底层思维的本质是分类,要么是对整个图像类别的分类判断(图像分类),要么是对图像中区域的类别判断(目标检测),甚至说图像中每个元素点的类别判断(语义分割)。这些都是判别式模型。
另外一种是生成式模型,使人们对计算机创造力(创作力)的需求。我们在生成式模型中的需求是希望生成与我们期望数据(或已有数据集)非常相关或者非常近似的数据。
如下图:我们希望和也就是说生成数据和已有数据的分布尽量相似。那么我们如何描述这种数据分布尽量相似或者说如何衡量这种相似度呢?我们评价两个数据分布的相似性可以通过散度(Divergence,可用于表征空间各点矢量场发散的强弱程度)。但是如何计算divergence是一个难点。如何评价我们生成的图像与已有数据集的相似度是个难点。
而GAN的创新点就在于:
你只要可以从两个分布(和,生成分布和已有数据分布)中可以采样Sampling出来,那么就有办法计算Divergence。
那么到底怎么实现的呢?怎么work的呢?Discriminator。
判别器,也就是说在生成式模型中引入了一个判别式模型的判别器Discriminator,让判别器的输出概率值作为评估生成图像与原始图像的相似性的指标,以此来衡量生成图像与原始图像的相似度。
神经网络的本质就是一个特征提取器。
通过判别器Discriminator这个神经网络来将评估散度相似性(特征提取,散度就是一个特征。)的过程来替代掉。把评估特征(不便计算,或不便描述的事情)非常抽象的活动,用模糊的形式(神经网络)来替换掉。
这个判别器如何工作的呢?
判别器主要判断通过采样Sampling而来的数据到底属于生成数据还是原始数据。这是一个二分类(Binary Classification)问题。
二分类问题常用的目标函数还是二元交叉熵(Cross Entropy)损失函数。如上,只是由min加负号后变成max。
看图中红色框。V(D,G)这个数跟JS散度Divergence相关。一开始可能是从二元交叉熵,但是经过推到发现,与JS散度非常相似。
我们只要修改了Object Function就可以得到各种各样的Divergence。这个证明在F GAN这篇文章中有详细的证明。
GAN is difficult to train。GAN是以不好Train闻名的。
GAN训练的小技巧:Tips for GAN——WGAN
引言:先看看JS Divergence的问题。
问题:和有一个问题:他们真正重合overlapped的部分非常少。
理由1:The nature of data:
和都是非常高维的,图片只是他们的低维度(二维)的一个展示或者说复制manifold。 和 可以看做两条低维空间中的两条曲线,两条曲线的相交的部分,其实是非常少的。
理由2:Sampling
我们对和分布的理解其实来源于Sampling。可能实际上 和 数据分布重合的部分非常大,但是由于我们是采样的,如果我们sampling的点不够多,不够密,通过采样观察到的重合部分是实际重合部分的一小部分。每次采样,只能观察到一部分重合。
具体JS Divergence的问题:
对JS Divergence有个特性,如果两个分布没有重叠的部分,那么这两个分布的JSDivergence算出来是log2。
如上图,第一组数据分布两者相距较远,第二组更近一些,最后一组重叠。
问题就在于此。第二组以后明显要比第一组分布更接近,效果更好,但是JS散度确仍是log2。
所以说对JS散度来说,如果没有重叠部分,距离更近反而无法精确衡量。
也就是说我们无法通过Loss Function来衡量我们train的过程,效果到底有没有变好,只能通过观察生成的图像来决定是否效果更好。
所以GAN的训练过程非常pain。
为了解决这个问题:有人提出了不再使用JS散度类似的object function。改为使用Wasserstein distance。
WGAN
Wasserstein Distance
想象你在开一台推土机。 P想象成一堆土,Q是你要堆放的目的地。把土堆P移动到Q所需要移动的平均距离就是Wasserstein Distance。也称为推土机距离。
但是对于更复杂的数据分布Distribution,要计算推土机距离就有些困难了。如下,把P变成Q的方法,非常多。
用不同的moving plan,计算出来的推土机距离就不同。这样肯定不行,为了使用推土机距离来衡量数据分布的不同。规定:穷举所有的路径,使用最省力的moving plan,产生的距离最短的值为WD。
为何D必须足够光滑?
查看目标公式,我们希望项越大越好,越小越好。在和没有任何重叠的情况下,此时Discriminator会给generated无限小的值,给realData无限大的值,此时就无法完成收敛。所以必须加上对D的限制:Discriminator不可以变化太剧烈,必须平滑。这样就可以保证, 当 和 距离比较远时,变化差值就比较大;和 在足够接近时,变化不会太剧烈,而且两者分布足够近似时可以完成收敛。
如何实现这个限制呢?
- original WGAN最早的做法是对参数更新的限制,超过阈值则赋值阈值。
- 后来改进的办法是Improved WGAN中的Gradient Penalty。不要较真这个,因为后面还有很多方法来实现这个方法,如果想了解需要看论文。后面甚至还有Improved Improved WGAN。两次升级还是对限制的实现。
- Spectral Normalization:keep gradient norm:目前来看SNGAN是效果最好的。
尽管有以上方法:但是GAN仍然还是很难train。
GAN很难被train起来,有一个本质上很难的地方:
Generator和Discriminator训练中是互动的,彼此砥砺。
用GAN生成文字是最难的。
其中Decoder生成文字扮演Generator的角色。Decoder有一点改变的时候,Discriminator并没有改变。因为输出始终是max。如此难以训练,往往人们会把它当做一个RL增强学习来训练。
除此以外,还有以下方法:
- 采用Pre-Trained方法:用fine-tuned方法。
- ScratchGAN的方法:Google暴调超参数来tuning以及一大堆的tips。
GAN的衡量Evalution of Generation
- Generator如果抓住了Discriminator的盲点,就会对着这个盲点使劲的打。会出现Mode collapse。每一次都都成功欺骗了判别器。
- Mode Dropping:生成的图像只有真实图像的一部分类别。有些根本没有产生。因为有些类别在产生时效果很差,无法欺骗判别器,或者是生成器根本没有学到。不容易被侦测出来。
- 如何衡量多样性有没有够?所有类别是否都产生了?针对每一次的Generator产生的图像,我们在Image Discriminator 中记录统计所有类别。如果类别分布均匀,那么多样性效果好,否则我们认为生成器效果不均衡,多样性不够。
Frechet Inception Distance(FID)
将我们产生的图像输入到inception network分类器中,我们将softmax之前的hiden layer输出的高维向量取出。比如:虽然可能不通的图像在softmax层输出的都是人脸结果,但是在在softmax之前的向量差别很大。我们不取最后的类别,只取Inception network中一层的输出向量来代表一张图像。
如上图:从softmax之前的hiden layer中取出中间向量,假设取出的向量映射到二维平面中,形成下面的点。红色是真实图像,蓝色是生成图像。再假设两组资料满足高斯分布,FID就是计算两个高斯分布之间的距离。这个距离越小,生成效果越好。
有两个问题需要注意:
1、我们假设的是高斯分布。
2、如果要准确的得到network的分布,那么需要大量的samples。需要大量的运算量。
所以我们在衡量GAN的生成效果时,不会仅仅看FID。还需要结合实际效果去查看。
Conditional Generation
之前我们全是Unconditional GAN,把随机向量Z输入到生成器中,现在我们希望可以控制Generator的输出。
控制Generator的输出就是后续所有网络的目的。
对Generator,我们除了输入随机向量z之外,还输入x,让它根据x跟z来产生y。
这样可以用来做什么呢?比如:
- 文字对图像的生成。Text-to-image
- 声音对图像的生成。Sound-to-image
- 图像对图像的生成。Image-t0-image;Image translation,or pix2pix
- 图像对文字的生成。
- 文字对文字的生成:Text-to-text
如何让文字作为x输入给Generator呢?以前会用RNN把它读进去,然后得到一个向量,再丢给Generator;还可以通过Transformer的Encoder将向量通道平均起来再输入到Generator。
如何实现这个text-to-image的GAN过程呢?
Generator有两个输入,一个是Normal Distribution中sample取样出来的随机向量z,另一个x,也就是一段文字,比如red eyes。
Generator输出产生一张图片y=G(c,z),c=x。
Discriminator如何?
原来GAN的做法是对Discriminator输入一张图像y,然后输出一个scalar:is real image or not的衡量概率值:表示输出的图像有多像真实的图像。但是这么做的话,有一个问题:Generator学习的是如何生成一张图片来欺骗判别器,完全与我们的输入的条件x=c无关。它只要生成一张清晰的图像骗过Discriminator就可以了,不会理睬条件如何。
为何出现这种现象,原因就在于Discriminator又不知道条件c是什么。
所以我们对Discrimator的输入,不能仅仅输入y,还需要输入x,也就是c。输出:不仅要图像质量好,还需要满足c的限制,才可以得到较高的分数。称之为matched。
所以对于x和y必须是成对的,所以我们需要成对的标注数据。
但是仅仅告诉Discriminator这些还是不够的,还要加上,已经产生好的图像,然后文字叙述对不上的图像:把训练图像拿出来,然后把文字和图像故意混搭,设置一些错误。
如何实现Pix2pix,image-to-image?
与上面个text-to-image类似,只不过是将上面的text取代掉换成image而已。
此时可以采用Supervised有监督的方法。但是实验中,没有取得非常好的效果。非常模糊:因为同样的输入可能对应到不一样的输出,Generator会把这些不容的输出做平均,结果就会成为一个模糊的结果。
此时需要引入Discrimator,输入生成的图像以及条件图像。
但是GAN产生的图像过度丰富,所以往往需要GAN+Supervised。
Sound-to-image
其他应用:会说的图像。
Learning from unpaired Data——CycleGAN
之前介绍的DeepNetwork,输入和输出往往是一一对应的。Paired。
但是如果是不成对的怎么处理:有一种叫做Semi-supervised Learning。半监督。
有哪些unpaired的例子:图像风格转换:把真人头像生成动漫图像。
如果按照上面GAN的做法:输入-生成-判别。那么对于Generator的输出我们还是缺乏控制。Generator还是只要生成一个骗过Discriminator的清晰图像就可以了。下图中,生成图可以满足Discriminator的判定,但是不满足我们的期望。我们希望输入男,输出也为男。如何解决呢?CycleGAN。
在CycleGAN中我们会训练两个Generator:
- 第一个Generator是把Xdomain的图生成到Ydomain的图;
- 第二个Generator是把Ydomain的图还原成Xdomain的图。
在训练时,我们多了一个额外的目标:经过输入和输出之后的两张生成图越接近越好。叫做:Cycle consistency。
此时多了这个额外的限制之后,第一个Generator就不可以再随便生成一个图像来进入到判别器中,还需要可以恢复还原回去才可以。这样就限制了Generator必须对输入进行充分学习。
除此以外Cycle还可以是双向的。上面是从人头像到动漫,反向就是从动漫到人头像。
其他做风格转换的GAN:
Disco GAN,Dual GAN, CycleGAN
更进阶的版本:StarGAN。CycleGAN只能在两种风格之间做转换。StarGAN的厉害之处在于可以在多种风格之间转换。
CycleGAN还可以做:
Text Style Transfer
同样需要两个Generator。将原来的句子转换回去。
将输出直接给Discriminator会有问题,所以需要用RL硬做。
- 还可以把长的文章变成简短的摘要。简介写作。
- 还可以做翻译工作。
- 语音辨识