| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 人工智能 -> 知识蒸馏(Knowledge Distillation) -> 正文阅读 |
|
[人工智能]知识蒸馏(Knowledge Distillation) |
知识蒸馏是做什么的?知识蒸馏的概念由Hinton在Distilling the Knowledge in a Neural Network中提出,目的是把 一个大模型或者多个模型集成 学到的知识迁移到另一个轻量级模型上。 做模型压缩的原因:一般情况下,我们在训练模型的时候使用了大量训练数据和计算资源来提取知识,但是大模型不方便部署到服务中去,一是因为大模型的推理速度慢,二是对设备的资源要求高,因此我们希望对训练好的模型进行压缩,在保证推理效果的前提下减小模型的体量。 知识蒸馏的理论依据下面介绍一下知识蒸馏所用到的理论依据。 名词解释
符号定义
Teacher Model和Student Model知识蒸馏采取Teacher-Student模式:将复杂且大的模型作为Teacher,Student模型结构较为简单,用Teacher来辅助Student模型的训练,Teacher学习能力强,可以将它学到的知识迁移给学习能力相对弱的Student模型,以此来增强Student模型的泛化能力。复杂笨重但是效果好的Teacher模型不上线,就单纯是个导师角色,真正部署上线进行预测任务的是灵活轻巧的Student小模型。 需要注意的是,这里蒸馏的目的是小网络的概率分布趋近于大网络,而非单纯的正确率趋近于大网络。 Hinton注意到,虽然我们最终分类依靠的是softmax后的最大概率结果,但其实那些概率很小类之间的差别蕴含着网络进行特征提取的很多信息。例如,猫、狗、狮子三个类的输出分别是0.99,0.001,0.009,则很明显:狮子与猫的相似程度比狮子与狗高。 知识蒸馏分类知识蒸馏是对模型的能力进行迁移,根据迁移的方法不同可以简单分为基于目标蒸馏(也称为Soft-target蒸馏或Logits方法蒸馏)和基于特征蒸馏的算法两个大的方向,下面我们对其进行介绍。 目标蒸馏-Logits方法目标蒸馏方法中最经典的论文就是来自于2015年Hinton发表的Distilling the Knowledge in a Neural Network。下面以这篇论文为例,讲一下目标蒸馏方法的原理。 Hard-target 和 Soft-target【KD的训练过程和传统的训练过程的对比】
知识蒸馏用Teacher模型预测的 Soft-target 来辅助 Hard-target 训练 Student模型的方式为什么有效呢?softmax层的输出,除了正例之外,负标签也带有Teacher模型归纳推理的大量信息,比如某些负标签对应的概率远远大于其他负标签,则代表 Teacher模型在推理时认为该样本与该负标签有一定的相似性。而在传统的训练过程(Hard-target)中,所有负标签都被统一对待。也就是说,知识蒸馏的训练方式使得每个样本给Student模型带来的信息量大于传统的训练方式。 如在MNIST数据集中做手写体数字识别任务,假设某个输入的“2”更加形似"3",softmax的输出值中"3"对应的概率会比其他负标签类别高;而另一个"2"更加形似"7",则这个样本分配给"7"对应的概率会比其他负标签类别高。这两个"2"对应的Hard-target的值是相同的,但是它们的Soft-target却是不同的,由此我们可见Soft-target蕴含着比Hard-target更多的信息。 在使用 Soft-target 训练时,Student模型可以很快学习到 Teacher模型的推理过程;而传统的 Hard-target 的训练方式,所有的负标签都会被平等对待。因此,Soft-target 给 Student模型带来的信息量要大于 Hard-target,并且Soft-target分布的熵相对高时,其Soft-target蕴含的知识就更丰富。同时,使用 Soft-target 训练时,梯度的方差会更小,训练时可以使用更大的学习率,所需要的样本也更少。这也解释了为什么通过蒸馏的方法训练出的Student模型相比使用完全相同的模型结构和训练数据只使用Hard-target的训练方法得到的模型,拥有更好的泛化能力。 好模型的目标不是拟合训练数据,而是学习如何泛化到新的数据。所以蒸馏的目标是让student学习到teacher的泛化能力,理论上得到的结果会比单纯拟合训练数据的student要好。另外,对于分类任务,如果soft targets的熵比hard targets高,那显然student会学习到更多的信息。采用软标签的知识蒸馏方法,一方面压缩了模型,另一方面,增强了模型的泛化能力。 知识蒸馏的具体方法神经网络使用 softmax 层来实现 logits 向类别概率(class probabilities)的转换。 原始的softmax函数:
q
i
=
e
x
p
(
z
i
)
∑
j
e
x
p
(
z
j
)
q_i= \frac{exp(z_i)}{\sum_jexp(z_j)}
qi?=∑j?exp(zj?)exp(zi?)? 加上temperature变量之后的softmax函数: q i = e x p ( z i / T ) ∑ j e x p ( z j / T ) q_i= \frac{exp(z_i/T)}{\sum_jexp(z_j/T)} qi?=∑j?exp(zj?/T)exp(zi?/T)?。其中, q i q_i qi?是每个类别输出的概率, z i z_i zi?是每个类别输出的logits, T T T是温度。当 T = 1 T=1 T=1时,就是标准的softmax公式。 T T T越高,softmax 的 output probability distribution 越趋于平滑,其分布的熵越大,负标签携带的信息会被相对地放大,模型训练将更加关注负标签。 知识蒸馏训练的具体方法如下图所示,主要包括以下几个步骤:
(1) Teacher模型和Student模型同时输入 transfer set (这里可以直接复用训练Teacher模型用到的training set),用Teacher模型在高温
T
h
i
g
h
T_{high}
Thigh?下产生的softmax distribution来作为Soft-target,Student模型在相同温度
T
h
i
g
h
T_{high}
Thigh?条件(保证Student Model和Teacher Model的结果尽可能一致)下的softmax输出和Soft-target的cross entropy就是Loss函数的第一部分
L
s
o
f
t
L_{soft}
Lsoft?。 (2) Student模型在
T
=
1
T=1
T=1的条件下(保证Student Model的结果和实际的类别标签尽可能一致)的softmax输出和ground truth的cross entropy就是Loss函数的第二部分
L
h
a
r
d
L_{hard}
Lhard?。 第二部分Loss 的必要性其实很好理解:Teacher模型也有一定的错误率,使用 ground truth 可以有效降低错误被传播给Student模型的可能性。打个比喻,老师虽然学识远远超过学生,但是他仍然有出错的可能,而这时候如果学生在老师传授的知识之外,可以同时参考到标准答案,就可以有效地降低被老师偶尔的错误“带偏”的可能性。 最后, α α α和 β β β是关于 L s o f t L_{soft} Lsoft?和 L h a r d L_{hard} Lhard?的权重,实验发现,当 L h a r d L_{hard} Lhard?权重较小时,能产生最好的效果,这是一个经验性的结论。理论的推导不再给了,这里直接给出结论:由于 L s o f t L_{soft} Lsoft?贡献的梯度大约为 L h a r d L_{hard} Lhard?的 1 T 2 \frac{1}{T^2} T21?,因此在同时使用Soft-target和Hard-target的时候,需要在 L s o f t L_{soft} Lsoft?的权重上乘以 T 2 T^2 T2的系数,这样才能保证Soft-target和Hard-target贡献的梯度量基本一致。 关于温度在知识蒸馏中,需要使用高温将知识“蒸馏”出来,但是如何调节温度呢,温度的变化会产生怎样的影响呢?
温度的高低改变的是Student模型训练过程中对负标签的关注程度。当温度较低时,对负标签的关注,尤其是那些显著低于平均值的负标签的关注较少;而温度较高时,负标签相关的值会相对增大,Student模型会相对更多地关注到负标签。
总的来说, T T T的选择和Student模型的大小有关,Student模型参数量比较小的时候,相对比较低的温度就可以了。因为参数量小的模型不能学到所有Teacher模型的知识,所以可以适当忽略掉一些负标签的信息。 最后,在整个知识蒸馏过程中,我们先让温度
T
T
T升高,然后在测试阶段恢复“低温”(
T
=
1
T=1
T=1 ),从而将原模型中的知识提取出来,因此将其称为是蒸馏。 特征蒸馏另外一种知识蒸馏思路是特征蒸馏方法,如下图所示。它不像Logits方法那样,Student只学习Teacher的Logits这种结果知识,而是学习Teacher网络结构中的中间层特征。最早采用这种模式的工作来自于论文FITNETS:Hints for Thin Deep Nets,它强迫Student某些中间层的网络响应,要去逼近Teacher对应的中间层的网络响应。这种情况下,Teacher中间特征层的响应,就是传递给Student的知识。在此之后,出了各种新方法,但是本质上还是是Teacher将特征级知识迁移给Student。因此,接下来以这篇论文为主,详细介绍特征蒸馏方法的原理。 主要解决的问题这篇论文指出,既宽又深的模型通常需要大量的乘法运算,从而导致对内存和计算的高需求。因此,即使网络在准确性方面即使是性能最高的模型,其在现实世界中的应用也受到限制。为了解决这类问题,我们需要通过知识蒸馏将知识从复杂的模型转移到参数较少的简单模型。 到目前为止,知识蒸馏技术已经考虑了Student网络与Teacher网络有相同或更小的参数。这里有一个洞察点是,深度是特征学习的基本层面,到目前为止尚未考虑到Student网络的深度。一个具有比Teacher网络更多的层但每层具有较少神经元数量的Student网络称为“thin deep network”。 因此,该篇论文主要针对Hinton提出的知识蒸馏法进行扩展,允许Student网络可以比Teacher网络更深更窄,使用Teacher网络的输出和中间层的特征作为提示,改进训练过程和student网络的性能。 模型结构Student网络不仅仅拟合Teacher网络的Soft-target,而且拟合隐藏层的输出(Teacher网络抽取的特征)
第一阶段:首先选择待蒸馏的中间层(即Teacher的Hint layer和Student的Guided layer),如图中绿框和红框所示。由于两者的输出尺寸可能不同,因此,在Guided layer后另外接一层卷积层,使得输出尺寸与Teacher的Hint layer匹配。接着通过知识蒸馏的方式训练Student网络的Guided layer,使得Student网络的中间层学习到Teacher的Hint layer的输出。 第二阶段: 在训练好Guided layer之后,将当前的参数作为网络的初始参数,利用知识蒸馏的方式训练Student网络的所有层参数,使Student学习Teacher的输出。 |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/25 20:53:20- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |