导航:首页 > 蒸馏问题 > 知识蒸馏算法

知识蒸馏算法

发布时间:2022-12-21 04:02:42

A. 常减压蒸馏塔 的理论塔板数算法由于自己自己基础比较差,所有请告诉一个比较简单的从头到尾的计算方法。

要逐板计算理论塔板数,你得有这么几个数据:(1)馏出液组成,即xd;(2)进料液组成,即xf;(3)馏残液组成,即xw;(4)回流比R以及相对挥发度a。
在精馏塔中,Xn和Yn是一对平衡,Xn和Yn+1是同一塔板上的一对气液组成。气液平衡组成满足气液平衡方程,可根据该方程由Yn算出Xn;同一塔板上的气液组成分别满足精馏段操作线方程和提馏段操作线方程,可根据这两个方程由Xn算出Yn+1;然后由Yn+1算Xn+1(气液平衡),Xn+1算Yn+2(操作线),以此类推即可分别算出精馏段理论塔板数和提馏段理论塔板数。其中,精馏段算至x接近Xf为止,提馏段算至x接近Xw为止。所得到的Y的下标即为理论塔板数。因为塔底再沸器是部分气化,相当于一块塔板,所以最后的理论塔板数要减1。例如,精馏段塔板数:第一步,因为已知Y1(即Xd),所以可由气液平衡方程,由y1计算x1;第二步,由精馏段操作线方程,由x1计算y2;然后重复第一步和第二步,分别算出x2和y3;以此类推计算至Xn=Xf为止,可得精馏段理论塔板数;提馏段理论塔板数的计算与精馏段类似,只不过是从Xf开始,先根据提馏段操作线方程算其同层气相组成Ym,然后由Ym根据气液平衡算Xm。
希望对你有所帮助。

B. 白酒蒸馏技术

白酒的制作方法:
所用设备:
1.原料处理及运送设备。有粉碎机、皮带输送机、斗式提升机、螺旋式输送机、送风设备等。
2.拌料、蒸煮及冷却设备。有润料槽、拌料槽、绞龙、连续蒸煮机(大厂使用)、甑桶(小厂使用)、晾渣机、通风晾渣设备。
3.发酵设备。水泥发酵池(大厂用)、陶缸(小厂用)等。
4.蒸酒设备。蒸酒机(大厂用)、甑桶(小厂用)等。
我国的白酒生产有固态发酵和液态发酵两种,固态发酵的大曲、小曲、麸曲等工艺中,麸曲白酒在生产中所占比重较大,故此处仅简述麸曲白酒的工艺。
制作方法:
1.原料粉碎。原料粉碎的目的在于便于蒸煮,使淀粉充分被利用。根据原料特性,粉碎的细度要求也不同,薯干、玉米等原料,通过20孔筛者占60%以上。
2.配料。将新料、酒糟、辅料及水配合在一起,为糖化和发酵打基础。配料要根据甑桶、窖子的大小、原料的淀粉量、气温、生产工艺及发酵时间等具体情况而定,配料得当与否的具体表现,要看入池的淀粉浓度、醅料的酸度和疏松程度是否适当,一般以淀粉浓度14~16%、酸度0.6~0.8、润料水分48~50%为宜。
3.蒸煮糊化。利用蒸煮使淀粉糊化。有利于淀粉酶的作用,同时还可以杀死杂菌。蒸煮的温度和时间视原料种类、破碎程度等而定。一般常压蒸料20~30分钟。蒸煮的要求为外观蒸透,熟而不粘,内无生心即可。将原料和发酵后的香醅混合,蒸酒和蒸料同时进行,称为“混蒸混烧”,前期以蒸酒为主,甑内温度要求85~90℃,蒸酒后,应保持一段糊化时间。若蒸酒与蒸料分开进行,称之为“清蒸清烧”。
4.冷却。蒸熟的原料,用扬渣或晾渣的方法,使料迅速冷却,使之达到微生物适宜生长的温度,若气温在5~10℃时,品温应降至30~32℃,若气温在10~15℃时,品温应降至25~28℃,夏季要降至品温不再下降为止。扬渣或晾渣同时还可起到挥发杂味、吸收氧气等作用。
5.拌醅。固态发酵麸曲白酒,是采用边糖化边发酵的双边发酵工艺,扬渣之后,同时加入曲子和酒母。酒曲的用量视其糖化力的高低而定,一般为酿酒主料的8~10%,酒母用量一般为总投料量的4~6%(即取4~6%的主料作培养酒母用)。为了利于酶促反应的正常进行,在拌醅时应加水(工厂称加浆),控制入池时醅的水分含量为58~62%。
6.入窖发酵。入窖时醅料品温应在18~20℃(夏季不超过26℃),入窖的醅料既不能压的紧,也不能过松,一般掌握在每立方米容积内装醅料630~640公斤左右为宜。装好后,在醅料上盖上一层糠,用窖泥密封,再加上一层糠。发酵过程主要是掌握品温,并随时分析醅料水分、酸度、酒量、淀粉残留量的变化。发酵时间的长短,根据各种因素来确定,有3天、4~5天不等。一般当窖内品温上升至36~37℃时,即可结束发酵。
7.蒸酒。发酵成熟的醅料称为香醅,它含有极复杂的成分。通过蒸酒把醅中的酒精、水、高级醇、酸类等有效成分蒸发为蒸汽,再经冷却即可得到白酒。蒸馏时应尽量把酒精、芳香物质、醇甜物质等提取出来,并利用掐头去尾的方法尽量除去杂质。
8、原酒储存一段时间,勾兑成品,符合国家相关标准就可以出售了。

