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