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


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

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

这引发了 Andrew Beam 注意并写了一篇文章反驳。文章指出通过适当训练甚至只通过几个简单训练的深度学习能够战胜简单线性模型。这个来来回回的辩论发生在愈来愈多生物信息研究者采用深度学习来解决问题的时候。这究竟是炒做仍是线性模型真的是咱们所须要的?网络

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


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

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


深度学习真的能够在小规模体系中使用工具

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

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


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

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


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

深度学习不适用于全部状况

第二个我常听到的先入之见是人们对于深度学习的炒做。不少还没开始尝试的实践者但愿深网能够给他们带来神话般的表现提高,只由于它在别的领域有效。另一些人则由于使人影响深入的建模,图像,音乐和语言收到启发。他们尝试训练最新的 GAN 架构而但愿成为第一批进入这片领域的人。这些炒做在不少方面实际上是真实的。

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

天下没有免费的午饭,深度学习模型能够很是细微,须要仔细和有时很是昂贵的超参数搜索,调整和测试(详细内容会在以后的文章中说起)。另外一方面,在不少状况下,使用深度学习从实践的角度来看是没有意义的,由于更简单的模型工做得更好。


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

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

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

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

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

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

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