首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

神预言:Andrej Karpathy和他的”软件2.0”(基于神经网络的软件设计)一文

在这个访谈里,Andrej提到了自己几年前提出的一个概念:Software2.0。这个初看没啥吸引力的词其实指向了Andrej一个高度前瞻性的思考:基于神经网络的软件设计。

本文整理了Andrej 在5年前,2017年底写于博客的文章:Software 2.0,让我们一起领略大神的战略性眼光:

当时Transfomer论文刚诞生完全没普及,神经网络依然是CNN(卷积神经网络)的天下,Andrej就在这篇博客里断言了大一统模型的存在,提出了基于神经网络的编程思想;甚至,明确提出,AGI必将由神经网络实现。

这篇文章所指出的方方面面, 今天基本都已经陆续被证实。今天,所有的软件代码都值得用神经网络改造一遍。而这个思考,早在5年前,就已淋漓尽致的体现在Andrej的这篇博客里。

所有做软件的同学都应该看看这篇文章。

不过,Andrej大神也不是没毛病,这篇文章当时没引起太多反响;在城主看来,罪魁祸首实属起了个糟糕透顶的名字;如当时Andrej能想出一个类似“Transformer模型 /注意力机制” 这样吸引人的概念名,说不准这文章思想早就广泛传播了。

(此外,有点意思的是, 这篇文章也是Andrej 公开更新的最后一篇博客。按照时间线,之后Andrej应就是直接参与创办OpenAI了。公开博客/油管更新结束在了2017年底。 看,大佬断更是中外惯例。。。)

--以下是博客全文--

Software 2.0

作者:Andrej Karpathy, 2017年11月12日

我有时会看到人们把神经网络简单地认为是“机器学习工具箱中的另一种工具”。它们有一些优点和缺点,在某些情况下有效,有时可以用来赢得Kaggle比赛。不幸的是,这种解释完全忽略了问题的本质。神经网络不仅仅是另一种分类器,它代表着我们开发软件的基本转变的开始。它们就是软件2.0。

软件1.0的“经典堆栈”是我们都熟悉的——它是用Python、C++等语言编写的。它由程序员编写的向计算机发出明确指令的代码组成。通过编写每一行代码,程序员在程序空间中的特定点识别出一些理想的行为。

相比之下,软件2.0是用更抽象、更不人性化的语言编写的,比如神经网络的权重。没有人参与编写这段代码,因为有很多权重(典型的网络可能有数百万个),直接用权重编码有点难(我试过)。

相反,我们的方法是指定某种理想程序行为的目标(例如,“满足一组输入输出示例的数据集”或“赢得一局围棋”),编写粗略的代码骨架(即神经网络架构)来识别程序空间的子集进行搜索,并使用我们的计算资源搜索这个空间寻找可工作的程序。在神经网络的情况下,我们将搜索限制在程序空间的连续子集,其中搜索过程可以用反向传播和随机梯度下降令人惊讶地高效地进行。

为了明确这个类比,在Software 1.0中,人工编写的源代码(例如一些.cpp文件)被编译成可执行有用工作的二进制文件;在Software 2.0中,源代码通常包括 1)定义理想行为的数据集和 2)给出代码粗略骨架的神经网络架构,但有许多细节(权重)需要填写。训练神经网络的过程将数据集编译成二进制文件——最终的神经网络。

在今天的大多数实际应用中,神经网络架构和训练系统正在标准化为大宗商品,所以大部分活跃的“软件开发”采取标注数据集的整理、增长、处理和清理的形式。

这基本上改变了我们迭代软件的编程范式,因为团队分为两部分:2.0程序员(数据标注者)编辑和增加数据集,而一些1.0程序员维护和迭代周围的训练代码基础设施、分析、可视化和标注接口。

事实证明,现实世界的大部分问题具有这样的属性:收集数据(或更普遍地,识别理想行为)明显比显式编写程序更容易。由于这个原因以及我将在下文讲到的Software 2.0程序的许多其他优点,我们正在见证行业范围内大规模转变,许多1.0代码正在转换为2.0代码。软件(1.0)正在吞噬世界,现在AI(软件2.0)正在吞噬软件。

