AI科技评论按:本文为旷视科技首席科学家孙剑日前在 CCF 与 KDD China 联合主办的ADL上做的题为《如何在大公司和创业公司做好计算机视觉研究》的分享,雷锋网进行了全文整理。以下是第一部分。
传送门:旷视科技孙剑:如何在大公司和创业公司做好计算机视觉的研究(二)
旷视科技孙剑:如何在大公司和创业公司做好计算机视觉的研究(三)
孙剑博士(摄影:雷锋网 刘芳平)
孙剑,博士,旷视科技(Face++)首席科学家、研究负责人。2003年毕业于西安交通大学人工智能与机器人研究所,毕业后加入微软亚洲研究院(Microsoft Research Asia),任至首席研究员。其主要研究方向是计算摄影学(computational photography)、人脸识别(face recognition)和基于深度学习的图像理解(deep learning based image understanding)。自2002年以来在CVPR、ICCV、ECCV、SIGGRAPH、PAMI五个顶级学术会议和期刊上发表学术论文100+篇,Google Scholar 引用 20,000+次,H-index58,两次获得CVPR Best Paper Award (2009, 2016)。孙剑博士于2010年被美国权威技术期刊Technology Review评选为“全球35岁以下杰出青年创新者”。孙剑博士带领的团队于2015年获得图像识别国际大赛五项冠军(ImageNet分类,检测和定位,MS COCO检测和分割),其团队开发出来的“深度残差网络”和“基于区域的快速物体检测”技术已经被广泛应用在学术和工业界。同时孙剑带领的团队的研究成果也广泛被应用在微软Windows, Office, Bing, Azure, Surface, Xbox等多条产品线上。目前孙剑博士正在带领旷视科技的研究团队推进计算机视觉技术的进步和探索其在工业和商业上的实践。
以下为演讲内容,主要介绍了近期计算机视觉的发展现状,ResNet基本原理和设计,旷视科技在计算机视觉的研究进展等。最后他还分享了一些“如何在大公司和创业公司做好研究?”的心得。
图一
计算机视觉发展现状
去年夏天我加入旷视科技,就是大家所熟知的Face++,Face++其实是早期一款产品的名字,而并非公司名称。简单来说这家公司主要就是用深度学习来做计算机视觉。计算机视觉是目前人工智能中比较热的一块。大家目前将人工智能分为感知智能和认知智能两部分,其中语音识别、计算机视觉是人工智能进展最快的技术。(图一)右侧NLP和各种通用人工智能,属于认知智能领域,这部分有很大的进展,但仍处于很强的探索阶段,所以,没有(图一)左侧绿色部分进展大。
旷视科技就是做感知智能的计算机视觉部分。当然,计算机视觉并不只是纯感知智能,它也涉及更高层的理解。但是作为感知智能的第一步,它很大的一部分功能是在做感知部分。
计算机视觉和语音识别不一样,语音识别可能只有一个应用,就是做翻译。把语音翻译成文本信号,当然还有一个文本合成的任务,但是它的主要任务只有一个,就是一直改善文本信号处理的结果。
图二
但是计算机视觉很不一样,它的应用非常多,这里列举了6个比较热且重要的应用:
视频监控
人脸识别
医学图像分析
自动驾驶
机器人
AR、VR
计算机视觉技术的内容非常丰富,并不是简单的图像识别,它还涉及很多其他的知识。
图三
旷视科技在2011年~2014年做了一个Face++这样的人工智能开放云平台,提供人脸识别、图像识别的开放服务;从2014年开始,公司聚焦在两个方向:一个是互联网金融,以提供人脸识别认证服务为主,另外一方面是IoT,就是智能前端化。往后,我们希望打造最好的智能云和智能机器。
图四
旷视怎样去做视觉智能呢?
基本路线和很多公司类似。从技术、到产品、再到数据,希望这三部分能运转起来。今天深度学习的方法需要大量的数据,更精准的说是大量的标注数据,有大量的数据,才能把算法做的更好。
很多人会问数据如何而来,旷视认为最有效的方法还是通过真实业务,不断地把数据从真实场景回流回来,然后再去驱动算法,自然就可以把第一版算法做不好的事情解决了。
旷视科技研究院的基本任务是产生核心的技术,这些技术可以用来做产品,然后产品落地到市场。
图五
研究院主要关心4个技术:
分类
检测
分割
序列学习
其中分类技术是对图片做一个分类,或者对图片中的区域做一个分类,或者对图片的每个像素都做一个分类;序列学习技术是输入一个视频,或者一个有序列的Python(比如一串文字)后,怎样用序列之间的关系来做学习和推理。
这里不包含计算机视觉3D感知的部分,一个公司要做计算机视觉,首先要聚焦在一个具体的方向。
图六
这4个方向的主要研究成果有:
图像分类:现在最强的方法是用深度学习来做。有个数据库叫ImageNet,这张PPT展示的是2010年的一个比赛情况,上面的数字是Top5的错误率,意思是大概1000类的物体大概能分多准,这个数字越小越好。最大的进展发生在2012年,Geoffrey Hinton和他的学生Alex第一次用深度学习方法把错误率大幅降低。随着神经网络的深度层次越来越多,错误率越来越低。在2015年的时候,当时我在微软亚洲研究院的团队做的ResNet,第一次把网络的深度从几十层提高到100多层,后来可以做到上千层。后来在ImageNet的数据库上,error可以降到比人类还要低的错误率。
图七
背后的核心技术是深度卷积神经网络,这个网络其实是一切嵌套到非线性函数的组合,因为不断的嵌套非线性,构成了一个非常复杂的非线性系统。
深度神经网络的一个精髓是要做end-to-end Learning,输入最好不要涉及feature,因为中间的很多参数都希望整个系统是可求导的。不输入feature的end-to-end Learning的 ,所有参数都可以学,从而简化了训练过程,避免了很多人工因素。一个系统如果非常复杂的话,但人的能力是非常有限的,人类只能调有限的参数,所以能简化训练的end-to-end Learning显得尤为重要。
那么问题来了,如果做一个非线性变换,这相当于映射一个函数,那么研究人员到底要做什么呢?以前研究人员的主要任务是设计feature,设计一个有效的feature是一个很大的贡献。有了feature再设计分类器,在end-to-end Learning的体系下,你到底可以做什么东西,能够对end-to-end Learning有用?
仔细观察神经网络的结构,有一部分不是learn出来的,比如网络的结构就不是learn出来的,结构目前还是手工指定的。
不过现在的一些最新的进展,希望通过RNN的方法或者是深度增强学习的方法,来自动探索网络结构。目前来说,还没有很显著的成果。
图八
如果你指定一个卷积神经网络的话,里面的结构有一些变量是可以来设计的。这个是时间复杂度的公式,这里面有几个关键的数据:Depth(深度),filter number(卷积神经网络每一层filter的数目),以及filter size卷积神经网络每一层filter的大小)和filter map size(图像卷积后的空间分辨率)。这同时也是决定一个网络计算复杂度的公式。
其实一个网络的能力在很大程度上是被计算力限制。比如说计算力法则,如果相似体系的一个网络,如果计算力相似的话,不管参数多也好、少也好,包括上述提到的在变化的参数,大致的filter能力都是相似的。在design space中,我们可以做一些事情,探寻一下怎样组合这些参数,能够做一个更好的网络。
图九
其中有一些设计原理,比如在对图像分类的时候,随着层级的增加,应该把图像的空间分辨率慢慢缩小,但这同时也需要在每一层中增加filter number。后来大家发现,用小的filter size是更经济的,还有一些则包括用Low-rank逼近的方法,比如说在网络中持续的用1*1的filter。
我们在2015年的时候研究过,哪些参数是最关键的,当时的结论是在刚才的4个参数里面,深度是非常关键的。如果给定你一个fixed的计算代价的话,你首先要考虑的参数是深度,深度决定了这个网络的能力。有兴趣的话可以参看下面这篇论文。
图十
2012年,AlexNet是8层网络,几层卷积,几层全连接。当时很多人是不相信深度是有用的。但是两年后,牛津大学和谷歌分别做了VGG Net 和Google Net,随着层级的增加,性能得到大幅改善。
图十一
2015年,微软提出了ResNet,进一步将深度从20多层推进到152层。ResNet的关键思想是引入了一个跳层的技术,理论上叫“残差学习”的概念。我们可以将神经网络理解成嵌套很多层的映射,从输入到输出,如果直接映射很难的话,有可能残差学习会更容易。残差学习的意思是只学输出相对输入的变化,而不是直接学习输入本身。
举个例子,如果一张图像有些噪点,你想学习一张没有噪点的照片,那你可能只需要学习怎样去掉噪点就行了,而不需要去学习怎样重构一张自然的照片。
残差学习的设计结构和以前网络比起来非常简单,只是加了一些跳层链接。
图十二
这个网络为什么能训练好?这个是我们官方的解释,比较直观。如果从前向角度看,在训练过程中有一个动态的特性,整个训练系统是由浅到深的。在训练的初期,可以认为我们是在训练一个浅层的网络,后期是深层网络。目前神经网络采用反向传播算法,梯度反传过程中幅度会逐层衰减。如果网络浅还好,如果很深的话会衰减到非常小,最后相当于反向传播,就传播不到前面去了,导致训练困难。在新的Design of ResNet里面,大家可以看我们的论文,大概意思就是反向传播的梯度会从最后结果一层直接回馈到很多中间层去。而这个幅度都是不小的。所以从这个意义上来说是绕开了以前梯度消失的问题。
这个工作为什么会有这么大的意义?原因是当做到20层后,就很难再做下去;当再加层的时候,训练将变得非常困难。加完以后训练错误和测试错误都会增加,这其实是个非常大的优化问题,ResNet就试图解决这个优化的问题。
图十三
方法有两种:
第一种方法寻找是不同于随机梯度下降的新方法,这个可以行的通,但是非常困难。神经网络发展这么多年,最有效的还是随机梯度下降法,原因未知。
第二个方法,如果能够从新定义这个问题,重新修改数学的formulation的话,就会使解决问题变得容易。学解线性系统的时候我们知道,有一种方法叫做preconditioning,要解方程时,左右两边乘另外一个矩阵,乘完以后整个系统的解其实是不变的,但是这样以后去做优化就会变得容易很多。通过类比以后,残差学习的reformulation,可以让优化过程变得更容易,这个也是引入残差学习最大的意义。
ResNet优化的结果是到今天为止不管设计多少层的网络,只要显存装的下,只要能训练起来,这些都没有任何问题。这就破除了深度学习历史上的一个魔咒:深到一定程度就训练不了了。在深度学习的发展过程中,在一定阶段是没有人相信会有这么深的训练系统。如果考虑非线性系统的话,这么多的参数,这么高的非线性,怎么能给他训练好呢?现在实践做到了,但理论研究很不完善,因为它是一个高度的非线性系统,缺少有效的分析工具,大多数好的分析工具都是分析线性系统的。
以上是ResNet的基本原理。
图十四
下一步旷视(Face++)要做的就是如何将ResNet 怎么设计的更好,其中一个方向是要有更高的精度,但是在实际的工程应用中有个很大的问题:就是它的计算量是非常大的。如果你用参加ImageNet得冠军的那个Model来去做实际应用的话是非常不现实的。
大家可以看一下这个图,x轴是不同的网络,y轴上每个bar上的数字是每个网络的计算量,单位是GFLOPs。可以看到虽然error下降了,但是计算量却在不停的上升。虽然结果做的很好,但是计算量非常的大。比如说一个好的网络可以到十几到二十几的GFLOPs,但是在实际应用中,我们常用的手机或者嵌入式设备,能承担的GFLOPs可能在0.01,也就是说你需要做一个百分之一或者千分之一计算复杂度的Model,才可以在实际的系统用,所以这是一个很大的挑战。
图十五
目前旷视(Face++)与研究领域在不同的方向探索后找到了一个解决方案,大致有三类方式可以解决这个问题:设计一个更好的网络,或者简化网络,再或者对于如何表述网络内部的值可以做一些研究。
图十六
第一,如何更好的设计这个网络?这里列了一些最近比较流行的网络设计。整体网络的结构还是ResNet的设计,但是每一层怎么设计,每一层怎么设计最经济,所以这是一个非常重要的问题。
第二,在简化网络方面,我们可以做结构的Pruning,这里我大概分了一共有3种方法。
第一种方法叫做稀疏连接,本来一个网络里有很多连接的。然后基本思想是去除不重要的连接,让这个连接变稀疏了。但是这个方法的问题就是它可以减少网络的模型大小,但是不一定能够减少网络的运行时间;
第二种就是tensor分解的方法,就是把一个卷积网络通过tensor分解,用它的低值特性做逼近;
第三种是channel pruning,是我们最近做的一种比较有趣的方法,就是训练好一个网络后,简单粗暴的把一些channel 去掉。
图十七
其中这个tensor分解的方法,基本思想是a是原来网络设计的卷积过程,然后怎么能够将它通过一个低值分解的方式,拆成中间的channel filter数目比较小的b。
图十八
图十九
第三,就是我们在旷视(Face++)做的非常多的Low-bit的表示。这张图大概描述了一下什么是卷积,卷积就是输入一个三维的feature map,拿另外一个卷积核在上面卷,feature map标准的话都是float表示的,卷积核其实也是一个三维的矩阵,它也是float表示的。Low-bit的表示方法就是不要用这些float的方式来表示,而是用一些低精度的表示,比如8位或者更加极端的两位来表示。大家可以看到这是之前的两篇比较著名的工作。一个是Binary connect,他的思想是把这个weight都变成01,这也是很夸张的一个想法。下面是更进一步的工作,它是将feature和weight全变成01,这样的好处是叫XNOR-Net,好处是卷积神经网络里的矩阵层,可以变成一个bitcount的指令,就可以完成它想要完成的计算,这个是在硬件中很有效的一个方法,也是Low-bit网络非常吸引人的地方。优点在于:1.内存可以降得非常多;2.潜在的加速比非常大。
这个(Low-bit)Reoresentation是我们旷视(Face++)研究员做的,它除了能量化weight或feature,还可以量化gridient,就是在反向回传的过程中,gridient标准其实也是float的,他的意义是如果你想做并行训练,主要问题是通讯的overfit非常大,也需要传gridient,或者你想把训练放在FPGA或者芯片上来做的话,这样如果你能做weight或feature,gridient的话,你就可以做这样的训练,所以我们推荐了一个设置就是weight用01表示,activation用两位表示,gridient用4位表示。所以我们同事将它取名为DOReFa-Net。
图二十
这个图表是最近的一个类似的工作,比较了一下DOReFa-Net和他们的Net的性能差别。
未完待续,请持续关注雷锋网的后续文章……