导航:首页 > 蒸馏问题 > 知识蒸馏剪枝量化

知识蒸馏剪枝量化

发布时间:2022-12-14 08:06:20

『壹』 【技术博客】通过量化知识来解释知识蒸馏

【技术博客】****通过量化知识来解释知识蒸馏

知识蒸馏介绍

知识蒸馏(Knowledge Distillation)最早是在2006年由 Bulica 提出的,在2014年 Hinton 对知识蒸馏做了归纳和发展。知识蒸馏主要思想是训练一个小的网络模型来模仿一个预先训练好的大型网络或者集成的网络。Hinton 在2015年发表的论文中提出了‘softmax temperature’的概念,对 softmax 函数做了改进:

当 T 等于1时就是标准的 softmax 参数,前者比后者具有这样一个优势:经过训练后的原模型,其 softmax 分布包含有一定的知识,真实标签只能告诉我们,某个图像样本是一辆宝马,不是一辆垃圾车,也不是一颗萝卜;而带有温度参数T的softmax函数可能会告诉我们,它最可能是一辆宝马,不大可能是一辆垃圾车,但不可能是一颗萝卜。

Hinton 等人做了三组实验,大体上验证了知识蒸馏方法的有效性。 Hinton 等人促进了知识蒸馏的发展并从实验的角度来验证了知识蒸馏的有效性,而本篇介绍的论文则提出了一些量化知识的概念来解释知识蒸馏的成功机理。

该论文为了解释知识蒸馏的成功机理,提出了三个假设,并根据假设基于可视化的量化标准,提出了三种类型的度量标准来验证了关于知识蒸馏的三个假设,为解释知识蒸馏提供了依据。

假设提出

假设1:知识蒸馏使 DNN 可以学习更多的视觉概念。我们将与任务相关的视觉概念和其他概念区分开来,如下图所示,前景上的视觉概念通常被认为是与任务相关的,而背景上的视觉概念则被认为是与任务无关的。

假设2:知识蒸馏确保了 DNN 易于同时学习各种视觉概念。相比之下基础网络倾向于顺序学习视觉概念,即在不同的 epoch 学习不同的概念。

假设3:知识蒸馏的模型优化方向更加稳定。DNN 在对原始数据进行学习时,通常会在早期尝试对各种视觉概念进行建模,然后在后期抛弃某些视觉概念;而在知识蒸馏的过程中,教师网络直接引导学生网络瞄准特定视觉概念,没有明显的迂回。

在该文章的研究中,视觉概念被定义为一个图像区域,如物体的一个部分:翅膀、头、爪子等。基础网络被定义为从原始数据中学习的网络。

算法

在该节,我们给定一个提前训练好的 DNN 网络(教师网络)和一个经蒸馏形成的另一个 DNN 网络(学生网络),为了解释知识蒸馏,我们将学生网络与从原始数据中学习生成 DNN 网络相比较,另外我们将任务限制为分类任务来简化下面的理论分析。

为了验证假设1,这里定义几个度量的标准:

这里

和[图片上传失败...(image-dffcd3-1601385590605)]

的图像区域可以视为有效的视觉概念,b为一个正标量。当括号内条件满足时,返回1,否则返回0.

(上图为视觉概念(visual concepts)的可视化表现,第二列表示了不同图像每个像素的熵值,在第三列中,具有低熵值的区域被视为视觉概念)

参数会更高。

来测量在视觉概念最多时的学习过程。没有使用 epoch number 而是使用 weight distance 的原因是后者更好的量化了每个epoch后参数更新的总路径,因此我们使用平均值[图片上传失败...(image-381693-1601385590604)]

标准差[图片上传失败...(image-184659-1601385590604)]

来量化一个 DNN 是否同时学习视觉概念:

[图片上传失败...(image-127b3a-1601385590604)]

平均值[图片上传失败...(image-e1aaea-1601385590604)]

和标准差[图片上传失败...(image-171a50-1601385590604)]

的数值越小,代表 DNN 能够快速同时地学习各种视觉概念。

(DNN 倾向于在前期学习各种视觉概念,之后主要丢弃与任务无关的概念)

结论

该文章从对 DNN 的知识进行量化的角度来解释了知识蒸馏的成功。提出了三种类型的度量标准来验证分类场景中的三种假设,也就是相对于从原始数据进行学习,知识蒸馏可以确保 DNN 学习更多与任务相关的概念,学习更少与任务无关的概念,具有更高的学习速度,并以更少的弯路进行优化。

参考文献

[1]Hinton G, Vinyals O, Dean J. Distilling the knowledge in a neural network[J]. arXiv preprint arXiv:1503.02531, 2015.

[2]Cheng X , Rao Z , Chen Y , et al. Explaining Knowledge Distillation by Quantifying the Knowledge[J]. 2020.

『贰』 名师出高徒:关于知识蒸馏技术的一点思考

在最初听说知识蒸馏技术的时候,我是持怀疑态度的,甚至觉得不可思议,为什么通过用简单模型去学习复杂模型的效果会比直接用训练标签来训练简单模型要好???

但是,它的存在必有其合理性,更何况是我偶像,深度学习第一人Hinton等人最早开始提出这种思想的.
于是便带着疑惑,对所谓的模型蒸馏技术做了一番研究,发现这个东西确实有过人之处,能够用更简单的模型获得更优质的推理效果,这在工程上,简直是妙不可言.下面就让我们来think think,模型蒸馏为什么有用,又是怎么来实现的.

众所周知,对于各类任务,当有足够多的数据的情况下,我们的神经网络模型越大越深,往往效果也会越好,正如ResNet50在图像任务上摧枯拉朽,Large Bert在语言任务上效果拔群,除了优秀的模型结构涉及,可以归结为是大力出奇迹.
但是,在实际的生产中,部署一个很大的推理模型是十分困难的,因为它的计算量是无数大大小小公司不能承受之痛,并不是每个企业都像Google那样拥有成千上万的TPU,当然即使有,在大部分场景下,也显然是不划算的.为了解决日益增长的模型预测效果的追求和和工程师想要提高性能老板想要节省成本之间的矛盾,有人提出了知识蒸馏技术.
即我们先在原始的训练数据上训练一个大的复杂的拟合的好泛化能力也很好的巨无霸模型(教师模型),再用这个复杂模型的inference结果取代原有的标签,用于训练一个新的更小的效果跟教师模型相差不大的模型(学生模型).然后生产环节只要部署这个性能强劲和推理效果足够好的学生模型就可以了.

好,这个想法实在是太好了..但是旁观者大概会有些不明觉厉....直接从原始的训练数据学不好吗?干嘛还多此一举去学一个更不精确的拟合结果数据?

