作者丨郑华滨
学校丨中山大学硕士生
研究方向丨GAN,文本生成,OCR
知乎专栏丨AI带路党
前段时间我受极视角邀请,在斗鱼上直播分享有关 GAN 的话题。考虑到现在网上关于 GAN 的文章、视频都已经非常多了,所以我就故意选择了一个之前没有什么人讲过的主题:LSTM 之父 Schmidhuber 与 GAN 之间的恩怨纠葛。其实这件事在英文网上传播得还挺广,而且除了八卦之外也有一些严肃的学术讨论,可惜相关的中文信息寥寥,不过这样倒正好给我一个机会来给大家介绍一些新内容。
其实相比视频直播我还是更喜欢写成文章的形式,因为后者更适合深入理解和收藏回顾。所以为了方便错过直播或者不习惯看视频的朋友,我对当晚直播内容进行了文字整理,全文分为以下四个部分:
八卦 Schmidhuber 与 GAN 之间的恩怨
讲解 Schmidhuber 在 92 年提出的 PM 模型
简单介绍 GAN、InfoGAN、对抗自编码器三个模型
对比以上四个模型之间的异同
如果选择看直播回放,请在 PaperWeekly 微信公众号后台回复“20170529”,获取视频下载链接和密码。
2016 年 12 月,NIPS 大会,Ian Goodfellow 的 GAN Tutorial 上,发生了尴尬的一幕。
正当 Goodfellow 讲到 GAN 与其他模型的比较时,台下一位神秘人物站起来打断了演讲,自顾自地说了一大通话(视频片段可见:www.bilibili.com/video/av10431990/)。
这个观众不是别人,正是大名鼎鼎的 Jürgen Schmidhuber,一位来自德国的 AI 科学家。虽然名声不如三巨头响亮,但 Schmidhuber 其实也是深度学习的先驱人物,在上个世纪就做出了许多重要贡献,其中最有名的就是他在 1997 年提出的 LSTM,而他本人也被尊称为”LSTM 之父”。
本文八卦的正是这位大佬跟 Goodfellow 在 GAN 上的争论,但其实这早就不是 Schmidhuber 第一次开炮怼人了。再往前 2015 年的时候,我们熟知的三巨头 Hinton、Lecun、Bengio 在 Nature 上发表了一篇《Deep Learning》综述之后,Schmidhuber 就站出来指责他们行文偏颇,认为他们没有重视自己做出的很多贡献,觉得自己没有得到应有的荣誉,而 Lecun 之后也发文霸气反驳,场面十分激烈。当然这不是本文的重点,感兴趣的朋友可以进一步挖掘,下面还是继续回到 NIPS 演讲现场,看看 Schmidhuber 这回究竟又是为何开炮。
只见他站起来之后,先讲自己在 1992 年提出了一个叫做 Predictability Minimization 的模型,说它如何如何,一个网络干嘛另一个网络干嘛,花了好几分钟,接着话锋一转,直问台上的 Goodfellow:“你觉得我这个 PM 模型跟你的 GAN 有没有什么相似之处啊?”
似乎只是一个很正常的问题,可是 Goodfellow 听完后反应却很激烈。Goodfellow 表示,Schmidhuber 已经不是第一次问我这个问题了,之前我和他就已经通过邮件私下交锋了几回,所以现在的情况纯粹就是要来跟我公开当面对质,顺便浪费现场几百号人听 tutorial 的时间。然后你问我 PM 模型和 GAN 模型有什么相似之处,我早就公开回应过你了,不在别的地方,就在我当年的论文中,而且后来的邮件也已经把我的意思说得很清楚了,还有什么可问的呢?
确实正如 Goodfellow 所言,早在 2014 年的第一篇 GAN 论文中,PM 已经被拿出来跟 GAN 进行了比较,举了三点不同之处。不过那只是论文的最终版本,而在一开始投递 NIPS 的初稿中并没有下面这段文字,也就是说很可能 Goodfellow 一开始是不知道有 PM 这么一个东西的。
那为什么在最终版本里又出现了 PM 的内容呢?原来,当年 Schmidhuber 就是 NIPS 的审稿人,而且刚好就审到了 Goodfellow 的论文。我们现在知道这篇论文挖了一个巨大无比的坑,引得大批人马前赴后继都来做 GAN 的研究,以后也应该是能写进教科书的经典工作。但就是这样牛逼的一篇论文,当年 Schmidhuber 居然给出了拒稿意见!所幸另外两位审稿人识货,所以论文最后还是被收了。
回到正题,当时Schmidhuber在评审意见中认为,他 92 年提出的 PM 模型才是“第一个对抗网络”,而 GAN 跟 PM 的主要差别仅仅在于方向反过来了,可以把 GAN 名字改成“inverse PM”,即反过来的 PM。按他的意思,GAN 简直就是个 PM 的变种模型罢了。
Goodfellow 当然不同意,所以就有了 14 年最终版本里的三点不同之处,具体细节放在最后模型比较的部分再讲。然而 Schmidhuber 并不接受这些说法,私下里又通过邮件跟 Goodfellow 进行了一番争论,还到 16 年的 NIPS 大会上打断演讲,公开较劲,就是想让对方承认 PM 模型的地位和贡献,可谓不依不饶。
Goodfellow 也不客气,干脆在 2016 年的 GAN Tutorial 中完全移除了对 PM 的比较和引用。他在 Quora 上公开表示,“我从没有否认 GAN 跟另外一些模型有联系,比如 NCE,但是 GAN 跟 PM 之间我真的认为没太大联系。”更有意思的是,Goodfellow 还透露说,“Jürgen 和我准备合写一篇 paper 来比较 PM 和 GAN—如果我们能够取得一致意见的话。”想必真要写出来,背后又要经过一番激烈的争论了。
说了这么多,所谓的 PM 模型究竟是什么?它跟 GAN 究竟有多少相同多少不同?还有,这个“古老”的模型能给今天的 GAN 研究带来什么启发吗?大家心里肯定充满了疑问。那么八卦结束,我们现在就来走近科学,走近尘封多年的 PM 模型。
Predictability Minimization(可预测性最小化)模型,简称 PM 模型,出自 1992 年的论文《Learning Factorial Codes by Predictability Minimization》,Jürgen Schmidhuber 是唯一的作者。对于类似我这样二零一几年才接触深度学习的人来说,它几乎就是“中古时期”的文献了。
理解 PM 模型,首先得从自编码器说起。大家知道机器学习分为有监督学习、无监督学习和强化学习,无监督学习中一个很重要的领域是表征学习,旨在从原始数据中学习到一个良好的表征,而自编码器就是用于表征学习的代表模型。
自编码器由两个模块—编码器(encoder)和解码器(decoder)组成。编码器负责输入原始样本,输出压缩编码(code);解码器负责输入编码,还原出原始样本。解码还原出来的样本跟真正的原始样本进行比较,可以计算重构误差,自编码器的训练目标就是尽可能地减少这个重构误差。
如果自编码器经过训练能够很好地重构样本,那意味着编码器和解码器中间的隐藏层节点保留了原始样本的重要信息,我们把中间这层节点构成的向量称为表征(representation)、特征(feature)或编码(code),这三个词其实可以当成同义词。
但是仅仅保留样本信息、仅仅学到一个表征,是不够的,因为表征学习的一大难点就是想要学到一个“好”的表征。但什么是“好”呢?有很多人提出了不同的标准。
比如有人认为编码向量的各个维度代表了样本所具有的属性,而单独一个样本不应该同时具备那么多种属性,所以合理的情况是编码向量中大多数维度都是 0(不激活),只有少数维度不为 0(激活),此为“稀疏”,附带稀疏要求的编码器就叫稀疏自编码器。
再比如有人认为自编码器不能死记硬背,需要在“理解”样本的基础上对样本进行编码,即便输入的时候存在一些噪声损坏了样本,自编码器也要能够还原出完好的原始样本,在此条件下编码出来的向量可能会更具语义信息,此为“降噪”,附带降噪要求的编码器就叫降噪自编码器。
除了稀疏、降噪,还有人认为编码向量的各个维度之间应该相互独立,此为“解耦”(factorial / disentangled),也是下文的重点。为了方便起见,我们考虑编码只有 3 个维度的情况,此时解耦在数学形式上表现为:
其中 X 是全部训练样本而非单个样本,c1 对应编码的第 i 个维度。为方便起见,下文省略 X。
直观上说,一个解耦的编码(factorial code)把原本混杂在样本中的各个独立要素拆解开来,用一个个维度分别表示,就像人类通过拆解独立要素来认知复杂事物一样,所以可以认为它是一个“好”的表征。
现在问题来了,我们可以通过 L1 正则化给来自编码器提出稀疏的要求,可以通过输入加噪来给自编码器提出降噪的要求,那要怎么给自编码器提出解耦的要求呢?当年 Schmidhuber 就想到了非常聪明的方法。
首先,上述公式可以换一个表述,改写成三个条件独立表达式:
直观上可以把这组式子解释为,一个编码维度旁边的“兄弟维度”对于预测该维度没有额外帮助,比如说知道了 c1 和 c2 并不能帮助我们将 c3 猜得更准。
接着,使用三个预测器网络 f1, f2, f3 把上述逻辑具体化,其中预测器 1 负责预测维度 1,输入维度 2 和 3,以此类推,数学形式如下:
网络形式如下:
为了让预测器猜准它所负责的编码维度,可以把它的 loss 函数定为 L2 loss(或者其他预测误差 loss):
按 Schmidhuber 的思想,上述 loss 体现了各个编码维度的解耦程度。怎么说呢?以预测器 1 为例,如果 c1 和 c2, c3 很有关系,甚至极端情况下 c1 恒等于 c2,那么 f1 就能够猜得很准。此时 c1 关于 c2, c3 条件不独立,很有可预测性(predictability),我们就认为 c1 没能从 c2, c3 中解耦。
这显然不是想要的局面。为了将 c1 与 c2, c3 解耦,编码器就得尽可能让预测器猜不中,loss 上体现为:
预测器 1 想要猜中维度 1,而编码器想要让它猜不中,loss 函数刚好相反,两者之间存在对抗。如果编码器赢了,就代表 c1 与 c2, c3 关系不大,成功解耦。
接下来考虑上所有维度,再把公式写得通用一点。每个预测器试图猜中它所负责的编码维度,体现了编码的可预测性,其 loss 为:
编码器试图让所有预测器都猜不中,试图最小化可预测性,其 loss 与预测器相反:
如果编码器赢了,就解耦了编码向量的各个维度。至此,读者就可以理解 Schmidhuber 论文标题的含义了:Learning Factorial Codes by Predictability Minimization,通过最小化可预测性,来学习一个解耦的编码表示。
当然,除了上述两个相互对抗可预测性 loss,别忘了还有个自编码器本身的重构误差 loss,它能够保证编码中尽可能保留了原始输入样本的重要信息。论文中其实还有其他 loss,但不是重点,感兴趣的人可以去读原论文。将上述网络模块与 loss 函数全部集中在一起,就形成了 PM 模型的总体架构图,我们用这张图作为第二部分的总结:
知道了 PM 是啥,接下来的问题就是它跟 GAN 究竟有多相似,但实际上 GAN 的两个后续变种—InfoGAN、对抗自编码器反而跟 PM 更像,所以第三部分先简单介绍这三个模型,再在第四部分跟 PM 进行综合比较。相关论文如下:
Generative Adversarial Nets
https://papers.nips.cc/paper/5423-generative-adversarial-nets
InfoGAN: Interpretable Representation Learning by Information Maximizing Generative Adversarial Nets
https://arxiv.org/abs/1606.03657
Adversarial Autoencoders
https://arxiv.org/abs/1511.05644
第一个模型是大家已经很熟悉的 GAN,分为生成器(generator)和判别器(discriminator)两个模块。生成器输入一个随机编码向量,输出一个复杂样本(如图片);判别器输入一个复杂样本,输出一个概率表示该样本是真实样本还是生成器产生的假样本。判别器的目标是区分真假样本,生成器的目标是让判别器区分不出真假样本,两者目标相反,存在对抗。
GAN 的生成器输入一个 100 维的编码向量,但在生成样本的过程中未必会用上全部维度,可能有些维度提供了绝大部分重要信息,另外一些维度只是陪衬,提供一些无关痛痒的随机扰动。然而究竟哪些维度编码了重要信息,哪些维度仅仅提供随机扰动?在 GAN 的架构下我们既没法知道,也没法控制。
第二个模型 InfoGAN 却可以做到。先来看它的结构,相比 GAN 多了个重构器模块,用于重构生成器输入的随机编码向量,但是只重构由我们指定的一部分维度。
加上重构器模块之后,如果生成器拿这一部分维度当成无关痛痒的随机扰动来用,那重构器的任务就会比较艰难;但如果生成器拿这一部分维度当成样本的重要信息(或者套用 PCA 的术语,主成分)来用,那么输出样本就会和这部分编码维度高度相关,此时重构器能够比较轻松地从样本重构出原来的这部分编码。两相对比,生成器就会倾向于使用我们指定的这一部分维度来作为样本的重要信息(主成分)。训练结束后,甚至有机会观察到有些维度具有非常显著的语义信息,比如 InfoGAN 论文在 MNIST 手写数字上训练之后,可以观察到某个维度完全控制着 0-9 的数字类别,某个维度完全控制着数字图像从左到右的倾斜程度,这些显然就是 MNIST 数据集的重要信息(主成分):
对于已经读过 InfoGAN 论文的人,我需要补充解释一下,上述讲法跟论文的讲法不太一样。论文是从互信息的角度开始推导,经过一些变分推断的技巧最终得到模型的 loss,但其实最终得到的 loss 基本上就是普通的重构误差。对于离散维度,论文最终推出的 loss 是 log likelihood,一般对离散维度设置的重构误差也是如此;对于连续维度,论文最终推出的 loss 是对多维高斯分布取 log,如果简化高斯分布中的协方差矩阵是单位矩阵,该 loss 就等价于普通的 L2 loss,也是一般对连续维度设置的重构误差形式。
无论是 GAN、InfoGAN 还是其他 GAN 变种,基本上都想学习从零均值、一方差的标准高斯分布到复杂样本分布的映射,而 GAN 的思路是先固定前者(标准高斯分布)作为网络输入,再慢慢调整网络输出去匹配后者(复杂样本分布)。
第三个模型 Adversarial Autoencoder(对抗自编码器)却采取了相反的思路!它是先固定后者(复杂样本分布)作为网络输入,再慢慢调整网络输出去匹配前者(标准高斯分布)。具体来说,对抗自编码器包含三个模块——编码器、解码器、判别器,前两者构成一个普通的自编码器,输入的复杂样本,还是要求在解码器的输出端重构;判别器输入编码向量,判定它是来自一个真实的标准高斯分布,还是来自编码器的输出。判别器试图区分编码向量的真假,编码器就试图让判别器区分不出真假,如果最终编码器赢了,就意味着它输出的编码很接近标准高斯分布,导致判别器混淆不清,我们的目的也就达到了。对抗自编码器严格来说应该不算 GAN 的变种,因为它的思路方向与 GAN 相反。
说到跟 GAN 方向相反,读者可能会记起上文提到 Schmidhuber 把 GAN 叫做“inverse PM”。PM 跟 GAN 相反,对抗自编码器也和 GAN 相反,那它们两个会不会很像呢?答案是确实很像,如果把 PM 的架构图参照上面三个模型重新画一遍,就可以很清晰地看到 PM 跟对抗自编码器的主体架构完全对的上。
需要注意的是,上图其实把 N 个预测器合并画成了一个。
最后,一图总结第三部分:
最后是对上述四个模型做综合比较。首先对比 PM 和 GAN:
1. 映射方向相反
其中 PM 的编码器和 GAN 的生成器方向相反,所以 Schmidhuber 把 GAN 称为“inverse PM”。
2. 都是对抗优化相反的目标
3. 预测/判别结构相似
如果把真假标签的节点跟图片样本节点拼接到一起,视为一个超长向量的话,GAN 的判别器就可以强行视为 PM 预测器的特例:PM 对每一个维度都要预测,但是 GAN 只预测真假标签这一特殊维度。
4. 模型主体不同(Goodfellow 在 GAN 论文中提出)
5. 可拓展性不同
Goodfellow 在 GAN 论文中还提了其他不同点,但是我个人觉得不合理,就忽略不讲了。经过上述比较,我们可以看到 PM 和 GAN 确实有非常多的相似之处,但是差异也很大,我个人觉得并不能把 GAN 简单看作 PM 的变种。
相比之下,PM 和 InfoGAN、对抗自编码器反倒更像:
1. 模型主体
2. 对网络中间层的要求
PM 要求编码器和解码器中间的隐藏层解耦,它是通过可预测性最小化的思想来做到的
对抗自编码器要求编码器和解码器中间的隐藏层解耦,且满足高斯分布,它是通过对抗训练,拉近隐藏层编码分布与一个真正的解耦高斯分布来做到的
InfoGAN 要求生成器和重构器中间的隐藏层满足复杂样本分布,它是通过对抗训练,拉近生成分布与真实复杂分布来做到的
3. 预测/判别结构相似
PM 输入编码其他维度,预测某一维度;对抗自编码器,输入编码全部维度,预测真假标签;InfoGAN 和前面 GAN 的情况相同,输入图片,预测真假标签。在这个角度上对抗自编码器与 PM 更相似。
四个模型对比完毕,我们能够获得什么启发吗?下面试举一例,来结束第四部分。
inference.vc(http://www.inference.vc/)是一个关于生成模型的著名博客,其中有篇文章认为对抗自编码器中用 GAN 来拉近编码分布和高斯分布,是杀鸡用牛刀的做法。
文章认为,GAN 模型强大的分布拉近能力适用于图片这样的复杂分布,但是对于像解耦高斯分布如此简单的情况,并不需要动用到 GAN 这种大杀器,其实完全可以利用解耦高斯分布的特殊形式,采取更加高效的方式(比如文章中提了一个叫做 MMD 的方法,此处略过不讲)。
看了 PM 之后就可以想到另一个思路——分别要求解耦和高斯。先把对抗自编码器的判别器换成 PM 模型的 N 组预测器,用可预测性最小化的思想,实现编码向量各个维度之间的解耦;接着对每个单独的编码维度,通过 GAN 使其满足高斯分布。虽然还是用 GAN,但是我们把向量上的对抗训练转化为标量上的对抗训练,而后者可能比前者要容易和稳定得多。
Schmidhuber 在 92 年提出的 PM 模型通过可预测性最小化来学习一个解耦的编码表示,编码器和预测器优化相反的目标,确实是比 GAN 更早地使用了对抗训练的思想。
PM 不仅跟 GAN,还跟 InfoGAN、对抗自编码器存在很多相似之处,但还是有很明显的差异。其中 PM 和对抗自编码器最像,主体都是自编码器,但它们并不能简单地视为 GAN 的变种。
我们现在都是盯着最新最前沿的研究工作,其实也许有很多像 PM 这样“古老”但有趣的想法被我们忽视了,有的是因为当年提出的时候思想太过超前,或者硬件计算能力撑不起来,导致无人问津,最典型的例子就是 LSTM。这些工作不应该被埋没,如果能够重新挖掘出来的话,就可能给今天的研究带来很多新的启发。
关于PaperWeekly
PaperWeekly是一个推荐、解读、讨论、报道人工智能前沿论文成果的学术平台。如果你研究或从事AI领域,欢迎在公众号后台点击「交流群」,小助手将把你带入PaperWeekly的交流群里。