深度学习随着AlphaGo大胜李世石之后被“神话”,很多人认为深度学习就是挑战人类智力的“神器”。可是,深度学习真的如他们想象的那般“战无不胜”吗?本文编译自hyperparameter.space,作者是Pablo Cordero,就读于加利福尼亚大学圣克鲁斯校区,主攻方向为细胞生物学和再生医学背景下的应用机器学习研究。阅读此文后,你便能够从深层理解,为什么深度学习其实并不像普通百姓想象的那般“神”了,甚至,你还会发现它有时还有些“笨”。
我知道以一种较为消极的态度来作为博客的开头是很奇怪的方式,但是在过去几天里有一波讨论,我认为这是关于我最近一直在思考的话题一个很好的切入点。这一切都从Jeff Leek在Simply Stats博客中发表了一篇关于在小样本规模体系中使用深度学习的注意事项开始的。总之,他认为,当样本量很小(这在生物领域频繁发生)时,即使有一些层和隐藏单元,具有较少参数的线性模型的表现是优于深度网络的。他还表示,当在一个使用仅仅80个样本的MNIST数据集中进行0和1的分类时,一个具有十大最具特征值的非常简单的线性预测器的表现要比一个简单的深度网络好得多。这促使Andrew beam写出一篇文章来反驳,一个适当训练的深度网络能够击败简单的线性模型,即使是很少的训练样本。现如今频繁出现的是,越来越多的生物医学信息学研究人员正在使用深度学习来解决各种问题。这种肆无忌惮的宣传是真的有效吗?或者说这种线性模型是我们所需要的吗?答案一如既往的是——这取决于先决条件。在这篇文章中,我想探索机器学习中的使用案例,实际上,深度学习并不是真正意义上对所有应用都有效,同时探索出我认为可以使得深度学习得到有效使用的解决想法,特别是针对新来者。
打破深度学习之偏见
首先,我们要剔除一些先入为主的偏见,很多圈外的人们还处于一知半解的状态。有两个广泛的认知点,而我将要对这个更为技术性的做一个详细说明。这有点像是对Andrew Beam在他的帖子中所完美地阐述的“误解”部分的延伸。
深层学习确实可以在小样本的情况下进行
深度学习是随着大数据的背景下产生的(请牢记,第一个Google大脑项目正在向深度网络提供大量YouTube视频),并自此不断地被宣称运行在大量数据中的复杂算法。不幸的是,这个大数据/深度学习对不知为何也被误解:在小样本条件下不能使用的虚构体。如果你只有几个样本,在一个具有高样本参数比例的神经网络中进行开发,看起来似乎会出现过度拟合。然而,仅仅考虑给定问题的样本容量和维度,无论是监督还是无监督,都几乎是在真空中对数据进行建模的,而无需任何背景。可能的情况是,你拥有与你问题相关的数据源,或者该领域专家可以提供强有力的数据源,或者数据可以以非常特殊的方式进行构建(例如,以图形或图像编码的方式进行)。在所有这些情况下,深度学习有机会成为一种可供选择的方法——例如,你可以编码较大的相关数据集的有用表示,并将其应用于你的问题中。这种经典的示例常见于自然语言处理,你可以学习大型语料库中嵌入的词语,然后将它们作为一个较小的、较窄的语料库嵌入到一个监督的任务中。在极端情况下,你可以拥有一套神经网络,共同学习一种表示方式,并在小型样本中重用该表示的有效方式。这被称为一次性学习(one-shot learning),并已经成功应用于包括计算机视觉和药物发现在内的高维数据的许多领域当中。
药物发现中的一次性学习神经网络,摘自Altae-Tran et al. ACS Cent. Sci. 2017
深度学习不是一切的答案
我听到最多的第二个偏见就是过度宣传。许多尚未从事AI职业的人,期望深度网络能够给他们一个神话般的表现提升力,仅仅因为它在其他领域有效。其他人则从深度学习在图像、音乐和语言(最贴近人类的三种数据类型)中的令人印象深刻的表现中受到鼓舞,并通过尝试训练最新的GAN架构,而匆匆一头扎进这个领域。当然,在许多方面这种过度宣传也是真实存在的。深度学习已经成为机器学习中不可否认的力量,也是数据建模者的重要工具。它的普及带来了诸如tensorflow和pytorch等重要框架,它们即使是在深度学习之外也是非常有用的。失败者的巨星崛起的故事激励了研究人员重新审视其他以前模糊的方法,如进化方法和强化学习。但这不是万能的。除了考虑天下没有免费的午餐之外,深度学习模型可以非常细微,并且需要仔细,有时甚至是非常昂贵的超参数搜索、调整和测试(文章后续将有更多讲解)。此外,有很多情况下,从实践的角度来看,使用深度学习是没有意义的,而更简单的模型工作得更好。
深度学习不仅仅是.fit()
深度学习模型还有另外一个方面的应用,我认为在其他机器学习领域方面是有所损失的。大多数深度学习的教程和介绍性材料描述了这些模型由层次连接的节点层组成,其中第一层是输入,最后一层是输出,并且你可以使用某种形式的随机梯度下降(SGD)来训练它们。可能有一些简要的介绍随机梯度下降是如何工作的,以及什么是反向传播,大部分解释集中在神经网络类型(卷积、循环等)。而优化方法本身却没有什么人关注,这是很不幸的,因为很有可能深度学习为什么能够起作用的很大(如果不是最大的)一部分原因就是这些特定的方法(例如来自Ferenc Huszár’s的这篇文章和从该文中引用的论文,并且要知道,如何优化它们的参数,以及如何分割数据,从而有效地使用它们以便在合理的时间内获得良好的收敛,是至关重要的。不过,为什么随机梯度如此关键却仍然是未知的,现在也或多或少地出现了一些线索。我最喜欢的一个是将该方法解释为执行贝叶斯推理的一部分。实质上,每当你做某种形式的数值优化时,你都会用特定的假设和先验来执行一些贝叶斯推理。实际上,有一个被称为概率数值计算(probabilistic numerics)的整个领域,就是从这个角度出现的。随机梯度下降是没有什么不同,最新的研究成果表明,该程序实际上是一个马尔可夫链,在某些假设下,可以看作是后向变分近似的静态分布。所以当你停止你的SGD并采用最后的参数时,你基本上是从这个近似分布中抽样的。我发现这个想法是有启发性的,因为优化器的参数(在这种情况下是学习率)使得这种方式更有意义。例如,当你增加SGD的学习参数时,马可夫链就会变得不稳定,直到找到大面积采样的局部极小值;也就是说,增加了程序的方差。另一方面,如果你减少学习参数,马尔可夫链慢慢接近狭义极小值,直到它收敛于一个区域;那就是你增加某个区域的偏差。而另一个参数,SGD中的批量大小也可以控制算法收敛的区域是什么类型的区域:小批量的较大区域和大批次的小区域。
SGD根据学习速率或批量大小而选择较大或极限最小值
这种复杂性意味着深度网络的优化器变得非常重要:它们是模型的核心部分,与层架构一样重要。这与机器学习中的许多其他模型并不完全相同。线性模型(甚至是正则化的,像LASSO算法)和支持向量机SVM都是凸优化问题,没有那么多的细微差别,而且只有一个答案。这就是为什么来自其他领域和/或使用诸如scikit-learn工具的人在他们没有找到一个非常简单的具有.fit()方法的API时会感到困惑。尽管有一些工具,如skflow,尝试将网络简化成一个.fit()签名,我认为这有点误导,因为深度学习的全部重点就是它的灵活性。
何时不需要深度学习?
那么,什么时候深度学习不适合于某些任务呢?从我的角度来看,以下这些情况下,深度学习更多是一种阻碍,而不是福音。
低预算或低投入问题
深度网络是非常灵活的模型,具有多种架构和节点类型、优化器和正则化策略。根据应用程序,你的模型可能具有卷积层(多大?使用什么池操作?)或循环结构(有没有门控?);它可能真的很深(hourglass、siamese,或者其他的架构)?还是只是具有很少的几个隐藏层(有多少单元?);它可能使用整流线性单元或其他激活函数;它可能或可能不会有退出(在什么层次中?用什么分数?),权重应该是正则化的(l1、l2,或者是某些更奇怪的东西?)。这只是一部分列表,还有很多其他类型的节点、连接,甚至损失函数。即便只是训练一个大型网络的示例,那些需要调整的参数以及需要探索的框架的过程也是非常耗时的。谷歌最近吹嘘自己的AutoML方法可以自动找到最好的架构,这是非常令人印象深刻的,但仍然需要超过800个GPU,全天候运行数周,这几乎对于任何人来说是都遥不可及的。关键在于训练深层网络时,在计算和调试部分都会花费巨大的代价。这种费用对于许多日常预测问题并没有意义,即使调整小型网络。调整网络的投资回报率可能太低。即使有足够的预算和承诺,也没有理由不尝试替代方法,即使是基准测试。你可能会惊喜地发现,线性SVM对于你就够用了。
解释和传达模型参数对一般受众的重要性
深度网络也是各臭名昭着的黑匣子,它具有高预测能力但可解释性不足。尽管最近有很多工具,诸如显著图(saliency maps)和激活差异(https://arxiv.org/abs/1704.02685),对某些领域而言是非常有用的,但它们不会完全迁移到所有的应用程序中。主要是,当你想要确保网络不会通过记住数据集或专注于特定的虚假特征来欺骗你时,这些工具就能很好地工作,但仍然难以将每个功能的重要性解释为深度网络的整体决策。在这个领域,没有什么能够真正地打败线性模型,因为学习系数与响应有着直接的关系。当将这些解释传达给一般受众时,这就显得尤为重要。例如,医生需要包含各种不同的数据来确认诊断。变量和结果之间的关系越简单、越直接,医生就能更好地利用,而不是低于/高于实际值。此外,有些情况下,模型的精度并不像可解释性那样重要。例如,策略制定者可能想知道一些人口统计变量对于死亡率的影响,并且相较于预测的准确性来说,可能对这种关系的直接近似比更有兴趣。在这两种情况下,与更简单、更易渗透的方法相比,深度学习处于不利地位。
建立因果机制
模型可解释性的极端情况是当我们试图建立一个机械模型,即实际捕捉数据背后的现象的模型。一个好的例子包括试图猜测两个分子(例如药物、蛋白质、核酸等)是否在特定的细胞环境中相互作用,或者假设特定的营销策略如何对销售产生实际的影响。在这个领域,根据专家意见,没有什么可以击败老式的贝叶斯方法,它们是我们表达并推断因果关系的最好方式。Vicarious有一些很好的最新研究成果,说明为什么这个更原则的方法在视频游戏任务中比深度学习表现得更好。
学习“非结构化”特征
这可能是具有争议性的。我发现深度学习擅长的一个领域是为特定任务找到有用的数据表示。一个很好的例子就是上述的词语嵌入。自然语言具有丰富而复杂的结构,可以说与“上下文感知”(context-aware)网络相近似:每个单词都可以在向量中表示,而这个向量可以编码其经常使用的文本。在大型语料库中学习的NLP任务中使用单词嵌入,它有时可以在另一个语料库的特定任务中提升效果。然而,如果所讨论的语料库是完全非结构化的,则可能不会起到任何作用。例如,假设你正在通过查看关键字的非结构化列表来对对象进行分类,由于关键字不是在任何特定结构中都会使用的(比如在一个句子中),所以单词嵌入不太可能有助于所有这些情况。在这种情况下,数据是真正的一个单词包,这种表示很有可能足以满足任务所需。与此相反的是,如果你使用预训练的话,可以更好地捕获关键字的相似度,而且单词嵌入并不是那么昂贵。不过,我还是宁愿从一个单词的表示开始,看看能否得到很好的预测结果。毕竟,这个词包的每个维度都比对应的词嵌入槽更容易解读。
前景广阔
深度学习目前非常火爆,且资金充足,并且发展异常迅速。当你还在阅读会议上发表的论文时,它可能已经有两三次迭代了。这给我上述列出的几点提出了很大的挑战:深度学习在不久的将来可能在这些情景中是非常有用的。用于解释图像和离散序列的深度学习模型的工具越来越好。最近的软件,如Edward与贝叶斯结合建模和深度网络框架,将量化神经网络参数的不确定性考虑在内,通过概率编程的简易贝叶斯推理和自动变分推理。从长远来看,可能会有一个简化的建模词汇表,指出深度网络可以具有的显著属性,从而减少需要尝试的参数空间。
评论
查看更多