持续转变

让我们简要审视这个正在进行的转变的一些具体例子。

在这些领域中的每一个,在过去几年里,当我们放弃试图通过编写显式代码来解决复杂问题,转而将代码转化为2.0技术栈时,我们看到了改进。

视觉识别过去由设计的特征加上一点点传统机器学习(例如,SVM支持向量机)组成。从那时起,通过获得大规模数据集(例如ImageNet)并在卷积神经网络架构的空间中搜索,我们发现了更强大的视觉特征。最近,我们甚至不信任自己手动编码架构,我们已经开始在其上搜索。

语音识别过去涉及大量预处理、高斯混合模型和隐马尔可夫模型,但今天几乎完全由神经网络组成。一条非常相关的、经常被引用的幽默引语归因于Fred Jelinek在1985年的话:“每次我解雇一位语言学家,我们的语音识别系统的性能就会提高”。

语音合成历史上采用各种拼接机制来实现,但今天最先进的模型是产生原始音频信号输出的大型卷积网络(例如WaveNet)。

机器翻译通常采用基于短语的统计技术,但神经网络正在迅速成为主流。我最喜欢的架构是在多语言环境下训练的,其中一个模型可以从任何源语言翻译到任何目标语言,在弱监督(或完全无监督)环境下。

游戏。明确手动编码的围棋程序已经开发了很长时间,但AlphaGo Zero(一个查看棋盘原始状态并下棋的卷积网络)现在已成为该游戏最强大的玩家。我预计我们将在其他领域看到非常类似的结果,例如DOTA 2或StarCraft。

数据库。人工智能之外的更传统系统也显示出早期转变的迹象。例如,“学习索引结构案例”用神经网络替换数据管理系统的核心组件,速度提高了最高70%的同时节省了一个数量级的内存。

您会注意到,我上面许多涉及谷歌完成的工作。这是因为谷歌目前处于将自己的大部分内容重新编写为Software 2.0代码的前沿。“一种模型统治天下”初步描绘了这可能是什么样子,各个领域的统计优势被融入到对世界的一致理解中。

(注:这真是对今天Transformer大模型一统天下的神预言)

软件2.0的好处

为什么我们应该将复杂程序移植到Software 2.0中?

显然,一个简单的答案是它们在实践中效果更好。然而,还有很多其他方便的理由更倾向于这个堆栈。让我们看看Software 2.0(卷积网络)与Software 1.0(产品级C++代码库)相比的一些优点。

Software 2.0是:

计算均匀。一个典型的神经网络基本上由两种操作组成:矩阵乘法和零阈值(ReLU)。与之相比,经典软件的指令集显着更加异构和复杂。因为您只需要为少数核心计算基元(例如矩阵乘法)提供Software 1.0实现,所以更容易做出各种正确性/性能保证。

易于烧成硅片。作为推论,由于神经网络的指令集相对较小,因此要将这些网络实现得更接近硅片,比如使用定制ASIC、neuromorphic芯片等,要明显更容易。当低功耗智能无处不在时,世界将发生变化。例如,小型低成本芯片可以预先训练卷积网络、语音识别器和WaveNet语音合成网络,所有这些都集成在一个小型“初级大脑”中,您可以将其连接到各种东西上。

常量运行时间。典型神经网络的每次前向传递迭代需要精确相同的FLOPS数量。根据您的代码可以通过某些庞大的C++代码库采取的不同执行路径,几乎没有变化。当然,您可以有动态计算图,但执行流通常还是受到很大限制。这样我们几乎可以保证永远不会发现自己陷入未预期的无限循环。

常量内存使用。与上述相关,在任何地方都没有动态分配的内存,所以也很少可能交换到磁盘,或者在代码中必须追踪的内存泄漏。

高度可移植。与经典二进制文件或脚本相比,一系列矩阵乘法要在任意计算配置上运行得更容易。