如果是单纯蒸馏过程的技术细节,那就很细了,要点:轻、松、缓、匀,见气撒糟、探气撒糟、断花取酒、掐头去尾、高温馏酒、底锅黄水、适时调味、蒸糠摊凉等等。

C. 知识蒸馏综述:网络结构搜索应用

【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这个工作)

D. 模型压缩简述

如今学术界新提出的神经网络模型越来越大,而在实际应用中很多模型都要被部属在移动端。移动端的存储空间以及算力都有限,无法运行太大的模型,所以模型压缩这个概念就应运而生。本文简单介绍一下在算法(软件)层面的模型压缩方法和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。

E. 知识蒸馏 | 模型压缩利器_良心总结

最近利用知识蒸馏的方法,对业务中的性能有了可观的提升,因此在这里总结一波。本文主要从宏观的角度分析一下各个蒸馏算法的蒸馏方式,具体细节可以根据兴趣阅读论文~ 知识蒸馏是一种模型压缩常见方法,用于模型压缩指的是在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信息,而鉴别器主要被用来鉴别学生网络的输出和教师网络的输出,最终学习的目的就是是的学生网络能够欺骗鉴别器,是的鉴别起无法区分出学生网络和教师网络的输出。最终实现学生网络学习到了教师网络的输出特征和分布。而无监督对抗学习这篇文章的出发点有点不一样,由于一些实践问题(如隐私、法律等问题),给定深度网络的训练数据往往不可用,除了一些接口之外,给定网络的架构也是未知的。基于此,本文提出了一种利用生成对抗网络训练高效深度神经网络的新框架。讲预先训练好的教师网络看作一个固定的鉴别器,利用该鉴别器产生的训练样本可以得到最大的鉴别结果。然后,利用生成的数据和教师网络,同时训练出模型尺寸较小、计算复杂度较低的高效网络。

F. 【心理学与AI】2019年9月DNN模型压缩-综述

Cheng, Y., Wang, D., Zhou, P., & Zhang, T. (2017). A survey of model compression and acceleration for deep neural networks. arXiv preprint arXiv:1710.09282.

目前的DNN太庞大,使得计算需要的时间和空间都很大。为了优化这个问题,科学家们提出了压缩模型的各种方法。

牛逼的那些DNN到底有多大?
2012的CNN(已经算参数少的了),6千万个参数,5卷积层+3全连接。在NVIDIA K40的机器上要训练2-3天 (Krizhevsky et al. , NIPS , 2012) 。人脸识别网络,几亿个参数 (Taigman et al., CVPR , 2014; Lu et al., CoRR , 2016)。纯靠全连接的网络甚至有几十亿个参数 (Dean et al., NIPS , 2012) 。

