分享
软件 2.0(Software 2.0)
输入“/”快速插入内容
软件 2.0(Software 2.0)
源地址:
https://karpathy.medium.com/software-2-0-a64152b37c35
作者:
Andrej Karpathy
(
OpenAI
创始团队成员,原特斯拉
AI
部门负责人)
发布时间:2017 年 11 月 12 日
翻译:在
OneFlow 社区
翻译基础上略作修改
我发现,有时候人们会把
神经网络
当作“不过是
机器学习
工具箱中的工具之一而已”。它有优点也有缺点,在某些领域有用,并且可以帮助你打赢 Kaggle 比赛。很不幸,这种观点完全是只见树木、不见森林。神经网络可不只是又一种
分类器
而已,它代表着一种根本性转变的开始,这种转变与我们如何开发软件有关。它就是软件 2.0。
我们对
软件 1.0
已经比较熟悉——它们由计算机语言(如 Python、
C++
等)所开发。 它由程序员写的给计算机的明确
指令
组成。通过编写每一行代码,程序员确定了程序空间中具有一些理想行为的特定点。
与之对比的,
软件 2.0
由更抽象、人类更难理解的语言(比如说,
神经网络
中的权重)开发。没人可以直接参与这种代码的编写,因为它涉及到大量的权重(往往上百万数量级),并且(我试过)直接编写权重某种意义上是很困难的。
取而代之,我们为程序的行为指定目标(比如,“符合数据集中样本的输入输出对”,又或者“赢得围棋比赛”),并写好程序的骨架(比如
神经网络
的结构),这样就在整个程序空间中确定了一个可以用于搜索的子集,然后就可以使用我们所有的计算资源在这个空间中
搜索可用的程序
。
对于
神经网络
而言,我们将搜索限制在程序空间的一个连续的子集上,并且,使用
反向传播
和随机
梯度下降
方法进行搜索,(出人意料地)这种搜索方式挺有效。
更具体地对比,
软件 1.0 是将人工设计的
源码
(比如
cpp
文件)编译为可以有效工作的二进制文件。而
软件 2.0 的源码通常由两部分组成:1)定义了目标行为的数据集;2)给定代码大致结构,但是需要填充细节的
神经网络
结构
。训练神经网络的过程,就是将数据集编译成二进制文件的过程——得到最终的神经网络。时至今日,大多数实际应用中,神经网络的结构及训练系统已经日益标准化为一种商品,所以,大部分活跃的“软件开发”工作某种形式上变成了组织、增加、调整和清理带标签的数据集。这从根本上改变了我们迭代软件的编程范式,将开发团队分成了两拨:软件 2.0 的程序员(数据标记员)负责编辑和扩大数据集,而另一小撮人,维护着与训练有关的基础设施以及分析、可视化和标注等接口。
事实证明,对于真实世界中的很多问题,采集数据(更泛化地说,确定期待的行为)比显式地写程序要容易得多。 由于以上以及以下我将要介绍的软件 2.0 的诸多好处,我们正在见证工业界大量代码从软件 1.0 迁移至软件 2.0 的重大转变。
软件 1.0 吞噬着整个世界,
软件 2.0(
AI
)在吞噬软件 1.0
。
转变进行时
让我们来看看这场转变中的具体领域的例子。我们会发现,在过去几年,对于这些领域,我们放弃了尝试通过显式写代码的方式去解决复杂问题,取而代之的,是转向了软件 2.0。
•
图像识别
:图像识别之前常常是由
特征工程
组成的,只是在最后加入一点点
机器学习
(比如:SVM)。 之后,通过使用更大的数据集(比如
ImageNet
)和在
卷积神经网络
结构空间中进行搜索,我们发现了更强大的视觉特征。最近,我们甚至不再相信自己手写的网络结构,而开始用
类似的方法
搜索
(最优
网络结构
)。
•
语音识别
:以前的语音识别工作,涉及到大量的预处理工作、高斯混合模型和隐式马尔科夫模型,但是
现在
,几乎只需要
神经网络
。还有一句与之非常相关的搞笑名言,是 1985 年 Fred Jelinek 所说:“每当我开除一个语言学家,我的语音识别系统的性能就会提高一点”。
•
语音合成
:历史上,语音合成一直采用各种拼接技术,但是现在,
SOTA(State Of The Art)
类型的大型卷积网络(比如
WaveNet
)可以直接产生原始音频信号输出。
•
机器翻译
:机器翻译的实现之前常常采用基于短语的统计方法,但是
神经网络
正迅速占领了统治地位。我最喜欢的网络结构就与
多语言
训练
有关:一个模型就可以把任意源语言翻译成任意目标语言,并且只需要很弱的监督(甚至是
完全的无监督
)。