这样做自然是有好处滴,且听我给你慢慢分析...这一切应该从一个软妹字说起..... [噗..抱歉,多打了一个妹字...

人类能够非常好的从许许多多的特征之中找到主要特征来区分不同的物品,而不会被表面很多相似的特征所迷惑,比如,人类可以较好的区分一只像猫的狗或是一只像狗的猫,而对于深度神经网络来说,却并没有那么容易.正如Hinton等人的一个经典论述: 一辆宝马被深度网络识别为一台垃圾车的可能性很小,但是被错误的识别为一个胡萝卜的可能性却要高很多倍.
为了让网络能够获得学习这些东西的能力,我们不得不让网络变得更深更复杂.知识蒸馏的目的就是希望大模型能够将学习到的这些区分近似特征的能力教给小模型,教育这种知识的精髓就恰好在于用softmax的软特征来取代原始one-hot标注的硬特征.

仔细想一下,软特征的好处实际上是显而易见的.

就拿手写数字识别的例子来说,我们的标注数据的不同分类之间,实际是无法捕捉到它们之间的关系的,因为它们都是只有自己的分类位置是0,其余位置是1,每个目标向量之间的距离是一样的,因此这种标注的方式实际上是存在一定缺陷的,它无法包含这样一种信息:比如数字1,和只带有一点点弯曲的7实际是极为相似的,但实际的标注数据并不能体现这一点.但是经过一个大模型的学习之后,或许对于一个只有一点点弯曲的7模型的预测结果中,1的score是0.4,7的score是0.5,其余score都接近0. 当我们看到这样一组特征向量的时候,是可以很清晰的发现这个手写图片非常相7同时又有点像1而和其他数字不像.
因此,再用这个向量作为target给小模型进行学习的时候,小模型只需要很小的代价就能学习到这一复杂的关系了~

是不是觉得我上面的说法很有道理? 如果你真的就这么认为,那就too naive了! 梦想很丰满,而现实却很骨感..真实的情况是,经过softmax函数之后,几乎不可能出现某个分类0.5,另一个分类0.4的情况,更一般的是某个分类0.99,另一个分类0.01......

当然,别担心,前面的想法这么好,自然遇到一点困难不该轻易放弃,既然softmax不行,那我们就不如就给它调整一下..

Hinton等大佬的解决方案是:将原始logits传递给softmax之前,将教师模型的原始logits按一定的温度进行缩放.这样,就会在可用的类标签上得到更加广泛的分布.并且这个温度缩放机制同样可以用于学生模型.

然后,原始的softmax操作就变成了:

其中, 便是一个缩放因子的超参数,这些得到的结果便是所谓的软目标...
变大,类别概率就会变软,也就是说会相互之间更加接近,从而达到了捕捉类别间关系的目的.

除了上述这种方法,还有其他人有一些别的不使用softmax获得软特征的方法,各有优劣...因为想快点写完这篇,所以别的方法先不介绍了,有兴趣可以自己了解,或者改天有时间我回来补充上这个部分....

如果想要更大限度的压缩模型,可以使用一些十分高效的传统机器学习方法作为学生去蒸馏
比如决策树。我觉得这可能是一个很好的方法,尽管它们的表达能力不如神经网络,但它们的预测非常可控和具有解释性,并有可能实现自动的更新和快速迭代.可以看一下Hinton他们的研究,读下这篇论文 Distilling a Neural Network Into a Soft Decision Tree

他们的研究表明,尽管更简单的神经网络的表现比他们的研究要好,但蒸馏确实起到了一点作用。在MNIST数据集上,经过蒸馏的决策树模型的测试准确率达到96.76%,较基线模型的94.34%有所提高。然而,一个简单的两层深卷积网络仍然达到了99.21%的准确率。因此,在任务追求的精度和推理性能及边界性之间寻求一个权衡即可。

个人认为知识蒸馏是一个极具前途的研究.它让更好的推理效果以更小更便捷的方式得以部署,这在工业界简直是无敌的存在.正所谓名师出高徒,和人类的学习一样,能够有一个牛逼的老师对你进行深入浅出的指导,能让你的学习过程事半功倍.而知识蒸馏,正好就是实现了这样一个深入浅出的功能,这种思想我个人十分推崇.

『叁』 知识蒸馏 | 模型压缩利器_良心总结

最近利用知识蒸馏的方法,对业务中的性能有了可观的提升,因此在这里总结一波。本文主要从宏观的角度分析一下各个蒸馏算法的蒸馏方式,具体细节可以根据兴趣阅读论文~ 知识蒸馏是一种模型压缩常见方法,用于模型压缩指的是在teacher-student框架中,将复杂、学习能力强的网络学到的特征表示“知识蒸馏”出来,传递给参数量小、学习能力弱的网络。从而我们会得到一个速度快,能力强的网络,因此这是一个概念上的模型压缩方案。从另一个角度来说,蒸馏可以使得student学习到teacher中更加软化的知识,这里面包含了类别间的信息,这是传统one-hot label中所没有的。由于蒸馏中软化标签的本质,因此蒸馏也可以被认为是一种正则化的策略。总结来说,知识蒸馏除了能够学习到大模型的特征表征能力,也能学习到one-hot label中不存在的类别间信息。现有的知识蒸馏方法主要侧重于两点: 从teacher的什么位置学习 和 用什么方式学习 。以下的总结图概述了本文要介绍的蒸馏方法。

目录结构:

(1)KL:知识蒸馏:蒸馏开山之作
https://arxiv.org/pdf/1503.02531.pdf

如上图所示,本文中直接利用KL散度来衡量教师模型和学生模型的输出分布,通过最小化KL散度的方式,使得学生模型的输出分布能够尽可能的逼近教师模型,从而实现知识蒸馏的目的。KL散度是一种衡量两个概率分布之间的差异的数学概念,有不懂的同学请出门左拐网络一下,右拐也行Google一下。

(2)FT:相关性因子加权学习法
https://arxiv.org/pdf/1802.04977.pdf
(3)PKT:概率分布学习法
https://arxiv.org/pdf/1803.10837.pdf

上述两篇文章的作者认为学生一般都是不聪明的,为了让学生能够更好的理解教师模型,FT算法这篇文章提出了一种新的知识转移方式,如图所示,利用卷积运算对教师模型的输出进行编码,并解码(翻译)给学生。而位于学生模块部分也添加一个卷积操作,用来学习翻译后的教师知识。实验证明这种方式要比直接学习效果好。PKT算法这篇文章提出了另一种新的知识转移方式,如图所示,该文章让学生模型学习教师模型的概率分布,使得整体的学习更加容易,更鲁棒。作者提出了一种通过匹配数据在特征空间中的概率分布进行知识蒸馏,PKT算法的另一个优势是该方法可以直接转移不同架构和维度层之间的知识。

(4)RKD:关系型学习法
https://arxiv.org/pdf/1904.05068.pdf
(5)CC:多输入联系型学习法
https://arxiv.org/pdf/1904.01802.pdf

所谓的单打独斗就是一个样本进行自我学习,单打独斗的蒸馏方法使得学生模型只能学习教师模型的输出表现,无法真正学习到教师模型的结构信息。而这两篇文章的作者都提出了多个样本之间进行合作学习的蒸馏学习方法,使得学生模型能够更好的学习到教师模型的结构信息。RKD关系型学习算法的核心是以多个教师模型的输出为结构单元,取代传统蒸馏学习中以单个教师模型输出学习的方式,利用多输出组合成结构单元,更能体现出教师模型的结构化特征,使得学生模型得到更好的指导。CC多输入联系型学习法在上述RKD算法的基础上,为了更好的扩大类间差异,更好的缩小类间距离,CC算法提出了两种采样方法:包括均衡类别采样法和均衡超类别采样法。所谓的均衡类别采样法,即假设每个batch大小为48,则这48个样本分布来自于6个类别,每个类别8个样本,使得整体的学习样本不像RKD算法那样是随机的。

(1)Fitnet:阶段性知识蒸馏
https://arxiv.org/pdf/1412.6550.pdf

FItnet这篇文章首次提出了从教室模型的中间层去进行蒸馏学习,而不仅仅关注教室模型的输出。因为通过中间层的引导,使得学生模型进行了提前学习,使得最终的蒸馏学习效果变得更好。

(2)VID:互信息学习法
https://arxiv.org/pdf/1904.05835.pdf
(3)SP:相似性矩阵学习
https://arxiv.org/pdf/1907.09682.pdf
(4)AT:注意力学习法
https://arxiv.org/pdf/1612.03928.pdf

为了更好的表征神经网络中间层的特征,如上图所示,本文列举了三种不同形式的用于更好抽象的表征中间层特征的新的蒸馏形式。其中VID互信息学习法,将中间层知识蒸馏的最优性能定义为最大化教师和学生网络之间的互信息。那么为什么通过最大化互信息可以使得蒸馏学习变得有效呢?首先作者对互信息做了定义:互信息为[教师模型的熵值] - [已知学生模型的条件下的教师模型熵值]。而我们又有如下常识:当学生模型已知,能够使得教师模型的熵很小,这说明学生模型以及获得了能够恢复教师模型所需要的“压缩”知识,间接说明了此时学生模型已经学习的很好了。而这种情况下也就是说明上述公式中的熵很小,从而使得互信息会很大。作者从这个角度解释了为什么可以通过最大化互信息的方式来进行蒸馏学习。而在SP相似性矩阵学习法中,作者提出了一种新的知识蒸馏形式,该方法是作者观察到相似语义的输入往往会使得神经网络输出相似的激活模式这一现象启发得到的。该知识蒸馏方法被称为保持相似性知识蒸馏(SPKD),该方法使得教师网络中相似(不同)激活的输入样本对,能够在学生网络中产生相同(不同)的激活,从而指导学生网络的学习。而在AT注意力学习法中,作者认为注意力在人类视觉体验中起着至关重要的作用。以图像分类为例,注意力地图展示了学习完成后的网络模型更关注于图像的哪个区域,是网络模型学习成果的体现。本文通过迫使学生模型模仿强大的教师模型的注意力特征图,来显著提高学生模型的性能。为此,本文提出了基于激活注意力地图的蒸馏法。

(5)NST:基于滤波器的知识蒸馏
https://arxiv.org/pdf/1707.01219.pdf

(6)FSP:授之以鱼不如授之以渔
http://openaccess.thecvf.com/content_cvpr_2017/papers/Yim_A_Gift_From_CVPR_2017_paper.pdf

和之前对中间层特征进行直接学习的方式不同,本文提出了一个偏哲学的论点:授之以鱼不如授之以渔。具体来说就是,如上图所示,本文将教师模型网络层与层之间的映射关系作为学生网络学习的目标,而不是像之前提到的直接对教师模型的中间结果进行学习。通过让学生学习这种获得特征的方法,而不是直接学习特征本身,文章的结果显示,这种方式确实有助于提高学生模型的鲁棒性。

(1)AB:激活边界学习
https://arxiv.org/abs/1811.03233.pdf
(2)利用对抗样本进行激活边界学习
https://arxiv.org/abs/1805.05532.pdf

在分类任务中,小模型真正的缺陷更多的在于对边界样本(难例样本)的分类困难。而这真是我们在分类任务中最关心的问题。而教师模型处理边界的能力一定是要优于学生模型的。因此尝试用学生模型学习教师模型的边界分布,这将是蒸馏学习的新思路。本部分列举了两种不同的边界学习方法。AB激活边界学习法,通过最大化边界误差的方式,来引导学生模型学习更强的边界约束能力。利用对抗样本进行边界激活学习的方法,首先定义一个基类并通过基类找到各个类别中的对抗边界,最终通过对抗边界样本进行蒸馏学习。

(1)be your own teacherr
https://arxiv.org/pdf/1905.08094.pdf
(2)强制拉近类内距离:regularzing class-wise
https://arxiv.org/pdf/2003.13964.pdf
(3)类内的鲁棒性学习:Data-Distortion Guided
https://www.researchgate.net/publication/335476911_Data-Distortion_Guided_Self-Distillation_for_Deep_Neural_Networks

由于我们不一定可以在所有任务中都顺利的获取教师模型,有的大模型由于数据的缺失,很难被正常的训练出来。基于这种情况,很多研究者提出了自我学习的策略。简单来说该策略就是自己作为自己的老师,进行自我优化。本部分列举了三种自学习的方式。be your own teacher这篇文章将网络较深部分的知识压缩到较浅部分,也就是说该蒸馏策略的教师模型和学生模型来自与同一个模型,这大大降低了蒸馏学习的复杂度,并且通过增加额外的训练检测模型,在不增加前向推理时间的前提下提升了自我学习的能力。举例来说,如上图中以resnet50为例,在每个block之后都接出一个bottleneck作为隐藏层的监督输出模块,并接出一个全连接层作为每个子模块的子分类器。每个子分类器都作为一个小的学生模型,其对应的教师模型为主分类层的输出,最终实现自我蒸馏的学习。另外两篇文章的思路主要从同一个类内的样本出发进行自我学习。其中强制拉近类内距离这篇文章,在训练的过程中,首先我们会从数据迭代器中提取batch1大小的数据,同时选出和当前batch1中类别相同的样本形成batch2,并将两个batch的样本组合起来进行联合训练。具体来说就是每一此计算loss时,从batch1和batch2中各挑选出一个同类样本,在loss计算中尽可能的是的这两个同类样本的输出分布一致,这种方式是一种广义上的自我学习的策略,且这种训练方式能够强制减小类内的差异,且可以利用这种方式减小某些过度自信的异常值的预测。其中增强类内鲁棒性这篇文章,也是从对同一个类别的样本进行联合学习,具体操作如下:对输入batch中每个图片利用不同的数据增强方式增强层两份输入,这两份输入的标签为同一个类别,将两份输入特征concat之后通过卷积层提取全局特征,并将得到的特征向量进行对应的切分,在训练过程中通过最小化切分后特征向量间的差异,从而增强同一个类内的多样性提升鲁棒性,该过程也可以被认为是自己和自己学习。

(1)DML:互相学习
https://arxiv.org/pdf/1706.00384.pdf
(2)知识嫁接
https://arxiv.org/pdf/2001.05868.pdf

与自学习类似的是互相学习策略中不存在教师模型,与自学习不同的是互相学习的方式通用是多个模型之间的学习,而自学习仅仅只有一个模型。其中DML:互相学习这篇文章就是一种典型的互相学习的方式,DML是在训练过程中,几个需要反向传播的待训学生网络协同学习,互相传递知识。每个互相学习的网络都有一个标准的分类Loss和互学习Loss,其中互学习Loss是一个KL散度。 具体而言,两个网络的softmax输出为p1,p2.则互学习的意义在于,对于Net1(Net2亦然),对了提高其泛化能力,使用Net2的p2作为一种后验概率,然后最小化p1,p2的KL散度。而知识蒸馏这篇文章更像是一种广义上的互相学习方法,该文章的主要是思想是并行地训练多个网络,对所有网络的参数进行重要性排序,并另一个并行网络中的更有效的权重替换到当前网络的不重要权重的位置,在训练过程中通过这种重要性权重的互相替换实现互相学习。

(1)GAN对抗学习
https://arxiv.org/pdf/1709.00513.pdf
(2)无监督对抗学习
https://arxiv.org/pdf/1904.01186.pdf

本部分主要列举了两种利用GAN网络进行蒸馏的文章。GAN对抗学习这篇文章就是典型的利用生成对抗网络的例子,具体来说,学生网络作为生成器,生成对应的输出结果,而教师网络用来表征GT信息,而鉴别器主要被用来鉴别学生网络的输出和教师网络的输出,最终学习的目的就是是的学生网络能够欺骗鉴别器,是的鉴别起无法区分出学生网络和教师网络的输出。最终实现学生网络学习到了教师网络的输出特征和分布。而无监督对抗学习这篇文章的出发点有点不一样,由于一些实践问题(如隐私、法律等问题),给定深度网络的训练数据往往不可用,除了一些接口之外,给定网络的架构也是未知的。基于此,本文提出了一种利用生成对抗网络训练高效深度神经网络的新框架。讲预先训练好的教师网络看作一个固定的鉴别器,利用该鉴别器产生的训练样本可以得到最大的鉴别结果。然后,利用生成的数据和教师网络,同时训练出模型尺寸较小、计算复杂度较低的高效网络。

『肆』 知识蒸馏-Distilling the knowledge in a neural network

“很多昆虫在幼虫形态的时候是最擅长从环境中吸取能量和养分的,而当他们成长为成虫的时候则需要擅长完全不同能力比如迁移和繁殖。”在2014年Hinton发表的知识蒸馏的论文中用了这样一个很形象的比喻来说明知识蒸馏的目的。在大型的机器学习任务中,我们也用两个不同的阶段 training stage 和 deployment stage 来表达两种不同的需求。training stage(训练阶段)可以利用大量的计算资源不需要实时响应,利用大量的数据进行训练。但是在deployment stage (部署阶段)则会有很多限制,比如计算资源,计算速度要求等。知识蒸馏就是为了满足这种需求而设计的一种模型压缩的方法。

知识蒸馏的概念最早是在2006年由Bulica提出的,在2014年Hinton对知识蒸馏做了归纳和发展。知识蒸馏的主要思想是训练一个小的网络模型来模仿一个预先训练好的大型网络或者集成的网络。这种训练模式又被称为 "teacher-student",大型的网络是“老师”,小型的网络是“学生”。

在知识蒸馏中,老师将知识传授给学生的方法是:在训练学生的过程中最小化一个以老师预测结果的概率分布为目标的损失函数。老师预测的概率分布就是老师模型的最后的softmax函数层的输出,然而,在很多情况下传统的softmax层的输出,正确的分类的概率值非常大,而其他分类的概率值几乎接近于0。因此,这样并不会比原始的数据集提供更多有用的信息,没有利用到老师强大的泛化性能,比如,训练MNIST任务中数字‘3’相对于数字‘5’与数字‘8’的关系更加紧密。为了解决这个问题,Hinton在2015年发表的论文中提出了‘softmax temperature’的概念,对softmax函数做了改进:

这里的 就是指 temperature 参数。当 等于1 时就是标准的softmax函数。当 增大时,softmax输出的概率分布就会变得更加 soft(平滑),这样就可以利用到老师模型的更多信息(老师觉得哪些类别更接近于要预测的类别)。Hinton将这样的蕴含在老师模型中的信息称之为 "dark knowledge",蒸馏的方法就是要将这些 "dark knowledge" 传给学生模型。在训练学生的时候,学生的softmax函数使用与老师的相同的 ,损失函数以老师输出的软标签为目标。这样的损失函数我们称为"distillation loss"。

在Hinton的论文中,还发现了在训练过程加上正确的数据标签(hard label)会使效果更好。具体方法是,在计算distillation loss的同时,我利用hard label 把标准的损失( )也计算出来,这个损失我们称之为 "student loss"。将两种 loss 整合的公式如下:

这里的 是输入, 是学生模型的参数, 是交叉熵损失函数, 是 hard label , 是参数有 的函数, 是系数, 分别是学生和老师的logits输出。模型的具体结构如下图所示:

在上述公式中, 是作为超参数人为设置的,Hinton的论文中使用的 的范围为1到20,他们通过实验发现,当学生模型相对于老师模型非常小的时候, 的值相对小一点效果更好。这样的结果直观的理解就是,如果增加 的值,软标签的分布蕴含的信息越多导致一个小的模型无法"捕捉"所有信息但是这也只是一种假设,还没有明确的方法来衡量一个网络“捕捉”信息的能力。关于 ,Hinton的论文中对两个loss用了加权平均: 。他们实验发现,在普通情况下 相对于 非常小的情况下能得到最好的效果。其他人也做了一些实验没用加权平均,将 设置为1,而对 进行调整。

Hinton的论文中做了三个实验,前两个是MNIST和语音识别,在这两个实验中通过知识蒸馏得到的学生模型都达到了与老师模型相近的效果,相对于直接在原始数据集上训练的相同的模型在准确率上都有很大的提高。下面主要讲述第三个比较创新的实验:将知识蒸馏应用在训练集成模型中。

训练集成模型(训练多个同样的模型然后集成得到更好的泛化效果)是利用并行计算的非常简单的方法,但是当数据集很大种类很多的时候就会产生巨大的计算量而且效果也不好。Hinton在论文中利用soft label的技巧设计了一种集成模型降低了计算量又取得了很好的效果。这个模型包含两种小模型:generalist model 和 specialist model(网络模型相同,分工不同)整个模型由很多个specialist model 和一个generalist model 集成。顾名思义generalist model 是负责将数据进行粗略的区分(将相似的图片归为一类),而specialist model(专家模型)则负责将相似的图片进行更细致的分类。这样的操作也非常符合人类的大脑的思维方式先进行大类的区分再进行具体分类,下面我们看这个实验的具体细节。
实验所用的数据集是谷歌内部的JFT数据集,JFT数据集非常大,有一亿张图片和15000个类别。实验中 generalist model 是用所有数据集进行训练的,有15000个输出,也就是每个类别都有一个输出概率。将数据集进行分类则是用Online k-means聚类的方法对每张图片输入generalist model后得到的软标签进行聚类,最终将3%的数据为一组分发给各个specialist,每个小数据集包含一些聚集的图片,也就是generalist认为相近的图片。
在specialist model的训练阶段,模型的参数在初始化的时候是完全复制的generalist中的数值(specialist和generalist的结构是一模一样的),这样可以保留generalist模型的所有知识,然后specialist对分配的数据集进行hard label训练。但是问题是,specialist如果只专注于分配的数据集(只对分配的数据集训练)整个网络很快就会过拟合于分配的数据集上,所以Hinton提出的方法是用一半的时间进行hard label训练,另一半的时间用知识蒸馏的方法学习generalist生成的soft label。这样specialist就是花一半的时间在进行小分类的学习,另一半的时间是在模仿generalist的行为。
整个模型的预测也与往常不同。在做top-1分类的时候分为以下两步:
第一步:将图片输入generalist model 得到输出的概率分布,取概率最大的类别k。
第二步:取出数据集包含类别k的所有specialists,为集合 (各个数据集之间是有类别重合的)。然后求解能使如下公式最小化的概率分布q作为预测分布。

这里的KL是指KL散度(用于刻画两个概率分布之间的差距) 和 分别是测试图片输入generalist 和specialists(m)之后输出的概率分布,累加就是考虑所有属于 集合的specialist的“意见”。

由于Specialist model的训练数据集很小,所以需要训练的时间很短,从传统方法需要的几周时间减少到几天。下图是在训练好generalist模型之后逐个增加specialist进行训练的测试结果:

从图中可以看出,specialist个数的增加使top1准确个数有明显的提高。

本文结合Hinton在2014年发表的论文对知识蒸馏和相关实验做了一个简单的介绍,如今很多模型都用到了知识蒸馏的方法,但知识蒸馏在深度学习中还是非常新的方向,还有非常多的应用场景等待研究。

项目地址: https://momodel.cn/explore/5dc3b1223752d662e35925a3?type=app

[1]Hinton G, Vinyals O, Dean J. Distilling the knowledge in a neural network[J]. arXiv preprint arXiv:1503.02531, 2015.
[2] https://nervanasystems.github.io/distiller/knowledge_distillation.html
[3] https://www.youtube.com/watch?v=EK61htlw8hY&t=3323s

『伍』 剪枝论文统计

先确定哪些连接是重要的,然后prune,在fine tune
L1正则pruning和L2正则 retrain和iterative prune效果好

prune/fine tune, quantize weights, Huffman coding
3-4x speep

动态的修剪,并且加入splicing,避免不正确的prune

prune filter,也就是prune cout

(1)每次prune最不重要的参数,迭代
(2)taylor展开判断哪个该减
(3)每层都要normalization

irregularize prune,先跳过

retrain少 设定一个laye-wise 的error,计算它的二阶导,这和paper#5的区别?

根据输入,动态的自适应的prune cin
自上而下,逐层剪枝

基于能耗 channel prune
每层剪枝后,进行最小二乘微调,快速回复精度。全部剪枝完后,再全局反向传播微调

filter prune,根据下一层的统计信息来prune当前层 和paper#5区别?

这个和paper#12有啥区别??待细看

修剪input channel,也就是cin,使用BN的scaling来做判断卷积channel的重要性

训练时对channel的scale参数进行L1正则化,抑制为0

以前假设较小的权重或feature map是不重要的,该文不基于这个假设
训练模型使某个通道输出恒定,然后把这个通道剪掉?

大的稀疏网络效果优于小的密集网络
渐进式prune,sparsity逐渐增加 训练时不断稀疏

待细看

量化输出对参数的敏感性(相关性),引入一个正则项,降低敏感性参数的绝对值,直接将低于阈值的设为0
感觉之后可以用于层间只适应,待细看next to read

使用了AutoMl 有必要之后细看

使用一个参数比例因子来缩放某个结构(group block neuron)的输出,正则化稀疏该因子,使用Accelerated Proximal Gradient优化问题,然后删除(感觉和paper#17有点像)

不需要retrain, 有量化和Huffman编码。不知道啥玩意

跳过

prune参数,剩余参数用来训练新任务

以前只考虑单层或者两层的误差,没有考虑对整个网络的影响,本文基于一个统一的目标,即最小化分类前倒数第二层的“最终响应层”(FRL)中重要响应的重构误差,提出了神经元重要性评分传播(NISP)算法,将最终响应的重要性得分传播到网络中的每个神经元。

同时减枝和量化 跳过

自动学习每层prune多少

(1)不是将删除滤波器固定为0
(2)能从头训练,边训边减
有必要细看

全局的动态剪枝,还可以将误删的恢复

既NAS又蒸馏

给channel设置因子gate,gate为0,则删除,用taylor展开判断gate为0时对损失函数的影响 全局的剪枝 tick-tock框架

先跳过

先跳过

全局的,找到每层稀疏比;端到端训练;不需要retrain;效果比lottery ticket好

一般修剪权重会降低鲁棒性,或者需要先验的知识确定超参数,本文用一个autoprune的方法,辅助新的更新规则,缓解了前面的两个问题。还是pre-train prune fine-tune三步走

不损害鲁棒性的压缩

逐层剪枝,之后有必要细看

鲁棒性的,先跳过

前面的工作认为值小的不重要,这需要两个前提条件:(1)fliter偏差大(2)最小的norm应该更小 本文提出了一种基于几何中值的filter prune

用GAN 跳过

跳过

跳过

可以控制prune的大小和速度,还用了蒸馏,跳过

估计神经元对最终loss的影响,迭代的删去最小的那个。用了一阶和二阶的泰勒展开,而不是每层的敏感度分析。
感觉很重要,之后细看

之前的工作只考虑层内的关系,没有考虑层间的关系,这篇文章考虑了连续层之间的关系,当前层的out和下一层的in

速度和精度上取折衷 跳过

变分贝叶斯 不需要retrain

先跳过

自动确定每层稀疏率
剪枝再fine-tune的会比从头训练的网络要差。剪枝后的网络结构不应该复用之前的训练好的模型中的权重。所以应该从头训练。

并不是像单纯的剪枝一样删除结构,而是通过FBS动态的放大重要的通道,跳过不重要的通道。

不是先训练再减枝,而是先减枝,再从头开始训练。还是先做一个链接的敏感度分析,但是仍然是一个使用一阶泰勒展开,然后做softmax,一次性减k个值

可以用来训练,有空再看。

剪channel,分析通道对loss的影响,用ccp逼近Hessian矩阵

oracle减枝评估filter的重要性,但是时间复杂度高,且需要给定结果宽度,本文通过近似oracle法来优化

基于Kronecker因子特征基(KFE)的网络重参数化方法,并在此基础上应用了基于Hessian的结构化剪枝方法。

filter减枝,先跳过

可以让每层稀疏率可微,采用梯度的方式搜索稀疏率,而且可以train from scratch

automl跳过

把剪枝用于元学习,跳过

反向传播中的激活梯度大部分很小,使用一种随机剪枝的方式对激活梯度进行剪枝,剪枝阈值通过分布确定,理论分析。
之后细看

NAS跳过

联合量化剪枝,跳过

跳过

跳过

加强的彩票假设

自动调节稀疏的阈值

不是删除网络中的神经元,而是贪婪的从空网络中添加网络中的神经元

跳过

每次删去训练样本平均后激活值最低的那个点

学习跨不同层的滤波器的全局排名,通过修剪排名靠后的滤波器来获得一组具有不同精度/延迟权衡的结构

跳过

跳过

跳过

跳过

低秩分解和剪枝一起用,全局压缩

蒸馏,跳过

跳过

对非结构化稀疏的权重进行加密,推理的时候用异或门解码

每一层自适应的选择不同的剪枝

联合NAS,prune,quantization

rewind 和 fine-tune两种方法的对比

解释了为什么修剪只初始化,还没开始训练的网络,这种方法是有效的。

跳过

RNN的一次性剪枝

基于基于幅值的剪枝确实能使单层线性算子的Frobenius失真最小化,我们将单层优化扩展为多层优化,提出了一种简单的剪枝方法,即超前剪枝

通过反馈重新激活早期删除的权重

跳过

跳过

跳过

用所获得的信息作为指导,我们首先提出了一种新的块最大加权掩蔽(BMWM)方法,它可以有效地保留显著的权重,同时对权重矩阵施加高度的正则性。作为进一步的优化,我们提出了一种密度自适应规则块(DARB)剪枝方法

『陆』 AI常见面试35题

交叉熵做损失函数,训练时传播的梯度和训练误差是成正比的(单调),而当采用均方误差做损失函数时,训练时传播的梯度和训练误差不是成正比的(非单调),具体表现是,训练误差从0开始增大,梯度增大(这点与我们预期相符),但训练误差继续增大,梯度开始下降(这点就与我们的预期不符了),这样就显得,模型在训练误差大的时候,根本不愿意继续学习,模型显得“自暴自弃”不肯学习。

决在低维空间 线性 不可分的问题,通过核函数把低维映射到高维,实现线性可分。

常见 核函数 有线性核函数,多项式核函数,高斯核函数,sigmoid 核函数

Adaboost用错分数据点来识别问题,通过调整错分数据点的权重来改进模型。GBDT通过负梯度来识别问题,通过计算负梯度来改进模型。

1.样本选择:bagging训练集是在原始集有放回的选取,每次选取训练集都是独立的.boosting:每一轮的训练集的数量不变,但是训练集里的样例比重根据上一轮的分类结果进行调整
2.样本权重:bagging:均匀取样,每个样例的权重都相等。boosting:根据您错误率不断调整样例的权值,错误率越大的则权重越大
3.预测函数:bagging每个基分类器投票,权重比例都是一样的,boosting每个分类器的权重是不一样的
4.运行规律:bagging:各个预测函数可以并行生成 boosting:每个基分类器都都是根据前一个分类器的结果调整过来的

之所以被称为“朴素”, 是因为它假定所有的特征在数据集中的作用是同样重要和独立的,正如我们所知,这个假设在现实世界中是很不真实的,因此,说是很“朴素的”。

1.线性回归
2.逻辑回归
3.岭回归
4.多项式回归

顺序关系,先求出特征值再来求SVD

PCA: 无监督学习,找到最优重构子空间,使主成分能刻画样本绝大部分的方差。
应用:数据降维、Eigenfaces、PCA-SIFT

CCA(Canonical Correlation Analysis): 无监督学习,对两组变量降维,找到一个最优相关子空间进行相关性分析。
应用:问卷调查中变量的相关性分析、跨模态学习。

LDA: 有监督学习,学习一个可分性最好的投影方向。相当于是白化(whitening) + PCA,得到的是假设条件下的最优分类子空间(假设每个类都是单模态高斯分布、每个类协方差矩阵相同)。
应用:数据降维、模式分类

ICA: 无监督学习,各个分量之间相互独立,利用数据的高阶统计信息而不是二阶信息得到用于信号分离的独立子空间。
应用:语音信号分离

随机森林中树的选择是随机选择的,生成每棵树的样本也是随机采样有放回产生的

预训练初始化:一般是在大规模数据上已经训练过的模型可以提供一个较好的参数初始值,并能提升模型的泛化能力(一种解释是预训练任务起到一定的正则化作用)。
随机初始化:如果全部初始化为0,在神经网络第一遍前向传播所有隐层神经网络激活值相同,反向传播权重更新也相同,导致隐层神经元没有区分性,称为“对称权重”现象。为打破这个平衡,比较好的方式是对每个参数进行随机初始化。
固定值初始化:比如对于偏置(bias)通常用0初始化,LSTM遗忘门偏置通常为1或2,使时序上的梯度变大,对于ReLU神经元,偏置设为0.01,使得训练初期更容易激活。

1.dropout
L2正则化方法就是通过使参数变小,进而使模型变得简单的方法。dropout方法原理类似,只不过它不是减少权值,而是随机的删除某些节点,使得模型的网络结构变得简单,起到正则化的效果。
直接限制模型参数的方法:

从数据集入手的方法:

集成化方法(通过训练多个不同的模型,并让所有模型一起表决测试集的输出):
baggingdropout
其他:
early stop交叉验证(bagging为又放回采样,而交叉验证可以理解为无放回模型平均)

self-attention:attention(q,t,v) = softmax(qk.T/根号DK)*v
多头的本质是多个独立的attention计算,作为一个集成的作用,不同的权重矩阵映射到不同的空间

RNN:输入与输出长度相等,很多时候机器翻译的输入跟输出是不等的
seq2seq:encoder+decoder 所有输入的信息都保存在隐藏层的最后一个印象里,作为解码器的初始隐向量,银项链称之为上下文向量,长度固定,当输入句子很长的时候,上下文向量会丢失相关信息,效果很差
seq2seq+attention:seq2seq忽略了输入跟输出之间的对应关系,利用attention来寻求输入跟输出之间的对应关系
tranfarmer:解决了翻译中网络训练时间过长,难以并行计算的问题,利用self-attention代替RNN实现并行计算,用postion embedding记录位置信息

类似cnn的多个卷积核,不同卷积核提取不同方面的特征,不同head关注不同的表示子控件,总和利用各方面的信息,获得更丰富的特征

由两个线性层组成,两个线性层直接具有relu激活函数

点乘注意力可以用高度优化的矩阵乘法来实现
速度更快,空间效率更高

概率密度函数:由已知计算未知
似然函数:对于不同的模型参数,出现已知的概率是多少

将各个特征分布调整到标准正态分布,若某些特征方差很大,会主导目标函数从而使得模型无法正确学习其他特征

将数据划分成K份,留作一份作为测试集,其他作为训练集
重复K次得到K个测试结果,取平均

进程是火车,线程是车厢

复杂的模型占用大量内存,且具有庞大的计算开销,导致模型难以被部署在手机等计算能力较差的设备上,抑或是时延要求较高的应用中。
模型压缩的主要方法可以分为:

1.系统级优化,包括单设备优化和多设备优化。比如ZeRO-Offload,就设计了精细的策略来安排CPU内存和GPU内存之间的交换,以便内存交换和设备计算能够尽可能多地重叠。
2.探索更高效的预训练方法和模型架构,以降低方案的成本。
3.模型压缩策略,包括参数共享、模型剪枝、知识蒸馏和模型量化。

深度学习时代,为了充分训练深层模型参数并防止过拟合,通常需要更多标注数据喂养。在NLP领域,标注数据更是一个昂贵资源。PTMs从大量无标注数据中进行预训练使许多NLP任务获得显著的性能提升。总的来看,预训练模型PTMs的优势包括:

词嵌入是自然语言处理(NLP)中语言模型与表征学习技术的统称。概念上而言,它是指把一个维数为所有词的数量的高维空间嵌入到一个维数低得多的连续向量空间中,每个单词或词组被映射为实数域上的向量,这也是分布式表示:向量的每一维度都没有实际意义,而整体代表一个具体概念。

分布式表示相较于传统的独热编码(one-hot)表示具备更强的表示能力,而独热编码存在维度灾难和语义鸿沟(不能进行相似度计算)等问题。传统的分布式表示方法,如矩阵分解(SVD/LSA)、LDA等均是根据全局语料进行训练,是机器学习时代的产物。

PTMs的发展经历从浅层的词嵌入到深层编码两个阶段,按照这两个主要的发展阶段,我们归纳出PTMs两大范式:「浅层词嵌入」和「预训练编码器」。
浅层词嵌入的主要缺陷为:

PTMs范式为预训练编码器,主要目的是通过一个预训练的编码器能够输出上下文相关的词向量,解决一词多义的问题。这一类预训练编码器输出的向量称之为「上下文相关的词嵌入」

随着网络层数的增加,从前面的层传递到后面的层的梯度会越来越小,进而就梯度消失了
梯度消失和梯度爆炸,简单来说,就是因为激活函数sigmoid导致的,输入值过大或过小导致sigmoid函数趋于0和1,对应的求导趋近于0,而且sigmoid的导数在(0,1/4)之间,这就导致如果初始化W为0-1之间的比较小的值,通过过多的层数之后,梯度下降的时候,慢慢就会出现梯度消失。如果W初始化为较大的值,通过多层之后,梯度下降会导致梯度越来越大,产生爆炸。

当w越大,其wx+b很可能变的很大,而根据上面 sigmoid 函数导数的图像可以看到,wx+b越大,导数的值也会变的很小。因此,若要出现梯度爆炸,其w既要大还要保证激活函数的导数不要太小。
下面说下解决办法:

在数学上是一个函数,,意思就从高纬抽象空间映射到低纬具象空间
抽象-具象
词-语义
为什么要做embedding?
1.抽象的事物都应该有一个低纬的表示
2.计算机善于处理低纬度信息
3.解决one-hot编码带来的纬度爆炸问题
嵌入的好处?
1.计算词向量的相似度,扩充标签
2.累加得到一个文本向量
3.用于聚类会比词聚类有更好的聚类效果

1.输入层:前者用N-GRAM模型,后者是CBOW
2.输入到投影层的操作:前者是拼接,后者是累加求和
3.隐藏层:前者有,后者无
4.输出层:前者线性结构,后者是树形结构

1.导致全连接层爆炸
2.样本数量少于特征数会造成模型过拟合

饱和:sigmoid,tanh
缺点:出现梯度消失问题
非饱和:relu及其变体
优点:解决梯度消失问题
加快收敛速度
计算速度快

NLP网络第一层参数使用其他任务训练的word embedding ,高层参数仍然随机初始化
为什么可行?
因为网络底层提取出的特征是基础特征,跟具体任务相关性不大,具备任务的通用性,而网络高层提取出的特征跟具体任务密切相关

设有一个多层感知机模型,假设输出层只保留一个输出单元 ,且隐藏层使用相同的激活函数。如果将每个隐藏单元的参数都初始化为相等的值,那么在正向传播时每个隐藏单元将根据相同的输入计算出相同的值,并传递至输出层。
在反向传播中,每个隐藏单元的参数梯度值相等。因此,这些参数在使用基于梯度的优化算法迭代后值依然相等。之后的迭代也是如此。在这种情况下,无论隐藏单元有多少,隐藏层本质上只有一个隐藏单元在发挥作用。
因此,通常对神经网络的模型参数,特别是权重参数进行随机初始化。随机初始化模型参数的方法有很多,可以使用正态分布的随机初始化方式。

1.赛题理解

2.数据探索跟预处理

3.特征工程

4.算法尝试

5 算法选择

1.随机欠采样:
优点:平衡数据的同事减小了数据量
缺点:数据减少会影响模型的特征学习能力跟泛化能力
2.随机过采样:
优点:没有导致数据信息的丢失
缺点:增加了过拟合的可能性

类别特征常用的处理方法:
1.序号编码:成绩的高中低,转成3,2,1
2.独热编码:比如血性中的a=[1,0,0,0],b = [0,1,0,0]
3.二进制编码:跟独热类似

把一阶离散特征两两组合,就构成高阶组合特征
中文 - 电影 = 中文电影,中文电视剧
英文-电视剧 = 英文电影,英文电视剧,
一般当引入id类型的特征,通常需要降维
组合特征
利用决策树方法来组合特征

朴素贝叶斯,逻辑回归,sVM,感知机,最大熵模型,em算法,决策树,主成分分析
感知机:是二类分类的线性分类模型,输入为实例的特征向量,输出是正负1
K近邻算法:是一种基本分类跟回归算法,算法步骤是,计算当前数据跟其他数据距离最近的K个数据点,然后查看他们的类,类最多的就是数据的分类类别
朴素贝叶斯:是一种基于贝叶斯定力跟条件独立假设的分类算法
决策树:是一种基本的分类跟回归方法,呈现树形结构,基于树的特征依次对实例进行分类
逻辑回归:对数线性模型分类回归方法

主要是为了加速,因为反向传播求导一次就可以求出所有的偏导数,反之前向传播因为数据的输入入口会变慢很多倍

pytorch是一个动态的框架,而TensorFlow是一个静态的框架。何为静态的框架呢?我们知道,TensorFlow的尿性是,我们需要先构建一个TensorFlow的计算图,构建好了之后,这样一个计算图是不能够变的了,然后我们再传入不同的数据进去,进行计算。这就带来一个问题,就是固定了计算的流程,势必带来了不灵活性,如果我们要改变计算的逻辑,或者随着时间变化的计算逻辑,这样的动态计算TensorFlow是实现不了的,或者是很麻烦

K折交叉法,留一法,留P法

网格搜索,也就是一种穷举的方法,划定一个范围,不断的尝试,所有的可能性,选出表现最好的参数

1.直接删除2.平均值填充,中值填充,众数填充3.预测模型填充

isnull:返回是否空值
notnull:isnull的否定
统计量填充:连续值
特殊值填充:比如0
不处理:xgb跟LGB会自动处理

主要是特征降维
1.过滤法:按照发散性跟相关性对各个特征进行评分,通过设定阈值或者带选择阈值的个数来选择特征
(代表:相关系数,互信息,卡方检验,信息增益)
2.包装法:根据预测效果得分,每次选择若干特征,或者排除若干特征
(代表:遗传算法,模拟退火算法)
3.嵌入发:使用机器学习算法进行训练,得到每个特征的权值系数,并根据系数从大到小选择特征
(代表:决策树-熵,信息增益,正则化)

1.第一,根据电化学模型进行温度修正,兼顾不同场景
2.电化学模型的RUL结果会作为LSTM的一个新特征输入

1.bagging,boosting
2.投票法,平均法,权重法,

1.网格搜索
2.随机森林

1.查看训练集特征变量信息
2.查看数据统计信息
3.查看数据字段信息
4.画箱线图探索数据
5.查看数据分布图
6.可视化线性回归关系
7.查看特征变量的相关性(画出相关性热力图,找出特征变量和target变量相关系数大于0.5的特征变量)
8.查看特征变量跟target变量的

1.删除异常值
2.最大最小值归一化
3.查看训练集数据和测试集数据分布情况
4.特征降维
5相关性初筛
6.多重共线性筛选降维
7.pca主成分降维
8.决策树构建新特征

1.平均绝对值误差:MAE是预测值跟真实值的绝对值
2.均方误差:mse指参数估计值跟参数真实值之差的平方
3.均方根误差:均方误差的平方根
4.R2:反映了回归模型在多大程度上解释了因变量的变化,换句话就是模型对观测值的拟合程度如何

个体学习模型的准确性越高,多样性越大,模型融合的提升效果越好

如果需要稀疏性就⽤l1,因为l1的梯度是1或-1,所以每次更新都稳步向0趋近。
⼀般多⽤l2因为计算⽅便“求导置零解⽅程”,l2只有最好的⼀条预测线⽽l1可能有多个最优解。
l1鲁棒性更强对异常值不敏感

归⼀化:对不同特征维度的伸缩变换的⽬的是使各个特征维度对⽬标函数的影响权᯿是⼀致的,即使得那些扁平分
布的数据伸缩变换成类圆形。这也就改变了原始数据的⼀个分布。
好处:
1 提⾼迭代求解的收敛速度,不归⼀化梯度可能会震荡
2 提⾼迭代求解的精度

标准化:对不同特征维度的伸缩变换的⽬的是使得不同度ᰁ之间的特征具有可⽐性。同时不改变原始数据的分布。
好处
1 使得不同度ᰁ之间的特征具有可⽐性,对⽬标函数的影响体现在⼏何分布上,⽽不是数值上
2 不改变原始数据的分布

『柒』 模型压缩:剪枝算法

过参数化主要是指在训练阶段,在数学上需要进行大量的微分求解,去捕抓数据中的微小变化信息,一旦完成迭代式的训练之后,网络模型推理的时候就不需要这么多参数。而剪枝算法正是基于过参数化的理论基础而提出的。

剪枝算法核心思想就是减少网络模型中参数量和计算量,同时尽量保证模型的性能不受影响。

那在AI框架中,实际上剪枝主要作用在右下角的端侧模型推理应用场景中,为的就是让端侧模型更小,无论是平板、手机、手表、耳机等小型IOT设备都可以轻松使用AI模型。而实际在训练过程更多体现在剪枝算法和框架提供的剪枝API上面。

实际上大部分刚接触剪枝算法的时候,都会从从宏观层面去划分剪枝技术,主要是分为Drop Out和Drop Connect两种经典的剪枝算法,如下图所示。

1)Drop Out:随机的将一些神经元的输出置零,称之为神经元剪枝。

2)Drop Connect:随机将部分神经元间的连接Connect置零,使得权重连接矩阵变得稀疏。

