微软亚洲研究院刘铁岩博士:迎接深度学习的"大"挑战

主要介绍了深度学习的训练方法和技巧、深度学习的挑战和应对方法等问题。文末,刘博士结合眼下AI的研究进展,对深度学习领域深刻的"吐槽"了一番,妙趣横生且发人深省。

前面提到的BN方法还不能解决所有的问题。 因为即便做了白化,激活函数的导数的最大值也只有0.25,如果层数成百上千,0.25不断连乘以后,将很快衰减为0。所以后来又涌现出一些更加直接、更加有效的方法。其基本思路是在各层之间建立更畅通的渠道,让信息流绕过非线性的激活函数。这类工作包含Highway Network、LSTM、ResNet等。

Highway Network和LSTM一脉相承,除了原来的非线性通路以外,增加了一个由门电路控制的线性通路。两个通路同时存在,而这两个通路到底谁开启或者多大程度开启,由另外一个小的神经网络进行控制。

相比之下,ResNet的做法更加直接,它不用门电路控制,而是直接增加总是开通的线性通路。虽然这些方法的操作方式不同,但是它们的基本出发点是一样的,就是在一定程度上跳过非线性单元,以线性的方式把残差传递下去,对神经网络模型的参数进行有效的学习。

在前面提到的各项技术的帮助下,深层神经网络的训练效果有了很大的提升。这张图展示了网络不断加深、效果不断变好的历史演变过程。2012年ImageNet比赛中脱颖而出的AlexNet只有8层,后来变成19层、22层,到2015年,ResNet以152层的复杂姿态出场,赢得了ImageNet比赛的冠军。

从这张图上可以看出,随着层数的不断变深,图像的识别错误率不断下降,由此看来,网络变深还是很有价值的。

到此为止,我们把深度学习及其训练方法和技巧给大家做了一个非常简短的介绍。

深度学习的挑战

接下来我们进入下一个主题:深度学习的挑战和机遇。很多人都在讨论为什么深度学习会成功,说起来无外乎来源于机器学习优化过程的三个方面。

基本上所有的有监督机器学习都是在最小化所谓的经验风险。在这个最小化的式子里包含以下几个元素:

一个是数据:X是数据的输入、Y是数据的标签;

二是模型,用f表示(L是loss function);

三是针对f的寻优过程。

首先对数据X、Y而言,深度学习通常会利用非常大量的数据进行训练。举个例子,机器翻译的训练数据通常包含上千万个双语句对,语音识别常常使用几千或者上万个小时的标注数据,而图像,则会用到几百万甚至几千万张有标签的图像进行训练。前面还提到了下围棋的AlphaGo,它使用了3千万个棋局进行训练。可以这么说,现在主流的深度学习系统动辄就会用到千万量级的有标签训练数据。这对于十几年前的机器学习领域是无法想象的。

其次,深度学习通常会使用层次很深、参数众多的大模型。很多应用级的深层神经网络会包含十亿或者更多的参数。使用如此大的模型,其好处是可以具备非常强的逼近能力,因此可以解决以往浅层机器学习无法解决的难题。

当然当我们有那么大的数据、那么大的模型,就不得不使用一个计算机集群来进行优化,所以GPU集群的出现成为了深度学习成功的第三个推手。

成也萧何败也萧何,深度学习受益于大数据、大模型、和基于计算机集群的庞大计算能力,但这些方面对于普通的研究人员而言,都蕴含着巨大的挑战。我们今天要探讨的是如何解决这些挑战。

其次,在很多情况下,模型如果太大会超出计算资源的容量。比如,简单计算一下要在10亿量级的网页上训练一个基于循环神经网络的语言模型,其模型尺寸会在100GB的量级。这会远远超过主流GPU卡的容量。这时候可能就必须使用多卡的模型并行,这会带了很多额外的通信代价,无法实现预期的加速比。(GPU很有意思,如果模型能塞进一张卡,它的运算并行度很高,训练很快。可一旦模型放不进一张卡,需要通过PCI-E去访问远端的模型,则GPU的吞吐量会被拖垮,训练速度大打折扣。)

最后,即便有一些公司拥有强大的计算资源,同时调度几千块GPU来进行计算不成问题,也并表示这样可以取得预期的加速比。如果这些GPU卡之间互相等待、内耗,则可能被最慢的GPU拖住,只达到了很小的加速比,得不偿失。如何保证取得线性或者准线性加速比,并且还不损失模型训练的精度,这是一个重要且困难的研究问题。

深度学习"大"挑战的应对策略

接下来我会介绍我们研究组是如何解决前面提到的有关大数据、大模型、大规模训练的技术挑战的。为此,我会简要介绍我们最近从事的三项研究工作:

一个对偶学习Dual Learning;

二是轻量级算法LightRNN;

三是Delay-Compensated ASGD。

对偶学习Dual Learning

