编者按:Microsoft Semantic Machines资深研究科学家、UC Berkeley计算机科学博士Jacob Andreas对比了机器学习和程序语言的发展史,提出可组合性、模块化是神经网络的重要发展方向。
应用机器学习简史:
每当我们用能力更强、特征更简单、结构性限制更少的模型替换能力更弱、附带手工编写的结构性限制的模型时,模型质量提升了(模型更小,开发用时更短,在未见数据上的概括性更好)。
从NLP领域我们就能举出很多例子:线性模型取代了决策列表;Jelinek说:“我每开掉一个语言学家,语音识别系统的表现就会提高一点”;基于统计的机器翻译;最近一大波论文的实质是“将log-linear模型(双层神经网络)替换为一个三层神经网络”。
程序语言简史:
每当我们用带有少量高层构件的语言替换带有大量简单构件的语言时,程序质量提升了(同等复杂度的程序更短了,开发用时更短,包含bug的可能性降低)。
所有人都不写汇编了,接着,所有人都不写C了。(显然这是粗暴的过度概括,因为还有很多人在写汇编和C。争议更少的说法是使用底层语言写程序的人越来越少,使用底层语言更难写对程序。)
不知道你注意到了没有,在以上两个情形中,我们移动的都是同一个滑块——只不过方向不同。机器学习和程序语言设计最终目标是一致的:让特定的问题求解机器(不管是人类还是优化算法)产生正确的代码。在现实世界中,我们并不是因为机器学习内在地比手写代码更纯粹或者更美才偏爱机器学习——我们使用机器学习是因为它高效。如果今天有人发布了一个包含一些可组合的视觉原语的库,接着突然之间Facebook发现实习生可以比神经网络更高效地解决所有的图像标记问题,那么明天神经网络就会被弃之门外。
实际上,我们现在能够写出这样的库吗?
澄清一下,我指的不是类似OpenCV的东西,让你选择为特定任务预先实现的模型,然后在后处理部分加上你想要的操作。相反,我想要的是一些视觉原语,基于这些原语我们可以这样编写一个分类器:
l
oad(image) andThen
detectObjects andThen
orderBy(salience) andThen
head andThen
name
或者这样给图像自动加上说明:
load(image) andThen
detectObjects andThen
describeAll
或者这样识别人脸:
load(image) andThen
detectObjects andThen
filter(name(_) == Face) andThen
drawBoundaries
detectObjects、describeAll等函数看起来是什么样?目前的经验提示它们应该是神经网络,但不是特定种类的神经网络:它们并不是为完成某个具体任务(比如给图像加上说明)而训练的,而是以可自由组合的方式进行训练:describeAll承诺可以接受任何“检测结果列表之类”的输入(可以直接来自detectObjects,也可以是经过后续过滤的),并生成一个字符串。这些函数的输入和输出都是实向量。无法结构化地强制“检测结果列表之类”的东西实际具有所需的语义,相反,我们完全依赖训练过程。
在当前的真实世界实现中,将网络层视为模块化、预先规定的单元,而将网络视为为特定任务定制的单一模型(需要端到端训练)。不过,一旦我们转移到模块化网络上,我们可以开始进行不存在训练数据的任务。例如,使用上面指定的原语“为图像中的人添加说明”:
load(image) andThen
detectObjects andThen
filter(name(_) == Face)
andThen describeAll
其实我们已经向这个方向迈步了:人们使用图像分类网络的前若干层初始化几乎所有视觉任务;尽管“注意力”是一系列组合多个网络层的复杂操作,人们在描述模型时突然开始将其用作原语。Roger Grosse关于矩阵分解模型的语法的出色论文(arXiv:1210.4856)也多少是这个风格,还有Christopher Olah对视作可复用模块组合的神经网络的类型理论细节的讨论(git.io/fAn4J)。
回到我们之前的程序语言讨论,我们观察到:
手工编写人类检测器对人类来说很难,但对神经网络而言很容易。
给定功能恰当的视觉原语,编写人类描述器很容易。但从头训练完成这一任务的神经网络需要大量人类描述的样本。(我们也许可以说,对人类来说“容易”,对神经网络来说“困难”。)
更进一步,有很多更类似人类而不是神经网络的机器学习技术,使用很小的数据集以及良好的预先指定的原语,比如,程序推导和语义解析。如果我们真的只在乎最少的人类干预,我们可以将指定的视觉原语交给机器学习子系统自动推导。
所以让我们编写这个库!这里有一些问题需要研究:首先,提供给人们的功能原语(或用于程序推导的模块)的正确组合是什么?接着,这些共享的表示真的可以被学习吗?我们如何基于现有的标记数据为这些模块搜寻参数配置?
作为概念证明,我和一些研究人员合作,写了三篇关于可组合模块化神经网络的论文:
Neural Module Networks(arXiv:1511.02799)
Learning to Compose Neural Networks for Question Answering(arXiv:1601.01705)
Modeling Relationships in Referential Expressions with Compositional Modular Networks(arXiv:1611.09978)
原文地址:http://blog.jacobandreas.net/programming-with-nns.html