LeCun又语出惊人了,这次直指深度学习——
好,深度学习作为一个流行词,现在时效已过。
深度学习已死,可微分编程万岁!
事情要回溯到前天。
1月4日,AAAI前主席Thomas Dietterich连发10条Twitter,驳斥纽约大学心理学家Gary Marcus对深度学习的批评。其中,Dietterich提到,
“深度学习本质上是一种新的编程方式——可微分编程——而且这个领域正试图用这种方式来制定可重用的结构。目前我们已经有:卷积,池化,LSTM,GAN,VAE,memory单元,routing单元,等等。”
这个说法让英伟达的AI架构VP Clement Farabet深表赞同,Farabet还评价说,这是对现今深度学习的最好总结。LeCun也转推此文,表示赞同。
但是,光是转发推文,对LeCun来说显然不够。
今天,他在Facebook个人主页上写了一篇短文,不仅支持可微分编程,还用上了“深度学习已死”的表述。不仅如此,他还推出了一个“归化学习”。
先来看LeCun的文章。
Yann LeCun:深度学习已死,可微分编程万岁!
好,深度学习作为一个流行词,现在时效已过。
深度学习已死,可微分编程万岁!
没错,“可微分编程”不过是把现代这套深度学习技术重新换了个叫法,这就跟“深度学习”是现代两层以上的神经网络变体的新名字一样。
但重要的一点是,人们现在正在将各种参数化函数模块的网络组装起来,构建一种新的软件,并且使用某种基于梯度的优化来训练这些软件。
越来越多的人正在以一种依赖于数据的方式(循环和条件)来程序化地定义网络,让它们随着输入数据的动态变化而变化。这与是普通的程序非常类似,除了前者是参数化的、可以自动可微分,并且可以训练和优化。动态网络变得越来越流行(尤其是对于NLP而言),这要归功于PyTorch和Chainer等深度学习框架(注意:早在1994年,以前的深度学习框架Lush,就能处理一种称为Graph Transformer Networks的特殊动态网络,用于文本识别)。
现在人们正在积极从事命令式可微分编程语言编译器的工作。这是开发基于学习的AI(learning-based AI)一条非常令人兴奋的途径。
重要提示:这不足以让我们实现“真正的”人工智能。还需要其他的概念,比如我说过的预测性学习,我现在决定将其称为“Imputative Learning”(归化学习)。之后我会详细介绍……
可微分编程:深度学习的延伸,人工智能成功的关键
那么,在等LeCun大神更详细介绍他的归化学习前,我们更需要关注的是可微分编程,这是深度学习的又一个新名字,还是确实有不同和新的内涵?
MIT媒体实验室的David Dalrymple此前撰文介绍过可微分编程,Dalrymple 9岁登上TED讲台,14进入MIT读研,16岁以5.0的GPA毕业,也是一代奇才。进入MIT媒体实验室后,Dalrymple开发了新的编程范例,如“可重构的异步逻辑自动机(Reconfigurable asynchronous logic automata,RALA)。
Dalrymple认为,深度学习的成功有两大关键,一是反向传播,而是权重相关(weight-tying),而这两大特性与函数编程(functional programing)中调用可重用函数十分相同。可微分编程有成为“timeless”的潜力。
过去几年里,人工智能领域几十年来一直没有得到解决的一系列经典挑战,突然被AI纯粹主义者长期以来一直颇为鄙视的“统计方法”征服。这种方法主要从大量的数据中学习概率分布,而不是检查人类解决问题的技巧,并试图以可执行的方式对这些技巧进行编码。
这种方法最初被称为“神经网络”,现在则叫“深度学习”,强调对过去的神经网络的定性改进。深度学习的成功很大程度上归功于大的数据集和更强大的计算系统,大型科技公司对该领域突然兴起的兴趣也有一定关系。深度学习已经取得了令人难以置信的进步。许多其他方法也有所改善,但程度较低。
那么,将深度学习与其他学习区分开来的关键是什么?首先是反向传播。这实际上是一个以非常优雅的方式应用的链式规则,一个简单的微积分技巧。它是连续和离散数学的深度整合,使复杂的潜在解决方案族可以通过向量微积分自主改进。
关键是将潜在解决方案的模式(template)组织为有向图(例如,从照片到生成的图说,其间有许多节点)。反向遍历这个图,算法能够自动计算“梯度向量”,这个向量能引导算法寻找越来越好的解决方案。
从这个意义上看,现代的深度学习技术与传统的神经网络在结构上相似度不大,但在幕后,反向传播算法对于新旧架构都至关重要。
但是,即便使用了反向传播,以前的神经网络也远远不及现在的深度学习技术,哪怕是在今天的硬件和数据集条件下。因此,深度学习的第二大关键,是一个网络的组件可以同时在多个地方使用。
随着网络的优化,每个组件的每个副本都被迫保持一致(这个想法被称为 “weight-tying”)。这对权重相关的组件施加了额外的要求:它们必须学会在许多地方同时有用,而不是专门针对特定的地点。Weight-tying 会使网络学习更泛化的能力,因为单词和物体可能出现在文本块或图像的多个位置。
在网络的许多地方放置一个通用的组件,就类似于在一个程序中编写一个函数,并在多个地方调用它,这是函数编程(functional programming)的基本概念。函数编程将计算机运算视为数学上的函数计算,并且避免使用程序状态以及易变对象。与编程相比,权重相关(weight-tied)的组件,实际上与编程中可重用函数的概念相同。不仅如此,过去几年中,许多最成功的架构,它们对组件的重用方式,与函数编程中通用的“高阶函数”生成组件的方式完全相同。这表明函数编程中的一些著名算子,可能是深度学习架构的一个很好的灵感。
能够直接在函数程序上运行反向传播的新语言,将最便于探索那些被训练成深度学习网络的函数结构。事实证明,隐藏在实现/部署的细节中,函数程序实际上被编译成类似于反向传播所需的计算图。图的各个组成部分也必须是可微的,但是Grefenstette等人最近发布了几个简单的数据结构(栈,队列和双向)的可微分构造,表明进一步的可微分实现,可能只是数学上巧妙设计的问题。这方面的进一步工作可能会打开一个新的编程范式——可微分编程。
用这样一种语言编写程序,就好像构建函数结构时,把细节留给优化器——语言会使用反向传播根据整个程序的目标自动学习细节,就像优化深度学习中的权重一样。
可微分编程是一个比较新的概念,是反向传播和weight-tying这些想法的延伸。在各种架构、技术来了又去去了又来的眼下,这些核心概念仍然是人工智能成功的关键。
神经网络是“软件2.0”:开发通用人工智能的基础
这些都让人想到了深度学习和计算机视觉专家、特斯拉人工智能部门主管Andrej Karpathy此前提出的“软件2.0”概念。
Karpathy说,软件1.0(Software 1.0)是用Python、C++等语言编写的,它由程序员编写的对计算机的明确指令组成。通过编写每行代码,程序员可以确定程序空间中的某个特定点。
相比之下,Software 2.0 是用神经网络权重编写的。没有人参与这段代码的编写过程。在软件2.0的情况下,人类对一个理想程序的行为指定一些约束(例如,一个样本的输入输出对数据集),并使用可用的计算资源来搜索程序空间中满足约束条件的程序。在神经网络的例子中,我们把搜索限制在程序空间的一个连续的子集,在这个空间中,搜索过程可以利用反向传播和随机梯度下降奏效。
Karpathy认为,在现实世界中,大部分问题都是收集数据比明确地编写程序更容易。未来,大部分程序员不再需要维护复杂的软件库,编写复杂的程序,或者分析程序的运行时间。他们需要做的是收集、整理、操作、标记、分析和可视化提供给神经网络的数据。
从长远来看, Software 2.0的未来是光明的,因为越来越多的人清楚,当我们开发通用人工智能(AGI)时,肯定会写成Software 2.0。
Software 3.0?那就需要到AGI的时代了。
原文发布时间为:2018-01-06
本文作者:文强
本文来自云栖社区合作伙伴新智元,了解相关信息可以关注“AI_era”微信公众号