1.简介
1.1目的
经过对基于稀疏矩阵乘法和基于INT8量化的模型加速方案的实验和分析,发现上述两种方法在模型加速的使用中有很大的局限性,所以需要寻找更有效的方式对模型进行加速。模型蒸馏(Distilled Model)就是在寻找更有效方法中进一步的尝试。
1.2范围
本实验设计文档的内容会包括对模型蒸馏的基本原理进行介绍,并介绍一个可执行的实验设计。
1.3定义、首字母缩写词和缩略语
| 序号 | 术语或缩略语 | 说明性定义 |
| 1 | ||
| 2 | ||
| 3 | ||
| 4 |
1.4参考资料
Distill the Knowledge in a Neural Network
2.设计目标
基于现有的caffe框架,根据蒸馏模型的原理,设计一套支持模型蒸馏的训练和测试框架,可以简单的对现有的人证模型进行迁移训练,最终输出一个和原本人证大模型精度类似的一个小模型。
3.模型蒸馏
3.1 为什么需要模型蒸馏
一个很大的DNN往往训练出来的效果会比较好,并且多个DNN一起ensemble的话效果会更加的好,但是当用在实际的应用中的话,过于庞大的DNN ensemble在一起会增大计算量,从而影响应用。于是一个问题就被提出了:有没有一个方法,能使降低网络的规模,但是保持(一定程度上)精确度呢?
Hinton举了一个仿生学的例子,就是昆虫在幼生期的时候往往都是一样的,适于它们从环境中摄取能量和营养;然而当它们成长到成熟期,会基于不同的环境或者身份,变成另外一种形态以适应这种环境。那么对于DNN是不是存在类似的方法?在一开始training的过程中比较的庞杂但是后来当需要拿去deploy的时候,可以转换成一个更小的模型。他把这种方法叫做Knowledge Distillation(KD)。
3.2模型蒸馏的基本原理
这里的distillation方法其实主要用的就是通过一个performance非常好的大网络(有可能是ensemble的)来教一个小网络进行学习。这里我们可以把大网络叫为:teacher network,小网络叫为:student network。至于为什么是希望通过大网络来教小网络而不是直接利用ground truth label来学习,hinton也给了一个例子:比如说在MNIST数据集中,有两个数字“2”,但是写法是不一样的:一个可能写的比较像3(后面多出了一点头),一个写的比较像7(出的头特别的短)。在这样的情况下,ground truth label都是“2”,然而一个学习的很好的大网络会给label “3” 和 “7” 都有一定的概率值,如图1所示。通常叫这种信息为 “soft targets”;相对的,ground truth label 是一种 “hard target” 因为它是one-hot label。总的来说就是,通过大网络的“soft targets”,能得到更加多的信息来更好的训练小网络。

图1 hard target vs. soft target
论文中所提出的上述soft target实际上就是已经训练好的复杂模型的softmax层的输出概率,而其中所提出的“蒸馏”方法在softmax层中引入了一个”温度”参数T,公式如图2所示:

图2 带T参数的softmax层计算公式
通过上述温度参数的调整,softmax层的映射曲线更加平缓,因而实例的概率映射将更为集中,便使得目标更加地"soft"。并且论文中还指出,当transfer set中的标签可得时,将soft target和实际标签的两个目标共同使用作为目标函数将使得其性能更加提高。在训练过程中,作者将迁移样本集中样例输入原复杂模型并通过上述蒸馏softmax得到soft target,并将其作为目标,并在迭代过程中更新温度,训练出细粒度的模型。
蒸馏”最简单的形式就是:以从复杂模型得到的“软目标”为目标(这时T比较大),用“转化”训练集训练小模型。训练小模型时T不变仍然较大,训练完之后T改为1。
当“转化”训练集中部分或者所有数据都有标签时,这种方式可以通过一起训练模型使得模型得到正确的标签来大大提升效果。一种实现方法是用正确标签来修正“软目标”,但是论文中发现一种更好的方法是:对两个目标函数设置权重系数。第一个目标函数是“软目标”的交叉熵,这个交叉熵用开始的那个比较大的T来计算。第二个目标函数是正确标签的交叉熵,这个交叉熵用小模型softmax层的logits来计算且T等于1。论文中指出当第二个目标函数权重较低时可以得到最好的结果。整体的结构如图3所示:

