【编者按】Andrej Karpathy,特斯拉AI部门主管、前OpenAI研究科学家、Stanford PhD,昨天发表博客,认为神经网络意味着软件开发方式将发生基础性改变,软件开发将步入2.0时代。
我有时候发现人们认为神经网络只不过是机器学习工具箱中的又一件工具。神经网络有一些优势,也有一些劣势。神经网络在这里和那里都能发挥作用。有时候你可以使用神经网络赢得Kaggle竞赛。不幸的是,这一阐释完全是只见树木不见森林。神经网络并不仅仅是又一种分类器,它是一个开端,意味着我们开发软件的方式将发生基础性的改变。神经网络是软件2.0。
我们都很熟悉软件1.0的“经典堆栈”。它们由Python和C++之类的语言编写,包括程序员编写的给计算机的明确指令。编写每一行代码的时候,程序员辨认了程序空间内具有某种所需的行为的特定点。
相反,软件2.0由神经网络的权重编写,其中并不牵涉人写的代码,因为权重的数量太多了(典型的网络可能有数百万个权重),直接基于权重编码太难了(我尝试过)。作为替代,我们指定所需程序的一些行为上的约束(例如,一个数据集的输入将输出成对的例子),同时使用计算资源来处理数据,以便在程序空间中搜寻满足这些约束的程序。就神经网络而言,我们将搜索限制在程序空间中的一个连续子集,在这个子集中,我们可以通过反向传播和随机梯度下降高效地进行搜索。某种程度而言,这一过程惊人地高效。
我们发现现实世界中很大一部分的问题具有某种性质,使搜集数据比明确地编写程序要简单不少。未来有很大一部分的程序员不会维护复杂的软件仓库,编写错综复杂的程序,或分析这些程序的运行时间。他们将搜集、清洗、操作、标记、分析和可视化那些传入神经网络的数据。
软件2.0不会取代1.0。实际上,训练和推断(以便“编译”2.0代码)神经网络需要1.0的大量基础设施。但是,软件2.0将逐渐代替越来越多现在软件1.0负责的工作。让我们查看一些这一正在进行的过渡的例子,以获得更具体的认识:
视觉辨识曾经由设计的特征和在其基础上加上的一点机器学习技术组成,例如,SVM。后来我们发展了探索远为强大的图像分析程序的机制(卷积网络家族),最近我们又开始尝试基于架构搜索。
语音识别曾经涉及大量的预处理、高斯混合模型和隐马尔可夫模型,现在基本上完全由神经网络组成。
语言合成在历史上使用了各种拼合的机制,不过现在第一流的模型是WaveNet之类的大型卷积网络,它们直接产生原始音频信号输出。
机器翻译过去通常使用基于词组的统计技术,但是神经网络很快就占据了统治地位。我最喜欢的架构使用多语言设定,单一的模型将任意源语言翻译为任意目标语言,该模型基于弱监督或者无监督学习。
机器人有一个长期的传统,将问题分解为传感、姿态估计、规划、控制、不确定性建模等部分,更多地使用明确的表示和算法而不是一些中间表示。我们在这方面进展不大,但是UC Berkeley和Google的研究提示我们,软件2.0在这个领域的表现可能会比传统方法要好很多。
游戏 围棋程序很早就有了,但是AlphaGo Zero(一个查看棋盘原始状态来决定如何落子的卷积网络)成为今时今日最强的玩家。估计我们会在其他领域看到非常相似的结果,例如,DOTA 2和星际。
你会注意到我上面的很多链接涉及Google的成果。这是因为,在以软件2.0的方式重写自身大量代码的运动中,Google一马当先。“单一模型决定一切”一文粗略地勾勒出这在未来会是什么样子,独立领域的统计强度将融为一体,形成一个对这个世界的统一认知。
软件2.0的效益
为什么我们会选择将复杂的程序移植到软件2.0?很明显,一个容易的回答是它们在实践中效果更好。然而,还有其他便利因素促使我们选择软件2.0。让我们比较一下软件2.0(想想卷积网络)和软件1.0(想想一个用于生产环境的C++代码基)。软件2.0具有以下特性:
计算同构 一个典型的神经网络,从原理上来说,是一块仅包含两种操作的三明治:矩阵乘法和以0为阈值的ReLU函数。与此相比,经典软件的指令集显然要更加异构,也更加复杂。由于你仅仅需要为很少的核心计算原语(比如矩阵相乘)提供软件1.0实现,各种正确性/性能保证也更容易实现。
更易贴近硬件 因为神经网络的指令集相对较小,以更贴近硬件的方式实现这些网络明显要更容易,例如,基于定制的ASIC和神经形态芯片。当我们的身边遍布低功率的智能时,世界将由此改变。例如,一块小型廉价的芯片可以包含一个预训练的卷积网络、一个语音识别器、一个WaveNet语音合成网络,全部集成在一个小型原脑之内。这个原脑可以附加在任何东西上。
常数运行时间 典型的神经网络前向通过的每一次迭代占用相同数目的FLOPS。在某个杂乱无序的C++代码基上,你的代码可能选择不同的执行路径,然而,这并不会带来什么变化。当然,你可能有动态计算图,但是执行流通常仍然可控。这样我们也基本上保证了不会陷入一个意料之外的无限循环。
常数内存使用 同理,由于不会出现动态分配内存的情形,需要交换内存到磁盘,或者需要查找代码中的内存泄露的情形也不太可能发生。
高可移植性 相比传统的二进制文件或脚本,一系列矩阵乘法显然更容易在随意的计算系统配置下运行。
非常敏捷 如果你有一些C++代码,然后有人想要你让这些代码的运行速度增加一倍(如果有必要的话不惜为此降低表现),为新规格调整系统可是一项大工程。然而,在软件2.0中,我们可以从网络中去掉一半通道,重新训练,然后,一切都水到渠成——这个网络运行的速度恰好是原来的两倍,效果比原来差一点。这是魔法。反之,如果你碰巧有更多的数据,或者要进行更多的运算,你可以增加通道并重新训练,立刻让你的程序表现得更好。
模型可以融入一个最佳整体 我们的软件常常可以分解为通过公开函数、API和端点通讯的模块。然而,如果有两个原本独自训练的软件2.0模块,我们可以很容易地通过整体进行反向传播。想象一下,你的网络浏览器可以自动地重新设计比自身低10层的底层系统指令,以更高效地加载网页,那该有多么令人惊讶。这将是2.0的标配。
易于学习 我喜欢开玩笑说深度学习是肤浅的。这可不是核物理,你需要一个博士学位才能做出点有用的东西。理解构成深度学习的基础概念需要基本的线性代数、微积分、Python和CS231n的一些讲座。当然,有很多专业技能和直觉是需要逐渐积累的。所以一个更准确的说法是,软件2.0易学难精。
比你强 最后,也是最重要的,在很多垂直领域,神经网络比你和我编写的代码效果更好。目前,这样的垂直领域至少包括图像/视频、音响/语音和文本。
软件2.0的局限
软件2.0也有一些自身的局限。优化之后,我们有了一个效果很好的巨大网络,然而,我们很难解释它为什么效果好。在许多应用领域,我们要么选择一个我们能够理解的具有90%准确率的模型,要么选择一个具有99%准确率但我们不理解的模型。
软件2.0可能以一种违反直觉且令人尴尬的方式失败,或者更糟,“默默地失败”,例如,默默地选用训练数据中的偏差,这通常非常难以妥善地分析和检查,因为在大多数案例中,训练数据很容易达到数百万的规模。
最后,我们仍不断发现软件2.0的一些古怪特性。例如,对抗样本和攻击的存在突出了软件2.0的反直觉本质。
最后一些想法
如果你把神经网络看作软件堆栈而不仅仅是一个不错的分类器,那你很快就会发现,神经网络具有很多优势和潜能,足以转变整个软件行业。
从长远来看,软件2.0的未来是光明的,因为AGI(通用人工智能)一定会基于软件2.0来编写,很多人觉得这一点越来越显而易见。
至于软件3.0?那完全取决于AGI。
原文 Software 2.0