这里就是我们的生成模型了。如图所示,它把噪声数据 z(也就是我们说的假数据)通过生成模型 G,伪装成了真实数据 x。(当然,因为 GAN 依旧是一个神经网络,你的生成模型需要是可微的(differentiable))
训练的过程也非常直观,你可以选择任何类 SGD 的方法(因为 A 和 B 两个竞争者都是可微的网络)。并且你要同时训练两组数据:一组真实的训练数据和一组由骗子 A 生成的数据。当然,你也可以一组训练每跑一次时,另一组则跑 K 次,这样可以防止其中一个跟不上节奏。
同样,既然要用类 SGD 优化,我们就需要一个目标函数(objective function)来判断和监视学习的成果。在这里,J(D) 代表判别网络(也就是警察 B)的目标函数——一个交叉熵(cross entropy)函数。其中左边部分表示 D 判断出 x 是真 x 的情况,右边部分则表示 D 判别出的由生成网络 G(也就是骗子)把噪音数据 z 给伪造出来的情况。 这样,同理,J(G) 就是代表生成网络的目标函数,它的目的是跟 D 反着干,所以前面加了个负号(类似于一个 Jensen-Shannon(JS)距离的表达式)。 这其实就是我们熟悉的最小最大博弈(minimax game):两个人的零和博弈,一个想最大,另一个想最小。那么,我们要找的均衡点(也就是纳什均衡)就是 J(D) 的鞍点(saddle point)。 对这个过程的更直观解释是这样的:
如图所示,我们手上有真实数据(黑色点,data)和模型生成的伪数据(绿色线,model distribution,是由我们的 z 映射过去的)(画成波峰的形式是因为它们都代表着各自的分布,其中纵轴是分布,横轴是我们的 x)。而我们要学习的 D 就是那条蓝色的点线,这条线的目的是把融在一起的 data 和 model 分布给区分开。写成公式就是 data 和 model 分布相加做分母,分子则是真实的 data 分布。 我们最终要达到的效果是:D 无限接近于常数 1/2。换句话说就是要 Pmodel 和 Pdata 无限相似。这个时候,我们的 D 分布再也没法分辨出真伪数据的区别了。这时候,我们就可以说我们训练出了一个炉火纯青的造假者(生成模型)。 于是,最终我们得到的应该是如下图的结果:
蓝色断点线是一条常数线(1/2),atv,黑色与绿色完美重合了。 但是,这也是有问题的:我们的生成模型跟源数据拟合之后就没法再继续学习了(因为常数线 y = 1/2 求导永远为 0)。
为了解决这个问题,除了把两者对抗做成最小最大博弈,还可以把它写成非饱和(Non-Saturating)博弈:
也就是说用 G 自己的伪装成功率来表示自己的目标函数(不再是直接拿 J(D) 的负数)。这样的话,我们的均衡就不再是由损失(loss)决定的了。J(D) 跟 J(G) 没有简单粗暴的相互绑定,就算在 D 完美了以后,G 还可以继续被优化。 在应用上,这套 GAN 理论最火的构架是 DCGAN(深度卷积生成对抗网络/Deep Convolutional Generative Adversarial Network)。熟悉卷积神经网络(CNN)的同学对此应该不会陌生,这其实就是一个反向的 CNN。
卷积神经网络的原理是用一个叫做 convolutinoal filter(卷积过滤器,类似于滤镜)的东西把图片过滤(转化)成各种样式(就好像美图软件里面的滤镜效果)。很多这样的滤镜就可以把图片变成很多种样式。我们假设这些样式是原图片各种不同的特征表达(比如,黑白滤镜可以把图片变黑白,让你可以看出更多彩色世界里关注不到的重点;边缘虚化滤镜是把图片虚化,你也许又能看到不同的端倪。一层层这样跑下去,你就会得到原图片的各种非常详尽的特征表达。注意:这个滤镜也不是人选的,而是被慢慢学习到的,不用你操心)。
相反,DCGAN目的是创造图片,其实就类似于把一组特征值慢慢恢复成一张图片。 (责任编辑:本港台直播) |