深度学习远不止.fit()这么简单

深度学习远不止.fit()这么简单

一切都是从 Jeff Leek 于 Simply Stats 博客 发表的一篇关于在小样本规模体系中使用深度学习的注意事项文章开始。

简而言之,Jeff Leek 认为当样本规模很小的时候(通常在生物领域很常见),参数较小的线性模型甚至比拥有少量分层和隐藏单元的深网表现更好。为了证明自己的观点,Jeff 展示了一个拥有十个最常见信息特征的简单线性预测,在尝试使用仅 80 个样本的 MNIST 数据组进行 0 和 1 的分类时,它在表现上优于简单深网。

这引起了 Andrew Beam 注意并写了一篇文章反驳。文章指出经过适当训练甚至只经过几个简单训练的深度学习可以打败简单线性模型。这个来来回回的辩论发生在越来越多生物信息研究者采用深度学习来解决问题的时候。这到底是炒作还是线性模型真的是我们所需要的?

对于这个问题的答案,我认为和往常一样,是需要根据情况来决定的。在这篇文章中,我将重心放在机器学习上,解析深度学习不是那么有效或者受到阻碍的的使用案例,尤其是对入门者来说。

深度学习远不止.fit()这么简单

打破深度学习先入为主的观念

首先,让我们来聚焦一些在外行人眼中已经成为半真相的先入之见。这些先入之见有两个笼统的和一个更有专业性的。他们有点类似于 Andrew Beam 在帖子中指出的“误解”部分的延伸。

深度学习远不止.fit()这么简单

深度学习真的可以在小规模体系中使用

深度学习之所以成功是因为他的背后有大数据支持(还记得第一个 Google Brain 项目吗,他将大量的 YouTube 视频加入到了深网中),并且宣称有复杂的算法来处理这些数据。

然而,这个大数据/深度学习也可以被翻译成截然相反的意思:这个很好用的东西无法被用到很小的规模体系中。如果你只有少数几个可供添加进神经网络的样本,想要适用于高采样比参数,似乎就感觉要求过高了。然而,只考虑给定问题的样本大小和维度,无论是监督还是无监督,都是在真空中对数据进行建模,而无需任何上下文。这种情况可能是因为您有与您的问题相关的数据源,或者领域专家可以提供强有力的数据源,或者以非常特殊的方式构建数据(比如使用图形或图像进行编码)。

深度学习远不止.fit()这么简单

以上的这些情况,深度学习都可以作为一种解决办法。例如,你可以编码较大的,与数据集相关的表达。并在你的问题中使用这些表达。一个关于这个的经典例子便是我们对自然语言进行的处理。你可以在大型词汇网站比如 Wikipedia 上学习一个单词,并将这个单词用在范围更小更窄的使用中去。在极端情况下,你可以拥有一套神经网络共同学习一种表达方式,并在小样本集中重复使用该表达方式的有效方法。

这种行为被称作一次学习(one-shot learning),并已经被成功应用于包括计算机视觉(https://arxiv.org/abs/1606.04080)和药物研发(https://arxiv.org/abs/1611.03199)在内的高维数据的多个领域。


深度学习远不止.fit()这么简单

用于药品开发的一次学习网络,引自 Altae-Tran 等人的论文,ACS Cent. Sci. 2017

深度学习不适用于所有情况

第二个我常听到的先入之见是人们对于深度学习的炒作。很多还没开始尝试的实践者希望深网可以给他们带来神话般的表现提升,只因为它在别的领域有效。另外一些人则因为令人影响深刻的建模,图像,音乐和语言收到启发。他们尝试训练最新的 GAN 架构而希望成为第一批进入这片领域的人。这些炒作在很多方面其实是真实的。

深度学习在机器学习中已经成为不可否认的力量,并且是所有数据建模者的核心工具。它的普及带来了诸如 TensorFlow 和 Pytorch 等重要框架,即使在深入学习之外也是非常有用的。从失败者到超级明星的起源故事激励了研究人员重新审视其他的方法,如进化策略和强化学习。但这并不是万能的。

天下没有免费的午餐,深度学习模型可以非常细微,需要仔细和有时非常昂贵的超参数搜索,调整和测试(详细内容会在之后的文章中提及)。另一方面,在很多情况下,使用深度学习从实践的角度来看是没有意义的,因为更简单的模型工作得更好。

深度学习远不止.fit()这么简单

深度学习远不止.fit()这么简单

另外还有一个深度学习模式的缺失,我认为是因为翻译自其他机器学习领域导致的。绝大多数深度学习的教程和入门材料将这些模型描述为由分层连接的节点层组成,其中第一层是输入,最后一层是输出,并且你可以使用某种形式的随机梯度下降法来训练它们。可能经过一些简短的提及梯度下降是如何运作以及什么是反响传播,大部分的解释都集中在神经网络丰富的多样性上(卷积,反复等等)。

优化方法本身只收到了一点点额外关注,这是很不幸的,因为他才是深度学习最重要的部分之一。他解释了深度学习是如何实现的。知道如何优化参数,如何有效地分配数据来使用它们,在合理的时间内获得良好的结合是至关重要的。这也正是为什么随机梯度这么关键却仍然有很多人不了解,问题的原因即出自于此。我最喜欢的是执行贝叶斯推理一部分的解释方法。实质上,每当你做某种形式的数值优化时,你都会用特定的假设和先验来执行一些贝叶斯推理。实际上,有一个被称为概率数字的领域,就是基于这个观点诞生的。

随机梯度下降是没有什么不同的,最近的工作表明,该程序实际上是一个马尔可夫链,在某些假设下,具有一个可以看作是后向变分近似的静态分布。所以当你停止你的 SGD 并获得最后的参数,你其实是在从这个近似分布中抽样。我发现这个想法是有启发性的,因为优化器的参数(在这种情况下,学习率)使得这种方式更有意义。例如,当增加 SGD 的学习参数时,Markov 链变得不稳定,直到找到大面积样本的局部极小值;那是因为你增加了程序的方差。另一方面,如果您减少学习参数,马尔科夫链会缓慢地接近较窄的最小值,直到其收敛于紧密的区域;那是因为您增加了某些部分的偏差。另一个参数,SGD 中的批量大小也可以控制算法收敛的区域是什么类型的区域:较大区域的较小批次和较大批次的较小区域。

深度学习远不止.fit()这么简单

SGD 根据学习速度或批量大小而更倾向于宽极小或尖极小

这种复杂性意味着深层网络的优化器成为最重要的部分:它们是模型的核心部分,与层架构一样重要。这种现象在别的机器学习模型里并不常见。线性模型和 SVMs 的优化并没有过多的细微差别,并且真的只有一个解决办法。这就是为什么来自其他领域和/或使用 Scikit 学习的工具的人在他们找不到具有 .fit()方法的非常简单的 API 时会感到困惑(虽然有一些工具,如 Skflow,尝试将简单的网络装入 .fit() 签名,但我认为这有点误导,因为深入学习的关键是它的灵活性)。

深度学习远不止.fit()这么简单

----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------