下面会把剪枝的更多种方式呈现出来,可能会稍微复杂哈。从剪枝的粒度来划分,可以分为结构化剪枝和非结构化剪枝,2个剪枝结构方法。下面来看看具体的剪枝方法有4种:

细粒度剪枝、向量剪枝、核剪枝在参数量与模型性能之间取得了一定的平衡,但是网络模型单层的神经元之间的组合结构发生了变化,需要专门的算法或者硬件结构来支持稀疏的运算,这种叫做 结构化剪枝(Unstructured Pruning)

其中,非结构化剪枝能够实现更高的压缩率,同时保持较高的模型性能,然而会带来网络模型稀疏化,其稀疏结构对于硬件加速计算并不友好,除非底层硬件和计算加速库对稀疏计算有比较好的支持,否则剪枝后很难获得实质的性能提升。

滤波器剪枝(Filter-level)主要改变网络中的滤波器组和特征通道数目,所获得的模型不需要专门的算法和硬件就能够运行,被称为 结构化剪枝(Structured Pruning) 。结构化剪枝又可进一步细分:可以是channel-wise,也可以是filter-wise,还可以是在shape-wise。

结构化剪枝与非结构化剪枝恰恰相反,可以方便改变网络模型的结构特征,从而达到压缩模型的效果,例如知识蒸馏中的student网络模型、NAS搜索或者如VGG19和VGG16这种裁剪模型,也可以看做变相的结构化剪枝行为。

