,," /> " />

目 录CONTENT

文章目录

转载:软件2.0

Administrator
2024-05-23 / 0 评论 / 0 点赞 / 3 阅读 / 9860 字

原文地址:https://karpathy.medium.com/software-2-0-a64152b37c35

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

软件1.0的“经典堆栈”是我们都熟悉的——它是用Python、C++等语言编写的。它由程序员编写的对计算机的显式指令组成。通过编写每一行代码,程序员可以识别程序空间中具有某些所需行为的特定点。

相比之下,软件 2.0 的语言更加抽象,对人类不太友好,例如神经网络的权重。编写此代码不需要人类参与,因为权重太多(典型的网络可能有数百万个),而直接用权重编码有点困难(我试过)。

相反,我们的方法是为理想程序的行为指定一些目标(例如,“满足输入输出对示例的数据集”或“赢得一场围棋比赛”),编写代码的粗略框架(即神经网络架构),确定要搜索的程序空间子集,然后使用我们掌握的计算资源在该空间中搜索有效的程序。在神经网络的情况下,我们将搜索限制在程序空间的连续子集内,其中可以使用反向传播和随机梯度下降使搜索过程(有点令人惊讶地)高效。

为了使类比更明确,在软件 1.0 中,人工设计的源代码(例如一些 .cpp 文件)被编译成可执行有用工作的二进制文件。在软件 2.0 中,源代码通常包含 1)定义所需行为的数据集和 2)给出代码粗略骨架的神经网络架构,但需要填充许多细节(权重)。训练神经网络将数据集编译成二进制文件——最终的神经网络。在当今的大多数实际应用中,神经网络架构和训练系统越来越标准化为商品,因此大多数活跃的“软件开发”都采取策划、增长、整理和清理标记数据集的形式。这从根本上改变了我们迭代软件的编程范式,因为团队分成两部分:2.0 程序员(数据标签人员)编辑和增长数据集,而一些 1.0 程序员维护和迭代周围的训练代码基础设施,分析、可视化和标签界面。

事实证明,现实世界中的大部分问题都具有这样的特性:收集数据(或者更一般地说,识别所需的行为)比显式编写程序要容易得多。由于软件 2.0 程序的这一优势以及我将在下面介绍的许多其他优势,我们正在见证整个行业的巨大转变,其中许多 1.0 代码正在被移植到 2.0 代码中。软件(1.0)正在吞噬世界,而现在人工智能(软件2.0)正在吞噬软件。

持续转型

让我们简要介绍一下这一持续转变的一些具体示例。过去几年中,当我们放弃通过编写显式代码来解决复杂问题,而是将代码过渡到 2.0 堆栈时,上述每个领域都取得了进步。

视觉识别过去由工程化特征和少量机器学习(例如 SVM)组成。从那时起,我们通过获取大型数据集(例如 ImageNet)并在卷积神经网络架构空间中进行搜索发现了更强大的视觉特征。最近,我们甚至不相信自己可以手动编写架构,我们也开始搜索这些架构。

语音识别过去涉及大量预处理、高斯混合模型和隐马尔可夫模型,但如今几乎完全由神经网络组成。弗雷德·杰利内克 (Fred Jelinek) 在 1985 年说过一句非常相关、经常被引用的幽默名言:“每次我解雇一名语言学家,我们的语音识别系统的性能就会提高”。

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

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

游戏。手工编写的围棋程序已经开发了很长一段时间,但AlphaGo Zero(一个观察棋盘原始状态并走棋的 ConvNet)现在已成为该游戏迄今为止最强大的玩家。我预计我们会在其他领域看到非常相似的结果,例如DOTA 2星际争霸

数据库。人工智能之外的更多传统系统也看到了转型的早期迹象。例如,“学习索引结构案例”用神经网络取代了数据管理系统的核心组件,速度比缓存优化的 B 树高出 70%,同时节省了一个数量级的内存。

您会注意到我上面的许多链接都涉及在 Google 完成的工作。这是因为 Google 目前处于将自身大部分内容重写为 Software 2.0 代码的最前沿。 “一个模型可以统治所有领域”提供了一个早期的草图,其中各个领域的统计强度被合并为对世界的一致理解。

软件 2.0 的好处

为什么我们应该将复杂的程序移植到软件 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 层以下的低级系统指令,以实现更高的网页加载效率,那该是多么令人惊奇。或者,如果您导入的计算机视觉库(例如 OpenCV)可以根据您的特定数据进行自动调整。对于 2.0,这是默认行为。

它比你好。最后,也是最重要的是,神经网络是比你或我在大部分有价值的垂直领域中所能想到的任何代码都更好的代码,这些垂直领域目前至少涉及与图像/视频和声音/语音有关的任何内容。

软件 2.0 的局限性

2.0 堆栈也有一些自身的缺点。优化结束后,我们留下了运行良好的大型网络,但很难说如何运行。在许多应用领域,我们可以选择使用我们理解的 90% 准确率的模型,或者我们不理解的 99% 准确率的模型。

2.0 堆栈可能会以不直观和令人尴尬的方式失败,或者更糟糕的是,它们可能会“默默地失败”,例如,通过在训练数据中默默地采用偏差,当它们的规模轻松达到数百万时,很难正确分析和检查。在大多数情况下。

最后,我们仍在探索此堆栈的一些特殊属性。例如,对抗性示例攻击的存在凸显了此堆栈的非直观性质。

在2.0堆栈中编程

软件1.0是我们编写的代码。软件2.0是根据评估标准(例如“正确分类此训练数据”)优化编写的代码。程序不明显但可以重复评估其性能的任何设置(例如,您是否正确分类了一些图像?您赢得围棋比赛了吗?)都可能会受到这种转变的影响,因为优化可以找到比人类编写的更好的代码。

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

具体来说,我们已经构建了大量工具来帮助人们编写 1.0 代码,例如具有语法突出显示、调试器、分析器、转到 def、git 集成等功能的强大 IDE。在 2.0 堆栈中,编程是通过积累、处理和清理数据集来完成的。例如,当网络在某些困难或罕见的情况下失败时,我们不会通过编写代码来修复这些预测,而是通过包含更多这些情况的标记示例来修复这些预测。谁将开发第一个软件 2.0 IDE,帮助完成积累、可视化、清理、标记和获取数据集的所有工作流程?也许 IDE 会根据每个示例的损失将网络怀疑标记错误的图像冒泡出来,或者通过用预测播种标签来协助标记,或者根据网络预测的不确定性建议有用的标记示例。

同样,Github 是软件 1.0 代码非常成功的家园。软件 2.0 Github 有空间吗?在这种情况下,存储库是数据集,提交由标签的添加和编辑组成。

传统的包管理器和相关的服务基础设施(如 pip、conda、docker 等)可帮助我们更轻松地部署和编写二进制文件。我们如何有效地部署、共享、导入和使用软件 2.0 二进制文件?conda 相当于神经网络吗?

短期内,软件 2.0 将在任何可以进行重复评估且成本低廉且算法本身难以明确设计的领域中变得越来越普遍。有许多令人兴奋的机会来考虑整个软件开发生态系统以及它如何适应这种新的编程范式。从长远来看,这种范式的未来是光明的,因为越来越清楚的是,当我们开发AGI时,它肯定会用软件2.0来编写。

0
  1. 支付宝打赏

    qrcode alipay
  2. 微信打赏

    qrcode weixin

评论区