https://medium.com/@karpathy/software-2-0-a64152b37c35
Andrej Karpathy
人工智能主任特斯拉。以前在OpenAI的研究科学家和在斯坦福大学的博士生。我喜欢在大型数据集上训练深度神经网络。
我有时会看到人们将神经网络称为“机器学习工具箱中的另一个工具”。他们有一些优点和缺点,他们在这里或那里工作,有时你可以用他们赢得Kaggle比赛。不幸的是,这种解释完全错过了森林的树木。神经网络不仅仅是另一个分类器,它代表了我们如何编写软件的根本转变的开始。他们是软件2.0。
Software 1.0的“经典堆栈” 是我们所熟悉的 - 它是用Python,C ++等语言编写的。它由对程序员编写的计算机的明确指令组成。通过编写每行代码,程序员正在识别程序空间中的一个特定点,并具有一些理想的行为。
相比之下,Software 2.0是用神经网络权重编写的。没有人参与编写这个代码,因为有很多的权重(典型的网络可能有数百万),直接用权重编码是困难的(我试过)。相反,我们对一个理想程序的行为(例如输入输出对实例的一个数据集)指定了一些约束,并使用我们可用的计算资源来搜索程序空间以寻找满足约束条件的程序。在神经网络的情况下,我们将搜索限制在程序空间的一个连续的子集,在那里搜索过程可以用反向传播和随机梯度下降(有点令人惊讶地)有效
事实证明,大部分现实世界的问题具有收集数据比明确写入程序要容易得多的性质。很大一部分明天的程序员不会维护复杂的软件库,编写错综复杂的程序或分析其运行时间。他们收集,清理,操纵,标记,分析和可视化提供神经网络的数据。
软件2.0不会取代1.0(实际上,需要大量的1.0基础设施来训练和推断“编译”2.0代码),但它将占据软件1.0当今所负责的越来越多的部分。让我们来看一些正在进行的过渡的例子,以便更具体一些:
视觉识别过去是由工程特征组成的,机器学习的一点点在最后(如SVM)。从那以后,我们开发了一个机制来发现更强大的图像分析程序(在ConvNet体系结构中),最近我们已经开始寻找体系结构。
语音识别涉及到大量的预处理,高斯混合模型和隐马尔可夫模型,但是现在几乎全部是神经网络。
语音合成在历史上已经用各种拼接机制来处理,但是现在最先进的模型是产生原始音频信号输出的大型虚拟网络(例如WaveNet)。
机器翻译通常是基于短语统计技术的方法,但是神经网络正迅速成为主导。我最喜欢的架构是在多语言环境中进行培训的,在这种环境下,单一模型可以从任何源语言翻译成任何目标语言,在弱监督(或完全无人监督)的环境下翻译。
机器人具有将传感,姿态估计,规划,控制,不确定性建模等问题分解为多个中间表示的显式表示和算法的悠久传统。我们目前还不是很清楚,但加州大学伯克利分校和Google的研究表明,Software 2.0可能能够更好地代表所有这些代码。
游戏。去玩节目已经存在了很长一段时间,但是AlphaGo Zero(一个看着棋盘的原始状态并且发挥作用的ConvNet)现在已经成为了这个游戏中最强大的玩家。我希望在其他领域看到非常相似的结果,比如DOTA 2或者StarCraft。
你会注意到,我上面的很多链接都涉及在Google上完成的工作。这是因为Google目前处于将大部分本身重新编写成Software 2.0代码的最前沿。“ 一个统一所有制度的模式 ”为我们提供了一个初步的概念,即将各个领域的统计强度合并为一个对世界的一致理解。
为什么我们更喜欢将复杂的程序移植到Software 2.0中?显然,一个简单的答案就是他们在实践中更好地工作。但是,还有很多其他方便的理由来选择这个堆栈。让我们来看看软件2.0的一些好处(想一想:一个ConvNet)与软件1.0相比(想一想:一个生产级的C ++代码库)。软件2.0是:
计算均匀。一个典型的神经网络是由一个只有两个操作的三明治构成的:矩阵乘法和零点阈值(ReLU)。将其与经典软件的指令集进行比较,该指令集显得更为异构和复杂。由于您只需为少数核心计算原语(例如矩阵乘法)提供软件1.0实现,就可以更容易地进行各种正确性/性能保证。
很容易烧成硅。作为推论,因为神经网络的指令集相对较小,所以实现这些网络非常容易,比如使用定制的ASIC,神经形态的芯片等。当低能力的智能在我们周围变得普遍时,世界将会改变。例如,小巧便宜的芯片可以附带一个预训练的ConvNet,一个语音识别器,以及一个WaveNet语音合成网络,这些网络都集成在一个小的原生细胞中,您可以附加到任何东西上。
恒定运行时间。典型的神经网络正向传递的每一次迭代都需要完全相同的FLOPS量。根据不同的执行路径,您的代码可能会通过一些庞大的C ++代码库来实现零变化。当然,你可以有动态的计算图,但执行流程通常仍然受到很大的限制。这样我们也几乎可以保证永远不会发现自己处于无意识的无限循环中。
常量内存使用。与上面相关的是,在任何地方都没有动态分配的内存,所以交换到磁盘的可能性也很小,或者你必须在代码中寻找内存泄漏。
它非常便携。与传统的二进制或脚本相比,矩阵乘法的序列在任意的计算配置上运行起来要容易得多。
这是非常敏捷的。如果你有一个C ++代码,并且有人希望你做两倍的速度(如果需要的话,性能上的代价),调整新规范的系统是非常不平凡的。但是,在2.0版软件中,我们可以利用我们的网络,删除一半的通道,重新训练,而且在那里 - 运行速度是两倍,而且工作效率更差一些。这是魔法。相反,如果你碰巧得到更多的数据/计算,只需增加更多的渠道和再培训,就可以立即使你的程序更好地工作。
模块可以融合成一个最佳的整体。我们的软件经常被分解成通过公共功能,API或端点进行通信的模块。但是,如果两个原本分开训练的Software 2.0模块相互作用,我们就可以很容易地在整体上反向传播。想一想,如果你的网络浏览器能够自动地重新设计底层的系统指令10堆栈以达到更高的网页加载效率。2.0,这是默认的行为。
拿起来很容易。我喜欢开玩笑,深度学习是浅薄的。在你做任何有用的事情之前,这不是你需要博士学位的核物理学。基础概念需要基本的线性代数,微积分,Python和CS231n的一些讲座。当然,随着时间的推移,人们可以获得大量的专业知识和直觉,所以更精确的说法是,软件2.0堆栈很容易拾取,但不是很容易掌握。
这比你好。最后,也是最重要的一点,神经网络是一个比任何你或我可以在很大一部分有价值的垂直线上都能提出的更好的代码,目前这至少与图像/视频,声音/语音和文字。
2.0堆栈也有其自身的一些缺点。在优化结束时,我们剩下的大型网络运行良好,但很难说清楚。在许多应用领域,我们将会选择使用我们理解的90%精确模型,或者99%精确模型。
2.0堆栈可能会以不直观和令人尴尬的方式失败 ,或者更糟糕的是,他们可能会“默默地失败”,例如,通过默认的训练数据中的偏见,这些数据很难正确地分析和检查它们的大小在几百万在大多数情况下。
最后,我们仍然发现这个堆栈的一些特殊属性。例如,敌对的例子和攻击的存在突出了这个堆栈的直觉性。
如果将神经网络看作是一个软件堆栈,而不仅仅是一个很好的分类器,很显然,它们具有大量的优势,并且有很大的潜力来改造软件。
从长远来看,软件2.0的未来是光明的,因为许多人越来越清楚,当我们开发AGI时,肯定会写成2.0软件。
和软件3.0?这完全取决于AGI。