深度学习在AlphaGo战胜李世石后一度被推向神坛,许多人将其视为挑战人类智力的“神奇技术”。但现实果真如此吗?本文编译自hyperparameter.space,作者Pablo Cordero是加利福尼亚大学圣克鲁斯分校的研究人员,主攻细胞生物学与再生医学背景下的应用机器学习。读完本文,你将真正理解深度学习为何并不像大众想象的那般“全能”,甚至会发现它在某些场景下显得有些“笨拙”。

以相对消极的基调开头或许有些突兀,但过去几天的讨论恰好提供了一个合适的切入点。Jeff Leek在Simply Stats博客上撰写了一篇关于小样本量下深度学习注意事项的文章。他的核心观点是:当样本量极少(这在生物领域十分常见)时,即便增加若干层和隐藏单元,参数较少的线性模型表现也优于深度网络。他还举例指出,在仅使用80个样本的MNIST数据集上区分0和1时,一个选取十大最具特征值的简单线性预测器,效果远超简单深度网络。这引发了Andrew Beam的反驳:经过适当训练的深度网络能够击败简单线性模型,即使训练样本非常有限。如今,越来越多的生物医学信息学研究者借助深度学习解决各类问题。这种铺天盖地的宣传真的有效吗?还是线性模型就足以胜任?答案一如既往——取决于具体条件。本文旨在探索那些深度学习并非万能的场景,并分享一些让深度学习真正发挥作用的思路,尤其适合初学者参考。
打破深度学习之偏见
首先需要摒弃一些先入为主的偏见。许多圈外人仍处于一知半解的状态,这里重点澄清两个广泛认知,也算是对Andrew Beam那篇帖子中“误解”部分的延伸。
深度学习确实可以在小样本场景下进行
深度学习诞生于大数据背景下——首个Google Brain项目利用大量YouTube视频训练深度网络,随后一直被宣传为处理海量数据的复杂算法。不幸的是,大数据与深度学习的组合也被误解了:很多人认为小样本下无法使用。如果只有少量样本,在参数比例极高的神经网络上开发,似乎必然导致过拟合。然而,仅看样本容量和维度,无论是有监督还是无监督,几乎是在真空中建模,忽略了背景信息。实际情况是,你可能有与问题相关的外部数据源,或者领域专家能提供强有力的先验知识,或者数据本身结构特殊(如图形或图像编码)。在这些情况下,深度学习完全有机会成为可选方案——例如,先在大规模相关数据集上学习有用表示,再应用到你的小问题上。自然语言处理中就有经典案例:在大型语料库中学习词嵌入,然后用于一个较小的、较窄的监督任务。极端情况下,甚至可以使用一套神经网络共同学习表示,并在小样本中重用。这种“一次性学习”已经成功应用于计算机视觉和药物发现等许多高维领域。
药物发现中的一次性学习神经网络,摘自Altae-Tran et al. ACS Cent. Sci. 2017
深度学习不是万能的答案
第二个常见偏见是过度宣传。许多尚未入行的人期望深度网络能带来神话般的性能提升,仅仅因为它在其他领域表现优异。另一些人被深度学习在图像、音乐、语言(最贴近人类的三种数据类型)中的惊艳效果所鼓舞,直接尝试训练最新的GAN架构。这种过度宣传确实存在。深度学习已成为机器学习中不可否认的力量,也是数据建模者的重要工具。它的普及催生了TensorFlow和PyTorch等关键框架,这些框架在深度学习之外也颇有价值。失败者逆袭的故事激励着研究人员重新审视进化方法、强化学习等以前模糊的方法。但深度学习并非万能。且不说“天下没有免费的午餐”,深度学习模型非常精微,需要仔细甚至昂贵的超参数搜索、调整和测试。而且很多情况下,从实践角度看,使用深度学习毫无意义,更简单的模型反而表现更佳。
深度学习不仅仅是.fit()
还有一个方面在其他机器学习领域有所缺失:大多数深度学习教程和入门资料只描述模型由层级连接的节点组成,第一层是输入,最后一层是输出,然后用某种随机梯度下降(SGD)训练。可能简要介绍SGD和反向传播,但重点往往放在网络类型(卷积、循环等)上,优化方法本身关注不足。这很不幸,因为深度学习能奏效的最大原因之一正是这些特定的优化方法。如何优化参数、如何分割数据,从而在合理时间内获得良好收敛,至关重要。虽然SGD为何如此关键仍不完全清楚,但已有一些线索。一种有趣的解释是将SGD视为执行贝叶斯推理的一部分。本质上,每次做数值优化时,都带着特定假设和先验在执行贝叶斯推理。甚至有“概率数值计算”这个领域专门研究这一角度。SGD也不例外:最新研究表明,该过程实际上是一个马尔可夫链,在某些假设下可以看作后验变分近似的稳态分布。所以当你停止SGD并取最后参数时,相当于从这个近似分布中抽样。这个想法很有启发性,因为优化器参数(比如学习率)因此更有意义。增大学习率时,马尔可夫链变得不稳定,找到大面积采样的局部极小值——方差增大。减少学习率时,链慢慢接近狭义极小值,直至收敛到一个区域——偏差增大。批量大小也类似:小批量倾向于较大区域,大批量倾向于小区域。
SGD根据学习速率或批量大小选择较大或极限最小值
这种复杂性意味着深度网络的优化器变得至关重要:它是模型的核心部分,与层架构同等重要。这与机器学习中的许多其他模型不同:线性模型(包括正则化的LASSO)和支持向量机SVM都是凸优化问题,没那么精细,只有一个答案。这就是为什么来自其他领域、习惯用scikit-learn工具的人在遇到深度学习时,会困惑于没有简单的.fit() API。虽然skflow等工具尝试将网络简化成.fit()签名,但这有点误导,因为深度学习的全部重点就在于灵活性。
何时不需要深度学习?
那么,什么时候深度学习不适合某些任务呢?从实践经验来看,以下几种情况下,深度学习更多是一种阻碍而非福音。
低预算或低投入问题
深度网络非常灵活,有各种架构、节点类型、优化器和正则化策略。根据应用,模型可能有卷积层(多大?用什么池操作?)或循环结构(有没有门控?);可能真的深(沙漏结构、孪生网络等)还是只有几个隐藏层(多少单元?);可能用ReLU或其他激活函数;可能有或没有Dropout(哪一层?比例多少?);权重应该用L1还是L2正则化,或其他。这只是一部分,还有很多其他类型的节点、连接甚至损失函数。仅训练一个大型网络的例子,调参和探索框架的过程就极其耗时。谷歌最近吹嘘的AutoML方法可以自动寻找最佳架构,但需要超过800个GPU全天候运行数周,对绝大多数人遥不可及。关键在于,训练深层网络在计算和调试上的代价巨大。这种成本对许多日常预测问题并不合理,即使只是调一个小网络,投资回报率也可能太低。即使预算和承诺足够,也没理由不尝试替代方法做基准测试——你可能会惊喜地发现,线性SVM就够用了。
解释和传达模型参数对一般受众的重要性
深度网络也是出了名的黑箱,预测能力强但可解释性差。虽然最近有显著性图、激活差异等工具,在某些领域很好用,但无法完全迁移到所有应用中。这些工具在确保网络不会通过记住数据集或关注特定虚假特征来欺骗你时很好,但很难将每个特征的重要性解释为深度网络的整体决策。这个领域没有什么能真正打败线性模型,因为学习系数与响应直接相关。当把这些解释传达给一般受众时尤其重要。例如,医生需要各种数据确认诊断,变量和结果的关系越简单直接,医生就越能利用。另外,有些情况下模型精度不像可解释性那么重要。比如策略制定者可能想知道某些人口统计变量对死亡率的影响,相比预测准确性,他们可能对直接近似关系更感兴趣。在这两种情况下,深度学习不如更简单、更易于理解的方法。
建立因果机制
模型可解释性的极端情况是建立机械模型,即真正捕捉数据背后现象的模型。例如猜测两个分子(药物、蛋白质、核酸等)是否在特定细胞环境中相互作用,或假设特定营销策略如何影响销售。在这个领域,老式的贝叶斯方法仍然是表达和推断因果关系的最佳方式,而且能融合专家意见。Vicarious有最新研究成果表明,这种更原则的方法在视频游戏任务中比深度学习表现更好。
学习“非结构化”特征
这可能有些争议。深度学习擅长的一个领域是为特定任务找到有用的数据表示,例如前面提到的词嵌入。自然语言有丰富而复杂的结构,可以用“上下文感知”网络近似:每个单词都能用向量表示,编码其经常使用的文本。在大型语料库中学到的词嵌入用于另一个语料库的特定任务,有时能提升效果。然而,如果语料库完全非结构化,可能没用。比如通过非结构化关键字列表对对象分类,这些关键字不在任何特定结构中使用(如在句子中),词嵌入不太可能帮助。这种情况下,数据是真正的词袋,这种表示可能已经足够。相反,如果用预训练表示,词嵌入能更好捕获关键字相似度,且成本不高。但还是建议从简单的词袋表示开始,看看能否获得好的预测结果——毕竟词袋的每个维度比词嵌入的槽更容易解读。
前景广阔
深度学习目前异常火爆,资金充足,发展极快。当你在读会议上发表的论文时,它可能已经迭代了两三次了。这给上面列出的几点带来了挑战:深度学习在不久的将来可能在这些情景中变得非常有用。用于解释图像和离散序列的深度学习模型的工具越来越好。Edward等软件将贝叶斯建模与深度网络结合,通过概率编程实现简易贝叶斯推理和自动变分推理,量化神经网络参数的不确定性。长远来看,可能会有一个简化的建模词汇表,指出深度网络的重要属性,从而减少需要尝试的参数数量。
