做者 | 王井东
算法
整理 | 阿司匹林数组
出品 | AI科技大本营(公众号ID:rgznai100)微信
卷积神经网络在近几年得到了跨越式的发展,虽然它们在诸如图像识别任务上的效果愈来愈好,可是随之而来的则是模型复杂度的不断提高。愈来愈深、愈来愈复杂的卷积神经网络须要大量存储与计算资源,所以设计高效的卷积神经网络是很是重要和基础的问题,而消除卷积的冗余性是该问题主要的解决方案之一。
网络
如何消除消除卷积的冗余性?咱们邀请到了微软亚洲研究院视觉计算组资深研究员王井东博士,为你们讲解发表在 ICCV 2017 和 CVPR 2018 上基于交错组卷积的方法。机器学习
回放地址:https://edu.csdn.net/huiyiCourse/detail/783性能
如下是公开课内容,AI科技大本营整理,略有删减:学习
▌深度学习大获成功的缘由优化
2006年《Science》上的一篇文章——Reducing the Dimensionality of Data with Neural Networks,是近十多年来促进深度学习发展很是重要的一篇文章。当时这篇文章出来的时候,不少机器学习领域的人都在关注这个工做,可是它在计算机视觉领域里并无取得很是好的效果,因此并无引发计算机视觉领域的人的关注。ui
深度学习的方法在计算机视觉领域真正获得关注是由于 2012 年的一篇文章——ImageNet Classification with Deep Convolutional Neural Networks。这个文章用深度卷积神经网络的方法赢得了计算机视觉领域里一个很是重要的 ImageNet 比赛的冠军。在 2012 年以前的冠军都是基于 SVM(支持向量机)或者随机森林的方法。人工智能
2012年 Hinton 和他的团队经过深度网络取得了很是大的成功,这个成功大到什么程度?比前一年的结果提升了十几个百分点,这是很是可观、很是了不得的提升。由于在 ImageNet 比赛上的成功,计算机视觉领域开始接受深度学习的方法。
比较这两篇文章,虽然咱们都称之为深度学习,但实际上相差还挺大的。特别是 2012 年这篇文章叫“深度卷积神经网络”,简写成 “CNN”。CNN 不是 2012 年这篇文章新提出来的,在九十年代,Yann LeCun 已经把 CNN 用在数字识别里,并且取得很是大的成功,可是在很长的时间里,你们都没有拿 CNN 作 ImageNet 比赛,直到这篇文章。今天你们发现深度学习已经统治了计算机视觉领域。
为何 2012 年深度学习可以成功?其实除了深度学习或者 CNN 的方法之外,还有两个东西,一个是 GPU,还有一个就是 ImageNet。
这个网络结构是 2012 年 Hinton 跟他学生提出的,其实这个网络结构也就8层,好像没有那么深,但当时训练这个网络很是困难,须要一个星期才训练出来,并且当时别人想复现它的结果也没有那么容易。
这篇文章之后,你们都相信神经网络越深,性能就会变得越好。这里面有几个表明性的工做,简单回顾一下。
深度网络结构的两个发展方向
▌愈来愈深
2014 年的 VGG,这个网络结构很是简单,就是一层一层堆积起来的,并且层与层之间很是类似。
同一年,Google 有一个网络结构,称之为“GoogLeNet”,这个网络结构看起来比 VGG 的结构复杂一点。这个网络结构刚出来的时候看起来比较复杂,今天看起来就是多分支的一个结构。刚开始,你们广泛的观点是这个网络结构是人工调出来的,没有很强的推广性。尽管 GoogLeNet 是一我的工设计的网络结构,其实这里面有很是值得借鉴的东西,包括有长有短多分支结构。
2015 年时出了一个网络结构叫 Highway。Highway 这篇文章主要是说,咱们能够把 100 层的网络甚至 100 多层的网络训练得很是好。它为何可以训练得很是好?这里面有一个概念是信息流,它经过 SkipConnection 能够把信息很快的从最前面传递到后面层去,在反向传播的时候也能够把后面的梯度很快传到前面去。这里面有一个问题,就是这个 Skip Connection 使用了 gate function,使得深度网络训练困难仍然没有真正解决。
同一年,微软的同事发明了一个网络,叫“ResNet”,这个网络跟 Highway 在某种意义上很相像,相像在什么地方?它一样用了 Skip Connection,从某一层的 output 直接跳到后面层的 output 去。这个跟 Highway 相比,它把 gate function 扔掉了,缘由在于在训练很是深的网络里 gate 不是一个特别好的东西。经过这个设计,它能够把 100 多层的网络训练得很是好。后来发现,经过这招 1000 层的网络也能够训练得很是好,很是了不得。
2016年,GoogLeNet、Highway、ResNet出现之后,咱们发现这里面的有长有短的多分支结构很是重要,好比咱们的工做 deeply-fused nets,在多个 Branch 里面,每一个分支深度是不同的这样的好处在于,若是咱们把从这个结构当作一个图的话,发现从这个输入点到那个输出点有多条路径,有的路径长,有的路径短,从这个意义上来说,咱们认为有长有短的路径能够把深度神经网络训练好。
同年,咱们发现有个相似的工做,叫 FractalNets,它跟咱们的 deeply-fused nets 很是相像。
这条路都是经过变深,但愿把网络结构训练得很是好,使它的性能很是好,加上 Skip Connection 等等形式来使得信息流很是好。尽管咱们经过 Skip Connection 把深度网络训练得很不错,但深度仍是带来一些问题,就是并无把性能发挥得很好,因此有另一个维度,你们但愿变得更宽一点。
除此以外,大的网络用在实际中会遇到一些问题。好比部署到手机上时但愿计算量不要太大,模型也不要太大,性能仍然要很好,因此识别率作的很是高的可是很庞大的网络结构在实际应用里面临一些困难。
▌简化结构的几种方法
另一条路是简化网络结构,消除里面的冗余性。由于你们都认为如今深度神经网络结构里有很强的冗余性,消除冗余性是我近几年发现很是值得作的一个领域,由于它的实际用处很大。
卷积操做
CNN 里面的卷积操做实际上对应的就是矩阵向量相乘,你们作的基本就是消除卷积里的冗余性。
咱们回顾一下卷积。右边的图:在 CNN 里面有若干个通道,每一个通道其实是一个二维的数组,每一个位置都有一个数值,在这里面咱们称为“响应值”。这里面有四个通道,实际上就至关于三维的数组同样。以这里(每一个位置)为中心,取一个 3×3 的小块出来,3×34 个通道,那就有 3×3×4 这么多个数值,而后咱们把这么多个数值拉成一个 3×3×4=36 维向量。卷积有个卷积核,卷积核对应一个横向量,这个横向量和列向量一相乘,就会获得响应的值,这是第一个卷积核。经过第二个卷积核又会获得第二个值,相似地能够获得第三个第四个值。
总结起来,卷积操做就是是矩阵和向量相乘,矩阵对应的是若干个卷积核,向量对应的是周围方块的响应值(ResponseValue)。
你们都知道矩阵跟向量相乘占了很大的计算量。我在这里举的例子并无那么大,但你们想想,若是输入输出 100个 通道,,假如这个卷积核是3×3×100,那就是 100×900 的计算量,这个计算量很是大,因此有大部分工做集中在解决这里面(卷积操做)冗余性的问题。
Low-precision kernels(低精度卷积核)
有什么办法解决冗余性的问题呢?
由于卷积核一般是浮点型的数,浮点型的数计算复杂度要大一点,同时它占得空间也会大一点。最简单的一招是什么?假设把卷积核变成二值的,好比 一、-1,咱们看看 一、-1转成之后有什么好处?这个向量 一、-1(使得)原本相乘的操做变成加减了,这样一来计算量就减小了不少。除此之外,模型和存储量也减小不少。
也有相似相关的工做,就是把浮点型的变成整型的,好比之前 32 位浮点数的变成 16 位的整型数,一样存储量会小,或者模型会小。除了卷积核进行二值化化之外或者进行整数化之外,也能够把 Response 变成二值数或者整数。
还有一类研究得比较多的是量化。好比把这个矩阵聚类,好比 2.9一、3.0六、3.21,聚成一类,我用 3 来代替它量化有什么好处?首先,你的存储量减小了,不须要存储原来的数值,只须要存量化之后的每一个中心的索引值就能够了。除此以外,计算量也变小了,你能够想办法让它减小乘的次数,这样就模型大小就会减小了。
Low-rank kernels(低秩卷积核)
另一条路,矩阵大怎么办?把矩阵变小一点,因此不少人作了这件事情, 100 个(输出)通道,我把它变成 50 个,这是一招。另一招, input(输入)不少, 100 个通道,变成了 50 个。
低秩卷积核的组合
把通道变少会不会下降性能?因此有人作了这件事情:把这个矩阵变成两个小矩阵相乘,假如这个矩阵是 100×100 的,我把它变成 100×10 和10×100 两个矩阵相乘,(相乘获得的矩阵)也变成 100×100 的矩阵,近似原来 100×100 那个矩阵。这样想一想,100×100 变成 100×10 跟 10×100,显然模型变小了,变成五分之一。此外计算量也降到五分之一。
稀疏卷积核
另一条路,怎么把矩阵跟向量相乘变得快一点、模型的参数少一点?能够把里面的有些数变成 0,好比 2.91 变成 0,3.06 变成 0,变成 0 之后就成了稀疏的矩阵,这个稀疏矩阵存储量会变小,若是你足够稀疏的话,计算量会小,由于直接是 0 就不用乘了。还有一种 Structured sparse(结构化稀疏),好比这种对角形式,矩阵跟向量相乘,能够优化得很好。这里 Structured sparse 对应我后面将要讲的组卷积(Groupconvolution)。
稀疏卷积核的组合
咱们来看看这个矩阵能不能经过多个稀疏矩阵相乘来近似,这是我今天要讲的重点,咱们的工做也是围绕这一点在往前走。在咱们作这个方向以前,你们并无意识到一个矩阵能够变成两个稀疏矩阵相乘甚至多个稀疏矩阵相乘,来达到模型小跟计算量小的目标。
从IGCV1到IGCV3
▌IGCV1
首先我给你们介绍一下咱们去年在 ICCV 2017 年会议上的文章,交错组卷积的方法。
这个卷积里面有六个通道,经过卷积出来的也是六个小方块(通道),假如 spatial kernel 的尺寸是5×5,对每一个位置来说,它的计算量是6×5×5×6。
我刚才讲了(一种结构化)稀疏的形式,对应的就是组卷积的形式,组卷积是什么意思?我把这 6 个通道分红上面 3 个通道和下面 3 个通道,分别作卷积,作完之后把它们拼在一块儿,最后获得的是6个通道。看看计算量,上面是 3×5×5×3,下面也是同样的,整个计算复杂度跟前面的 6×5×5×6 相比就小了一半,但问题是参数利用率可能不够。
咱们的工做是基于组卷积的,刚才提到了上面的三个通道和这三个通道不相关,那有没有办法让它们相关?因此咱们又引进了第二个组卷积,咱们把这6个通道从新排了序,一、4 放到这(第一个分支),二、5 放到这(第二个分支),三、6 放到那(第三个分支),这样每一分支再作一次 1×1 的convolution,得出新的两个通道、两个通道、两个通道,拼在一块儿。经过交错的方式,咱们但愿达到每一个 output(输出)的通道(绿色的通道或者蓝色的通道)跟前面6个通道都相连。
有什么好处?经过第二组的组卷积能够达到互补的条件,或者使得任何一个 output(输出通道)和任何一个 input(输入通道)连起来。
这里面咱们引进了一个严格的互补条件,直观来说就是,若是有两个通道在第一组卷积里面,落在同一个 Branch(分支),我但愿在第二组里面落在不一样的 Branch(分支)。第二组里面好比一个 Branch(分支)里面的若干个通道,要来自于第一个组卷积里面的全部 Branches(分支),这个称为互补条件。这个互补条件带来什么?它会带来(任何一对输入输出通道之间存在) path,也就是说相乘矩阵是密集矩阵。为何称之为“严格的”?就是任何一个 input 和 output 之间有一条 path,并且有且只有一条path。
严格的准则引进来之后,参数量变小了、模型变小了,带来什么好处?这里我给一个结论,L 是(第)一个组卷积里面的 partitions(分支)的数目或者卷积的数目,M是第二组组卷积卷积的数目,S 是卷积核的大小,一般都是大于 1 的。这样的不等式几乎是恒成立的,这个不等式意味着什么?结论是:若是跟普通标准的卷积去比,经过咱们的设计方式可让网络变宽。跟网络变深相比起来,网络变宽是另一个维度,变宽有什么好处?会不会让结果变好?咱们作了一些实验。
这个实验是跟标准的卷积去比,你们看看左下角的表格,这个表格是参数量,咱们设计的网络几乎是标准(卷积)参数量的一半。而后看看右下角这个网络,咱们的的计算量几乎也是一半。在 CIFAR-10 标准的图像分类数据集里(上面的表格),咱们的结果比前面的一种好。咱们甚至会发现越深越好,在 20 层有些提高并无那么明显,但深的时候能够达到 1.43 的提升量。
后来 CIFRA-100 咱们也作了一样的实验,发现咱们提高仍然是一致的,甚至跟前面的比起来提升得更大,由于分 100 类比分 10 类困难一点,说明越困难的任务,咱们的优点越明显。这个变宽了之后(性能)的确变好了,经过 IGC 实现,网络结构变宽的确会带来好处。
这是两个小的数据集,其实在计算机视觉领域里小数据集上的结果是不能(彻底)说明问题的,必定要作很是大的数据集。因此咱们当时也作了 ImageNet 数据集,跟 ResNet 比较了一下,参数量少了近五分之二,计算量小了将近一半了,错误率也下降了,这证实经过 IGC 的实现,让模型变宽,在大的网络模型上取得很是不错的效果。
咱们大概是前年 八、9 月份开始作这个事情,10 月份发现 Google 有一个工做是 Xception,这个是它的结构图,这个形式很是接近(咱们的结构),跟咱们前面所谓的 IGC 结构很是像,实际上就是咱们的一个特例。当时咱们以为这个特例有没有可能结果最好,因此咱们作了些验证,总体上咱们结构好一点。
IGC 可能还有变体,好比我要是把这个 channel-wise 也变成组卷积,第二个是 1×1 的,这样的结果会怎样?咱们作了相似一样的实验,仍然发现咱们的方法是最好的。
当时咱们作的时候,但愿在网络结构上跟 state-of-the-arts 的方法去比较,咱们取得了很是不错的结果,当时咱们的工做是但愿经过消除冗余性提升模型性能或者准确率。
▌IGCV2
后来咱们尝试利用消除冗余性带来的好处,把这个模型部署到手机上去。咱们去年又沿着这个方向继续往前走,把这个问题理解得更深,但愿进一步消除冗余性。
这个讲起来比较直接或简单一点,前面的网络结构是两个组卷积或者两个矩阵相乘获得的,咱们有没有办法变得多一点?实际上很简单,如上图所示。
这种方法带来的好处很直接,就是但愿参数量尽可能小,那怎么才能(使)参数量尽可能小?咱们引进了所谓的平衡条件。虽然这里面咱们有 L-1 个 1×1 的组卷积,但 L-1 个 1×1 的组卷积之间有区别吗?谁重要一点、谁不重要一点?其实咱们也不知道。不知道怎么办?就让它同样。同样了之后,咱们经过简单的数学推导就会得出上面的数学结果。
如今再验证一下,前面讲了互补条件、平衡条件,那这个结果是否是最好的?或者是否是有足够的优点?咱们作了些实验,这个红色的是对应知足咱们条件的,发现这个状况下(L=4)结果是最好的。实际上是不是老是最好?不见得,由于实际问题跟理论分析仍是有点距离。但咱们整体发现基本上红色的不是最好也排在第二,说明这种设计至少给了咱们很好的准则来帮助设计网络结构。这个虽然不老是最好的,但和最好的是差很少的。
第二个问题,咱们究竟要设计多少个组卷积(L 设成多少)?一样咱们的准则也是经过参数量最小来进行分析,之前是两个组卷积,咱们能够经过 3 个、4 个达到参数量更小,但其实最终的结论发现,并非参数量最优的状况下性能是最好的。
▌IGCV3
后来咱们发现,若是遵循严格互补条件,模型的结构变得很是稀疏、很是宽,结果不见得是最好的。因此咱们变成了 Loose。Loose 是什么意思?之前 output(输出通道)和 input (输入通道)之间是有且只有一个 path,咱们改得很是简单,能不能多个path?多个 path 就没那么稀疏了,它好处在于每一个 output (输出通道)能够多条路径从 input (输入通道)那里拿到信息,因此咱们设计了 Loose condition。
实际上很是简单,咱们就定义两个超级通道(super-channels)只能在一个 Branch 里面同时出现,不能在两个 Branch 里同时出现,来达到 Loose condition。
后来咱们进一步往前走,把 structured sparse 和 low-rank 两个组起来。咱们在 ImageNet 上比较,同时跟 MobileV2 去比,在小的模型咱们优点是愈来愈明显的。比较结果,见下图。
这就是今天的主要内容,这个工做是我跟不少学生和同事一块儿作的,前面这5个是个人学生,Ting Zhang如今在微软研究院工做,Bin Xiao 是个人同事,Guojun Qi 是美国的教授,咱们一块儿合做了这篇文章。
讲师简介
王井东,微软亚洲研究院视觉计算组资深研究员,国际模式识别学会会士,曾担任CVPR、ICCV、ECCV、AAAI 等计算机视觉和人工智能会议的领域主席和高级程序委员会委员。在视觉、机器学习以及多媒体领域里发表论文 100 余篇,我的专著一本。
更多公开课
计算机视觉
格灵深瞳:一亿ID的人脸识别训练和万亿人脸对(Trillion Pairs)的人脸识别评测
NLP