虽然剪枝算法的分类看上去很多,但是核心思想还是对神经网络模型进行剪枝,目前剪枝算法的总体流程大同小异,可以归结为三种:标准剪枝、基于子模型采样的剪枝、以及基于搜索的剪枝,如下图所示。

标准剪枝是目前最流行的剪枝流程,在Tensorflow、Pytroch都有标准的接口。主要包含三个部分:训练、剪枝、以及微调。

1) 训练 :首先是对网络模型进行训练。在剪枝流程中,训练部分主要指预训练,训练的目的是为剪枝算法获得在特定基础SOTA任务上训练好的原始模型。

3) 微调 :微调是恢复被剪枝操作影响的模型表达能力的必要步骤。结构化模型剪枝会对原始模型结构进行调整,因此剪枝后的模型参数虽然保留了原始的模型参数,但是由于模型结构的改变,剪枝后模型的表达能力会受到一定程度的影响。实现上,微调网络模型,参数在计算的时候先乘以该Mask,Mask为1的参数值将继续训练通过BP调整梯度,而Mask为0的部分因为输出始终为0则不对后续部分产生影响。

4) 再剪枝 :再剪枝过程将微调之后的网络模型再送到剪枝模块中,再次进行模型结构评估和执行剪枝算法。目的是使得每次剪枝都在性能更优的模型上面进行,不断迭代式地进行优化剪枝模型,直到模型能够满足剪枝目标需求。