图3 模型蒸馏的整体结构
3.3为什么使用soft target会有用

图4 soft target的用处
信息量:
hard target 包含的信息量(信息熵)很低,soft target包含的信息量大,拥有不同类之间关系的信息(比如同时分类驴和马的时候,尽管某张图片是马,但是soft target就不会像hard target 那样只有马的index处的值为1,其余为0,而是在驴的部分也会有概率。)
软化:
问题是像图4左侧的红色0.001这部分,在cross entropy的loss function中对于权重的更新贡献微乎其微,这样就起不到作用。把soft target软化(整体除以一个数值后再softmax),就可以达到右侧绿色的0.1这个数值,这样在后来权重的更新中就有一定的贡献了。
4. 模型蒸馏实验设计
4.1 蒸馏模型训练过程
实验步骤:
1.根据提出的目标问题设计一个或者多个复杂的网络结构(N1,N2,…,Nt)。
2.收集足够多的训练数据,按照常规CNN模型训练流程,训练好1中的一个或者多个复杂网络得到(M1,M2,…,Mt),记为原始网络。
3.收集简单模型训练数据,此处的训练数据可以是训练原始网络的有标签数据,也可以是额外的无标签数据。
4.修改原始模型(M1,M2,…,Mt)的softmax层中温度参数T为一个较大值如T=20,将3中收集到的样本输入到原始复杂模型中。每一个样本在每个原始模型可以得到其最终的分类概率向量,选取其中概率至最大即为该模型对于当前样本的判定结果。对于t个原始模型就可以得到t个概率向量。那么对这t个概率向量求取均值作为当前样本最后的概率输出向量,记为soft_target label,最后保存到文件中。
5.根据(N1,N2,…,Nt)重新创建一个精简的小网络N0,该网络最后有两个loss,一个是hard loss,即传统的softmaxloss,使用one shot label;另外一个是soft loss,即T>1的softmaxloss,使用我们第4步保存下来的soft target label。
6.设置精简的小网络N0的softmax层温度参数与原始复杂模型产生soft target label时所采用的温度一致,如T=20,按照常规模型训练精简的小网络得到模型M0。
7.训练完成之后,在实际应用中将精简的小模型中的softmax温度参数重置为1,即采用最原始的softmax,来走前向作为最后输出的小模型。
上述的训练过程可以用图5表示:

图5 模型蒸馏的训练过程
4.2 论文中的经验
论文中作者认为,由于soft target具有更高的熵,它能比hard target提供更加多的信息,因此可以使用较少的数据以及较大的学习率。将hard和soft的target通过加权平均来作为学生网络的目标函数,soft target所占的权重更大一些。 论文中作者同时还指出,T值取一个中间值时,效果更好,而soft target所分配的权重应该为T^2,hard target的权重为1。 这样训练得到的小模型也就具有与复杂模型近似的性能效果,但是复杂度和计算量却要小很多。
对于distilling而言,复杂模型的作用事实上是为了提高label包含的信息量。通过这种方法,可以把模型压缩到一个非常小的规模。模型压缩对模型的准确率没有造成太大影响,而且还可以应付部分信息缺失的情况。
4.3 蒸馏模型的问题
模型蒸馏的方法实际上还是有些问题的:
- 很明显这种模型蒸馏的方法,仅仅适合softmax分类的大模型,因为论文中的思想都是围绕图2进行的,通过图2的方法生成soft target label,来训练小模型的,所以此方法是有局限性的。
- 根据一个或者多个复杂的原始模型来设计一个比较小的模型也是一个比较不好解决的问题,对于本次要进行的实验中是设计小网络主要的方法就是对大网络中的层进行删减,例如,有多个连续的卷积层,我们在设计小网络的时候减去一半的层,这种删除的方法也会带来很大的不确定性,需要有一定的方法指导。
- 图2中的超参数T的设置也是一个比较重要的问题,T的设置会直接影响soft target label的质量,T过小导致label分布过“硬”,达不到论文中想要的效果,T过大回到值label分布过“软”,没有什么区分度,所以这个也是需要经过大量实验进行测试的。
- 就是我们现有的人证模型仅仅在SV的时候用到了softmax层,怎么将模型蒸馏的方法应用到人证模型上也是一个需要讨论的问题。
854

被折叠的 条评论
为什么被折叠?



