雷锋网按:本文为旷视科技首席科学家孙剑日前在 CCF-ADL上做的题为《如何在大公司和创业公司做好计算机视觉研究》的分享,主要介绍了近期计算机视觉的发展现状,ResNet基本原理和设计,旷视科技在计算机视觉的研究进展等。最后他还分享了一些“ 如何在大公司和创业公司做好研究?”的心得。
孙剑,博士,旷视科技(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岁以下杰出青年创新者”。目前孙剑博士正在带领旷视科技的研究团队推进计算机视觉技术的进步和探索其在工业和商业上的实践。
本文为旷视科技首席科学家孙剑日前在 CCF-ADL上做的题为《如何在大公司和创业公司做好计算机视觉研究》的分享,主要介绍了近期计算机视觉的发展现状,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,随着层级的增加,性能得到大幅改善。
ResNet基本原理
2015年,微软提出了ResNet,进一步将深度从20多层推进到152层。ResNet的关键思想是引入了一个跳层的技术,理论上叫“残差学习”的概念。我们可以将神经网络理解成嵌套很多层的映射,从输入到输出,如果直接映射很难的话,有可能残差学习会更容易。残差学习的意思是只学输出相对输入的变化,而不是直接学习输入本身。
举个例子,如果一张图像有些噪点,你想学习一张没有噪点的照片,那你可能只需要学习怎样去掉噪点就行了,而不需要去学习怎样重构一张自然的照片。
残差学习的设计结构和以前网络比起来非常简单,只是加了一些跳层链接。
这个网络为什么能训练好?这个是我们官方的解释,比较直观。如果从前向角度看,在训练过程中有一个动态的特性,整个训练系统是由浅到深的。在训练的初期,可以认为我们是在训练一个浅层的网络,后期是深层网络。
目前神经网络采用反向传播算法,梯度反传过程中幅度会逐层衰减。如果网络浅还好,如果很深的话会衰减到非常小,最后相当于反向传播,就传播不到前面去了,导致训练困难。在新的Design of ResNet里面,大家可以看我们的论文,大概意思就是反向传播的梯度会从最后结果一层直接回馈到很多中间层去。而这个幅度都是不小的。所以从这个意义上来说是绕开了以前梯度消失的问题。
这个工作为什么会有这么大的意义?原因是当做到20层后,就很难再做下去;当再加层的时候,训练将变得非常困难。加完以后训练错误和测试错误都会增加,这其实是个非常大的优化问题,ResNet就试图解决这个优化的问题。
方法有两种:
第一种方法寻找是不同于随机梯度下降的新方法,这个可以行的通,但是非常困难。神经网络发展这么多年,最有效的还是随机梯度下降法,原因未知。
第二个方法,如果能够从新定义这个问题,重新修改数学的formulation的话,就会使解决问题变得容易。学解线性系统的时候我们知道,有一种方法叫做preconditioning,要解方程时,左右两边乘另外一个矩阵,乘完以后整个系统的解其实是不变的,但是这样以后去做优化就会变得容易很多。通过类比以后,残差学习的reformulation,可以让优化过程变得更容易,这个也是引入残差学习最大的意义。
ResNet优化的结果是到今天为止不管设计多少层的网络,只要显存装的下,只要能训练起来,这些都没有任何问题。这就破除了深度学习历史上的一个魔咒:深到一定程度就训练不了了。在深度学习的发展过程中,在一定阶段是没有人相信会有这么深的训练系统。
如果考虑非线性系统的话,这么多的参数,这么高的非线性,怎么能给他训练好呢?现在实践做到了,但理论研究很不完善,因为它是一个高度的非线性系统,缺少有效的分析工具,大多数好的分析工具都是分析线性系统的。
以上是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的性能差别。
人脸识别的进展
嵌入式的设备是比较小的,比如FPGA,但是其实是可以做很大的空间的,下面是人脸检测在FPGA上的一个实时演示,这是我们实时抓屏下来的。它不带任何Tracking,用一个便宜的FPGA就可以做到这样的30帧或60帧的人脸检测和跟踪的效果。这是非常重要的,尤其是在实际应用中。说到人脸和图像分类,最重要的就是人脸识别,这个我自己也做了非常多的时间。旷视(Face++)一开始就是以人脸识别为主的。
当然思路有两类,一个是把它当做分类来做,每个人都有多张照片,你将它们分成一类,这样非常简单。
另外一类是叫测度学习的方法,学习一个feature,来自同一个人的不同照片距离比较近,不同的人的照片距离比较远。
两种方式都很好,而且还可以结合。那现在人脸识别的进展是什么样子的呢?
这个是2013年的进展。2013年有个评测人脸识别的face benchmark,我和我们的同事做了一个Hi-dim LBP的工作,曾经是最好的。
如果和人的性能比较,在这个数据库上比起来还是不够好的。当时不管我们怎么设计这个feature,不管怎么用线性的学习方法,也就到这个地步了。但是随着深度学习的出现,其中一个代表性的工作是facebook 的deep face,第一次用深度学习的方法把结果做到了很接近人类的性能。
然后过了一段时间之后,包括旷视(Face++)在内,我们的研究很快就超过了人类的性能。大家也许会好奇是不是真的超过了人类的性能?今天媒体动不动就宣布机器在这个项目上超过人类了,在那个任务上超过人类了。那是不是这样呢?从学术上来说,在这个benchmark上是超过人类了。但是在应用上,到底有没有超过人类呢?
这里是我们做的人脸识别的应用。有两个大的应用,一个是做1:1的验证,其中一个验证就是提供在线身份验证,和你的身份证照片比对。我们现在已经为上亿人提供了人脸身份认证的服务。另外一个人脸识别的应用是,在数据库中对人脸进行搜索。可以说在很多人脸识别的应用上都已经超过了人类,但并不是全方面超过。
物体检测的进展
第二个我们关心的就是物体检测。简单来说就是你不但需要知道图像里都有哪些东西,还要知道物体在哪里。这是一些目前走在前沿的方法,最重要的方法是Region-CNN,我们叫R-CNN,这个方法很简单,就是把一个区域抠出来,对每个区域做分类。
这个是R-CNN的基本流程,输入进来用一个叫Region Proposals的传统方法,大概找出图像中物体包括几百几千个框,然后把每个框做分类,非常简单有效。但是这个方法有个很大的问题就是他需要对几千个框都run一遍CNN,这个计算代价是不能容忍的。
后来我们在2014年的时候,ECCV上发了个论文,这个叫做SPP-net,基本思想是卷积神经网络出来的feature是非常强大的,包含远超我们想象的丰富信息。直接在feature map上去做prop,prop后把feature拿过来直接做分类,所以可以得到几十倍上百倍的加速,而且性能几乎不变,所以这也增加了我们对卷积神经网络的信心。
不论是SPP-net,Faster R-CNN,R-CNN都有个问题。
第一步都需要一个Region Proposal,这是通过传统方法来做的。用了Faster R-CNN或者SPP-net后,CNN花的时间非常的少,但是Proposal用的时间非常的多。
这个是用Region Proposal的一些方法,其实还是人工设计feature的方法,所以既然我们是用深度学习的方法,Region Proposal既不是深度学习的方法,也不是end to end的,所以我们就想用什么样的方式来替换Region Proposal。
基于这个我们提出了一个faster R-CNN,基本思想是先去卷积一下这个图,得到feature map,然后用它来直接预测Proposal在哪里,拿到Proposal再做Faser R-CNN,也是非常简单的方式。整个系统都可以end-to-end的训练,当然这里有一些逼近。
这是Faster R-CNN的效果,它是第一个能做到100、200毫秒级的整个过程的检测。这个在以前是没法做的。而且通过这样end-to-end的训练,像这样分开两步的训练是比人工设计是更高的。Faster RNN的核心思想是,feature map上可以假设有个sliding window,每个sliding window都会输出Region Proposal。
下边是用faster RNN系统做的检测,而且这个方法是single skill的方法,不需要对图像做计算,而是它可以考虑到大小尺度的所有信息,它可以Propose小东西,也可以Propose大东西,一个尺度的feature就可以handle不同长宽比大小的物品。
这个系统也被大家广泛使用,源代码在网上都有。
我们来比较一下最新的物体检测框架,分别对应3篇论文。第一个是说faster RNN和SSD系统,faster R-CNN是个两步方法,第一步出Proposal,第二步做分类和refine;还有一类是一步法,以SSD Single Shot为代表,就是它希望一步出结果,最后一个是我们一个前同事戴继峰做的工作,叫R-FCN,他会是faster RNN的一个比较有趣的修改。
如果看今天物体检测的benchmark,最好的方式是用ResNet拼接了五个Faster RNN的系统。
文本检测
物体检测非常重要,还有另一类是文本检测。我们都知道,文字的检测其实是非常难的,而且与物体检测也存在不同。
文字检测的主要特点是它的流程(pipeline)非常长,从设计模块、调整参数到训练都要花非常多的时间和心力。
深度学习的精髓是做端到端的训练,旷视(Face++)研究院今年在 CVPR 上发了一篇论文,就是一个基于 FCN 的简化文本检测算法。输入一张图片后,系统会生成Geometry Map 和Score Map两个Map,进而实现端到端的识别,这也是文本检测第一次能用一个这么小的模型实现,这里是它的一些量化评测,在公开评测集上取得了非常好的效果。
我们的研究员正在用不同的方法做一个实时检测的 demo,大家可以看到,这里其实并不涉及文字的识别。
语义分割
第三部分我们关心的是语义分割。即如何把像素映射到一个有语义的标记上来。
其中一个非常大的应用就是无人车。即在感知的时候需要知道人和车的位置。其实用非深度学习的方式已经做得非常不错,但如果涉及更复杂的情况,用深度学习可以做得更好。
在这里我们会采用 FCN 的方法(fully convolutional network,全卷积网络),用下采样抽取后再上采样回来,输出一个 feature map 或是有语义的 map,以完成一个端到端的学习。
涉及的一个概念叫 receptive field(感受野),也就是卷积的特征到底能覆盖多大的区域,而实际上还有一个叫有效感受野的(valid receptive field)概念,因为实际情况往往比理论上覆盖的区域要小。
在研究中我们会发现,做分类和分割实际上是不一样的任务。分类的话,研究者会希望感受野越大越好,而分割则可能需要控制一下。
这和标准的 FCN 还是有不同。如果你想识别图中的鸟的话,实际上我们还是需要一个很大的 receptive field 的。
我们旷视(Face++)实习生最近做了一个工作,他设计了一个方法,在大的 receptive field 或是大的 kernel 中也能实现很好的效果。这也是我们今年 CVPR 的一篇论文《Large-Kernel FCNs》,当时(的结果)在 VOC 2012 Segmentation on Benchmark 上排在第一位。
3D感知问题
以下是三个分类的核心问题。计算机还有一个问题就是 3D 感知问题,而且并不需要两只眼睛,一只其实也可以实现先验感知。
那么用深度学习是否能实现 3D 重建?自然是可以的。
目前研究员在研究如何用单张图片实现 3D 重建。左边是一个图片,右边是它构建的 3D 点云。看不见的地方我们需要利用先验猜一下可能是什么样子。
那么 3D 形态是如何构建的?最难的地方是如何表示 3D。传统方法包括用深度图或是 mesh 等方法实现,即判断一个空间内某个格子是否有这个物体。我们研究员采用的是 3D 点来表示物体的方法,能够呈现连续的特点。
3D 数据库训练了一个检测的 pipeline,红色列是输入,二三列是输出,根据先验知识判断,形成一些合成例子。
在提交论文前,我们在办公室随便拍了一些物体,也得到了一些还不错的结果。这篇论文在 CVPR 上也拿了 oral paper。
由于时间有限,一些技术细节我们在这里就不详细讨论了。
Brain++深度学习平台
在这里我想提一下我们旷视(Face++)自己有一个叫 Brain++的深度学习平台,每个研究员或访问学生只需要用虚拟机远程登录就可以实现算法训练,甚至还包括数据管理、数据标注和模型发布的整套系统。用户标注的数据可以直接上传到系统中,经过训练后就能直接发布模型了。
其中核心的一部分叫 megvii brain,是一个深度学习的训练引擎,大家可能都听说过 caffe、TensorFlow 或 MXNet,那么你可以把 megvii brain 理解为 旷视(Face++)的「TensorFlow」。TensorFlow 已经开源一年,而我们的 megvii brain 已经两年了。
为什么说旷视(Face++)是应用深度学习比较早的公司呢?不只是在做应用,其实底层的技术我们也在做,也开放应用了。
好处在于,很多定制化的东西我们可以自己来做。相对 TF 这样体量大的系统,可能用户在上面做一些改动就会产生很多问题。此外,引擎的占用内存小,训练速度快,有很多东西是我们可以控制的。
前面我们提到了一些技术,接下来会说说产品能做些什么事情。
Face++产品及应用
Face++有两类产品,一类是人脸识别的 FaceID;另一类是智能摄像头。
FaceID
FaceID 实际上就是为了解决一个问题:「如何验证『你是你』?」
比如线上银行开户、或是 Uber 司机的身份验证,目前也有很多方法,不过现在用得比较多的还是人脸识别的解决方案。
FaceID 的 App 身份验证方案的流程是这样的,用户拍一张照片,通过活体检测部分比对身份证信息,通过客户端的 SDK 与云上的计算实现比对任务。而 SmartID 则属于 SaaS 服务,目前已经应用于非常多的领域,包括线上线下的银行,还有以芝麻信用为代表的征信风控业务都在用我们的服务。
前一阵 3·15 展示了如何破解人脸识别技术,这里涉及到一个问题叫「活体攻击问题」,其实反过来想,如果它已经形成一个地下黑色产业链,说明已经成为一个非常有价值的业务。
智能摄像头
第二个方向则是智能摄像头。
我们将算法嵌入摄像头或计算盒子,主要方向是做家庭或公共安全的分析。大家可能了解过,中国的摄像头数量超过世界上的一半,而超过一半的硬盘都被用于存储视频监控内容。
我们来看看交通规划方面,旷视(Face++)的产品能做些什么。如果你能分析清楚视频中的人流车流的 ID,那么这也具有价值。
比如我们做了一套门禁系统,员工上班时不需要打卡,只要走过这个玻璃门前,就能自动识别人脸。目前这套系统也已经获得上百家公司的应用。
此外,我们还可以根据这套系统做一些改变。比如中国每年有很多展会,在注册服务上可能需要很多的人手跟进,那么我们这款产品就能打造成一个基于人脸识别的自动注册系统。
有了这些产品,势必会产生非常大的数据,目前 旷视(Face++)的开放平台 API 被调用的数据在 2016 年达到了 60 亿次,很快会接近 100 亿次。而我们的 Smart ID 也已经服务超过上亿人(不是上亿人次)。
从感知智能到认知智能
我们也希望实现「技术-产品-数据」的一个闭环,也是通过服务不同的行业实现 AI+的方式。我们再回到人工智能。
左边的绿色表示的是拟合映射的任务,用一个函数 F(x)就把很多内容解决了,提供大规模的标注数据就可以实现。但右边的任务就不是一步法就能做的,涉及很多的判断,而且右边的内容可能无法提供一个大的训练环境。虽然目前有很多新技术,也有大量的投入,但还没有很多进展。
计算机视觉虽然我划在左边,但实际上它也涉及右边的认知过程,比如系统能能够判断一个视频里面的内容,而这就涉及到很多 language 和常识的支持。
那么如何从感知智能向认知智能转变呢?
我从一本 2004 年的书中得到很多灵感,它的名字叫《On Intelligence》。作者 Jeff Hawkins 创建了一个研究院,研究如何做类似人脑智能的内容,虽然研究院规模不大,成果也尚不足以证明什么,但书中提出的思想都非常早,包括如何利用存储机做人工智能。
现在训练神经网络是没有内存的,而人类拥有记忆,根据书本、知识将内容传承下来。那么像 Facebook、Google 这样的公司都在做 Memory mechanism 的学习系统,要解决的核心内容在于要存储哪些内容,读取哪些内容,又该做怎样的联想。比如人类记得一首歌、记得一句话,是按一定的顺序记忆的,如果反过来,可能我们都回忆不起来。
此外,很多知识是分层结构的。因此这些内容如何以一个合理的机制存在,是我一直非常关注的研究方向。
另一个我自己觉得非常有意思的内容是无监督的预测。它的基本思想是说,人在学习过程中是需要和物理世界发生交互的,而人类通过观察现实世界就能学习到很多东西,不需要进行额外的标记。虽然我们不否认家长的重要性,但小孩学习的很多东西,也有很多不是父母教的。孩子在观察世界、与世界互动的过程中,包括基因传承的一些内容,就会自发地学习。
举个例子,我们衡量智商会通过 IQ 测试,比如给出一列数字,让你预测下一个数字是什么,或给一串文字,让你判断下一个文字。对将要发生事情的预测,是一个非常重要的监督信号,能够在整个学习过程中运用。现在有很多的研究,通过一段视频,判断下一帧的内容是什么;或通过一个图片预测另一个视角的样子。在这些过程中系统都能学到预测的特征。
在做深度学习时,我做过一篇论文叫《An associate-predict model for face recognition》,解决的是人脸识别中不同姿态的问题。当时我尝试创建了一个外部存储,通过存储 memory 来做预测,效果非常好。但系统本身非常原始,而且是深度学习时代之前的一个研究内容。
那么在无监督预测中,比如真实世界里有一个南瓜,可能人类可以猜出南瓜后面大概长什么样,这就是「image completion」问题,也是十几年前我们做的一个研究,即通过图形学的方法猜出背后的内容。那么今天在感知世界中,我们可以对被遮挡的东西做很多的感知,一个是我们的能力,另一个是教我们如何对真实世界进行推理和预测,通过很多观察的过程进行学习。
总而言之,人工智能很难,但我们从中也看到希望。这是朋友给我分享的一个图片,希望我们能够抵达一个至高点。在这个过程中,希望我们的技术商业数据能够实现循环,而对于每一个从业者来说,我们也需要有足够的热情、洞察力和耐心去做这件事。
我为什么相信这件事呢?今天世界上所有最聪明的人都在投入做人工智能。这张照片是我参加 CTC 大会时拍的,以前这是一个图形学的会议,会研究游戏怎么做。但近年来我参加这个会议,5000 人的图形学大会都在研究怎么做深度学习,更别说我们这些做机器学习的人了。
旷视(Face++)也进行了一个走入校园的活动,分享 CVPR 的五篇论文。旷视(Face++)也希望能找到「数学好、编程好、态度好」的三好学生,和我们一起 All in。
如何在大公司和创业公司做好研究?
最后,我想分享下如何大公司和创业公司做好研究,这些都是个人的一些感悟。我经常被问到以下几个问题:
在创业公司还能否做研究?
在创业公司能否做好研究?
是不是会完全被产品导向?
研究是不是只有用paper来衡量?
研究成果被友商抄去了怎么办?
(AI科技评论注:孙剑在演讲最后给出了自己的回答。)
大公司和创业公司的研发部门的异同
任何一个研发部门,不管是大公司还是小公司,在我看来,其共同的部分是这三个要素:
部门的定位是怎样的?
部门的人员组成是怎样的?
研发方式是怎样的?
这些对应的就是柳传志先生的“定战略、搭班子、带队伍”管理三要素。
我自己比较了一下大公司和小公司,特别是微软研究院和旷视研究院:
我们的使命定位是类似的,但是我们的目标范围是更小的。我们现在只关心的研究最好的深度学习和计算机视觉技术,让最好的技术落地,推动公司的快速发展。
在人员组成上,我们也是非常类似的。唯一不同的是,我们只有一个人不写code。我们旷视研究院员工的平均年龄也非常小,而且管理是非常扁平化的。
研发方式方面,因为规模不同,所以有些不同。我们的范围更小,更聚焦,我们每个小组的动态性也更强,可以短到3个月,也可以长期下去。
创业公司如何招募人才?
有了以上三个方向之后,接下来就需要招募人才。
大家可以看到,一般的创业公司都是通过什么方式来招募人才,其实最重要的还是第一条:people bring people(口口相传)。你可以通过通过个人关系,把最聪明的人引进来。
当然,公开发表论文这件事情也很重要。因为不管是做深度学习还是人工智能,最优秀的人才是希望他的成果能够让大家看得见的。所以在旷视研究院,我们鼓励大家发表公开论文。
我们的人才培养大致有这几个方向:科学家、系统架构师、以及我们自创的全栈人工智能工程师。
虽然人工智能很复杂,但是做应用的话还是相对来说没那么高的门槛,因为深度学习在一定程度上把这个过程缩短了。所以对系统能力强、工程能力强,同时又想做好研究的人,我们设立了全栈人工智能工程师这个职位。他们既是人工智能科学家,也是一个很强的工程师,有很强的解决问题的能力。
创业公司如何做好研究?
我们认为组织建设最重要的是:正直、对自己诚实;平等;安全感、鼓励尝试;学习型组织。
旷视公司的使命是“power human with AI”。一个组织要想真正运行下去,运行好,随着规模的增大,公司的使命是非常重要的。我们目前的愿景是:做最好的人工智能的云平台和最好的智能感知网络。我们的价值观是:追求极致、简单、可靠。
有了人,有了环境之后,要做好研究有三个非常重要的元素:需要有清晰的目标,需要motivate每个人,最后把事情贯彻下去。
关于目标设定,大家可能都有自己的标准,我们认为应该要分别设立终极目标、绩效目标、以及过程目标。我们希望这些目标是能实现的,但是同时又是有挑战性的,而且是大家都agree的。一般的话,我们会为2-4个人的组来制定长期和短期的课题。
有了目标之后,最重要的是怎样让大家为这个目标投入最大的精力。首先,我们相信任何人都是有巨大的潜能的。当然,每个人都有选择的自由,也需要他们的专注、以及想赢的心态。这些是我们认为能提高大家士气的方法。
我们在深度学习训练平台、数据标注上的投入是不遗余力的,希望能够为研究员、实习生创造最好的训练环境。
在创业公司到底能不能做好研究?
最后,回到之前的问题:“在创业公司是否能做好研究?”
我的结论是,可以做最好的研究。我们可以在产品和学术之间找到很好的平衡点,我们的研究既可以用paper来衡量,也可以用研究在产品中的落地和给你带来的成就感来衡量。当然,我们会选择性地发布我们的一些学术性成果。
Q&A环节
Q:在面部识别中,有些恶意攻击能够绕过活体检测,现在的技术可以解决这个问题吗?
A:这实际上是一个安全问题,我之前写过一篇文章来回答这个问题。任何安全问题,绝对意义的百分之百的解是没有的,它只能是说比原来的系统更安全。此外我们也有非常多的防止这种攻击的方式,包括客户端的、云端的等等。
客户对安全问题的承受力是不一样的:有些客户希望尽可能获取更多的用户,因此安全性较低是可以承受的,比如信用卡欺诈。信用卡签字每年有很多欺诈案件,但是总体来看,发卡公司是能够承受的,因为其带来的利益远大于损失,因此可以接受这样的交易方式。
从大的方面来说,这是非常有效的方式,非常多的客户对现有的安全程度是认可的。另一方面,从技术上方面来说,会有不断的新的防活体攻击的技术研发出来。
Q:目前大多数的活体检测需要用户的配合(比如眨眼、张嘴等),未来是否可以不再需要用户配合,在用户没有感觉的情况下,判断他是不是假体?
A:大家可能已经听说,iPhone 8要推出前置3D红外摄像头,这就是一个非常好的新的发展方向,提供了有着最好用户体验的检测活体攻击的新思路。
Q:用红外或者三维这样的方式,可以解决平面型的,比如打印、视屏的攻击。但是对于以后可能出现的3D打印的,或者头套之类的攻击,这种方法是否还有效?
A:对于头套攻击,在业界,包括我们客户都认为,这种假面具、假头套超过了现在要考虑的范围?
Q:您刚才在演讲中提到,“深度是决定一个模型学习能力最重要的因素”。那么这个深度到底有没有一个上限?对于一般的检测和识别任务来讲,什么样的深度就够了?
因为最近有个技术叫模型蒸馏,有一些可能用了一个50层或者100层的模型,但是最后通过模型蒸馏可以用一个10~20层的模型来表达。那就是说,我们在原始设计这个任务的时候,已经增加了很多的冗余量进去了,您是怎样看待模型蒸馏的呢?
A:深度到底要多深跟很多因素有关的。深度最重要的是有很多假设的,当然,跟你的数据量的大小有关,还跟其他因素有关,如果不考虑这些,基本上只要能够匹配好数据大小,越深越好。
关于模型蒸馏,它实际上是个优化问题。因为模型蒸馏还是需要一个大的模型来带着小模型的,那么这个大模型是哪来的?大模型怎样才能训练好?这些都是要考虑的,因为大模型训练好之后才有小模型。蒸馏是一个很好的方法,但是有时候管用有时候不管用。
有些数据有关系,包括我刚才介绍的模型简化,也是去除模型冗余的方式之一。大模型为什么能够被“蒸馏”,其实是因为小模型非常难训练,而大模型给了充分的自由度,因此可以训的很好。这意味着,首先需要有一个能训的很好的系统,才能诱导这个不好训的系统。
如果你直接切换成小模型,以现在的技术来说是很难训出来的。所以说,至少对训练来说,深度还是非常重要的。
Q:您在做公共区域的视频分析的时候,是基于图像做的,还是训练数据用一小段视频去做的?
A:基于图像做的。
Q:您之前提到的一个检测region proposals的方法,请问能详细的解释一下Faster R-CNN的基本思想吗?
A:以前的检测方法是sliding window,每个位置都会去检查,几万个、几十万个都有可能,region proposals用一些方法把这个数字降到几千,这样就可以很快做evaluation。
Faster R-CNN的思想:以前是在图像上做sliding window,现在是在feature map上做sliding window,去预测物体可能在哪里,其实也可以认为它是一种sliding window。
Q:您刚才提到公司产品FaceID可以再云端实现,也可以在客户端实现。那么它在客户端实现的硬件平台和主要思路是什么?
A:我们开发Brian++的一个目的是:一个模型可能需要支持很多平台,包括自己内部给产品做的SDK同时要支持20多种平台,包括手机、嵌入式、ARM7、ARM8,甚至包括安卓、Windows等等。我们需要支持非常多的平台,不同平台的计算不同,比如手机或者平板上精度model size是一定要比云端小很多的,主要是看具体业务需要做到什么地步,然后再去平衡计算复杂度和精度。
Q:关于网络结构学习,以我的了解,现在的网络学习一般都是在学习好之后,然后通过剪枝的方式来优化这个网络结构,使得这个网络结构更加精简。那么是不是能通过不断地数据流入,网络结构不断学习,实现生长式的学习过程?
A:这方面的文献目前很少。实际上,通过增强学习方法来不断调整网络结构目前不是非常成功。目前来说,训练一个非常有效的网络,周期非常长,因此整个周期也降不下来,所以目前没有非常好的方式来自动学好网络结构。我自己也不是非常确信能够学得好。
以上是CCF ADL 课程中孙剑博士的演讲全文,附另7位演讲大牛名单:
微软亚洲研究院主任研究员郑宇
地平线机器人创始人兼 CEO 余凯
360 首席科学家颜水成
华为诺亚方舟实验室主任李航
思必驰创始人兼首席科学家俞凯
KDD China 主席杨强
中科视拓创始人兼 CTO 山世光