最好加什么约束呢?我们应该尽可能从基本原理出发来找寻约束,尽量避免加入人工因素。我们回到距离的作用上来看:距离是为了表明两个对象的差距,而如果对象产生的微小的变化,那么距离的波动也不能太大,这应该是对距离基本的稳定性要求,“失之毫厘,谬以千里”是会产生浑沌的,数学模型不应该是这样。从这个角度来看,那个所谓的“JS 距离”,根据就不是距离了,因为就算对于伯努利分布 {0:0.1,1:0.9} 和 {0:0,1:1},这两个相似的分布算出来的“距离”居然是无穷大(因为出现了 0.1/0 这一项)。 放到我们的 D 中,这个约束我们该怎么体现呢?假如某个样本不是 yi 而是 y′i,假设 ‖yi−y′i‖(用两竖表示欧式距离,因为 y 可能是个多元向量)并不是十分大,那么会对分布造成一定的影响。这个影响有多大呢?显然不会大,因为分布是一批样本的统计特征,如果只是稍微改变了一个样本,那么分布的变化显然不能大的。而我们知道,分布的距离用 D 的均值 L 来描述,只改变一个 yi,所造成的分布差正比于: 我们希望 yi′→yi 时,自然地就有,怎么实现这一点呢?一个简单的方案是 D 满足以下约束: 这里 α>0,而最简单的方案就是: 这就是数学中常见的 Lipschitz 约束。如果能够满足这个约束,那么距离就能满足稳定性要求。注意这是个充分条件,不是必要条件,也可以使用其他方案。但不得不说,这是个简单明了的方案。而使得函数 D 满足 Lipschitz 约束的一个充分条件就是: 8 “罚”出来的成果 当然惩罚是“软约束”,最终的结果不一定满足这个约束,但却会在约束上下波动。也就是说虽然我们指定了 C=1,但最终的 C 却不一定等于 1,不过会在 1 上下波动,而这也不过是一个更宽松的 Lipschitz 约束而已,我们不在乎 C 的具体大小,只要 C 有上界就好。另外,约束的加法不是唯一的,WGAN 的作者 Martin Arjovsky 在他的论文中提出的加法为: 哪个好?实验结果好像都差不多。 不过,上面的惩罚项都是形式而已,我们还没给出具体的计算方法。理论上最好能够对所有的 y(全空间)都算一遍 然后取平均,显然这是做不到的。那么只好用一个退而求其次的方案:只对真实样本 zi 和生成样本 yi 算。但这样约束范围貌似也太小了,所以干脆在真实样本和生成样本之间随机插值,希望这个约束可以“布满”真实样本和生成样本之间的空间,即: 以及: 这里的 εi 是 U[0,1] 的随机数,这应该已经是我们“力所能及”的最优的方案了。后面这个就是 Martin Arjovsky 提出的最新的 Lipschitz 约束的方案,而实验结果表明前一个方案效果也不错。目前它们的大名叫“WGAN-GP”,全称 Wasserstein Generative Adversarial Nets - Gradient Penalty。 最后,有人会反驳,梯度有上界,只不过是 Lipschitz 约束的充分条件,为啥不直接将 Lipschitz 约束以差分形式加入到惩罚中去呢?(其实有这个疑问的最主要的原因,是很多深度学习框架并没有提供梯度函数;另外,尽管 tensorflow 提供了梯度函数,但如果判别器用的是 RNN,那么梯度函数也是不可用的。)事实上,这样做某种意义上更加合理,我觉得 Martin Arjovsky 直接用梯度,不过是想写得简单一点,这时候惩罚是: 以及: 这里 yi,j=εi,jyi+(1−εi,j)zi,也就是每步插值两次,然后用插值的结果算差分。 9 然后呢? 暂时没有然后了,终于写完了。这便是我理解的 GAN。 通过本文,我们可以一气呵成地直达 WGAN-GP,而不需要很多的历史知识和数学知识。有趣的是,我们的推导过程表明,WGAN-GP 其实跟 Wasserstein 距离没有直接的联系,尽管当初 WGAN 的作者是从 Wasserstein 距离将它们推导出来的。也就是说,WGAN 跟 W 没啥关系,这就尴尬了。另外,有人提问“WGAN 相比原始的 GAN 有什么优势?”,如果根据本文的理论推导,那么原始的 GAN 根本就不是 GAN,因为它不能改写为本文的某个特例。(原因在于,本文的推导基于分布的拟合,而原始 GAN 的推导基于博弈论,出发点不同。) (责任编辑:本港台直播) |