给人工智能降点温:深度学习不是万能良药
近日,在深度学习领域出现了一场热烈的争论。这一切都要从 Jeff Leek 在 Simply Stats 上发表了一篇题为《数据量不够大,别玩深度学习》(Don't use deep learning your data isn't that big)的博文开始。作者 Jeff Leek 在这篇博文中指出,当样本数据集很小时(这种情况在生物信息领域很常见),即使有一些层和隐藏单元,具有较少参数的线性模型的表现是优于深度网络的。为了证明自己的论点,Leek 举了一个基于 MNIST 数据库进行图像识别的例子,分辨 0 或者 1。他还表示,当在一个使用仅仅 80 个样本的 MNIST 数据集中进行 0 和 1 的分类时,一个简单的线性预测器(逻辑回归)要比深度神经网络的预测准确度更高。
这篇博文的发表引起了领域内的争论,哈佛大学药学院的生物医药信息学专业博士后 Andrew Beam 写了篇文章来反驳:《就算数据不够大,也能玩深度学习》(You can probably use deep learning even if your data isn't that big)。Andrew Beam 指出,即使数据集很小,一个适当训练的深度网络也能击败简单的线性模型。
如今,越来越多的生物信息学研究人员正在使用深度学习来解决各种各样的问题,这样的争论愈演愈烈。这种炒作是真的吗?还是说线性模型就足够满足我们的所有需求呢?结论一如既往——要视情况而定。在这篇文章中,作者探索了一些机器学习的使用实例,在这些实例中使用深度学习并不明智。并且解释了一些对深度学习的误解,作者认为正是这些错误的认识导致深度学习没有得到有效地使用,这种情况对于新手来说尤其容易出现。
首先,我们来看看许多外行者容易产生的偏见,其实是一些半真半假的片面认识。主要有两点,其中的一点更具技术性,我将详细解释。
深度学习是在大数据的背景下火起来的(第一个谷歌大脑项目向深度神经网络提供了大量的 Youtube 视频),自从那以后,绝大部分的深度学习内容都是基于大数据量中的复杂算法。
然而,这种大数据 + 深度学习的配对不知为何被人误解为:深度学习不能应用于小样本。如果只有几个样例,将其输入具有高参数样本比例的神经网络似乎一定会走上过拟合的道路。然而,仅仅考虑给定问题的样本容量和维度,无论有监督还是无监督,几乎都是在真空中对数据进行建模,没有任何的上下文。
可能的数据情况是:你拥有与问题相关的数据源,或者该领域的专家可以提供的强大的先验知识,或者数据可以以非常特殊的方式进行构建(例如,以图形或图像编码的形式)。所有的这些情况中,深度学习有机会成为一种可供选择的方法——例如,你可以编码较大的相关数据集的有效表示,并将该表示应用到你的问题中。
这种典型的示例常见于自然语言处理,你可以学习大型语料库中的词语嵌入,例如维基百科,然后将他们作为一个较小的、较窄的语料库嵌入到一个有监督任务中。极端情况下,你可以用一套神经网络进行联合学习特征表示,这是在小样本集中重用该表示的一种有效方式。这种方法被称作“一次性学习”(one-shot learning),并且已经成功应用到包括计算机视觉和药物研发在内的具有高维数据的领域。
药物研发中的一次性学习网络,摘自 Altae-Tran et al. ACS Cent. Sci. 2017
我听过最多的第二个偏见就是过度宣传。许多尚未入门该领域的人,仅仅因为深度神经网络在其它领域的出色表现,就期待它也能为他们带来神话般的表现提升。其他人则从深度学习在图像、音乐和语言(与人类关系密切的三种数据类型)处理领域的令人印象深刻的表现中受到启发,于是就头脑发热地钻入该领域,迫不及待地尝试训练最新的 GAN 结构。
当然,这种大肆吹捧在很多方面是真实存在的。深度学习在机器学习中的地位不可小觑,也是数据建模方法库的重要工具。它的普及带动了诸如 tensorflow 和 pytorch 等许多重要框架的发展,它们即使是在深度学习之外也是十分有用的。失败者崛起成为超级巨星的故事激励了许多研究员重新审视以前的模糊算法,如进化算法和增强学习。
但任何情况下也不能认为深度学习是万能良药。除了“天下没有免费的午餐”这点之外,深度学习模型是非常微妙的,并且需要仔细甚至非常耗时耗力的超参数搜索、调整,以及测试(文章后续有更多讲解)。除此之外,在很多情况下,从实践的角度来看,使用深度学习是没有意义的,更简单的模型反而能获得更好的效果。
深度学习模型从机器学习的其他领域传来时,我认为还有另外一个方面经常被忽略。大多数深度学习的教程和介绍材料都将模型描述为通过层次方式进行连接的节点层组成,其中第一层是输入,最后一层是输出,并且你可以用某种形式的随机梯度下降(SGD)方法来训练网络。有些材料会简单介绍随机梯度下降是如何工作的,以及什么是反向传播,但大部分介绍主要关注的是丰富的神经网络类型(卷积神经网络,循环神经网络等等)。
而优化方法本身却很少受到关注,这是很不幸的,因为深度学习为什么能够起到很大的作用,绝大部分原因就是这些特殊的优化方法(具体论述可以参考 Ferenc Huszár 的博客以及博客中引用的论文)。了解如何优化参数,以及如何划分数据,从而更有效地使用它们以便在合理时间内使网络获得良好的收敛,是至关重要的。
不过,为什么随机梯度下降如此关键还是未知的,但是现在线索也正零星出现。我倾向于将该方法看成是贝叶斯推理的一部分。实质上,在你进行某种形式的数值优化时,你都会用特定的假设和先验来执行一些贝叶斯推理。其实有一个被称做概率数值计算(probabilistic numerics)的完整研究领域,就是从这个观点开始的。随机梯度下降也是如此,最新的研究成果表明,该过程实际上是一个马尔科夫链,在特定假设下,可以看作是后向变分近似的稳态分布。
所以当你停止随机梯度下降,并采用最终的参数时,基本上是从这个近似分布中抽样得到的。我认为这个想法很有启发性,因为这样一来,优化器的参数(这里是指学习率)就更有意义了。例如,当你增加随机梯度下降的学习参数时,马尔可夫链就会变得不稳定,直到它找到大面积采样的局部最小值,这样一来,就增加了程序的方差。
另一方面,如果减少学习参数,马尔科夫链可以慢慢的近似到狭义极小值,直到它收敛,这样就增加了某个特定区域的偏置。而另一个参数,随机梯度下降的批次大小,也可以控制算法收敛的区域是什么类型,小的批次收敛到较大区域,大的批次收敛到较小区域。
随机梯度下降根据学习速率或批尺寸来选择较大或狭义最小值
这样的复杂性意味着深度网络的优化器非常重要:它们是模型的核心部分,与层架构一样重要。这一点在机器学习的许多其他模型中并不常见。线性模型(甚至是正则化的,像 LASSO 算法)以及支持向量机(SVM) 都是凸优化问题,没有太多细微差别,并且只有一个最优解。这也就是为什么来自其它领域的研究人员在使用诸如 scikit-learn 这样的工具时会感到困惑,因为他们发现找不到简单地提供.fit() 函数的 API(尽管现在有些工具,例如 skflow,试图将简单的网络置入.fit() 中,我认为这有点误导,因为深度学习的全部重点就是其灵活性)。
在什么情况下深度学习不是最理想的呢?在我看来,以下情况中,深度学习更多是一种阻碍,而不是福音。
深度网络是十分灵活的模型,有多种多样的结构和节点模型、优化器以及正则化方法。根据应用场景,你的模型或许要有卷积层(层尺寸多宽?有没有池化操作?),或者循环结构(有没有门控单元?);网络可能真的很深(hourglass,siamese,或其他结构?)还是只是具有很少的几个隐藏层(有多少单元?);它可能使用整流线性单元或其他激活函数;它可能会或可能不会有随机丢弃(在哪一层中?用什么比例?),并且权重应该是正则化的(L1、L2,或者是某些更奇怪的正则化方法?)。这只是一部分列表,还有很多其他类型的节点、连接,甚至损失函数可以去尝试。
即便只是训练大型网络的一个实例,调整许多超参数以及探索框架的过程也是非常耗时的。谷歌最近宣称自己的 AutoML 方法可以自动找到最好的架构,令人印象深刻,但仍然需要超过 800 个 GPU 全天候运行数周,这对于任何人来说几乎都是遥不可及的。关键在于训练深度网络时,在计算和调试部分都会花费巨大的代价。这种消耗对于许多日常预测问题并没有意义,并且调整深度网络的投资回报率太低,即使是调整小型网络。即使有足够的预算和投资,也没有理由不尝试替代方法,哪怕作为基准测试。你可能会惊喜地发现,线性 SVM 就够用了。
深度网络也是很有名的黑匣子,它具有高预测能力但可解释性不足。尽管最近有很多工具,诸如显著图(saliency maps)和激活差异(activation difference),它们对某些领域而言是非常有用的,但它们不会完全被应用到所有的应用中。主要是,当你想要确保网络不会通过记住数据集或专注于特定的虚假特征来欺骗你时,这些工具就能很好地工作,但仍然难以从每个特征的重要性解读出深度网络的整体决策。在这个领域,没有什么能够真正地打败线性模型,因为学习得到的系数与响应有着直接的关系。当将这些解释传达给一般受众,并且他们需要基于此做出决策时,这就显得尤为重要。
例如,医生需要结合各种不同的数据来确认诊断结果。变量和结果之间的关系越简单、越直接,医生就能更好地利用,而不是低估或高估实际值。此外,有些情况下,模型(尤其是深度网络)的精度并不像可解释性那样重要。例如,政策制定者可能想知道一些人口统计变量对于死亡率的影响,并且相较于预测的准确性来说,可能对这种关系的直接近似更有兴趣。在这两种情况下,与更简单、更易渗透的方法相比,深度学习处于不利地位。
模型可解释性的极端情况是当我们试图建立一个机械模型,即实际捕捉数据背后现象的模型。一个好的例子包括试图猜测两个分子(例如药物、蛋白质、核酸等)是否在特定的细胞环境中相互产生影响,或者假设特定的营销策略是否对销售产生实际的影响。在这个领域,根据专家意见,没有什么可以击败老式的贝叶斯方法,它们是我们表示并推断因果关系的最好方式。Vicarious 有一些很好的最新研究成果,说明为什么这个更有原则性的方法在视频游戏任务中比深度学习表现得更好。
这可能是具有争议性的。我发现深度学习擅长的一个领域是为特定任务找到有用的数据表示。一个很好的例子就是上述的词语嵌入。自然语言具有丰富而复杂的结构,与“上下文感知”(context-aware)网络相近似:每个单词都可以通过向量来表示,而这个向量可以编码其经常出现的文本。在 NLP 任务中使用在大型语料库中学习的单词嵌入,有时可以在另一个语料库的特定任务中提升效果。然而,如果所讨论的语料库是完全非结构化的,它可能不会起到任何作用。
例如,假设你正在通过查看关键字的非结构化列表来对对象进行分类,由于关键字不是在任何特定结构中都会使用的(比如在一个句子中),所以单词嵌入不会对这些情况有太大帮助。在这种情况下,数据是一个真正的“词袋”(bag of words),这种表示很有可能足以满足任务所需。与此相反的是,如果你使用预训练的话,单词嵌入并不是那么耗费时力,而且可以更好地捕获关键字的相似度。不过,我还是宁愿从“词袋”表示开始,看看能否得到很好的预测结果。毕竟,这个“词袋”的每个维度都比对应的词嵌入槽更容易解读。
深度学习目前非常火爆,资金充足,并且发展异常迅速。当你还在阅读会议上发表的论文时,有可能已经有两、三种新版本可以超越它了。这给我上述列出的几点提出了很大的挑战:深度学习在不久的将来可能在这些情景中是非常有用的。用于解释图像和离散序列的深度学习模型的工具越来越好。最近推出的软件,如 Edward 将贝叶斯建模和深度网络框架结合,能够量化神经网络参数的不确定性,以及通过概率编程和自动变分推理进行简易贝叶斯推理。从长远来看,可能会有一个简化的建模库,能够给出深度网络具有的显著属性,从而减少需要尝试的参数空间。所以要不断更新你的 arXiv 阅读内容,这篇博文的内容或许一两个月内也会过时。