最后输出模型参数储存的时候,因为有大量的稀疏,所以可以重新定义储存的数据结构, 仅储存非零值以及其矩阵位置。重新读取模型参数的时候,就可以还原矩阵。

除标准剪枝之外,基于子模型采样的剪枝《EagleEye: Fast sub-net evaluation for efficient neural network pruning》最近也表现出比较好的剪枝效果。得到训练好的模型之后,进行子模型采样过程。一次子模型采样过程为:

1)对训练好的原模型中可修剪的网络结构,按照剪枝目标进行采样,采样过程可以是随机的,也可以按照网络结构的重要性或者通过KL散度计算进行概率采样。

2)对采样后的网络结构进行剪枝,得到采样子模型。子模型采样过程通常进行 次,得到 个子模型( ≥1), 之后对每一个子模型进行性能评估。子模型评估结束之后,选取最优的子模型进行微调以得倒最后的剪枝模型。

基于搜索的剪枝主要依靠强化学习等一系列无监督学习或者半监督学习算法,也可以是神经网络结构搜索相关理论。

给定剪枝目标之后,基于搜索的剪枝在网络结构中搜索较优的子结构,这个搜索过程往往伴随着网络参数的学习过程,因此一些基于搜索的剪枝算法在剪枝结束后不需要再进行微调。

