深度学习近年来成为计算机领域最耀眼的明星,衍生出许多实际的应用,主要是在推理与决策等方面取得了突破。然而深度学习如何在超越图像、语音及自然语言处理方面做出更多成绩,比如对人类情感的理解,意识和动机的模仿,会涉及到很多更深层次的问题,是目前深度学习的黑匣子无法打开的魔方。从计算机视觉的角度说一下深度学习瓶颈的看法。
一、深度学习缺乏理论支撑
大多数文章的idea都是靠直觉提出来的,背后的很少有理论支撑。通过实验验证有效的idea,不一定是最优方向。就如同最优化问题中的sgd一样,每一个step都是最优,但从全局来看,却不是最优。
没有理论支撑的话,计算机视觉领域的进步就如同sgd一样,虽然有效,但是缓慢;如果有了理论支撑,计算机视觉领域的进步就会像牛顿法一样,有效且迅猛。
CNN模型本身有很多超参数,比如设置几层,每一层设置几个filter,每个filter是depth wise还是point wise,还是普通conv,filter的kernel size设置多大等等。
这些超参数的组合是一个很大的数字,如果只靠实验来验证,几乎是不可能完成的。最后只能凭直觉试其中一部分组合,因此现在的CNN模型只能说效果很好,但是绝对还没达到最优,无论是效果还是效率。
以效率举例,现在resnet效果很好,但是计算量太大了,效率不高。然而可以肯定的是resnet的效率可以提高,因为resnet里面肯定有冗余的参数和冗余的计算,只要我们找到这些冗余的部分,并将其去掉,效率自然提高了。一个最简单而且大多人会用的方法就是减小各层channel的数目。
如果一套理论可以估算模型的capacity,一个任务所需要模型的capacity。那我们面对一个任务的时候,使用capacity与之匹配的模型,就能使得效果好,效率优。
二、领域内越来越工程师化思维
因为深度学习本身缺乏理论,深度学习理论是一块难啃的骨头,深度学习框架越来越傻瓜化,各种模型网上都有开源实现,现在业内很多人都是把深度学习当乐高用。
面对一个任务,把当前最好的几个模型的开源实现git clone下来,看看这些模型的积木搭建说明书(也就是论文),思考一下哪块积木可以改一改,积木的顺序是否能调换一样,加几个积木能不能让效果更好,减几个积木能不能让效率更高等等。
思考了之后,实验跑起来,实验效果不错,文章发起来,实验效果不如预期,重新折腾一遍。
这整个过程非常的工程师化思维,基本就是凭感觉trial and error,深度思考缺位。很少有人去从理论的角度思考模型出了什么问题,针对这个问题,模型应该做哪些改进。
举一个极端的例子,一个数据实际上是一次函数,但是我们却总二次函数去拟合,发现拟合结果不好,再用三次函数拟合,三次不行,四次,再不行,就放弃。我们很少思考,这个数据是啥分布,针对这样的分布,有没有函数能拟合它,如果有,哪个函数最合适。
深度学习本应该是一门科学,需要用科学的思维去面对她,这样才能得到更好的结果。
三、对抗样本是深度学习的问题,但不是深度学习的瓶颈
我认为对抗样本虽然是深度学习的问题,但并不是深度学习的瓶颈。机器学习中也有对抗样本,机器学习相比深度学习有着更多的理论支撑,依然没能把对抗样本的问题解决。
之所以我们觉得对抗样本是深度学习的瓶颈是因为,图像很直观,当我们看到两张几乎一样的图片,最后深度学习模型给出两种完全不一样的分类结果,这给我们的冲击很大。
如果修改一个原本类别是A的feature中某个元素的值,然后使得svm的分类改变为B,我们会觉得不以为然,“你改变了这个feature中某个元素的值,它的分类结果改变很正常啊”。
目前绝大多数深度学习模型,不管神经网络的构建如何复杂,其实都是在做同样一件事:
用大量训练数据去拟合一个目标函数y=f(x)。
x和y其实就是模型的输入和输出,例如:
图像分类问题。此时x一般就是一个宽度*高度*通道数的图像数值矩阵,y就是分类的类别。
语音识别问题。x为语音采样信号,y为语音对应的文字。
机器翻译。x就是源语言的句子,y就是目标语言的句子。
而“f”则代表深度学习中的模型,如CNN、RNN、LSTM、Encoder-Decoder、Encoder-Decoder with Attention等。不同于传统的机器学习模型相比,深度学习中的模型通常具有两个特点:
模型容量大,参数多
端到端(end-to-end)
借助GPU计算加速,深度学习可以用端到端地优化大容量模型,从而在性能上超越传统方法,这就是深度学习的基本方法论。
那么,这种方法有什么缺点呢?
一、训练f的效率还不算高
训练的效率表现在两方面,首先是训练模型的时间长。众所周知,深度学习需要借助GPU加速训练,但即使这样训练的时间也是以小时或者天为单位的。如果使用的数据量大,加上模型复杂(例如大样本量的人脸识别、语音识别模型),训练时间会以周甚至会以月来计算。
在训练效率上还有一个缺点是样本的利用率不高。举个小小的例子:图片鉴黄。对于人类来说,只需要看几个“训练样本”,就可以学会鉴黄,判断哪些图片属于“色情”是非常简单的一件事。但是,训练一个深度学习的鉴黄模型却往往需要成千上万张正例+负例的样本,例如雅虎开源的yahoo/open_nsfw。总的来说,和人类相比,深度学习模型往往需要多得多的例子才能学会同一件事。这是由于人类已经拥有了很多该领域的“先验知识”,但对于深度学习模型,我们却缺乏一个统一的框架向其提供相应的先验知识。
那么在实际应用中,如何解决这两个问题?对于训练时间长的问题,解决办法是加GPU;对于样本利用率的问题,可以通过增加标注样本来解决。但无论是加GPU还是加样本,都是需要钱的,而钱往往是制约实际项目的重要因素。
二、拟合得到的f本身的不可靠性
我们知道,深度学习在性能上可以大大超越传统方法。但这种性能指标往往是统计意义上的,并不能保证个例的正确性。例如,一个99.5%准确率的图片分类模型,是指它在10000张测试图片中分类正确了9950张,但是,对于一张新的图片,就算模型输出的分类的置信度很高,我们也无法保证结果是一定正确的。因为置信度和实际正确率本质上并不等价。另外,f的不可靠性还表现在模型的可解释性较差,在深度模型中,我们通常很难说清楚每个参数代表的含义。
一个比较典型的例子是“对抗生成样本”。如下所示,神经网络以60%的置信度将原始图片识别为“熊猫”,当我们对原始图像加入一个微小的干扰噪声后,神经网络却以99%的置信度将图片识别为“长臂猿”。这说明深度学习模型并没有想象得那么可靠。
<span style="font-size: 20px; letter-spacing: 2px;"><img src="https://pic4.zhimg.com/v2-13e93ccf7c4a59eb3265473723c63343_b.png" data-rawwidth="1102" data-rawheight="352" class="origin_image zh-lightbox-thumb" width="1102" data-original="https://pic4.zhimg.com/v2-13e93ccf7c4a59eb3265473723c63343_r.jpg"></span>
在某些关键领域,如医疗领域,如果一个模型既不能保证结果的正确,又不能很好地解释其结果,那么就只能充当人类的“助手”,而不能得到普遍的应用。
三、f可以实现“强人工智能”吗
最后一个问题其实有点形而上学,并不是什么技术上的具体问题,不过拿出来讨论讨论也无妨。
很多人关心人工智能,是关心“强人工智能”的实现。仿照深度学习的方法,我们似乎可以这样来理解人的智能:x是人的各种感官输入,y是人的行为输出,如说的话,做出的行为,f就代表人的智能。那么,可以通过暴力拟合f的手段训练出人的智慧吗?这个问题见仁见智,我个人倾向于是不能的。人的智能可能更类似于概念的抽象、类比、思考与创造,而不是直接拿出一个黑盒子f,深度学习方法恐怕需要进一步的发展才能去模拟真正的智能。
计算图越来越复杂,设计越来越反直觉。
Dropout/BN/Residual这些创新也好trick也罢,至少能编一个有眉有颜的直观解释糊弄一下,在截然不同的场景和任务下也有成功的应用。去年这种级别的新的好用的trick基本没见着。炼丹师的人口越来越庞大,通用性的trick却没有被发掘出来,说明领域已经到了一个瓶颈,好摘的桃子已经被摘光了。
结构的潜力已经被挖光了么?还是我们没有找到更具有通用性和代表性的任务来作为新的trick的温床?这些都是DL研究需要回答的问题。现在看起来形式并不乐观,传统的DL研究依赖的改几根线多加几个layer,针对一个特定任务跑个分的范式,现在要发出高质量的paper是越来越困难了。
个人的看法是,如果DL想要真正带上人工智能的帽子,那就要去做智能改干的事情,现在人为的按照应用场景分成NLP/CV/ASR,粗暴的去拟合终究有上限,和人类获得智能的方式也并没有共同点。
深度学习已经被证明是非常成功的机器学习算法。但往往,深度学习庞大的计算性能需求阻碍了它在一些领域的应用,这些领域由于功耗、散热、成本等原因的限制,无法提供充裕的计算能力。
来源知乎
领取专属 10元无门槛券
私享最新 技术干货