:::: MENU ::::

TalkingData's Blog

现在开始,用数据说话。

Posts Tagged / 软件

  • 十一 24 / 2017
  • 0
Ideas

锐眼发现 | Andrej Karpathy发文谈神经网络后,引发的对硬件、软件和学件的思考

作者:Uri Yerushalmi

编译:雷锋网

本文转自雷锋网,如需转载请至雷锋网官网申请授权。

雷锋网按:近日,Tesla AI总监Andrej Karpathy发表了一篇关于“Software 2.0”的文章,该文章引发了对未来神经网络的编程方式的更深入探讨,本文就是其中之一。在Software 2.0的基础上,本文作者Uri Yerushalmi还借用了南京大学周志华教授在2016年提出的“学件”(Learnware)的概念,并更详细地讲述了他眼中的“学件”和软件的区别。他山之石,可以攻玉,本着传递更多信息的想法,雷锋网特此编译该文章,供读者讨论。

本文作者Uri Yerushalmi为AI社区Dopamind的创始人, 2008年于以色列Bar-llan University获得计算机和神经科学博士学位。以下是雷锋网编译的文章全文:

本周,我阅读了Andrej Karpathy的“Software 2.0”,他分析了新软件“Software 2.0”与旧软件“Software 1.0”之间的区别。 我和Karpathy有一个非常类似的结论,我们来看看这种新型软件的兴起如何影响软件行业和市场。

软件vs学件

以下是旧软件和Karpathy的帖子中描述的新的适应性软件之间的一些主要区别,我将其称为“学件”(雷锋网注:“学件”(Learnware)的概念最早由南京大学教授周志华2016年提出,是一种包含模型和模型描述模型规约的机器学习应用模型,这些模型可以以共享或定价的方式放在某一个地方,当有新的用户想做自己的应用的时候,可以先去市场上看看有没有可以使用的模型,从而可以部分重用别人的结果而不需要重新开始)。 

软件与学件的差异

“学件”将给软件市场带来什么变化?

您可能已经注意到软件市场开始发生变化,尽管这些变化并不明显。

协作处理和服务导向

在软件中,我们习惯通过库和API(应用程序编程接口)进行相互协作。每个接口的任务都需要定义好,用户通常很清楚在调用接口时做了什么、以及如何做。

举个例子,想象两个没有菜单、按顾客指示烹饪的餐馆:

第一家餐厅叫“旧软件类型”:客人需要准确地给予指示他们想要的餐点该如何烹饪。他们必须出示详细的食谱,以确保他们获得正确的食物。

第二家餐厅叫“学件”,客人会提出更多的抽象要求,比如“我很伤心,给我一些能让我开心的东西”,厨师能够当场创造出最佳的餐点。

很显然,第一家餐厅的一些顾客宁愿避免编写食谱的麻烦而改为在家做饭,对不对?但在第二家餐厅,顾客就算想自己编食谱,臣妾也做不到啊啊啊。

这样的底线通常会导致API用户采取“我最了解我所需要的,所以我会自己编程”的方法(这通常是错误的事情,但这又是另一个故事了)。在学件中,“我会自己做”的方法更加不合理,因为通过简单地定义用户需要什么(例如“在图片中找到一只猫”),开发人员仍然没有接近最终的解决方案。

由于这种巨大差异的客观存在,我认为在不久的将来会有越来越多的协作处理工具和平台出现。

主要影响因素见上表中的F、G、H项

“学件”的应用领域

我们可以将大多数使用软件2.0的方法的商业应用归入“学件”的范畴。这些新应用包括基于视觉和语音识别,视觉生成,语音合成,机器人技术,游戏,翻译,决策等。

主要影响因素见上表中的A项

人才市场

显然,“学件”将大大改变就业的市场格局。无论企业如何设计将知识或数据“喂”给“学件”的工作岗位(如程序员,数据科学家,定量分析),“学件”的培训会越来越普遍和越来越简单,使用这一新软件所需的技能将会发生进化。我预计未来对于开发人员角色的需求将与旧软件程序员完全不同。

主要影响因素见上表中的B、C、D项

“喂知识/数据”的技巧

作为一名软件开发人员,您可以使用C ++、Java或Python等语言将知识编程到软件中。目前,编写和训练“学件”使用相同的技术,然而,常规的软件编程语言视为了能够最好地描述,管理和维护各种指令集而设计的,但在“学件”中,编程知识的关键在于准确地描述最佳的数据流图。因此,我不确定使用旧的编程语言是开发“学件”的最佳方法。

主要影响因素见上表中的C、D项

用于构建学习软件的软件库

近几年来,我们已经看到了这些新的软件库:Tensorflow,Pytorch,Keras,Theano,MXNet …

主要影响因素见上表中的B、C、D项

专用硬件

在具有大型指令集的旧式软件中,引入新硬件需要对编译和代码级别进行调整。相反,在“学件”中,新硬件的使用更加透明。 对“学件”适用的专用硬件的竞赛已经打响,目前NVidia处于领先地位。

主要影响因素见上表中的B、E项

查看黑盒的工具

为了更好地进行开发,我们需要用于查看“学件”的黑盒的工具。如果我们了解每个“学件”如何做出决策,我们可能会更好地训练它。此外,从社会的角度看也更容易获得认可(例如,欧盟成员国预计通过新的立法,规定如果AI的决定出现不公平或随意性,AI的决定可能会被推翻,而在“通用数据保护条例”(GDPR)的早期草案也从法律上规定了所谓的“解释权”)。

主要影响因素见上表中的H项

Dopamine.ai正在对这方面的协作处理解决方案进行努力。如果您有兴趣阅读更多内容或接收我们项目的更新,请点击此处进行订阅

  • 十一 14 / 2017
  • 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。

随时欢迎您 联系我们