非常敏捷。如果您有一段C++代码,有人想让您的速度提高一倍(如果需要的话以性能为代价),要为新规格调整系统将是非常非平凡的。然而,在Software 2.0中,我们可以拿出我们的网络,删除一半的通道,重新训练,瞧——它的速度恰好是原来的两倍,性能略有下降。这太神奇了。相反,如果您恰好获得更多的数据/计算能力,您可以通过添加更多通道和重新训练立即使程序的性能变好。

模块可以融合成最佳整体。我们的软件通常分解成通过公共函数、API或端点通信的模块。但是,如果两个最初分开训练的Software 2.0模块相互作用,我们可以很容易地通过整个系统反向传播。想想如果您的网页浏览器可以自动重新设计10个堆栈下面的低级系统指令,以实现更高效地加载网页,那会有多棒。或者,如果您导入的计算机视觉库(例如OpenCV)可以根据您特定的数据自动调整,那会有多棒。有了2.0,这将是默认行为。

它比您更好。最后,也是最重要的一点,对于大部分有价值的垂直领域来说,神经网络是一个比您或我能想出的任何代码更好的代码,目前至少涉及与图像/视频和声音/语音有关的任何内容。

软件2.0的局限性

2.0堆栈也有其自身的一些缺点。在优化结束时,我们得到的大型网络工作效果很好,但很难说明原因。在许多应用领域,我们将面临选择使用我们理解的90%准确模型或我们不理解的99%准确模型的选择。

2.0堆栈可能以非直观和尴尬的方式失败,或者更糟的是,它们可能“无声失败”,例如,通过无声地采用训练数据中的偏见,这些偏见在大多数情况下的规模很容易达到数百万,很难进行适当的分析和检查。

最后,我们仍在发现这个堆栈的一些独特属性。例如,对抗示例和攻击的存在凸显了这个堆栈的非直观性。

2.0栈中的编程

Software 1.0是我们编写的代码。Software 2.0是基于评估标准(如“正确分类此训练数据”)的优化编写的代码。

任何程序不明显但可以重复评估其性能的设置(例如,您是否正确分类了一些图像?您是否在围棋游戏中获胜?)可能都会受到此转变的影响,因为优化可以找到比人类编写的代码好得多的代码。

我们查看趋势的方式很重要。如果您将Software 2.0视为一种新的编程范例,而不是简单地将神经网络视为机器学习技术中的一个相当好的分类器,那么外推会变得更加明显,很显然还有许多工作要做。

特别是,我们在编写1.0代码方面积累了大量的工具来帮助人类,如强大的集成开发环境,具有以下功能:语法高亮显示、调试器、分析器、def定位、git集成等。在2.0堆栈中,程序设计是通过累积、整理和清理数据集来完成的。例如,当网络在某些困难或罕见情况下失败时,我们不通过编写代码来修复这些预测,而是通过包含这些情况的更多标记示例。

谁将开发第一个Software 2.0集成开发环境来帮助积累、可视化、清理、标记和提供数据集的所有工作流程?也许集成开发环境会根据每个示例的损失推断网络怀疑的图像被错标记,或通过使用预测为标签进行种子来帮助标记,或根据网络预测的不确定性建议有用的示例进行标记。

同样,Github是一个非常成功的Software 1.0代码中心。是否有空间供Software 2.0 Github使用?在这种情况下,存储库是数据集,提交由标签的添加和编辑组成。(注:HuggingFace初步实现了这个预言,成为了模型领域的Github)

传统的软件包管理器和相关的服务基础架构(如pip,conda,docker等)使我们更容易部署和组合二进制文件。我们如何有效部署、共享、导入和使用Software 2.0二进制文件?什么是神经网络的conda等价物?

短期内,任何可以重复评估且价格便宜的领域以及算法本身难以显式设计的领域,Software 2.0将日益普及。考虑整个软件开发生态系统及其如何适应这种新的编程范例,这方面有许多令人兴奋的机会。

从长远来看,此范例的未来很光明,因为越来越清楚,当我们开发AGI时,它肯定会以Software 2.0编写。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20230531A09ER300?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券