来源 | hyperparameter.space
编译 | 聂震坤
我知道以深度学习的缺点来开始本文是不合时宜的,但是此前关于深度学习的一大波讨论我觉得可以很好的引出我观点。一切都是从 Jeff Leek 于 Simply Stats 博客 发表的一篇关于在小样本规模体系中使用深度学习的注意事项文章开始。
简而言之,Jeff Leek 认为当样本规模很小的时候(通常在生物领域很常见),参数较小的线性模型甚至比拥有少量分层和隐藏单元的深网表现更好。为了证明自己的观点,Jeff 展示了一个拥有十个最常见信息特征的简单线性预测,在尝试使用仅 80 个样本的 MNIST 数据组进行 0 和 1 的分类时,它在表现上优于简单深网。
这引起了 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() 签名,但我认为这有点误导,因为深入学习的关键是它的灵活性)。
▌什么时候不应使用深度学习
结合以上的观点,深度学习不适用于什么样的任务?依我之见,以下这些主要场景的深度学习弊大于利。
低成本或者低承诺问题
深网是非常灵活的模型,有着许多架构和节点类型,优化器和正则化策略。根据应用,你的模型可能会有卷基层(有多宽?使用什么汇集操作?)或者反复结构(有没有门?);他也有可能很深(沙漏,暹罗或其他许多架构?)又或者只是几个隐藏的层(有多少个单元?); 它可能使用整流线性单元或其他激活功能;它可能或可能没有流失dropout(在哪一层?哪一块?)占比应该是恰当的(l1,l2,或者是某些东西)。这只是一个部分列表,有很多其他类型的节点,连接,甚至丢失的功能等着我们尝试。
这些是调整和架构探索的很多超参数,当训练大型网络的一个实例时可能非常耗时。谷歌最近吹嘘自己的 AutoML 管道可以自动找到最好的架构,这是非常令人印象深刻的,但仍然需要超过 800 个 GPU,全天候工作数周,这对正常人来说是很难实现的。问题的关键在于训练深网需要大量的成本用于计算和调试。这种费用对于许多日常预测问题并没有意义,即使调整小型网络,调整网络的投资回报率也可能太低。即使有足够的预算和承诺,也没有理由不尝试基准替代方法。您可能会惊喜地发现,线性SVM真的是您需要的。
解释和传达模型参数对一般观众的重要性
深网另一个令人诟病的原因是其徒有高预测能力却很难解释清楚。尽管最近有很多工具,如 Saliency 地图和 Activation Differences(https://arxiv.org/abs/1704.02685),对某些领域而言是非常有用的,但它们并不会完全转移到所有应用程序上。
这主要是因为,当您想要确保网络不会通过记住数据集或专注于特定的虚假特征来欺骗您时,这些工具就能很好地工作,但是对于深层网络的整体决策来说,仍然难以将每个特征的重要性进行解释。在这个情况下,没有什么是可以真正的打败线性模型的,因为学习的难度与客户反应有直接的关系。当将这些解释传达给需要根据它们作出决定的一般观众时,这尤其重要。
举个例子,医生需要根据不同的数据来作出诊断,变量和结果之间的关系更简单更直接,医生则能更好的利用它,而不是低估/高估其价值。此外,有些情况下,模型的准确性(通常是深度学习所擅长的)并不像解释性那样重要。比如,决策者可能想知道人口变量对死亡率的影响,可能会对直接近似关系感兴趣,而不是预测的准确性。从以上两个例子,不难看出与更简单,更加渗透的方法相比,深度学习处于不利地位。
建立因果机制
模型解释的极端情况是当我们试图建立一个机械的模型,即一个实际捕获数据背后的现象的模型。好的例子包括试图猜测两个分子(例如药物,蛋白质,核酸等)是否在特定的细胞环境中相互作用,或者假设特定的营销策略如何对销售产生实际的影响。在这个领域没有什么能真正的击败专家的老式贝叶斯方法(可能不完美);他们是我们表达和推断因果关系的最好方法。Vicarious最近有一些很好的研究证明了为什么更有原则的手段比游戏任务中的深度学习更好。
从“非结构化”功能中学习
这一条可能有待争论。我发现深入学习擅长的一个领域是为特定任务找到有用的数据表示。一个很好的例子是上述的词语嵌入。自然语言具有丰富而复杂的结构,可以通过“上下文感知”来学习,每个单词都可以用向量来表示并编码程其最常用的内容。为了NLP任务在大型语料库中学习使用单词嵌入有时可以在另一个语料库的特定任务中提升效果。
然而,如果所讨论的语料库是完全非结构化的,则可能没有任何用处。例如,假设您正在查看非结构化的关键字列表来对对象进行分类。由于关键字不是在任何特定的结构中使用(如在一个句子中),所以字嵌入不太可能有帮助。在这种情况下,数据是真正的一个单词,这种表示可能足以满足任务。与此相反的是,如果您预培训深度学习的话,并且可以更好地捕获关键字相似度,那么字嵌入的代价并不高。不过,我还是宁愿从一个词包的表示开始,看看能否得到很好的预测。毕竟,这个词包的每个维度都比对应的字嵌入槽更容易解读。
▌前路漫漫
深度学习领域现在很热门,资金充足,并且正在快速发展。当你阅读在会议上发表的论文的时候,它很可能又经历了两三次迭代并且已经不推荐了。这给我以上提出的观点相符:深度学习在不久的将来可能对这些情景来说是非常有用的。用于解释图像和离散序列的深度学习模型的工具越来越好。
最近的软件,如融合了贝叶斯建模的 Edward 深层框架,允许量化神经网络参数的不确定性和容易的贝叶斯推理通过概率进行编程和自动变分推理。从长远来看,可能会有一个减少的建模词汇表,它会揭露深层网络可以具有的显着属性,从而减少需要尝试的东西的参数空间。因此,继续刷新你的 arXiv 吧,也许这篇文章在一两个月后就过时了。
Edward 与 TensorFlow 结合概率规划,支持深度学习和贝叶斯模型,摘自 Tran 等人的 ICLR 2017 论文
原文:http://hyperparameter.space/blog/when-not-to-use-deep-learning/
新一年,AI科技大本营的目标更加明确,有更多的想法需要落地,不过目前对于营长来说是“现实跟不上灵魂的脚步”,因为缺人~~
所以,AI科技大本营要壮大队伍了,现招聘AI记者和资深编译,有意者请将简历投至:gulei@csdn.net,期待你的加入!
如果你暂时不能加入营长的队伍,也欢迎与营长分享你的精彩文章,投稿邮箱:suiling@csdn.net
如果以上两者你都参与不了,那就加入AI科技大本营的读者群,成为营长的真爱粉儿吧!后台回复:读者群,加入营长的大家庭,添加营长请备注自己的姓名,研究方向,营长邀请你入群。
☟☟☟点击 | 阅读原文 | 查看更多精彩内容