一篇很好的关于生成模型的科普文
机器如果可以画出一只猫的时候,那么机器对于猫的概念就会有很大的不同。以下是三个最主要的方法。
pixelRNN
我们现在要求让机器画出一张图出来,假设现在让机器画出一个3x3的图,有9个像素点。即让机器画9个像素点就完成了任务,一个像素点就用三维的vector来表示,即rgb值。现在随机给机器一个红色的像素点,然后learn一个model,其输入是已经存在的像素点,输出是下一个像素点。(RNN是可以处理任意长度的input),pixelRNN是不需要任何标签的。
下面是slide所示的论文机器所画出的图片
waveNet:做语音合成
一些tip关于生成宝可梦:
如果你用上面所说的三维vector代表rgb做为像素点的输入,得到的图会偏灰,因为较为清晰的图片是有某个通道值较大,某个较小形成的,但是我们输入会做normalization,已经经过sigmoid function,最后值都会落在0.5左右,无法形成较大的偏差,所以我们用不同颜色作为one-hot encoding的不同维度,以此作为输入。然后会有很多相似的颜色,先做cluster,即最后有167个颜色。
像这种task是很难被评估的,因为你也不能说机器评估的不对,因为这是一种创作
VAE variation auto encoder
把decoder部分拿出来,然后随机生成一个向量,输入金decoder部分,希望输出是一张完整的image,但实际上这样生成图片效果不是很好,因此我们使用VAE,和auto-encoder很像,只不过在中间部分加了很多的trick部分。
假设code是三维的,首先encoder部分输出两个code,然后从正态分布sample出e1,e2,e3,然后经过一系列的操作得到ci,然后希望decoder最小化reconstruction error,但是该error还加上了一项
其实我们可以固定code某些维度,然后变化其中几个维度,可以知道每个维度具体代表什么。
why vae?
直觉的解释
为什么要使用VAE,下面slide左边表示是auto-encoder,假设现在code是一维的,即一个scalar,则输入一个满月,对应一个code部分,输入弦月,得到对应一个code部分,然后我们希望输入在满月和弦乐中间的code能够得到一个图像,它介于满月和弦月之间。但是network是非线性的,你无法确定中间的code输出的图片是什么。于是有了VAE,当你把满月的图变成code的时候,它会在code上面再加上noise,加上noise之后,在这个范围内code reconstruct后的图是满月,同理,在一定范围内弦月的code重建后仍旧要求是弦月,于是中间的部分重建之后即希望变成满月,又希望变成弦月,而VAE要求最小化mean square,则最后的生成图片就是满月和弦月之间。这样random sample一个code,VAE都能够得到比较好的图像。
variance决定noise的大小,如果只考虑加nosie,机器会自己决定variance是0,就等于auto-encoder.
variance是0的话,就不会有不同image overlap的情形。所以error会另外再加一项,强迫机器学习的variance不会太小。
新加的一项error,前面部分是希望variance不那么小,后面部分相当于给code加上L2 regularization
正式的解释
每个宝可梦想象成高维空间一个点,记作x,现在要做的事就是预估高维空间上的概率分布P(x),然后就可以根据该概率分布sample出一个图,那么这么这个图会比较像宝可梦的图。
然后可以利用高斯混合模型来预估P(x),很复杂的概率分布可以用一些加权的高斯分布求和得到,然后写成黄色的式子。现在我们从P(X)sample 出一个x时,我们需要决定从哪一个高斯分布sample,假设现在有一把不同的高斯分布,每个高斯分布都有自己的weight,从高斯分布的weight决定从哪一个高斯分布sample x。
上面部分简述:
1.首先从多项式分布决定从哪个m sample出一个 高斯分布
2.根据u和Σsample出一个x
假设下面的z是一维的vector
下面部分设计到很多概率论知识。待看完书后填坑
GAN
下面简单介绍一下GAN
NN generator v1生成一代图片,然后discriminator v1会根据真实图片和generator v1产生的图片去调整其自己内部的参数,去评断图片是真实的图片还是生成的图片,然后generator v1会根部discriminator v1演化成generator v2,继续迭代下去,生成器从来没有看过真正的图片,它会产生数据库里从没有见过的图片,
首先我们来看一下discriminator(天敌)是怎么训练的,输入是图片,输出是一个数值,天敌的训练目标就是把真正的图片label为1,生成的图片lable为0,就是一个二元分类的问题,
而generator训练目标是让天敌把生成的图片lable为1,即骗过天敌。而生成器加上天敌就是一个完整的网络,即生成器的训练目标就是训练这个网络,最后输出的数值越接近1越好。但是在梯度下降后向传播调整参数的时候,只能调整生成器的参数,固定住天敌的参数
来源:CSDN
作者:zhulinzhulinlin
链接:https://blog.csdn.net/zhulinzhulinlin/article/details/104056553