这几年神经网络剪枝pruning作为模型压缩技术的四小龙之一,正在受到越来越多的关注。当然,各种更好的pruning参数选取方法一定还会层出不穷。另外,从趋势来看,以下几个方向值得关注:

打破固定假设 :挑战已有的固有的假设,例如ICLR2019会议的best paper彩票假说《The Lottery Ticket Hypothesis: Finding Sparse, Trainable Neural Networks 》的出现。还有一开始提到的对于over-parameterization,与重用已有参数是否有有益的反思非常有意思。这样的工作会给剪枝算法非常大的启发,从而根本改变解决问题的思路。

自动化剪枝 :随着AutoML的大潮,越来越多的算法开始走向自动化。模型压缩能拉下吗?当然不能。经过前面的介绍我们知道,像ADC,RNP,N2N Learning这些工作都是试图将剪枝中部分工作自动化。如量化中的《HAQ: Hardware-Aware Automated Quantization》考虑网络中不同层信息的冗余程度不一样,所以自动化使用混合量化比特进行压缩。

与NAS融合 :如前面模型剪枝流程中提到,剪枝算法与神经网络搜索NAS的界限已经模糊了。NAS有针对结构化剪枝进行搜索方法,如One-Shot Architecture Search是先有一个大网络,然后做减法。NAS与模型压缩两个一开始看似关系不是那么大的分支,在近几年的发展过程中因为下游任务和部署场景的需求,最后似乎会走到一块去。这两个分支今天有了更多的交集,也必将擦出更多的火花。

