DGN:生成模型,可以有多简单?目前的深度学习研究,有什么问题?思考DL的理论细节 (3)

860 阅读5分钟
原文链接: zhuanlan.zhihu.com

本系列的前文见我的专栏:

技术备忘录zhuanlan.zhihu.com图标

在本系列的 (2),介绍了一种极其简单的生成模型。

在本文中,我们先不考虑它的复杂化。我们考虑能不能更简单,简单的极限到底在哪里。

我的观点是,生成模型的奥秘,不在于什么“分布积分来积分去”,在于 Deep Image Prior

Deep Image Priordmitryulyanov.github.io图标

Deep Image Prior 说的事情,从实验的角度看很简单。但是,从理论的角度看,比“分布的积分”复杂得多,所以还没见过有谁去理论分析。

大家都只在拼命算"分布的积分",不得要领。

在本文中我们做一些小实验。让我们看看生成模型的极限到底在哪里。

1. 生成模型到底可以有多简单?

生成模型,最有趣的地方,在于从 Xp_x

没有人说得清 p_x 是啥。即使给定了一批图像 X ,显然它们仍然可以来自几乎任何 p_x

但是我们可以加入 prior,然后就可以估计了。

卷积网络是一种极好的对于自然图像的 prior。这是 DL CV 的核心之核心所在。

考虑下列生成模型,不妨称为 DGN,Direct Generative Network:

z \xrightarrow{G} x

你没看错。它就长这样。啥都没有。


2. 训练最简单的生成模型

我说 G 是个生成模型。因为它首先可以保证几乎完美地生成每一个样本 X,一个都不拉下。

如此基本的要求,是目前的 GAN / VAE / Flow 系列甚至都不能保证的。现在的生成模型,问题太大了,连原始数据集都还原不了。

那么,DGN 怎么训练?例如两种方法:

  1. 最笨的方法。随机采样一批 z,然后我们硬性随机指定每个 z 对应哪个 x。没错,就是这么粗暴。
  2. 稍微聪明一点的方法,每次训练 G 后,也算一下 z 的梯度,让 z 也流动起来。

这里的 1,是不是让大家想起了 [1611.03530] Understanding deep learning requires rethinking generalization

没错,G 真的可以硬学会一切。我们等下看。


3. 所谓样本分布,到底是什么?

有人会问,你怎么知道 G 生成的分布符合那个神秘的 p_x

例如,这样做 z 插值出来的图像,真实吗?随机生成的 z,真实吗?

那么,我问你,你告诉我 p_x 是啥?有啥评判标准?

  • 如果你说 IS FID 之类,为何我们不干脆直接把这个加入训练过程,作为训练目标?
  • 重新搞几个 D/E 之类,有啥意义?本质上还不是在做一样的事情,只不过可以满足"算积分发论文"的需求罢了。而且还很不稳定,整天崩掉,只能缝缝补补,我跟你说,补不完的。
  • 是的,我跟你说,现在这种输出 1 个数字的 D,永远有漏洞,永远补不完。原因见我 1 年多前写的文章:
PENG Bo:GAN的几何图景:样本空间的Morse流,与鉴别网络D为何不可能真正鉴别真假zhuanlan.zhihu.com图标
  • 对于那种简单的 toy 数据集(例如那种一群gaussian排列的,大家都知道,论文里面喜欢用),可以补完漏洞,但没有任何意义。
  • 如果你说 D 是无监督出来的,我们完全可以用更好的办法来做,例如直接做图像的精细模型(就像语言模型),这种模型,加的约束是非常高维的,因此解决了我在"几何图景"提出的问题。这无疑会比现在这些残废的 D 要普适得多,稳定得多,有意义得多。难道不是吗?

如果你希望改进 DGN,没有必要训练一个和某个特定 G 紧密耦合的 D。应该另训练一个普适的 D。

直接用 deep image prior 把样本分布估计出来,难道不是最简单,最合理,最准确的吗?做这么多花样,有什么意义呢?


4. 做点实验

台式机的 bug10 懒得修了,用笔记本跑吧。找了一个之前知友做的头像数据集,跑一下吧。网络架构就用最原始的 DCGAN 的 G,filter 为 512 / 256 / ...。

为了看看 DL 的死记硬背能力有多强,我们就用最笨的训练方法,连 shuffle 都不做,就挑一批头像,先随机采样生成固定的 z,然后每次按顺序训练 x。首先 z 也只取 50 维。

先挑 64 个试试。Batch 也 64(因此可以说一切都是最笨了)。优化器用 DCGAN 里面的 Adam,参数完全一样。

第 0 步:

第 100 步:

第 200 步:

第 500 步:

第 900 步:

除了有点噪点之外,和原数据集一模一样。网络成功记忆了一切。

请注意,这个甚至都不是 SGD,是 GD。再次证明了,足够大的网络根本就不在意什么"local minimum"问题。

那么。加点数据量。加到 5*64=320 张图片。Batch 仍然 64。还是不做 shuffle。

第 200 步:

第 900 步:

仍然几乎完美地还原所有图片。

再多样本也一样。越多样本学得越慢,也会慢慢没这么准确。至于怎么改善,大家也知道。总之确实很粗暴。


5. 思考

这里已经有很多值得思考的问题,我先把文章发出来,大家可以自己去实验和思考。

例如:

  1. 对于常见数据集,最好的 DGN 架构到底是什么?
  2. 对于不同数据集,正确的 z 维数怎么确定?理论上,其实 1 维的 z 就可以覆盖所有样本。当然,覆盖不了 p_x
  3. 加入 z 的流动后,得到的 z 会有意义吗?
  4. 可以生成合理的插值和新样本吗?加入前文提到的辅助网络后,效果又如何?

后续继续。欢迎大家讨论,欢迎大家关注。

后续还有更多新内容,现在这些只是开胃小菜。