9月9日,2016湖南人工智能论坛在长沙举办,大会期间,来自国内外的许多顶级专家在会上给我们做了报告,下面是雷锋网根据微软亚洲研究院刘铁岩教授的现场精华整理,全部内容已经经由刘教授确认。
在人工智能高歌猛进,人们期待深度学习无往不胜之时,作为人工智能学者,我们必须保持冷静,分析深度学习技术的短板,开展针对性研究将其克服,从而助力人工智能的长期繁荣。事实上,今天深度学习成功的主要因素:超大规模训练数据、复杂的深层模型、分布式并行训练,也正是影响其进一步发展的障碍。首先,取得大量有标签训练数据需要付出巨大代价,不是每个领域都能满足这个条件;其次,深层模型很难优化,超大模型会突破计算机容量;再次,同步并行效率低下、异步并行受通信延时影响收敛缓慢。在本报告中,我将会介绍微软研究院的最新成果,展示如何通过“对偶通信博弈技术”有效利用无标签训练数据、如何利用“残差学习技术”解决深层神经网络的优化问题、如何借助“二维映射技术”缩小模型规模、以及如何使用“高阶泰勒补偿技术”解决通信延时问题。这些前沿技术将会陆续通过微软的开源项目CNTK和DMTK分享给业界,以期和大家一起推动人工智能技术的进一步发展。
刘铁岩博士,微软亚洲研究院首席研究员,美国卡内基梅隆大学(CMU)客座教授。刘博士的研究兴趣包括:人工智能、机器学习、信息检索、数据挖掘等。他的先锋性工作促进了机器学习与信息检索之间的融合,被国际学术界公认为“排序学习”领域的代表人物,他在该领域的学术论文已被引用近万次。近年来,刘博士在博弈机器学习、深度学习、分布式机器学习等方面也颇有建树,他的研究工作多次获得最佳论文奖、最高引用论文奖、研究突破奖,并被广泛应用在微软的产品和在线服务中。他是国际电子电气工程师学会(IEEE)、美国计算机学会(ACM)和中国计算机学会(CCF)的高级会员,中国计算机学会的杰出演讲者和学术工委。
在我的报告开始之前,先介绍一下我所供职的单位:微软研究院,它是微软公司在全球设立的基础研究机构,它在全球有六个分院。位于北京的微软亚洲研究院成立于1998年,到现在已经有十八个年头,这十八年里,微软亚洲研究院在顶级国际会议和期刊上发表了近5000篇论文,其中包括50篇最佳论文,为微软产品提供了400项技术。微软亚洲研究院非常像一所大学,有近200余名世界顶尖的计算机科学家,以及来自各个高校的三四百名长期的实习生。
人工智能在最近取得了令人瞩目的成果,微软在这个过程中也做了很多的贡献,比如在语音识别方面的突破,就起源于2006年微软的研究员和Geoff Hinton一起从事的研究。这几年人工智能领域在人脸识别、图像识别、自然语言处理、人际对弈都取得了甚至超过人类水平的研究成果,非常喜人。
说到这几年取得的成果,就不得不提到深度学习技术,深度学习技术概念很宽,但最主流的算法就是深度神经网络,这张图展示了深度神经网络的基本结构。图里的圆圈代表是一个神经元,每一个神经元会对它的输入做一个线性加权求和,在进行一个非线性变换。经过多层的变换,深度神经网络可以模拟非常复杂的非线性分类界面。
除了最基本的全连接网络,最近深度神经网络有很多新的变种,比如说卷积神经网络,这是为图像识别发明新的网络结构,循环神经网络主要为自然语言流式数据发明的神经网络结构。
不管是标准多层神经网络、卷积神经网络,还是循环神经网络,其学习过程都非常的简单和一致。首先会有一个训练集,我们用w表示深度神经网络里面的参数,用f来表示神经网络模型。
L称为损失函数,深度学习神经网络的训练其实通过在训练集上最小化损失函数而求得的,就是我们通常所说的经验风险最小化。为了实现这个目标,人们使用的优化技术也非常的简单,就是大家上大一的时候就会学到梯度下降法:对损失函数求一个梯度,然后把模型向梯度下降最快的方向做一个更新,这种方法在神经网络领域也被称为反向传播。
到此为止我就给大家用了一两张PPT做了非常快速的讲座,什么是深度神经网络,它有哪些变种。
接下来我们来看看神经网络背后深层次的东西。当深度神经网络带来了人工智能很大的飞跃,外行们讨论的都是人工智能对人类会不会产生威胁?而内行看到的则是深度神经网络有什么技术优势、往前发展还有什么样子的短版?
前面提到,无论深度神经网络长什么样子,其实就是一种经验风险最小化。这里,X是样本,Y是标签,所以X和Y加起来就是神经网络的训练数据,F用来表示神经网络模型,L是损失函数。神经网络的训练就是在整个神经网络的函数空间里面去找一个最优模型,从而最好地拟合训练数据。其实不仅神经网络在做这件事,历史上那么多的分类模型,都在做的类似的事情。
为什么到今天神经网络可以取得传统模型无法取得的成功呢?其实有三个理由:
一是要感谢我们这个大数据的时代,我们如今有着前所未有的大训练数据,可以充分训练复杂的模型。
二是深度神经网络和前面提到的模型相比,具有更强的表达能力。大家知道在神经网络领域有一个universal approximation theorem,讲的是带有隐层的神经网络可以逼近任意的连续函数。从这个意义上讲,即便我们选一个非常复杂的问题,用深度神经网络也可以逼近它的分类界面。
有了大数据,又有了复杂模型,那怎么训练呢?就需要非常强大的计算资源,就是可能要用上百台、上千台的计算机来共同训练一个深度神经网络。总结一下啊,大数据、复杂模型、运算集群能力其实共同支撑了今天深度神经网络的巨大成功。
但是世界上没有免费的午餐,这三方面恰洽也是深度神经网络向前进一步发展的瓶颈所在。
第一个方面,其实大规模的数据不是那么容易取得的,尤其在某些领域,比如说医学领域,有些疑难杂症这世界上一共就一百个样本,如何去产生成千上万的大数据?
第二个方面深度神经网络非常难以优化,目前人们为此发明了很多黑科技。我们经常遇到这种情况,即便有一个组织宣布他有非常好的深度模型并且把算法进行了开源,但是我们当下载到自己的环境里,用自己的数据做训练的时候,往往得不到那么好的结果。另外,有的时候很大的模型容量会超过计算机的限制,目前我们经常用GPU来训练深度神经网络,但是GPU的内存很小,一般就是几十个G,很多大的神经网络的规模会超过这个容量。
第三个方面,即便神经网络模型可以塞到GPU里,但是当数据够大的时候,用单机进行训练可能要花费非常多的时间,也许几百年也训练不出一个模型来。为此,我们需要用一个集群来做分布式的训练,听起来很简单,好像是系统领域成熟的问题,但是我们关心的不是简单地把模型训练分发到多个机器上,而是要保证精度不发生损失,我们希望在加速的同时,还有很好的判别或者是分类能力,这件事情一点都不简单。
前面提到了很多情况下,不是那么容易获得大数据,当没有大的训练数据时候该怎么办?通常获得有标签数据很难,但是获得无标签数据会相对荣国。比如现在ImageNet比赛的数据通常是1000类,每类1000幅图像;但是我们如果用搜索引擎来搜索图像,可以获得比这多得多的数据。 关键的问题是如何给这些无标签数据打上一个标签。常用的方法是标签传播,就是利用样本的相似性,给无标签数据赋予一个伪标签。另一种情况是,我们有类别信息,但是没有样本。最近有一个很有趣的工作叫GAN: generative adversarial nets,它利用一个生成器和一个判别器的博弈,最终能根据标签自动产生属于这个类别的数据。
有了这个技术,我们就不用去采集数据,而是自动地渊源不断输出那些图像。
这两种工作是对称的,一个工作处理的是有样本但无标签,另一个工作处理的是有标签但无样本。那么能不能使它们两个对接在一起?这是我们今年在NIPS上发的一篇论文,称为对偶通信博弈,可以把前面两项技术完美结合在一起。
首先从任何一个无标签的样本出发,可以预测标签,然后基于这个标签又可以用生成技术生成一个新样本出来,这个过程我们可以获得很多反馈信息,比如标签的分布、生成样本和原样本的相似度等。这个过程也可以从标签出发,也能形成一个闭环。有了这个技术,我们就可以自己产生训练数据。我们把这个技术应用到了机器翻译上,取得了非常好的结果。大家知道机器翻译这几年有突飞猛进的进展,得益于大量双语语料的存在,如果只有很少的数据能做什么呢?
这张图上面最上面条形图对应的是用百分之百的双语语料训练的结果,最底下一行是使用传统的深度学习技术只用5%的双语语料的结果。绿色的这一条也只是使用了5%的有标数据,但是使用了对偶通信博弈来自动生成更多的训练数据,它可以很快逼近使用全部双语语料的精度。当然,这里机器翻译只是一个例子,同样的方法可以解决很多其他的应用问题。
深度学习的网络很复杂,训练其实不容易,那么到底有哪些不容易?
一个典型的挑战叫做梯度消减,深度神经网络是从输出层的损失函数不断向下传播,用预测误差来更改神经网络的参数,所谓梯度消减指的是当网络很深的时候,输出层的损失很难有效反馈到底层,所以底层神经参数不能得到有效的更新。我们举个简单的例子,这是一个简化的深度神经网络,每一层只有一个隐节点,但是有很多层次,C是损失函数,反向传播无非就是对损失函数求一个偏导,求到每一个层的参数上面去,这个偏导长什么样子,大家回去做一点演算的话就可以得到这个式子。这里sigma’对应于非线性激活函数的导数,它的最大值也不过是0.25,如果一个网络很深,每一层对应的激活函数的导数会被连乘,一连串很小的量连乘会是什么结果呢,就是很快趋近于0,这就是梯度消减的起因。为了解决这个问题,人们提出在原有的神经网络基础上增加了一条由门电路控制的线性通路。
我们做回传的时候,线性通路可以把预测误差有效传递到底的参数上,而不会有那么强的梯度消减问题。但是,这两个工作使用的门电路,有的时候会通,有的时候会断,还是会带来一定的损失。我们研究院的同事提出在神经网络不同层次之间加一个直接的线性通路,不受任何的限制,永远是通的,经过这样的一个改造之后,对于解决梯度消减问题效果更好,并且可以让我们很轻易训练出成千上万层的网络,其中152层的残差网络参加了去年的比赛,并且取得了五个项目的冠军,获得了全世界的瞩目。
大家看看这个152层的网络有多深。
其实,不仅深会带来麻烦,网络大也是件麻烦事。这个数据集是在网络搜索领域常用的数学极,它包含十几亿的网页,词表大小大概1000万。如果基于这样数据去设计一个神经网络,因为输出层是词表那么大,输入层也是词表那么大,网络大小是非常可观的,其参数个数会超过200亿,存储的量会超过200G,这样是网络是没法塞到GPU的内存里的。即便可以塞进去,训练这么大的网络也需要花很长的时间,粗略的计算告诉我们,用主流GPU来训练,大约需要180年。
今年我们的研究组提出新的技术,就叫做参数维度压缩技术,可以有效解决词表过大的问题。因为词表决定了输出的结点数和输入的结点数,我们工作的核心所在就是提出了词表的二维向量表达。
每一个词不是用一个节点表示,而是用两个节点去表示,不同的词会共享节点。如果用二维的表格来表述所有的词条,原来10000个词,只需要200个元素就可以了。通过二维词表的构造大大解决了内存的空间,但是到底该怎么生成这些二维的词表?
哪些词要共享节点,哪些词不需要共享节点,其实这是一个最优的二分图匹配问题,我们可以循环地求解二分图匹配,从而获得合理的二维词表。相应地,我们把传统的神经网络也做了改进,提出的二维循环神经网络。
这个网络大大缩小了网络储存的内存需求,像我刚才提到有200亿个参数的网络,用了这个技术以后,储存量降低了三个数量级,运算量降低了四个数量级,这还不是最神奇的,我们使用了二维共享表之后,精度也得到了提高,这主要是因为传统的神经网络输入结点是互相独立的,但是我们没有做这样的假设,我们是用了最优二分图的匹配来找到了词与词之间的语义相似性,因此提高了网络的精度。
大家想象一下,如果真的有一个非常大的网络,有很多数据要跑,一台机器要一两百年才能完成训练。那就不得不使用多台机器进行并行训练。在并行的训练当中最简单的范式就是同步的并行。
比如说每一台机器做一个局部运算,然后机器互相之间互相同步一下学到的东西。但是这一百台机器可能运算的速度有很大差别,做同步的更新,这一百台机器就需要互相等待,最后运算的效率是由最慢的机器决定的。
结果是,使用了100台机器,可能由于互相等待,最终只实现了三五倍的加速比,得不偿失。为了解决这个问题,最近学者们开始研究异步并行。
就是机器之间不互相等待,这样虽然速度有所提高,但是会出现所谓延时通信的额问题。也就是,当一台机器根据当前模型,得到模型更新,想要推送回全局模型的时候,全局模型很可能已经被其他机器更新了好几次了,导致它推送上的更新过时了,把这个过时的更新加到全局模型上,可能会导致出乎意料的结果。有学者做过分析,这种延时,或导致学习的收敛速度变慢,最终也是影响加速比。
为了解决这个问题,我们需要弄清楚这个过时的更新到底会带来什么影响。其实,这个旧的更新和新的更新之间的差别可以用泰勒展开来进行刻画,传统的异步并行相当于只利用了泰勒展开的零阶项,那么,我们是不是可以用更多的高阶项去补偿这种延时呢?如果把所有高阶项都用上,确实可以把通讯延迟完全解决掉,但是其运算复杂度也会增加,所以这中间有一个平衡的问题。我们做了一个简单的尝试,就是在零阶项的基础上,多保留了一阶项。但是,即便这种简单的操作,也需要我们计算原损失函数的二阶导数(就是所谓海森阵),其复杂度是相当高的,可能得不偿失。我们的贡献在于证明了一个重要的定理,当损失函数具有对数似然的形式的时候,这个二阶导数可以用一阶导数的简单变换,实现无偏估计。而神经网络里常用的交叉熵损失函数,正是一种对数似然的形式,因此我们的技术可以很好地应用到深度神经网络里面。
前面我讲到了很多微软在深度学习方面的前沿技术,这些技术将会陆续通过我们的开源项目分享给业界。其中一个开源项目叫CNTK,微软深度学习工具包,还有一个叫DMTK,微软分布式机器学习工具包。希望对这方面感兴趣的同事可以尝试一下我们的工具包,希望对你们的研究有一个推动作用。
最后,让我们讨论一下我们的未来研究方向,我们希望创造一个能够自动创造人工智能的人工智能。今天人工智能虽然有很多成功的例子,但是绝大部分依靠人为编写的程序。最近这几年,学者们在思考,有没有可能不需要人为控制深度学习的过程,而是由机器自己来优化自己呢?比如说DeepMind今年发了一个论文,叫learning to learn by gradient descent by gradient descent,就是用循环神经网络取代人为定义的梯度下降方法。再比如,我们前面提到的对偶通信博弈,就是机器自己搜集和产生训练数据。还有一些人在用机器学习的方法自动来调深度神经网络的超参数,比如学习率。随着这些研究的开展,我们可以想象有一天机器学习工具可以针对给出的任务去自动搜索数据、选择数据、处理数据,自动根据你所给的目标去生成模型优化的方法,自动调整超参数,自动把训练部署到多个机器上进行分布式训练,如果真的有这样一天,将是对所有机器学习使用者的一种解放,我们不需要那些掌握黑科技的巨头,每个人都可以享受机器学习技术给大家带来的红利!让貌似高深复杂的机器学习技术,真正飞入寻常百姓家!