在移动设备上的使用局限
移动设备的内存,CPU,续航能力都有限,经不起那么大的网络折腾。比如ResNet-50有50个卷积层,仅处理一个图片就需要95M和38亿次的浮点数乘法。经过优化之后可以减少75%的参数,节省50%的计算时间。

*卷:卷积层;全:全连接层
*新:从头训练的模型(train from scratch);预:预训练模型(pre-trained model)

这些方法各有各的优势,有些可以结合着使用效果更佳,接下来我们就分别对这些方法进行描述。

包括用K-means 聚类减少参数数量[6,7],把参数压缩到8-bit[8], 16-bit[9],用霍夫曼编码(Huffman coding)来压缩码表[10]。用二阶偏导来衡量网络参数的重要性[11]。最极端情况干脆二值化参数,也就是参数只有可能是0或1,形成二值网络[12-14]。

缺点 二值网络在简化大型网络的时候损失较大

最早的剪枝算法是偏差权重衰减(Biased Weight Decay) [18].

The Optimal Brain Damage [19] and the Optimal Brain Surgeon [20] methods 根据the Hessian of the loss function来削减链接的数量。
这几种方法需要从头训练模型。

近来开始流行对预训练的模型进行剪枝[21,22],用哈希码表来储存参数,实现参数共享[23]。也已经有工作把上述的压缩,剪枝,参数贡献融合在一个统一的流程中[24]。

也有一些新兴的工作,将稀疏约束(sparsity constraints)加入到CNN的训练中[25-28]。大大减少了卷积核的数量,甚至是层数。

缺点 剪枝有很多需要手动调整的地方,对于某些应用场景来说太复杂了。

由于全连接层的参数过多,而且f(x,M) = σ(Mx),这里的σ(·)不是一个线性变化(因为引入了层间的非线性变换,如Relu),是对于每个元素特异的变换。

也就是说本来这个矩阵中每个值之间完全没有关系,我就得把每个值都单独存下来, 计算量也是O(mn)。现在我创建一种关系来约束部分的参数,那我只需要存这个关系就好了,不用存那么多值了。

缺点 人为地进行约束会降低模型地准确率,而且对特定任务找到合适的约束关系本身就很难,现在还没有一种靠谱的理论来定位这个约束关系。

这个方法的核心是对卷积核进行低秩分解,分解之后重要的信息被保留下来,计算的速度也提高了。

对于预训练的模型,可以一层一层的分解卷积核,分解完一层之后这层的参数就固定了,但是因为会有损失,下一层要先继续调参,再分解。

也有人提出基于低秩因子分解从头训练的做法[40]。Canonical Polyadic (CP)[39],Batch Normalization (BN)[40]这两种方法都可以做分解,效果都很好,但是前者存在有时候找不到一个最优的秩(best rank-K)的情况。具体是什么数学方法没有看。

全连接层是二维的矩阵,同样也可以用这种方法进行降维。

缺点 分解本身需要的计算量很大;只能逐层分解,不能进行全局的优化;为了达到跟原模型相近的效果,需要重新训练的量较大(因为每一层分解之后都要重新调参)。

(这句话也没有引用,但是感觉说的挺有道理在这里存个档。)

这个方法的核心思想其实跟结构矩阵挺像的,只不过这个方法是针对卷积层做的处理。

由于卷积层中有大量的卷积核,如果对他们进行随机的初始化,会发现最后训练出来也有很多的冗余。比如,有一些卷积核,是另一些卷积核的-1倍。这样我们还不如在一开始定义一些卷积核的约束规则,比如直接定义有一些核是另一些的-1倍[45]。(文献中的方程4)

反正定不定义训练出来都是类似的特征,为什么要定义这个约束呢?当然是首先节省了储存卷积核的空间,同时也节省了训练所需要的计算量。

虽然理论上不知道为什么,但是实际训练显示,如果卷积核之间有些关联的话效果甚至会更好。

缺点
这个方法对比较宽的浅层网络(e.g. VGG)效果较好,但是对窄而深的网络(e.g. GoogleNet,Resial Net)效果不好。另外,这种约束定义之后有时候会造成训练结果的不稳定。