与GAN融合 :这几年机器学习最火热的分支之一GAN,正在不断渗透到已有领域,在pruning中也开始有它的身影。如2019年《Towards Optimal Structured CNN Pruning via Generative Adversarial Learning》让generator生成裁剪后网络,discrimintor来判别是否属于原网络还是裁剪后网络,从而进行更有效的网络结构化裁剪。

硬件稀疏性支持 :剪枝会给神经网络模型带来稀疏性特征,参数稀疏性在计算中会有大量的索引,所以并不能加速。现在虽然有像cuSPARSE这样的计算库,但底层硬件AI芯片本身设计并不是专门为稀疏数据处理打造的。如果能将稀疏计算和处理能力做进芯片那必将极大提高计算效率。仅2021年中国就推出了10+款基于ASIC的AI加速芯片,相信针对稀疏性场景的支持在未来会有所突破。

模型压缩算法中针对已有的模型,有:张量分解,模型剪枝,模型量化。针对新构建的网络,有:知识蒸馏,紧凑网络设计等方法。

剪枝只是模型压缩方法中的一种,它与其它模型压缩方法并不冲突,因此会与量化、蒸馏、NAS、强化学习等方法慢慢融合,这些都是很值得研究的方向。另外在上面的发展来看,打破固有的假设定义,与NAS、GAN、AutoML、RL等技术进行相互的融合,可能到最后会模糊purning方式,出现新的范式或者压缩模式也是很吸引的。

『捌』 知识蒸馏综述:网络结构搜索应用

【GiantPandaCV导语】知识蒸馏将教师网络中的知识迁移到学生网络,而NAS中天然的存在大量的网络,使用KD有助于提升超网整体性能。两者结合出现了许多工作,本文收集了部分代表性工作,并进行总结。

知识蒸馏可以看做教师网络通过提供soft label的方式将知识传递到学生网络中,可以被视为一种更高级的label smooth方法。soft label与hard label相比具有以下优点:

那么知识蒸馏在网络结构搜索中有什么作用呢?总结如下:

知识蒸馏在很多工作中作为训练技巧来使用,比如OFA中使用渐进收缩训练策略,使用最大的网络指导小网络的学习,采用inplace distillation进行蒸馏。BigNAS中则使用三明治法则,让最大的网络指导剩下网络的蒸馏。

目标:解决教师网络和学生网络的匹配问题(知识蒸馏中教师网络和学生网络匹配的情况下效果更好)。

在知识蒸馏中,选择不同的教师网络、不同的学生网络的情况下,最终学生网络的性能千差万别。如果学生网络和教师网络的容量相差过多,会导致学生难以学习的情况。Cream这篇文章就是为了解决两者匹配问题。

普通的SPOS方法如左图所示,通过采样单路径子网络进行训练。右图则是结合了知识蒸馏的方法,Cream提出了两个模块:

Cream中心思想是,子网络可以在整个训练过程中协作学习并相互教导,目的是提高单个模型的收敛性。

消融实验如下:

目标:通过教师引导各个block特征层的学习,根据loss大小评判各子网的性能。

这是一篇将NAS和KD融合的非常深的一个工作,被CVPR20接收。之前写过一篇文章进行讲解,这里简单回顾一下。

DNA是两阶段的one-shot NAS方法,因此其引入蒸馏也是为了取代普通的acc指标,提出了使用子网络与教师网络接近程度作为衡量子网性能的指标。

在训练的过程中,进行了分块蒸馏,学生网络某一层的输入来自教师网络上一层的输出,并强制学生网络这一层的输出与教师网络输出一致(使用MSELoss)。在搜索过程结束后,通过计算各子网络与教师网络的接近程度来衡量子网络。

目标:通过改进KL divergence防止学生over estimate或者under estimate教师网络。

上图展示了OFA,BigNAS等搜索算法中常用到的蒸馏方法,子网使用的是KL divergence进行衡量,文中分析了KL 散度存在的局限性:即避零性以及零强制性。如下公式所示,p是教师的逻辑层输出,q是学生逻辑层输出。

AlphaNet提出了一个新的散度衡量损失函数,防止出现过估计或者低估的问题。如下所示,引入了 。

其中 不为0或者1,这样如下图所示:

蓝色线对应example 2表示,当 为负值,如果q过估计了p中的不确定性, 的值会变大。

紫色线对应example 1表示,当 为正数,如果q低估了p中的不确定性, 的值会变大

同时考虑两种情况,取两者中最大值作为散度:

目标:提出了衡量学生网络和教师网络 内部激活相似度 衡量指标,通过表征匹配可以用来加速网络结构搜索。

这部分其实是属于知识蒸馏分类中基于关系的知识,构建的知识由不同样本之间的互作用构成。

具体的指标构成如上图所示,是一个bsxbs大小的矩阵,这个在文中被称为Representational Dissmilarity Matrix,其功能是构建了激活层内部的表征,可以通过评估RDM的相似度通过计算上三角矩阵的关系系数,比如皮尔逊系数。

该文章实际上也是构建了一个指标P+TG来衡量子网的性能,挑选出最优子网络。

如上图所示,RDM的计算是通过衡量教师网络的feature以及学生网络的feature的相似度,并选择选取其中最高的RDM相似度。通过构建了一组指标,随着epoch的进行,排序一致性很快就可以提高。

目标:固定教师网络,搜索最合适的学生网络。

对于相同的教师网络来说,不同的架构的学生网络,即便具有相同的flops或者参数,其泛化能力也有所区别。在这个工作中选择固定教师网络,通过网络搜索的方法找到最优的学生网络,使用L1 Norm优化基础上,选择出与教师网络KL散度差距最小的学生网络。

目标:在给定教师网络情况下,搜索最合适的学生网络。

神经网络中的知识不仅蕴含于参数,还受到网络结构影响。KD普遍方法是将教师网络知识提炼到学生网络中,本文提出了一种架构感知的知识蒸馏方法Architecture-Aware KD (AKD),能够找到最合适提炼给特定教师模型的学生网络。

Motivation: 先做了一组实验,发现不同的教师网络会倾向于不同的学生网络,因此在NAS中,使用不同的教师网络会导致模型倾向于选择不同的网络结构。

AKD做法是选择使用强化学习的方法指导搜索过程, 使用的是ENAS那种通过RNN采样的方法。

目标:从集成的教师网络中学习,并使用NAS调整学生网络模型的容量。NAS+KD+集成。

这篇文章之前也进行了讲解,是网络结构搜索,知识蒸馏,模型集成的大杂烩。

详见: https://blog.csdn.net/DD_PP_JJ/article/details/121268840

这篇文章比较有意思,使用上一步中得到的多个子网络进行集成,可以得到教师网络,然后使用知识蒸馏的方法来引导新的子网络的学习。关注重点在于:

AdaNAS受Born Again Network(BAN)启发, 提出Adaptive Knowledge Distillation(AKD)的方法以辅助子网络的训练。

集成模型选择

从左到右代表四次迭代,每个迭代中从搜索空间中选择三个模型。绿色线框出的模型代表每个迭代中最优的模型,AdaNAS选择将每个迭代中最优subnet作为集成的对象。

最终集成的时候还添加了额外的weight参数w1-w4:

最终输出逻辑层如下所示:(这个w权重也会被训练,此时各个集成网络的权重是固定的,只优化w)

Knowledge Distillation

目标:解决知识蒸馏的效率和有效性,通过使用特征聚合来引导教师网络与学生网络的学习,网络结构搜索则是体现在特征聚合的过程,使用了类似darts的方法进行自适应调整放缩系数。ECCV20

文章总结了几种蒸馏范式:

最后一种是本文提出的方法,普通的特征蒸馏都是每个block的最后feature map进行互相蒸馏,本文认为可以让教师网络的整个block都引导学生网络。

具体如何将教师网络整个block中所有feature map进行聚合,本文使用的是darts的方法进行动态聚合信息。(a) 图展示的是对group i进行的可微分搜索过程。(b)表示从教师到学生的路径loss构建,使用的是CE loss。(c)表示从学生到教师网络的路径loss构建,使用的是L2 Loss。其中connector实际上是一个1x1 卷积层。

(ps: connector让人想到VID这个工作)

『玖』 模型压缩简述

如今学术界新提出的神经网络模型越来越大,而在实际应用中很多模型都要被部属在移动端。移动端的存储空间以及算力都有限,无法运行太大的模型,所以模型压缩这个概念就应运而生。本文简单介绍一下在算法(软件)层面的模型压缩方法和paper,不涉及硬件上的技巧。内容大多来自2020年李宏毅老师的课程。
目前在算法层面模型压缩主要有四个流派,简介如下:

剪枝思想加入神经网络中。将网络中不重要的weight和neuron(网络中每层的层数)删除。

传说中的知识蒸馏。利用已经训练好的大模型来指导小模型。主要用在分类任务上。

从数据存储角度节省空间,将存储参数的浮点数压缩为更小的单位,用更少的位来表示值。

调整结构/使用特殊的结构来节省参数,后面再详细介绍。

前面提到了删除不重要的weight和neuron。对于权重来说,他的范数(比如L1或L2)大小可以看出重要程度:范数太小,不重要。对于神经元,不同输入下的输出是0的频率可以看出重要程度:经常输出0,不重要。删完之后,对新的模型进行fine-tune。这是剪枝最基础的思路,具体每层剪几个,低于多少要剪掉不同paper有提出不同算法。注意可以迭代多次删除,不要一次删除太多。在实践中,删除神经元的方式更容易被执行计算。
下面两张图是对于剪枝降低了参数的示意图:

至于为什么不直接训练小的模型,因为大的网络容易训练,小的网络容易陷入局部最优,所以就把大网络裁剪成小网络而不是直接训练小网络。
当然可以剪枝的部分不限于weight和neuron,对于剪枝完之后模型的处理方法也有新的发现。下面给出相关的paper list:

Pruning Filters for Efficient ConvNets(ICLR 2017)
Learning Efficient Convolutional Networks Through Network Slimming(ICCV2017)
Filter Pruning via Geometric Median for Deep Convolutional Neural Networks Acceleration(CVPR2019)
The Lottery Ticket Hypothesis:Finding Sparse,Trainable Neural Networks(ICLR2019)
Rethinking the value of network pruning(ICLR2019)
Deconstructing Lottery Tickets:Zeros,Signs,and the Supermask(ICML2019)

通过已训练好的teacher模型训练student模型,指导/学习的过程在这里被抽象为蒸馏(distillation)。可以蒸馏模型的输出,直接匹配logits,或者蒸馏模型中间输出的特征feature,直接匹配feature或者学习feature如何转换 。
先说最经典的,对logits的蒸馏。结构如下图:

至于为什么要在softmax前除T,paper给的解释是让softmax的输出更平滑(意为输入更加类似soft target,而不是one-hot那样的hard target)。知识蒸馏还有一个有趣的点就是让小的模型还学会了不同输出label间的关系,比如在mnist模型可以学会label1和7很相似。
对于logits distillation的研究还有Deep Mutual Learning,Born Again Neural Networks,Improved Knowledge Distiilation via Teacher Assistant等研究,在下面的paperlist也有列出。
接下来简单介绍feature distillation。

类似的研究还有Similarity-Preserving Knowledge Distiilation,下面是paper list:

Distilling the knowledge in a Neural Network(NIPS2014)
Deep Mutual Learning(CVPR2018)
Born Again Neural Networks(ICML2018)
Improved Knowledge Distiilation via Teacher Assistant(AAAI2020)
Paying More Attention to Attention:Improving the Performance of Convolutional Neural Networks via Attention Transfer(ICLR2017)
Relational Knowledge Distiilation(CVPR2019)
Similarity-Preserving Knowledge Distiilation(ICCV2019)

可以用的方法有权重聚类,如下图:

也可以用一些经典的方法比如哈夫曼编码。
还有一种方法是使权重全都是+1或-1:

调整结构来节省参数的图示如下:

对于卷积结构也类似,传统的卷积结构需要3x3x2x4=72个参数,而以下结构只需要18+8=26个:

著名的模型有SqueezeNet,MobileNet,ShuffleNet,Xception。

阅读全文

与知识蒸馏剪枝量化相关的资料

热点内容
杭州污水厂排放标准 浏览:565
EDI只用于 浏览:115
哪里有韩式pp棉过滤芯卖 浏览:459
鸡蛋壳去电热水壶水垢 浏览:906
上海小型油烟净化器需要多少钱 浏览:541
半透膜能耐受DMSO 浏览:320
EDI循环 浏览:420
威驰空气滤芯盖两个锁扣怎么打开 浏览:740
abs树脂与pp有啥区别 浏览:838
水费简易计税需要区分污水费吗 浏览:130
普通热水瓶去水垢的方法 浏览:74
别墅排水需要什么样的污水提升泵 浏览:189
河南省城镇污水厂排放 浏览:294
反渗透膜品牌选择上海保兹 浏览:891
简单蒸馏的步骤 浏览:378
07骐达空调滤芯怎么安装 浏览:184
活性炭吸附废水适用条件 浏览:904
潍坊食品废水处理设备多少钱 浏览:487
投影机过滤网怎么取 浏览:927
dsm树脂有没有毒 浏览:660