清华大学丁霄汉:深度网络重参数化——让你的模型更快更强
不到现场,照样看最干货的学术报告!
嗨,大家好。这里是学术报告专栏,读芯术小编不定期挑选并亲自跑会,为大家奉献科技领域最优秀的学术报告,为同学们记录报告干货,并想方设法搞到一手的PPT和现场视频——足够干货,足够新鲜!话不多说,快快看过来,希望这些优秀的青年学者、专家杰青的学术报告 ,能让您在业余时间的知识阅读更有价值。
人工智能论坛如今浩如烟海,有硬货、有干货的讲座却百里挑一。“AI未来说·青年学术论坛”系列讲座由中国科学院大学主办,百度全力支持,读芯术、paperweekly作为合作自媒体。承办单位为中国科学院大学学生会,协办单位为中国科学院计算所研究生会、网络中心研究生会、人工智能学院学生会、化学工程学院学生会、公共政策与管理学院学生会、微电子学院学生会。2020年7月26日,第17期“AI未来说·青年学术论坛”百度奖学金特别专场论坛以“线上平台直播+微信社群图文直播”形式举行。清华大学丁霄汉带来报告《深度网络重参数化——让你的模型更快更强》。
清华大学丁霄汉做“深度网络重参数化——让你的模型更快更强”主题报告分享
丁霄汉,清华大学在读博士生,研究领域为卷积神经网络基本模型,包括重参数化、压缩、加速、架构设计、组件设计等。在CVPR、ICML、ICCV、NeurIPS等会议作为第一作者发表论文5篇。曾获得百度奖学金、国家奖学金等荣誉。
深度网络重参数化——让你的模型更快更强
丁霄汉本次的报告分为五个部分:1.什么是重参数化;2.重参数化的应用——增强模型性能;3.重参数化的应用——模型裁剪;4.重参数化的应用——NAS;5.关于结构与参数的思考。
首先,丁肖汉介绍了重参数化的概念。
部署时的模型需要一些参数来完成推理,以卷积网络为例,假设一个卷积层它有D个输出的channel,C个输入的channel,然后它的 kernel size是K×K,它就至少需要D×C×K×K的参数完成他的推理。这一层的参数就是一个D×C×K×K的4阶的张量。那么常规的方法是使用训练出来的D×C×K×K,这似乎是一个理所当然的事情。
这是一个理所当然的事情吗?这就引出了重参数化的概念,重参数化方法就是训练的时候使用另一套不同于这D×C×K×K的参数,在训练完成以后,将它等价转化为D×C×K×K用于推理。重参数化有两方面意义:一方面可以提高模型的性能,另一方面是改变模型的结构来达到某些目的。重参数化的关键是:1.想出一套重参数化的形式即如何设计一套形式,让它不同于 D×C×K×K;2.找到对应的等价转换的方式;3.如何利用这种形式来达成某些目的。
其次,丁霄汉通过介绍去年发表在ICCV上的一篇文章来介绍重参数化的第一个应用——增强模型性能。
这篇文章的主要内容是用非对称卷积模块来提高CNN的性能。如果一句话总结的话,3×3卷积 + 1×3卷积 + 3×1卷积能够在部署模型完全相同的情况下,只需要多训练一会就能得到性能提升。这篇文章的反响比较好,在知乎上大概有1000多个赞,在 GitHub也有大概500多个星。
回到报告的主题,这篇文章它用的重参数化的形式是什么呢?重参数化的形式就是将一个普通的卷积D×C×K×K,将其并行分解成三个分支:D×C×K×K,D×C×1×K,D×C×K×1。
等价转换方式是将K×1和1×K的这两个分支的参数直接加到 K×K的对应的位置上面去。由于卷积的线性,也就是可加性所以它的结果是相同的。从上图看到,为什么把batch norm中间加上batch norm之后还是可以等价转换,是因为卷积具有齐次性,保证了卷积后面的batch norm可以给“吸”到卷积中去,这样它最后的结果还是不变的。
有些人对这种重参数化提出了一些疑问,比如,两个卷积核的形状是相同的,把它加起来没问题,但是不是相同形状,例如K×K,K×1,1×k这样的卷积核可以直接相加吗?答案是可以的。丁霄汉用滑动窗口的方法来解释了这个问题,以滑动窗口的视角来看,这个变化是等价的,如下图所示。
这个方法目前也有很多人都使用过它了,比如说最近有一个工作室把它扩展成了一个名为eacb,然后用在一些竞赛里面并且得到比较不错的成绩;再比如在IJCAI2020上的比赛的第一名也是用这个方法;另外它也用到了一些商业产品里面。
再次,丁霄汉讲了重参数化的另外一个应用——改变模型结构(模型裁剪)。
它主要应用在剪枝上,这里说的剪枝是把卷积层的输出通道变小,也就是把层变窄。比如说VGG的第一层是64,第二层64,第三层是128,剪枝之后可能第一层第二层小于64,第三层小于128,这就叫channel pruning。这个应用的难点在于CNN的最终的精度是和它的宽度是密切相关的,那如何能把宽度减小,还能保证性能不降低,这是问题的关键。
给定一个训练的好的模型,做channel pruning通常的做法有两种。一种是根据某些标准选择某些channel,然后直接将其去掉,然后再调整网络的结构,调整之后,网络的精度很显然是会明显降低的。然后再去训练,它的精度再训练回来一点。另外一种是加入某种约束,在网络上加入某种约束,然后训练使得某些channel接近于0,接近0之后并将其剪枝,这样造成的精度损失就小得多了,之后再去训练就可以了。
如下图所示。比如说第一层的输入是两个channel,然后第一层有4个filter,它产生4个channel,然后如果把其中第三个filter去掉的话,那它就只输出3个channel了;原本第二层的输入有4个channel,如果把它前一层的四个channel的变成三个channel,则第二层的每个filter的第三个输入层的也要去掉,这样的话它的计算量就大大的减小了,因为只减第一层,它第一层也减小了,第一层的运算量也减小了,第二层运算量也减小了。所以 channel pruning是可以有效的减小模型的计算量。
下面丁霄汉介绍了他最近发表的一篇文章“(preprint) LosslessCNN Channel Pruning via Gradient Resetting and ConvolutionalRe-parameterization”。 如下图所示,他具体讲述了关于这篇文章中提到的重参数化的形式以及给定一个训练好的模型,怎样用于剪枝这两方面。
从下图看,文章中提到的方法的效果现在来看是非常好的,它在ResNet-50上可以达到一个相当高的压缩比,比其他方面都要好得多,可以把在我们度量这Channel pruning的方法。一般是通过看他减少了原模型的多少FLOPs来看的。在这里我们看到这个方法减小了超过50%的FLOPs,然后没有完全没有造成精度损失。目前肯定是这个领域内效果最好的一个方法了。
丁霄汉简单介绍了前面提到的“某种训练方法”(GradientResetting)。传统的方法是通过添加某种约束,比如说在loss上加一个项,比如L1或者Lasso来使某些channel变成0。这样它有一个很大的问题,如果约束很弱的话,大多数channel它只是变小一点而已,它并不能足够的接近零,这样的话剪枝依然会掉点。如果约束很强的话,这个模型的性能就会掉的很多,因为这个模型的优化的极值点,因为添加的约束而变化了,所以它的性能会掉得很多,有可能在还没到剪枝的时候,这个模型就已经崩掉了。
下图中的方法在弱约束下不能接近0,这是因为目标函数导出的梯度和罚项导出的梯度相拮抗,达到平衡便不再减小。这里也有一个非常暴力的解决方案:选择一些channel,把第一项梯度丢掉。但梯度中带着跟目标函数有关的信息,丢掉会导致性能损失。
那么重参数化在这里结合的关键是在哪?为什么重参数化结合这种思想它就有work呢?关键在于只对那些我们引入的这些1×1卷积层这样做,丢掉的一些梯度,是这些1×1卷积的梯度。不是原本这些kernel的梯度,它本来就不存在,只是额外引入的这么一些参数,所以这个模型并没有因为这些暴力操作得到什么关键的信息。换句话说,剪枝的过程并没有给他带来本质的副作用,如果模型性能降低了,那就真的只是因为宽度减小了,就是这个本质的原因。
如上图所示,传统的方法假设输入通道是4个,在经过batch norm,卷积层的参数是有许多参数,然后除了模型原本的之外,在上面加一个罚项,然后通过罚项Loss修正的来的梯度就会使它减小,然后把梯度用来进行SGD的话,最后得到的参数里面就有很多行,很多行比较接近0,但是不一定非常接近0。然后再剪枝的话它可能会掉点。对比来看丁霄汉的方法,原本的层都不变,但是在后面加入一个1×1卷积,这1×1卷积则我们在这里所谓的 compactor,loss不变,然后对loss求完导之后得到它们的梯度。然后通过compactor params得出来一个mask,然后把compactor的梯度中的某一部分变成0,然后在上面再加一下惩罚项的梯度,最后经过很多的SGD迭代之后,得到的结果还是不变的。 这里并没有对原来的参数做什么变化,做什么粗暴的操作,只是对 compactor做个操作,然后因为它的一些行都非常接近0,所以对它做剪枝不会有什么变化,不会对这个模型性能产生损失。
紧接着,丁霄汉讲述了重参数化最后一个应用——NAS。
NAS是用meta-kernel来构建kernel,将meta-kernel的形状放入搜索空间一起搜。
最后,丁霄汉提出了关于结构与参数的几点思考。
第一,区分“结构”和“参数”。我需要一个模型,然后需要一些参数,然后在训练的时候也训练需要的那么多参数,这个事情是理所当然的吗?其实不一定。思考这个问题时,是要区分结构和参数的。当不区分的时候,思维方式是这样的,我需要一个模型,在这里说到模型的时候,心里其实想的也是参数和结构,但是我们不会把它区分开,需要一个模型,所以我训了一个模型,训好的模型不够强,所以我不满意。但是如果你把结构和参数区分开的话,是这样想的,我需要用到这样的模型的结构,他要载入这么多的参数,然后为了得到一套强有力的参数,我要怎么做?一种做法是构建原来的结构,训练一套参数,训练上来的参数就是我用的参数,然后这套参数不够强烈,我不满意,或者用重参数化的方法来思考,就是我构建一个不一样的结构,然后训出另外一套参数,然后把这些参数给变成我最终需要的参数。
第二,为什么我们认为“训什么就用什么”的想法是理所当然的呢?因为参数转换不等价,转换过去之后有一点误差的话,深度网络对误差极其敏感,这个模型可能直接就崩掉,就导致转换后的参数根本就不能用。另外,如果一定要等价转换的话,参数的等价转换一般依赖于它的线性,若干个操作之间如果有非线性的话就难以转换,而更为致命的是连续线性操作被认为它等价于单一性的操作,这个很容易理解,因为同样的输入先乘矩阵A再乘矩阵B,它就等于乘以矩阵A乘以矩阵B,但连续线性操作它不一定等价于单一线性操作。
第三,重参数化work的本质是什么?一是深度模型它训练动力学特征的复杂性,就是前向传播的时候它等价,不意味着你反向传播更新梯度的时候也等价。这一点在丁霄汉去年的一篇paper里面也提到了这一点,深度网络是复杂的,深度网络的动力学是复杂的,不能简单的去理解它。二是关于参数量的基本原则。就是为什么他们重算的话加了那么多参数,它就work了,就是一个关于操作量基本原则,简单的讲多就是好,大就是猛,大力出奇迹,越多越work,这是一个简单的原则。三是对关于通过重参数化引入的那些部分的思考。通过重参数化引入的那些额外的输入,各种花式操作留出了空间。
丁霄汉欢迎大家关注他的后续研究,在未来两个月内他会放出一些更多有意思的东西。
AI未来说*青年学术论坛
第一期 数据挖掘专场
第二期 自然语言处理专场
第三期 计算机视觉专场
第四期 语音技术专场
5. 中科院刘斌:基于联合对抗增强训练的鲁棒性端到端语音识别
第五期 量子计算专场
1. 清华大学翟荟:Discovering Quantum Mechanics with Machine Learning
3. 荷兰国家数学和计算机科学中心(CWI)李绎楠:大数据时代下的量子计算
第六期 机器学习专场
3. 百度胡晓光:飞桨(PaddlePaddle)核心技术与应用实践
4. 清华大学王奕森:Adversarial Machine Learning: Attack and Defence
5. 南京大学赵申宜:SCOPE - Scalable Composite Optimization for Learning
第七期 自动驾驶专场
2. 清华大学邓志东:自动驾驶的“感”与“知” - 挑战与机遇
3. 百度朱帆:开放时代的自动驾驶 - 百度Apollo计划
第八期 深度学习专场
第九期 个性化内容推荐专场
第十期 视频理解与推荐专场
第十一期 信息检索与知识图谱专场
第十二期 年度特别专场
1. 复旦大学桂韬:当NLP邂逅Social Media--构建计算机与网络语言的桥梁
2. 清华大学董胤蓬:Adversarial Robustness of Deep Learning
3. UIUC罗宇男:AI-assisted Scientific Discovery
4. 斯坦福应智韬:Graph Neural Network Applications
第十三期 AI助力疫情攻关线上专场
3. 百度黄际洲:时空大数据与AI助力抗击疫情——百度地图的实践与思考
第十四期 深度学习线上专场
第十五期 大数据线上专场
第十六期 NLP前沿技术及产业化线上专场
5. 哈佛邓云天:Cascaded Text Generation with Markov Transformers
6. 复旦大学桂韬:Uncertainty—Aware Sequence Labeling
推荐阅读专题
留言 点赞 发个朋友圈
我们一起分享AI学习与发展的干货
推荐文章阅读
长按识别二维码可添加关注
读芯君爱你