什么是人工智能任务的对偶性呢?让我们来看几个例子。比如机器翻译,我们关心中文到英文的翻译,同时也关心从英文到中文的翻译。比如语音方面,我们关心语音识别,同时也关心语音合成。同样,我们关心图像分类,也关心图像生成。如此这般,我们发现,很多人工智能任务都存在一个有意义的相反的任务。能不能利用这种对偶性,让两个任务之间互相提供反馈信号,把深度学习模型训练出来呢?

现在左边的agent拿到了一个中文句子,用他的弱模型将其翻译成了英文,丢给右边的agent。右边的agent做的第一判断是她收到的句子是否是个合理的英文句子?如果从英文语法的角度看,这个句子乱七八糟的看不懂,她就会给出一个负反馈信号:之前的中到英的翻译肯定出错了。如果这个句子从语法上来看没啥问题,她就会用自己的弱翻译模型将其翻译回中文,并且传给左边的agent。同样,左边的agent可以通过语法判断这个翻译是否靠谱,也可以通过这个翻译回来的句子和原本的中文句子的比较来给出进一步的反馈信号。双方可以通过这些反馈信号来更新模型参数。这就是对偶学习,是不是特别简单?

这个过程听起来简单,但真正做起来不那么容易。因为这个闭环中很多的反馈信号都是离散的,不容易通过求导的方式加以利用,我们需要用到类似强化学习中Policy Gradient这样的方法实现模型参数的优化。我们把对偶学习应用在机器翻译中,在标准的测试数据上取得了非常好的效果。我们从一个只用10%的双语数据训练出的弱模型出发,通过无标签的单语数据和对偶学习技术,最终超过了利用100%双语数据训练出的强模型。

首先,有人可能会问,你举的这些例子里确实存在天然的对偶性,可以也有些任务并没有这种天然的对偶性,那能不能使用对偶学习技术来改善它们呢?答案是肯定的。如果没有天然的对偶性,我们可以通过类似"画辅助线"的方法,构建一个虚拟的对偶任务。只不过在完成对偶学习之后,我们仅仅使用主任务的模型罢了。大家可能也听过这几年很火的GAN(Generative Adversarial Nets),它就可以看做一种虚拟的对偶学习。

以前人们在训练一对对偶任务的时候,通常是独立进行的,也就是各自利用自己的训练数据来训练,没有在训练过程考虑到还存在另一个有结构关系的训练任务存在。其实,这两个训练任务是存在深层次内在联系的。大家学过机器学习原理的话,就知道我们训练的分类模型其实是去逼近条件概率P(Y X)。那么一对对偶任务的模型分别逼近的是P(Y X)和P(X Y)。他们之间是有数学联系的:P(X)P(Y X)=P(Y)P(X Y)。其中的先验分布P(X)和P(Y)可以很容易通过无标签数据获得。

因此,我们在训练两个模型的时候,如果由他们算出的联合概率不相等的话,就说明模型训练还不充分。换言之,前面的等式可以作为两个对偶任务训练的正则项使用,提高算法的泛化能力,在未知的测试集上取得更好的分类效果。

轻量级算法LightRNN

接下来,我们来讨论一下如何处理大模型的挑战。举个例子,假设我们要利用clueweb这样的互联网数据集来训练语言模型。这种大数据集通常有千万量级的词表,其中包含很多生僻的人名、地名、公司名,新词、衍生词、甚至是用户输入的错词。如果使用前面提到的循环神经网络来训练语言模型,经过非常简单的运算就可以得出,其模型规模大约80G,也就是说你需要有80G的内存才能放下这个RNN模型,这对于CPU不是什么问题,但是对GPU而言就是非常大的挑战了,主流的GPU只有十几二十G的内存,根本放不下这么大的模型。 就算真的可以,以目前主流GPU的运算速度,也要将近200年才能完成训练。

那么有人会问了,前面的LightRNN算法严重依赖于这个二维映射表,可是怎么才能构建出一个合理的表格,使得有联系的词共享参数,没有联系的词就不共享参数呢?其实这是一个经典的问题。假设我给每个词都已经有一个参数表达,x、y已经有了,就可以通过求解一个最优二分图匹配的问题实现二维映射表的构造。而一旦有了映射表,我们又可以通过RNN的训练更新参数表达。这是一个循环往复的过程,最终收敛的时候,我们不但有了好的映射表,也有了好的参数模型。

Delay-Compensated ASGD

一是同步;

二是异步。

同步并行指的是本地将模型更新后发给参数服务器,然后进入等待状态。直到所有模型更新都发到参数服务器以后,参数服务器将模型进行平均和回传,大家再各自以平均模型为起点,进行下一轮的本地训练。这个过程是完全可控的,而且在数学上是可以清晰描述的。但是,它的问题是由于互相等待,整个系统的速度会被最慢的机器拖垮。虽然使用了很多机器一起进行并行运算,但通常无法达到很高的加速比。为了解决这个问题,异步并行被大量使用。

