语音识别曾经涉及大量的预处理、高斯混合模型和隐藏的马尔可夫模型,但目前几乎完全由神经网络组成。
语音合成一直以来都有各种各样的拼接(stitching)机制,但是现在,艺术模型的状态是产生原始音频信号输出的大的卷积(例如WaveNet)。
机器翻译通常是采用基于短语的统计技术的方法,但神经网络很快就会占据主导地位。我最喜欢的架构是在多语言环境中进行训练的,其中一个模型可以从任何源语言转换为任何目标语言,并且在弱监督(或完全不受监督的)环境中进行。
机器人技术将问题分解为感知、姿态估计、规划、控制、不确定性建模等,使用显式表示和算法多于中间表示。我们还没有完全做到这一点,但加州大学伯克利分校和谷歌的研究表明,软件2.0或许能够更好地代表所有这些代码。
为什么我们更喜欢将复杂的程序移植到软件2.0中呢? 很明显,答案是因为它们在实践操作中表现得更好。但是,还有很多其他的方便的理由来选择这个堆栈。让我们来看看软件2.0(一个卷积神经网络)与软件1.0相比(一个生产级别的C++代码基数)的一些好处。软件2.0:
计算均匀:一个典型的神经网络,首先,由两个操作组成:矩阵乘法和在零点(ReLU函数)的阈值。将其与经典软件的指令集进行比较,后者明显更具有异构性和复杂性。因为你只需为少量的核心计算原语(例如,矩阵乘法)提供软件1.0实现,就可以更容易地做出各种正确的/性能的保证。
简单设置为硅
作为一个推论,由于神经网络的指令集相对较小,因此更容易实现将这些网络更靠近硅,例如自定义ASIC芯片,神经形态芯片等等。当低动力的智能变得无处不在时,情况又会发生变化。例如,小而便宜的芯片可以使用预先训练过的卷积神经网络、语音识别器和WaveNet语音合成网络,它们都集成在一个小的、可以连接到任何东西上的“原始大脑”中。
恒定的运行时间
典型的神经网络正向传递的每一次迭代都采用同样数量的FLOPS(即“每秒浮点运算次数”,“每秒峰值速度”)。零可变性基于你的代码的不同的执行路径,是可以通过一些庞大的C++代码库来实现的。当然,你可以拥有动态计算图,但是执行流通常仍然受到很大的限制。这样,我们几乎可以保证永远不会发现自己的操作在无意地进行无限循环。
持续的内存使用
与上面相关的是,在任何地方都没有动态分配的内存,因此也不大可能交换到磁盘,或是你必须在你的代码中追踪的内存泄漏。
它具有高度的可移植性
与经典的二进制文件或脚本相比,在任意计算配置上运行一个矩阵乘法序列要容易得多。
它非常敏捷
如果你有一个C++代码,并且有人想让你把它以两倍的速度为代价获得(如果需要的话),这将是非常重要的调优系统新规范。然而,在软件2.0中我们可以把我们的网络删除一半的通道,然后再次训练,——它完全是运行速度的两倍,并且运行的有些糟糕。相反地,如果你恰好得到了更多的数据/计算,你可以通过增加更多的通道和重新训练来让你的程序更好地工作。
模块可以融合为一个最优的整体
我们的软件经常被分解为通过公共函数,API或端点进行通信的模块。然而,如果两个最初训练的软件2.0模块相互作用,我们可以很容易地在整个过程中进行反向传播。想想看,如果你的web浏览器能够自动重新设计底层系统指令10个堆栈,直到加载web页面时获得更高的效率,那该多好。而对于2.0,这是默认的行为。
2.0堆栈也有一些自身的缺点。在优化的最后,我们剩下的是大型网络,它们运行得很好,但是我们很难知道它是如何运作的。在许多应用领域,我们将会选择使用我们所理解的90%的精确模型,或者99%的准确模型。
2.0堆栈可以以不直观和令人尴尬的方式失败,例如,通过在训练数据中默默地采用偏差,当它们的大小在数百万的大多数情况下,是很难正确地分析和检查的。
最后,我们还发现了这个堆栈的一些特殊属性。例如,对抗样本的存在突出了这个堆栈的不直观的本质。
如果你把神经网络看作是一个软件堆栈,而不仅仅是一个很好的分类器,那么很快就会发现,它们拥有大量的优势和很大的潜力来转换软件。
从长远来看,软件2.0的未来是光明的,因为越来越多的人认为,当我们开发了AGI时,它肯定会写入软件2.0中。