内容衔接上一讲,上节我们讲到VAE,我们为什么用VAE而不用auto-encoder呢,直觉上的原因是如果是auto-encoder,我们期待的是输入满月解码后还是满月,输入半月输出还是半月,但是我们能保证中间状态时候我们的输出是3/4月吗,结果往往不是;如果是VAE,我们就会引入一定的噪声,使得一定范围内输出都是满月,一定范围内输出都是半月,中间的公共部分由于我们要Minimize2者的误差,所以得出的结果是介于二者之间效果比较好的。
我们再看VAE模型,我们将encoder输出向量,其可能是正负,我们为了使其具有描述方差(噪声)的效果,我们要求方差是正,所以引入exp,e1,e2,e3就是正态分布的一组向量,因为参数不同,不同维度就有了不同的方差,我们就有可能实现训练模型,得到有一定噪声允许的code.可是我们仅仅把重构误差最小化就行吗,可能不太行,因为机器学习过程中可能说,我们把学成0,那就和auto-encoder一样了,我们于是就加了下图右下角的限制,要求其最小化
继续分析,我们讲下图右下式前两项蓝,红项分别画关于的曲线,得到红蓝2条曲线,相减得到绿色曲线,我们知道曲线最低点是=0,但是此时方差就趋近于1,所以模型会考虑方差不能太小,最后式子最后的平方项就相当于是均值的L2正则,可以使其系数变小,允许更大的变化
我们之前是直觉想象,回到我们想要VAE做的事情,比如宝可梦分布就是高维空间上的分布,每个宝可梦就是一个点,我们就是想预估宝可梦的概率分布模型,比如长得像我们见过的宝可梦位置概率就高,不像的地方概率就低,这样我们在概率高的地方分布出来,就很容易得到宝可梦
上面的概率分布我们就想到了GaussianMixture Model高斯混合模型,这个模型是一堆权重不一样,均值,方差不一样的高斯正态分布,假设我们有m个这样的分布,那我们分布出x的概率就是每个高斯分布的权重P(m)和这个正态分布分布出x的概率的成绩的求和,所以你用混合模型标达出来的模型分布x比聚类的效果要好,所以VAE就是高斯混合模型的概率分布版本
我们假设z是正态分布,我们就可以加上给定z,x是复合均值,方差都和z有关的正太分布,在z分布曲线上取一些点,就能对应到P(x)上的一个正态分布,我们的分布模型会比较复杂,但是神经网络会让我们学到关于z的均值和方差函数,从而得到P(x).当然正态分布z是我们假设的,我们假设他们之间相互独立,你也可以假设其他模型,那样的话P(x)可能就比较复杂
我们P(z)是正态分布,想要估计关于z的均值方差,我们需要优化的是使观测对象x的可能性得到最大,这种由z得到的模型其实就是VAE的Decoder,同理我们有x,然后得到z的方差和均值的模型就是VAE的encoder
我们要求近似度最大,我们将式子进行整理可以得到2项之和,下图标红的部分其实就是q分布和P分布的相似度衡量,完全相同为0,不同>0,所以这个函数就有了下界(q分布可以是任何分布,你可以理解从路边捡来的分布= =)
我们再研究上式的下限Lb,就变成了我们要找到P(x|z),q(z|x)的分布使得Lb最大,当P(x|z)给定后,logP(x)就一定了,所以我们就是希望Lb越大,大到上限,KL为0,就是可能性最大,我们训练得另一个产物就是q(z|x)和p(z|x)的分布一样
我们分析Lb左侧变形,其相当于q分布z|x和P分布z的相似度,我开门的encoder就是输入一个x,实现一个q分布的z
我们要求最小化左式和最大化右式,这个过程实际就是一个auto-encoder的过程,我们根据x输入实现分布出来一个z,在根据解码的输出实现x分布的均值,方差,我们想让的是均值要和x接近
我们还有一种是Conditional VAE,他是实现什么效果呢,我们可以用code学到一种特征比如笔画粗细或者风格,然后我们给的数字code就可以实现对应模式的各种数字输出
想了解的话,去看PAPER = =
VAE可能导致的问题,VAE并没有真正意义上的去学习图片,比如图中的7都是差了1个像素,但是效果就是不一样,但对于VAE都是一样的好坏,VAE学到的往往就是已有图库的线性组合
GAN- Generative Adversarial Network对抗神经网络
先举个简单的例子,我们的蝴蝶开始会被波波吃掉,波波认为蝴蝶不是棕色,于是蝴蝶进化为棕色,但是波波又进化成比雕,认为蝴蝶没有叶脉,于是蝴蝶进化成枯叶蝶……
比如我们开始训练了神经网络NN v1版本,然后就有评判器Discriminator v1版本,评判器判别出v1不行,NN就升级到第二个版本,效果能满足Discriminator v1版本,于是评判器也进化生成V2版本,如此继续,这个过程中,NN是完全没有看过真实的图片的数据的,只有评判器看过,NN做的只是在满足上个版本的评判器
我们的评判器其实就是一个神经网络,我们把图片输入,实现输出0,1判断是否真假,而NN其实就是VAE的decoder,我们分布出许多的图片,其标识为0,而真实的图片标识为1
对于初始的NN,我们给一个图片,我们通过评判器的输出可能是0.87,我们想让输出结果是1,就需要调整NN的参数,方法就是梯度下降,但是这个过程中,Discriminator的参数必须是固定住的,
我们NN网络就是decoder根据z分布出x,然后将x与真实图片比较送进评判器,输出0,1,这个过程中,z,x都有分布,真是点是黑色,x分布是绿色曲线,评判器输出是浅蓝色,我们开始可能x分布靠右,下次学得就会使x左移,使输出更好,直至所有x都能骗过评判器。当然这个discriminator自身是否是好坏呢,常常需要人来识别(盯在电脑前- -),比如图片变好了,参数还OK,变差了不OK
openai做的一个效果,在CIFAR-10上做GAN,左侧原图,右侧为结果,有21%的概率能骗过人
有人做的研究,逐渐改变code,就会有如下效果(卧室)
有人做动漫人物生成
总体上说GAN的discriminator还是很难训练得,因为我们要评判其是和NN一同进化的,有时候可能你的NN很弱,只不过恰好生成几张还不错的图片,就可能使评判器fail掉