要把一个复杂模型进行压缩,有人想到可以通过迁移的方法来把核心信息提取出来,但是之前这个方法只限于在浅层模型上操作[50]。

知识蒸馏这个概念是后来提出来的,它把复杂模型比作老师,目标的压缩模型,即简单模型比作学生,把老师的知识迁移到学生身上,并让学生在处理问题上的表现尽可能去逼近老师,就是知识蒸馏的核心算法。

数学方法的主要步骤就是,把学生网络和老师网络的输出结果看成两个分布,我要让这两个分布尽可能的接近。那么我首先要把输出结果(例如代表A类的输出神经元的值为0.8,B类的0.2,C类的0.2)转化为标准化的分布,并且我想尽可能突出最大值。这里就用到softmax函数,把输出结果映射到(0,1)上的分布,并且让值的和为1。

接下来我要基于当前两个分布的差异,来定义一个损失函数,我的目标就是让这个损失尽可能的小。这里常用的损失函数就是交叉熵损失函数(CrossEntropy Loss)。

一般我们用KL散度的值表示俩概率分布之间的差异,而交叉熵是等于KL散度加上一个常量(信息熵),其公式相比KL散度更容易计算,因此在机器学习中常常使用交叉熵损失函数而不是KL散度。

现有的KD算法中,FitNets[53] 提出如何将宽而浅的模型,压缩成窄而深的模型。这些算法在各大数据集(e.g. MNIST, CIFAR-10, CIFAR-100, SVHN, AFLW) 都得到了有效的验证,学生网络有的时候甚至比老师网络的效果更好。

之后的工作[54-57]进一步优化了这个算法的计算速度,或是寻找一下更宽松的训练条件(e.g. Attention Transfer (AT) [57]),又能达到相近的效果。

缺点 这个方法只能用在用softmax+crossentrophy loss训练的网络上,所以也有一些局限。另一方面,这个方法有时候约束条件太严格了,不一定训练得出来。

基于注意的算法是最近比较新的趋势,它的核心思想是,在训练时,选择性地关注那些和任务相关的网络结构,而不是整个网络,通过这种方式来大幅节省计算量。

Dynamic capacity network (DCN) [59] 的设计包括了两个网络,一个小型网络和一个大型网络,训练数据先经过小网络,确定一下主要激活的是哪些区域,然后再喂给大网络,这时只需计算那些重要区域的权重就可以了。

Sparsely-gated mixture-of-experts Layer (MoE) [60] 的思想也是只计算那些重要的梯度,这个MoE模块是由很多个专家网络构成的,并且另外有一个负责做选择的网络,通过训练它可以对不同的输入数据,选择不同的专家网络的组合来学习。

针对残差网络的压缩,也有几项研究提出随机深度(stochastic depth)的算法[63-65],相当于对于每个输入数据(batch),随机(或者根据某种规则)抽掉几层网络进行训练。(感觉跟dropout差不多)

还有一些研究对池化层(pooling)进行优化,但是仅仅是提高计算速度,没有压缩空间。

压缩工作要基于一些基准的模型进行改进,或者跟他们的效果进行比较,现有的一些基准模型大概如表格所列。

评估一个压缩工作的效果主要是两方面,空间的压缩程度和计算速度的提升程度。这两方面分别由 压缩率(compression rate) 加速率(speep rate)

压缩率是用基准模型的参数量a,除以压缩后模型的参数量a*得到的。(也有用右边这种的)

加速率则是用基准模型需要的训练时间s,除以压缩后模型的训练时间s*得到的。

对于小模型来说,这两个评估指标通常是高度相关的。但是不同的模型这两个指标的关系也会有差异。比如图像处理的CNN,它主要是刚开始几层的大量卷积操作,浮点数计算比较耗时间。但有些DNN(几百层的)很瘦的,主要是全连接层的参数占据了大多数的空间和时间。

总的来说并没有一个统一的准则,而是根据具体的应用场景来的。作者提供了一些参考建议。

目前对于深度网络的压缩算法还处于一个比较初级的阶段,面临很多的困难和挑战。

