:::: MENU ::::

TalkingData's Blog

现在开始,用数据说话。

锐眼洞察 | 软件2.0(翻译)

Tech

锐眼洞察 | 软件2.0(翻译)

作者:Andrej Karpathy,Director of AI at Tesla

原文:Software 2.0

译者:TalkingData首席架构师 黄洋成(YC)

本译文禁止商用,转载请注明来源与译者!

 

我时常会看到人们将神经网络称为不过是“机器学习工具箱中的另一个工具”。他们有种种的优点和缺点,他们可以在这种或那种情况下发挥作用,有时你可以用他们赢得Kaggle比赛。不幸的是,这种解释完全是只见树木不见森林。神经网络不仅仅是另一个分类器,它代表了我们如何编写软件的根本性转变的开始。他们是软件2.0。

我们所熟悉的Software 1.0的“经典堆栈”是用Python,C ++等计算机语言来编写的;它由一系列程序员编写的针对计算机的明确指令组成。程序员通过编写一行行代码来识别程序空间中的一个特定点,让程序执行一些期望的行为。

相比之下,软件2.0是用神经网络权重编写的。没有人会参与编写这个代码,因为有太多的权重(典型的网络可能有数百万),而且直接用权重来编码是很困难的(我就试过)。相反,我们对一个目标程序的行为指定了一些约束(比如包含一系列输入/输出对的数据集),然后使用我们干预的计算资源在程序空间中搜索满足约束条件的程序。在神经网络的情况下,我们将搜索限制在程序空间的一个连续的子集,在那里搜索过程可以利用反向传播和随机梯度下降来变得(有点出乎意料的)高效。

事实证明,大部分现实世界的问题都有一个性质,那就是收集数据远比编写程序要容易得多。很大一部分明天的程序员不会维护复杂的软件库,编写错综复杂的程序或分析其运行时间。他们收集,清理,操纵,标记,分析和可视化提供神经网络的数据。

软件2.0不会取代1.0(实际上,需要大量的1.0基础设施来执行训练和推断以“编译”2.0代码),但是它将接管软件1.0当今负责的越来越多的部分。让我们来看一些正在进行的过渡的具体的例子:

视觉识别过去由大量的人工构造的工程特征组成,在这个基础上最后用了一丁点机器学习(比如SVM)。从神经网络出现以后,我们利用卷积网络体系结构开发了一系列的强大的图像分析程序;而最近我们已经开始自动寻找体系结构的尝试(https://arxiv.org/abs/1703.01041)。

语音识别涉及到大量的预处理,高斯混合模型和隐马尔可夫模型;但是现在(https://github.com/syhw/wer_are_we)几乎全部是神经网络。

语音合成在历史上已经用各种拼接机制来处理,但是现在最先进的模型是直接产生原始音频信号输出的大型卷积网络(例如WaveNet,https://deepmind.com/blog/wave … tant/)。

机器翻译通常是基于短语统计技术的方法,但是神经网络正迅速成为主导。我最喜欢的架构是在多语言环境中进行训练的(https://arxiv.org/abs/1611.04558);在这种环境下,单一模型可以从任何源语言翻译成任何目标语言,模型工作在弱监督下(或完全无人监督, https://arxiv.org/abs/1710.11041)的设置下。

机器人传统上将问题分解为感知,姿态估计,计划,控制,不确定性建模等不同模块;使用的方法是显式表征和一些基于中间表征的算法。我们目前还不是很清楚,但加州大学伯克利分校(https://www.bloomberg.com/feat … obots/)和Google(https://research.googleblog.co … m.html)的研究表明,Software 2.0可能能够更好地代表所有这些代码。

游戏。围棋程序已经存在了很长一段时间,但是AlphaGo Zero(一个看着棋盘的原始状态来下棋的卷积网络,https://deepmind.com/blog/alph … atch/)现在已经成为了这个游戏中最强大的玩家。我预计在其他领域会看到非常相似的结果,比如DOTA 2(https://blog.openai.com/more-on-dota-2/)或星际争霸(https://deepmind.com/blog/deep … nment/)。

你会注意到,我上面的很多链接都涉及在Google上完成的工作。 这是因为Google目前处于将大部分本身重新编写成Software 2.0代码的最前沿。 “一个模型解决所有问题,https://arxiv.org/abs/1706.05137”为我们提供了一个关于这个可能会发展成什么样的一个早期的图景;即将各个独立领域的统计合并为一个对世界的一致理解。

软件2.0带来的好处

为什么我们倾向于把复杂的程序移植到Software 2.0?显然,一个简单的答案就是他们在实际中工作的更好。但是,还有很多其他的理由让我们优选Software 2.0。让我们来看看Software 2.0(比如ConvNet)相比于Software 1.0(比如一个生产级的C ++代码库)带来的一些好处,软件2.0是:

计算同质化。一个典型的神经网络是只有两类操作的三明治结构:矩阵乘法和零点阈值(ReLU)。将其与经典软件的指令集进行比较,经典软件指令集则显得更为异构和复杂。由于您只需为少数核心计算原语(例如矩阵乘法)提供软件1.0实现,就可以更容易地进行各种实现正确性和性能保证。

很容易烧成硅。作为推论,因为神经网络的指令集相对较小,所以可以更容易的在非常接近硅的层面(芯片层)实现这些网络,比如用定制的ASIC(专用集成电路),神经形态的芯片等等。当低能耗的智能在我们周围变得普遍时,世界将会改变。例如,小巧便宜的芯片可以附带一个预训练的卷积网络,一个语音识别器和一个WaveNet语音合成网络,所有这些都集成在一个小的原脑中,你可以把它附加到任何东西上。

固定的运行时间。典型的神经网络正向传递的每一次迭代都需要完全相同FLOPS的计算量;而传统的一些庞大的C ++代码库来实现的Software 1.0,则基于不同的代码执行路径,执行时间会有很大变化。当然,你可以有动态的计算图,但执行流程通常仍然受到很大的限制。这样我们也几乎可以保证永远不会发现自己处于无意的无限循环中。

常量内存使用。与上面相关的是,在任何地方都没有动态分配的内存,所以内存交换到磁盘的可能性也很小,你也不需要在代码中寻找内存泄漏。

非常易于移植。与传统的二进制代码或脚本相比,矩阵乘法的序列在任意的计算环境上运行起来要容易得多。

非常灵活。如果你有一个C ++代码,有人希望你将运行速度提高两倍(如果需要的话,可以付出一些性能上的代价),调整系统去满足新的规范是非常不容易的。但是,在2.0版软件中,我们可以找出我们的网络,删除一半的通道,重新训练,就得到期望的结果 – 运行速度是原来两倍,而运行性能稍微差一点。这就像是魔法。相反,如果你碰巧得到更多的数据/计算力,只要增加更多的通道和再训练,你就可以立即使你的程序更好地工作。

模块可以融合成一个更优的整体。我们的软件经常被分解成通过公共组件,API或端点进行通信的模块。但是,如果两个原本分开训练的Software 2.0模块相互作用,我们就可以很容易地在整体上进行反向传播。想一想,如果你的网络浏览器能够自动地调整涉及到多达10层的底层系统以达到更高的网页加载效率。 在Software 2.0,这是缺省的行为。

很容易入门。我喜欢开玩笑,深度学习是浅薄的。不像核物理,在你能做任何有用的事情之前,需要先考个博士学位。基础概念需要基本的线性代数,微积分,Python和像CS231n的一些讲座。当然,随着时间的推移,人们可以获得大量的专业知识和直觉;所以更精确的说法是,软件2.0堆栈很容易入门,但不是很容易精通。

做的比你好。最后,也是最重要的一点,神经网络在很大一部分有价值的垂直领域里都能做出比任何你或我可以写出的更好的代码,目前至少在与图像/视频,声音/语音和文字相关的领域里是这样。

软件2.0的局限性

2.0堆栈也有其自身的一些缺点。在优化结束时,我们得到的大型网络运行良好,但很难说清楚为什么。在许多应用领域,我们将会需要选择到底是使用我们理解的但是精确度只有90%的模型,还是99%精确度但是我们并不理解的模型。

2.0堆栈可能会以不直观和令人尴尬的方式失败(https://motherboard.vice.com/e … sexist),或者更糟糕的是,他们可能会“默默地失败”,例如,学习到训练数据中的一些偏见;而这些数据集很难被正确地分析和检查,因为它们的大小通常都在几百万级别。

最后,我们仍然发现这个堆栈的一些特殊属性;例如,对抗样本(https://blog.openai.com/advers … earch/)和其他的一些攻击(https://github.com/yenchenlin/ … arning)的存在突出了这个堆栈的不直观的本质。

最后几个想法

如果将神经网络看作是一个软件堆栈,而不仅仅是一个很好的分类器,很显然就能发现它们具有大量的优势,并且有很大的潜力来改造现有的软件。

从长远来看,软件2.0的未来是光明的,因为许多人越来越清楚,当我们开发AGI(Artificial general intelligence)时,肯定会写成2.0软件。

而软件3.0?这完全取决于AGI。

Leave a comment

随时欢迎您 联系我们