有些人将神经网络视为“机器学习工具箱中的另一个工具”。它们有一些优点和缺点,它们在这里或那里发挥作用,有时你可以用它们赢得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)正在吞噬世界,现在AI(软件2.0)正在吞噬软件。
正在进行的转变
让我们简要地检查一些这种正在进行的转变的具体例子。在每个领域中,当我们放弃通过编写明确的代码来解决复杂问题的尝试,转而将代码转换为2.0堆栈时,我们都看到了一些改进。
视觉识别曾经由一些经过工程处理的特征和一些机器学习组成(例如,一个SVM)。从那时起,我们通过获得大型数据集(例如ImageNet)并在卷积神经网络架构空间中搜索,发现了更强大的视觉特征。最近,我们甚至不相信自己手工编写架构,而是开始搜索这些架构。
语音识别曾经涉及大量的预处理、高斯混合模型和隐藏马尔可夫模型,但今天几乎全部由神经网络组成。一句经常被引用的有趣语录是来自于1985年的Fred Jelinek,“每次我解雇一名语言学家,我们的语音识别系统的性能都会提高”。
语音合成以前是用各种拼接机制来处理的,但现在最先进的模型是大型的ConvNets(例如WaveNet),可以产生原始音频信号输出。
机器翻译通常是用基于短语的统计技术来处理的,但神经网络正在迅速取代。我最喜欢的架构是在多语言环境中进行训练的,其中一个模型可以将任何源语言翻译成任何目标语言,并在弱监督(或完全无监督)设置中进行训练。
游戏。围棋的显式手工编码程序已经开发了很长一段时间,但AlphaGo Zero(一个ConvNet,查看棋盘的原始状态并进行移动)现在成为迄今为止最强的棋手。我预计我们会在其他领域看到非常类似的结果,例如DOTA 2或星际争霸。数据库。除了人工智能之外,更传统的系统也出现了转型的迹象。例如,《学习索引结构的案例》用神经网络替换了数据管理系统的核心组件,速度比优化缓存的B-树快70%,同时节省了数量级的内存。
你会注意到我上面提到的很多链接都是来自谷歌的工作。这是因为谷歌目前处于将自己的大部分内容重写为软件2.0代码的前沿。《一种模型统治所有》提供了一个早期的草图,展示了这种模式可能的样子,其中单个域的统计强度合并为对世界的一致理解。
软件2.0的好处
为什么我们应该将复杂的程序移植到软件2.0中呢?显然,一个简单的答案是,在实践中它们的表现更好。然而,还有很多其他方便的理由可以选择这个堆栈。让我们来看看软件2.0(类似于ConvNet)相对于软件1.0(类似于生产级C++代码库)的一些好处。软件2.0是:
计算同质化的。一个典型的神经网络,从一阶角度来看,只由两个操作组成:矩阵乘法和阈值为零的门限函数(ReLU)。相比之下,经典软件的指令集要复杂得多。因为你只需要为少量核心计算原语(例如矩阵乘法)提供软件1.0实现,所以更容易做出各种正确性/性能保证。
易于嵌入硅片中。由于神经网络的指令集相对较小,因此更容易将这些网络实现得更接近硅片,例如使用定制ASICs、神经形态芯片等等。当低功率智能在我们周围变得普遍时,世界将发生变化。例如,小型廉价芯片可以预先训练ConvNet、语音识别器和WaveNet语音合成网络,所有这些都集成在一个小型的原型脑中,你可以将其连接到物品上。
运行时间恒定。典型神经网络正向传播的每个迭代都需要完全相同的浮点运算次数(FLOPS)。根据代码通过一些繁杂的C++代码库的不同执行路径所采取的不同执行路径,没有任何变化。当然,你可以有动态计算图,但执行流通常仍然受到显着的限制。这样,我们也几乎可以保证永远不会发现自己处于意外的无限循环中。
内存使用恒定。与上述相关的是,没有任何动态分配的内存,因此也很少可能交换到磁盘,或者出现你必须在代码中寻找的内存泄漏。
高度可移植。与经典二进制文件或脚本相比,一系列矩阵乘积在任意计算配置上运行要容易得多。
非常灵活。如果你有一个C++代码,有人想让你使它的速度加倍(如果需要,牺牲性能),那么为新规格调整系统将非常非常棘手。然而,在软件2.0中,我们可以取出我们的网络,删除一半的通道,重新训练,然后就可以以两倍的速度运行,而且效果略微差一些。这是魔术。相反,如果你得到更多的数据/计算,你可以立即通过添加更多的通道和重新训练来使你的程序更好地工作。
模块可以融合成最佳的整体。我们的软件通常被分解成通过公共函数、API或端点进行通信的模块。然而,如果两个最初是分别训练的软件2.0模块互相作用,我们可以轻松地反向传播整个模块。想象一下,如果你的网络浏览器可以自动重新设计低级系统指令,使其更高效地加载网页,那将是多么令人惊奇。或者,如果你导入的计算机视觉库(例如OpenCV)可以根据你的特定数据自动调整。在2.0中,这是默认行为。
它比你更好。最后,最重要的是,一个神经网络在当前大部分有价值的垂直领域中都是比你或我能想出的任何东西都要好的代码,这些领域涉及到图像/视频和声音/语音。
软件2.0的局限性
2.0堆栈也有一些缺点。在优化的结尾,我们得到的是工作良好但很难理解的大型网络。在许多应用领域,我们将面临使用我们理解的90%准确模型或我们不理解的99%准确模型的选择。
2.0堆栈可能会以不直观和尴尬的方式失败,或者更糟的是,它们可能会“默默地失败”,例如在其训练数据中悄然采用偏见,这在大多数情况下非常难以正确分析和检查,因为它们的大小很容易达到数百万级别。
最后,我们仍在发现这个堆栈的一些奇特属性。例如,对抗性示例和攻击的存在突显了这个堆栈的不直观性质。
在2.0堆栈中编程
软件1.0是我们编写的代码。软件2.0是基于评估标准(如“正确分类这些训练数据”)进行优化的代码。由于优化可以找到比人类编写的代码更好的代码,因此任何设置中程序不明显但可以反复评估其性能的地方(例如——你是否正确地分类了一些图像?你是否赢得了围棋游戏?)都将受到这种转变的影响。
我们观察趋势的角度很重要。如果你将 Software 2.0 视为一种新兴的编程范式,而不仅仅将神经网络视为机器学习技术类别中的优秀分类器,那么你就会更容易看到这个趋势的未来发展方向,也会意识到这个领域还有很多工作要做。
特别是,我们已经建立了大量的工具来帮助人类编写 1.0 代码,比如强大的 IDE,包括语法高亮、调试器、性能分析器、跳转到定义、Git 集成等等。而在 2.0 栈中,编程的过程是通过积累、处理和清理数据集来完成的。例如,当网络在某些困难或罕见的情况下失效时,我们不是通过编写代码来修复这些预测,而是通过增加更多标记好的这些情况的样例来解决。那么,谁会开发第一个能够辅助处理数据集积累、可视化、清理、标记和来源等所有工作流程的 Software 2.0 IDE 呢?也许这个 IDE 可以根据每个样例的损失情况来弹出网络怀疑被标记错误的图像,或者通过预测来辅助标记标签,或者基于网络预测的不确定性来建议有用的样例进行标记。
同样,Github 是 Software 1.0 代码的一个非常成功的存储库。那么,是否有一个 Software 2.0 的 Github 存储库呢?在这种情况下,存储库就是数据集,提交是由标签的添加和编辑组成的。
传统的软件包管理器和相关的服务基础设施(如 pip、conda、docker 等)可以帮助我们更轻松地部署和组合二进制文件。那么,我们如何有效地部署、共享、导入和处理 Software 2.0 二进制文件呢?神经网络的 conda 等效物是什么呢?
短期内,在任何可以进行重复评估并且成本低廉的领域中,Software 2.0 都将变得越来越普遍,特别是在那些算法本身难以明确设计的领域中。有许多令人兴奋的机会可以考虑整个软件开发生态系统,以及如何将其适应这种新的编程范式。长远来看,这种范式的未来是光明的,因为越来越清楚的是,当我们开发 AGI 时,它一定会是由 Software 2.0 编写的。
评论(0)