所谓异步并行指的是,本地机器各自进行自己的训练工作,一段时间以后将模型更新推送到参数服务器上,然后并不等待其他机器,而是把当前参数服务器上的全局模型拿下来,以此为起点马上进行下一轮的本地训练。这个过程的好处就是快,因为各个机器之间不需要互相等待,但是训练过程在数学上的描述是不清晰的,因为包含很多乱序更新,它和单机串行训练的过程相去甚远,所以训练的结果没有很好的理论保证,会受到各个机器之间速度差的影响。我们用延迟来描述这种速度差。具体来说,假设我们一共有10台机器参与运算,对于其中的一台机器,当我从参数服务器上取得一个模型,并且根据本地数据求出模型梯度以后,在我打算将这个梯度回传给参数服务器之前,可能其他的机器已经把他们的模型梯度推送给了参数服务器,也就是说参数服务器上的全局模型可能已经发生了多次版本变化。那么我推送上去的模型梯度就不再适用了,因为它对应于一个旧模型,我们称之为延迟的梯度。当延迟的梯度被加到全局模型以后,可能毁掉全局模型,因为它已经违背了梯度下降的基本数学定义,因此收敛性没法得到很好的保障。

首先,泰勒展开在什么时候有意义呢?Wt和Wt+τ距离不能太远,如果相差太远,那些高阶项就不是小量,有限泰勒展开就不准了。这决定了在训练的哪个阶段使用这项技术:在训练的后半程,当模型快要收敛,学习率较小的时候,可以保证每次模型变化不太大,从而安全地使用泰勒展开。

其次,即便是多加上一个一阶项,运算量也是很大的。因为梯度函数的一阶导数对应于原目标函数的二阶导数,也就是对应于海森阵。我们知道海森阵计算和存储的复杂度都很高,在模型很大的时候,实操性不强。

那么怎么解决这个挑战呢?我们证明了一个定理,在特定情况下,Hessen阵可以几乎0代价地计算出来,而且近似损失非常之小。具体而言,我们证明了对于一些特定的损失函数(负对数似然的形式),二阶导可以被一阶导的外积进行无偏估计。无偏估计虽然均值相同,方差可能仍然很大,为了进一步提升近似效果,我们通过最小化MSE来控制方差。做完之后我们就得到了一个新的公式,这个公式除了以前的异步的梯度下降以外还多引入一项,其中包含一个神奇的Φ函数和λ因子,只要通过调节他们就可以有效的补偿延迟。

在此基础上,我们进一步证明,使用延迟补偿的异步并行算法可以取得更好的收敛性质,其对延迟的敏感性大大降低。

首先是关于深度学习的调参问题。现在深度学习技术非常依赖于调参黑科技。即便是公开的算法,甚至开源的代码,也很难实现完美复现,因为其背后的调参方法通常不会公开。那么,是否可以用更牛的黑科技来解决这个调参黑科技的问题呢?这几年炒的很火的Learning to Learn技术,正是为了实现这个目的。大家可以关注一下这个方向。

我觉得现在所谓的AI其实不配叫做 Artificial Intelligence,更像是animal Intelligence。因为它不够智能,它解决的绝大部分问题都是动物智能做的事情。关键原因是,它没有抓到人和动物的关键差别。人和动物的差别是脑容量的大小吗?是大数据、大计算、大模型能解决的吗?我个人并不这样认为。我觉得人和动物主要的差别是在于人是社会动物,人有一套非常有效的机制,使人变得越来越聪明。

我给大家举个简单的例子,虽然动物也会通过强化学习适应世界,学得一身本事。但是,一旦成年动物死掉,他们积累的技能就随之消失,幼崽需要从头再来,他们的智能进化就被复位了。而人则完全不同,我们人会总结知识,通过文字记录知识、传承知识;人有学校,有教育体系(teaching system),可以在短短十几年的时间里教会自己的孩子上下五千年人类积累的知识。所以说,我们的智能进化过程从未复位,而是站在前人的肩膀上继续增长。这一点秒杀一切动物,并且使得人类的智能越来越强大,从而成为了万物之灵。

可是现在的人工智能研究并没有对这些关键的机制进行分析和模拟。我们有deep learning,但是没有人研究deep teaching。所以我才说现在的人工智能技术是南辕北辙,做来做去还是动物智能,只有意识到人和动物的差别才能有所突破。或许,Deep Teaching才是人工智能的下一个春天。

【 摘自:AI科技评论


本文标题:微软亚洲研究院刘铁岩博士:迎接深度学习的"大"挑战 - 科技
本文地址:www.wuhanews.com/tech/1970.html

评论

  • 相关推荐
  • 新闻
  • 娱乐
  • 体育
  • 财经
  • 汽车
  • 科技
  • 房产
  • 军事