<img src="https://pic1.zhimg.com/v2-35fb4e11a0719721a5f937a4fa875830_b.png" data-rawwidth="1214" data-rawheight="618" class="origin_image zh-lightbox-thumb" width="1214" data-original="https://pic1.zhimg.com/v2-35fb4e11a0719721a5f937a4fa875830_r.jpg">
我们的主题是开启智能计算的研究之门,我想从一个研究者的角度跟大家讨论一下我们还能做些什么,甚至是更有意义的是去做些什么。人工智能表面看起来很火,其实如果把这张魔术的台布展开,你就会发现它千疮百孔,各种各样非常基础的问题其实并没有解决,甚至有很多哲学的方法论的东西从我们的角度来看可能也不准确。
面对这样的情况,更有意义的事情可能是冷静下来,去从事一些能够改变人工智能现状以及未来的很本质的基础研究工作,甚至是去反思人工智能发展的路线图,看看我们是不是应该重启一条道路。这些事情才能使得我们不仅仅是随波逐流,不仅仅是变点现,骗点钱,而是在人工智能发展的真正道路上留下我们自己的足迹,过了几十年当大家回忆的时候,另外一个人站在台上讲述人工智能一百年的时候,他会在那个图上标着一个星星,那里面讲的是你的故事。
前面这些人工智能现象的背后是什么?说到技术层面,现在最火的两个词,一个叫Deep Learning(深度学习),一个叫Reinforcement Learning(增强学习)。深度学习是什么?通俗地讲,它就是一个端到端的学习,我们不需要一些feature engineering,而是用一个非常复杂的、容量很大的模型去直接拟合输入输出,让模型自己探索有意义的中间表达。
什么是增强学习?通俗地讲,就是学习机器不断地跟环境做自主的互动,在互动的过程中用长远的收益来指导当下该做什么决策,通过不断的跟环境互动去调整决策的最优性。
<img src="https://pic2.zhimg.com/v2-cdf40e087fef0172677514cf5be2da4d_b.png" data-rawwidth="1600" data-rawheight="832" class="origin_image zh-lightbox-thumb" width="1600" data-original="https://pic2.zhimg.com/v2-cdf40e087fef0172677514cf5be2da4d_r.jpg">
之所以现在深度学习和增强学习能够取得很大的成功,背后有一个很大的原因,就是基于巨大的数据和巨大的运算量训练出的拥有巨大容量的模型,所以它们的成功离不开硬件系统,这也是为什么现在GPU这么火,包括云计算、多机协作已经成了我们必不可少的环节。
这是现在人工智能的现状。面对这样的现状,我们是按照大家指定的这条道路去走,多搞几个GPU去训练一些模型跟别人PK,还是反思一下这条路对不对,有没有什么问题,接下来我想跟大家讨论的就是人工智能的诸多问题。我只列了一些其中的代表,但其实问题远远不止这些。
第一件事,现今的人工智能技术,尤其是以深度学习为代表的,需要大量的标注数据,来让我们能够训练一个有效的模型,它不太依赖于人的先验知识,要learning from scratch。如果想从零开始学习就需要有大量的样本提供规律。比如,图像分类,现在通常会用上千万张图像来训练;语音识别,成千上万小时的有标注的语音数据;机器翻译一般都是在千万量级的双语语对上去做训练,这样的数据之前是不可想象的,但是我们这个时代是大数据时代,所以有了这些数据,就使得深度学习训练成为了可能。但这是不是一剂万能的灵药呢?其实在很多领域里是不可能或者是很难获得类似的数据的。比如医疗上面,很多疑难杂症,全世界也没有几例,那怎么能够对这个类别搜集大数据。所以从这个意义上讲,如果我们能够找到一种方法克服对大的标注数据的需求,我们才能够使得现在的人工智能技术突破目前数据给它划定的边界,才能够深入到更多的领域里面去。
第二个挑战是关于模型大小以及模型训练难度的问题,前面提到了深度神经网络有很多层,而且一般参数都很大,几十亿的参数是家常便饭。面对这样的网络,至少有两个困难,一个是我们经常提到的梯度消减和梯度爆炸的问题,当深层网络有非常多层次的时候,输出层和标签之间运算出来的残差或者是损失函数,是很难有效地传递到底层去的。所以在用这种反向传播训练的时候,底层的网络参数通常不太容易被很有效的训练,表现不好。人们发明了各种各样的手段来解决它,比如加一些skip-level connection,像我们微软亚洲研究院发明的ResNet技术就是做这件事情的,还有很多各种各样的技巧。但这些其实都只是去解决问题的技巧,回过头来,原来的这个问题本身是不是必要的,是需要我们反思的。
再有就是模型爆炸。前面说了几十亿的参数是家常便饭,几十亿甚至上百亿个参数意味着什么,意味着模型本身的存储量是非常大的。举一个简单的例子,如果我们用神经网络来做语言模型,给出的训练数据集是Clueweb整个网络上的网页,大概有十亿个网页的量级。 这样的一个数据,如果要去用循环神经网络去训练一个语言模型,简单计算一下就会知道,它需要用到的模型的大小大概是80G到100G的大小,听起来好像不太大,但是现在主流的GPU板上的存储24G已经算是高配,换句话说,80G到100G的大小已经远远超过一个GPU卡的容量,那么就一定要做分布式的运算,还要做模型并行,有很多技术难度在里面。即便有一个GPU卡,能够放下这80G或100G的模型,如此大的训练数据过一遍也可能要用上百年的时间,这听起来也相当不靠谱。到底需不需要这么大的模型,有没有必要我们非要把自己放在一个内存也不够用,计算时间也非常长,也不能忍受的境地呢,这个是值得思考的问题。
<img src="https://pic1.zhimg.com/v2-6d6e276e14f4044d92f8d105f5df30bc_b.png" data-rawwidth="1158" data-rawheight="613" class="origin_image zh-lightbox-thumb" width="1158" data-original="https://pic1.zhimg.com/v2-6d6e276e14f4044d92f8d105f5df30bc_r.jpg">
说到大模型,标注数据很大,那必然要提到分布式运算,分布式运算听起来是一个相对成熟的领域,因为系统领域已经对分布式计算研究了很多年。但是回到我们分布式机器学习这件事情上是有所不同的:这里我们做分布式运算的目的是为了让我们能够用更多的资源来容纳更大的模型,使得运算的时间缩短到能接受的程度,但是我们不想丢掉运算的精度。
举个例子,原来用上百年的时间可以得到一个非常精准的语言模型,现在有100台机器,虽然算的很快,但出来的语言模型不能用了,这件得不偿失。
说到分布式运算有两个主流的方式,一个是同步的并行方式,一个是异步的并行方式。同步的并行方式是什么,就是很多机器都分了一个子任务,大家每计算一步之后要互相等待,交换一下计算的结果,然后再往前走。这个过程能够保证对整个分布式运算的流程是可控的,可以知道发生了什么,在数学上可以做建模,能够在理论上有所保证。但它的问题就是所谓的木桶原理,这个集群里面只要有一台机器很慢,分布式运算就会被这台机器拖垮,就不会得到好的加速比。
所以人们开始做异步的并行方式,异步的意思就是每台机器各自做自己的事情,互相不等待,把当前按照各自的数据训练出来的模型更新推到某一个服务器上,再更新整体模型。但这时候又出现了一个新的问题,就是乱序更新的问题,这个过程是不能被我们原来的数学模型所描述的,违背了优化技术的一些基本假设。比如当我们使用随机梯度下降法的时候,可以证明当时用一个不断减小的学习率时,优化过程是有收敛性的。这是因为我们每一次增加的那个梯度是在上一次计算的模型基础上算出来的梯度。一旦加上去的梯度可能是旧的,不是依据前一个模型算出来的,到底优化过还能不能收敛,就不那么清楚了,所以虽然速度快,精度却可能没有保证。
第四个,我把它叫做调参黑科技,难言之隐。这件事情特别有趣,我前一段时间参加过一个论坛,一位嘉宾的一句话给我印象特别深,他说大家知道为什么现在很多公司都有深度学习实验室吗,以前没听说过有一个叫支持向量机实验室的,为什么?这是因为像SVM这样的技术训练过程非常简单,需要调节的超参数很少,基本上只要按部就班去做,得到的结果都差不多。
但深度学习这件事情,如果不来点调参黑科技,就得不到想要的结果。所谓深度学习实验室,就是一批会调参的人,没有他们深度学习就没那么好用。虽然是句玩笑,但是深度学习力要调的东西确实太多了,比如说训练数据怎么来,怎么选,如果是分布式运算怎么划分,神经网络结构怎么设计,10层、100层还是1000层,各层之间如何连接,模型更新的规则是什么,学习率怎么设,如果是分布式运算各个机器运算出来的结果怎么聚合,怎么得到统一的模型,等等,太多需要调的东西,一个地方调不好,结果可能就大相径庭。这就是为什么很多论文里的结果是不能重现的,不是说论文一定不对,但至少人家没有把怎么调参告诉你,他只告诉了你模型长什么样而已。
下一个挑战,叫做黑箱算法,不明就里。这不仅仅是神经网络的问题,更是统计机器学习多年来一直的顽疾,就是用一个表达能力很强的黑盒子来拟合想要研究的问题,里面参数很多。这样一个复杂的黑盒子去做拟合的时候,结果好,皆大欢喜。如果结果不好,出现了反例,该怎么解决呢,这里面几亿、几十亿个参数,是谁出了问题呢,其实是非常难排错的事情。相反,以前有很多基于逻辑推理的方法,虽然效果没有神经网络好,但是我们知道每一步是为什么做了决策,容易分析、排错。所以最近几年有一个趋势,就是把基于统计学习的方法和基于符号计算的方法进行结合,造出一个灰盒子,它既具备很强的学习能力,又能在很大程度上是可理解、可支配、可调整的。
<img src="https://pic1.zhimg.com/v2-8a874b260a505752f60a6b0933664278_b.png" data-rawwidth="1601" data-rawheight="786" class="origin_image zh-lightbox-thumb" width="1601" data-original="https://pic1.zhimg.com/v2-8a874b260a505752f60a6b0933664278_r.jpg">
到现在为止,这几件事都是现在人工智能技术层面的问题。接下来,谈的是更像方法论和哲学的问题,仅为个人的观点,跟大家一起分享。
其中一条,我叫做蛮力解法,舍本逐末。这句话什么意思?刚才我提到过深度学习之所以这么成功,是因为它有一个特别强的表达能力,在历史上人们证明过深层神经网络有universal approximation theorem,只要隐结点的数目足够多,任意给一个连续函数,它都可以无限逼近这个函数,换言之,有了很强的表达能力,什么问题都可以学的很好。听起来好像是挺美好的事,但实际上它背后存在一个问题:它拟合的是数据的表象,数据表象可以非常复杂,但是数据背后驱动的规律是不是真的那么复杂呢,如果我们只看到表象不去研究数据产生的本质,很可能你花了很大的力气去拟合,但是浪费了很多时间,得到的结果也不鲁棒。
举个例子,我们发现大自然也好,人类社会也好,其实没有想象的那么复杂,虽然你看到的很多数据很复杂,它们背后的规律可能非常简单。像量子力学有薛定谔方程、量子化学、流体力学、生物遗传学、经济学、社会学也都有类似的简单方程,科学家发现那么纷繁复杂的现象都可以被一个动态系统所刻划,而动态系统背后的规律可能就是一个最高二阶的偏微分方程。大家可以想象,如果不知道这些机理,不对动态系统做建模,只对动态系统的产出数据做建模,就会觉得这个问题非常复杂,要有一个容量非常大的神经网络去逼近这个数据。但反过来,如果目光焦点在这个动态系统身上,可能就两三个参数的一个二阶微分方程就搞定了。
下面也是一个值得思考的问题——动物智能,南辕北辙,虽然前面提到人工智能产生了很多的进步,但其实目前所做的还主要是认知的事情,做一个Pattern Recognition,听听声音,看看图像,这是动物也能做的事。今天的人工智能没有回答一个关键的问题,就是动物和人的区别。可能有人会讲,据说猴子的大脑比人的大脑小很多,有可能是体量的不同。但人的祖先跟大猩猩在包容量上应该没有本质的区别,那到底为什么经过漫长的进化,人能成为万物之灵主宰地球了呢?
我自己的观点是因为人类发明了很多动物界没有的机制和规律。比如我们有文字,我们可以把我们对世界的认知,总结出来的规律写下来,把它变成书,变成资料传给我们的下一代。当老一辈的人去世之后,孩子们读读书,就掌握了之前几百年几千年人们对世界的认识。但是老一代大猩猩死掉之后,它的孩子就要从头学起。另外,我们人类有强大的教育体系,人从幼儿园开始,小学,中学,一直进入大学,用了十几年的时间,就把几百年、几千年的知识都掌握在身上了,可以站在巨人的肩膀上继续往前走,这非常了不起。好的老师,会教出好的学生,教学相长,薪火相传。
这些人类的精髓在今天的人工智能技术里面是并没有充分体现,而没有它们我们怎么能指望深度神经网络达到人的智商呢?
前面列了很多方面,是我们对人工智能领域的一些看法,不管是从技术层面,还是方法论层面,都有很多值得进一步挖掘的点,只有这些问题真正解决了,人工智能才可能稳稳妥妥的往前走,而不只是昙花一现。
作者:微软亚洲研究院
来源:知乎
著作权归作者所有。
欢迎扫码添加小编,加入人工智能和大数据公众号读者交流群,探讨、分享、交流!交流群每周会邀请行业专家进行在线分享!
领取专属 10元无门槛券
私享最新 技术干货