G. 什么是蒸馏,蒸馏操作有什么作用

把水煮开收集那些水蒸气就叫蒸馏可以提纯,比如说白酒就是用蒸馏技术提取酒精的。

H. 蒸馏是物理变化还是化学变化 它有哪些特点

属于物理变化,拿水来说,首先水经过加热蒸发转变为水蒸汽,再经液化得到蒸馏水,水与蒸馏水的区别为水中有杂质以及矿物质,而蒸馏水中没有,原因是蒸馏水是由水蒸汽液化得到的,所以蒸馏是物理变化。

蒸馏

是一种热力学的分离工艺,它利用混合液体或液-固体系中各组分沸点不同,使低沸点组分蒸发,再冷凝以分离整个组分的单元操作过程,是蒸发和冷凝两种单元操作的联合。与其它的分离手段,如萃取、吸附等相比,它的优点在于不需使用系统组分以外的其它溶剂,从而保证不会引入新的杂质。

基本分类

1、简单蒸馏,如制造蒸馏水以去处其中溶解的固体杂质;制造蒸馏酒以浓缩酒精,去除部分水分;

2、精馏,一个设备中进行多次部分汽化和部分冷凝,以分离液态混合物,如将石油经过分馏可以分离出汽油、柴油、煤油和重油等多种组分。

分馏

是分离几种不同沸点的混合物的一种方法;对某一混合物进行加热,针对混合物中各成分的不同沸点进行冷却分离成相对纯净的单一物质过程。过程中没有新物质生成,只是将原来的物质分离,属于物理变化。

干馏

是固体或有机物在隔绝空气条件下加热分解的反应过程。干馏的结果是生成各种气体、蒸气以及固体残渣。气体与蒸气的混合物经冷却后被分成气体和液体。干馏是人类很早就熟悉和采用的一种生产过程。

以上是我整理的蒸馏的知识点,希望能帮到你。

I. 名师出高徒:关于知识蒸馏技术的一点思考

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

但是,它的存在必有其合理性,更何况是我偶像,深度学习第一人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%的准确率。因此,在任务追求的精度和推理性能及边界性之间寻求一个权衡即可。

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

J. 酿酒知识-制酒蒸馏上甄小技巧

一、取料时装甄要注意将取出的料装入甄桶时要注意:装甄要疏松,动作要轻快,上汽要均匀,甄料不宜太厚且要平整,盖料要准确。

二、装甄完毕时要注意插好馏酒管,盖上甄盖,盖内倒入水。甄桶蒸馏要做到缓汽蒸馏,大汽追尾。在整个馏酒过程中,冷却水的温度大致控制在:酒头30左右,酒身不超过30,酒尾温度较高。

三、装甄工序应注意 “见湿盖料”的装甄方法要注意:酒醅发湿时盖一层发酵的材料,避免跑汽,但若掌握不好,容易压汽; “见汽盖料”酒汽上升至甄桶表层要注意:在酒醅表层稍见白色雾状酒汽时,迅速准确地盖一层发酵材料,此法不易压汽,但易跑汽。这两种操作方法各有利弊,可根据自己装甄技术的熟练程度选择使用。

阅读全文

与知识蒸馏算法相关的资料

热点内容
公路挖污水管道沟怎么收平 浏览:976
废水池墙老是漏水怎么办 浏览:346
过滤水的设施 浏览:905
电池厂污水污染怎么办 浏览:198
污水好氧处理曝气参数 浏览:874
酿酒废水处理工程实例 浏览:412
水处理试运行方案 浏览:845
大空气净化器怎么更换滤芯 浏览:362
污水井张嘴怎么处理 浏览:267
单斜面太阳能蒸馏器 浏览:615
ro反渗透膜卷模机 浏览:227
树脂镜片有多厚 浏览:329
反渗透膜元件数计算公式 浏览:43
反渗透进水时声音很响是因为什么 浏览:394
过滤红锈用什么滤芯 浏览:695
纯化水ro膜 浏览:77
纳滤反渗透是什么 浏览:436
企业污水排放怎么办 浏览:725
塘厦最大的污水处理厂在哪里 浏览:827
江苏省电镀废水排放标准 浏览:107