《Distilling the Knowledge in a Neural Network》论文总结

目录

零、前言

一、模型压缩概述

二、知识蒸馏的思想

三、知识蒸馏中的知识定义

1、基于response/logits的知识

2、基于feature的知识

3、基于relation的知识

 四、本文提出的传统基于response的知识的蒸馏方法

1、soft target与hard target、温度因子T与推广的softmax:

2、知识蒸馏的流程: 

五、Q&A:

1、大模型、小模型的定义,以及其结构是否相同; 为什么要用大模型来辅助小模型的训练?

2、大模型是否为预训练模型?在小模型的训练过程中大模型是否还需要再继续训练?

3、是否存在小模型在训练后反而比大模型更大的问题?

4、知识蒸馏目的、作用以及知识蒸馏与迁移学习关系

零、前言

《Distilling the Knowledge in a Neural Network》论文总结_第1张图片

这篇文章是Hinton老爷子和Dean、Vinyals三人又一篇巨作,开创了知识蒸馏的先河。考虑到了小模型直接训练的效果并不理想,就引入了训练好但是臃肿的大模型作为“老师”,教小模型这个“学生”更好的学习。又因为在softmax函数中引入了T 这个“温度因子”,因此被称为知识蒸馏。

 论文传送门:[1503.02531] Distilling the Knowledge in a Neural Network (arxiv.org)

一、模型压缩概述

神经网络模型被广泛应用在图像分类、物体检测、目标跟踪等计算机视觉任务中,并取得了巨大成功。随着时代发展,人们更加关注深度神经网络的实际应用性能,人工智能技术的一个趋势是在边缘计算平台上部署高性能的神经网络模型,并能在真实场景中实时运行,如移动端/嵌入式设备。这些平台的特点是内存资源少,处理器性能不高,功耗受限,这使得目前精度最高的模型根本无法在这些平台进行部署和达到实时运行。由于内存空间和算力资源的限制,神经网络在移动设备和嵌入式设备上的存储与计算仍然是一个巨大的挑战。

目前解决这个挑战主要有三个思路:压缩模型算法、挖掘硬件性能、在压缩模型的同时对现有的芯片进行优化。

在算法层面主要有三个思路:

1、对现有的大模型进行“减肥瘦身”:权值量化、剪枝(通道剪枝和权重剪枝)、知识蒸馏、注意力迁移……

2、直接设计轻量化网络:squeezenet、mobilenet、shufflenet……

3、低秩分解、对卷积运算进行加速

在硬件层面主要就是以空间换时间(芯片面积换取运算的并行度)。

《Distilling the Knowledge in a Neural Network》论文总结_第2张图片

 二、知识蒸馏的思想

 用已经训练好但是参数量庞大、不便于部署(消耗硬件资源太多、计算缓慢)的大网络模型作为“老师”,训练新构建的参数量较小、便于部署的“学生”--小网络模型,使其在相同测试下有跟大模型几乎相同的预测,为了满足效率,小模型不需要学习任务之外的知识。如下示意图:

《Distilling the Knowledge in a Neural Network》论文总结_第3张图片

 三、知识蒸馏中的知识定义

知识蒸馏为什么叫知识蒸馏?蒸馏一词我们放到后面讲推广的softmax函数中讲,先来聊聊什么是知识。

在本篇知识蒸馏中让小模型(学生)模仿大模型(教师)的输出,因此Hinton老爷子把大模型的输出(在分类问题中是各种类型的概率)称为知识。但是从2014年到现在知识蒸馏有了很大的发展,对知识也出现了许多不同的定义。

1、基于response/logits的知识

将知识定义为教师网络的输出,学生网络直接模仿教师网络最后一层的输出。

优点: 1.简单易于理解,student模型学teacher模型输出的概率分布,相当于给出了类别之间的相似性信息,提供了额外的监督信号,学起来更容易。 2.对于输出层,实现简单方便

缺点: 1.依赖于最后一层的输出 2.由于soft logits实际上是类概率分布,因此基于响应的蒸馏仅限于监督学习 3.当学生模型太小时,很难从教师模型中蒸馏成功

《Distilling the Knowledge in a Neural Network》论文总结_第4张图片

2、基于feature的知识

如果把神经网络的任务看成问题、真实标签看成答案、教师模型的输出老师做出来的答案的话,教师模型中间feature map可以看成老师解题的中间量,对于人来说,学习解题过程可比直接记住答案更有效,于是就有同志提出了基于feature的知识,将知识定义为教师模型中间层的feature map。

《Distilling the Knowledge in a Neural Network》论文总结_第5张图片

3、基于relation的知识

只知道答案和中间量而不知道解题思路怎么能行嘞,教师模型层与层之间的流动(文中称为flow)也可以看成一种知识。有同志将教师模型层与层之间的关系称为知识。

《Distilling the Knowledge in a Neural Network》论文总结_第6张图片

看到上面说到的这么多种知识是不是已经开始头疼了?在这篇开山之作中其实只用到了基于response的知识,本文只讲述这种蒸馏方法。

 四、本文提出的传统基于response的知识的蒸馏方法

首先需要明确的是这篇文章所用到的模型要解决的任务是分类问题,对于分类问题我们通常使用在全连接层后加上softmax层、使用交叉熵损失函数的方法来进行优化,在详细讲解知识蒸馏过程之前,我们需要先知道什么是soft target什么是hard target,为什么引入温度因子T和推广后的softmax函数。

1、soft target与hard target、温度因子T与推广的softmax:

(1)soft target与hard target:

我们知道在分类任务中,教师模型经过softmax层输出的是各种类别的概率,很少有真实标签那样非0即1(错误类别为0,正确类别为1)的情况,模型越强,预测输出结果中各类概率的分布就越是不均匀。以手写数字举例如下图所示:

《Distilling the Knowledge in a Neural Network》论文总结_第7张图片

上面的分布就是教师模型的输出各类概率,称为“soft target”;下面的分布就是真实标签,称为“hard target”。很显然, soft target蕴含着教师模型更多的知识。

(2)softmax函数的特性:

传统的softmax函数长这样:

《Distilling the Knowledge in a Neural Network》论文总结_第8张图片

它是一个归一化的概率,当括号内的Zi越小,由函数的数学特性就可以得到输出的qi越小。如果参与归一化的Zi(i = 0,1,……,N)越小,输出的qi(i = 0,1,……,N)就越相近。

对于我们刚刚聊过的soft target来说,各类概率越相近,就蕴含着越多的教师模型的知识,这对于知识蒸馏(小模型学习)来说是有利的,因此我们引入温度因子T来统一缩小括号内的变量,就有了以下的推广的softmax函数:

《Distilling the Knowledge in a Neural Network》论文总结_第9张图片

z越小,各类概率越相近,知识越多,如下图所示《Distilling the Knowledge in a Neural Network》论文总结_第10张图片 

 (3)小模型从大模型所学到的知识(soft target):

为了使小模型输出各种可能的预测概率与大模型输出相同,可以将大模型的”soft target”作为小模型训练的标签,小模型的输出与”soft target”做交叉熵损失函数,利用反向传播调整小模型参数直至相似,这个损失函数为:

《Distilling the Knowledge in a Neural Network》论文总结_第11张图片

 (4)小模型从真实标签中所学到的知识(hard target):

也可以同时使用训练集”hard target”作为标签,小模型的输出与“hard target”做交叉熵损失函数,这个损失函数为:

《Distilling the Knowledge in a Neural Network》论文总结_第12张图片

 (5)总体的目标损失函数:

来做反向传播的交叉熵损失函数为二者的加权平均:

《Distilling the Knowledge in a Neural Network》论文总结_第13张图片

(ps:软目标soft target损失中T平方的来源:由于软目标产生的梯度大小为1/ t2,因此在使用硬目标和软目标时,将它们乘以t2是很重要的。这确保了在使用元参数进行实验时,如果改变蒸馏所用的温度,硬靶和软靶的相对贡献大致保持不变。)

2、知识蒸馏的流程: 

好啦!铺垫了这么多大家应该都快要睡着了吧,赶紧进入流程部分

《Distilling the Knowledge in a Neural Network》论文总结_第14张图片

整个训练过程分为三个阶段:

(1)先训练一个教师模型

(2)在高温T下教师模型网络输出“soft target” 使用{soft target,T}和真实标签{hard target,1}训练学生模型

(3)设置温度T = 1,学生模型部署推断

小模型知识蒸馏具体细节可以用以下流程图来表示

《Distilling the Knowledge in a Neural Network》论文总结_第15张图片

将输入同时喂给大模型和小模型,产生对应各类的logits,对于小模型的logits和大模型的logits,先/T后再做softmax运算,计算软标签的损失函数KL散度:《Distilling the Knowledge in a Neural Network》论文总结_第16张图片

对于小模型的logits和真实标签,进行softmax运算后做交叉熵损失函数:《Distilling the Knowledge in a Neural Network》论文总结_第17张图片

然后KL散度和交叉熵损失函数做加权平均为总体的损失函数:《Distilling the Knowledge in a Neural Network》论文总结_第18张图片

训练的目的就是为了最小化这个总体损失函数,再计算梯度之类的进行反向传播优化,这样就是知识蒸馏的一个循环啦!

五、Q&A:

1、大模型、小模型的定义,以及其结构是否相同; 为什么要用大模型来辅助小模型的训练?

(1)大模型(教师模型): 相对复杂的模型,也可以由多个分别训练的模型集成而成。对大模型而言不作任何关于模型架构、参数量的限制,唯一要求是精确。大模型训练时间长,推理速度慢,参数众多消耗计算资源因而难以部署

(2)小模型(学生模型): 参数量较小、模型结构相对简单的单模型。最终部署的是小模型。

(3)大模型与小模型结构:可以同构也可以异构。知识蒸馏本身并不关注网络结构,只要小网络能得到与大网络相同的输出,无论什么结构都可以

(4)为什么要用大模型来辅助小模型进行训练?   只用hard target真实标签直接训练小模型效果不好(参数越少,泛化效果越差,收敛速度越慢)   加入大模型的输出soft target对交叉熵损失函数加入约束,优化此交叉熵损失函数可以有效提高预测精确度。

《Distilling the Knowledge in a Neural Network》论文总结_第19张图片

2、大模型是否为预训练模型?在小模型的训练过程中大模型是否还需要再继续训练?

(1)预训练模型: 预训练模型是前人为了解决类似问题所创造出来的模型。要解决一个新的问题,没有必要从零开始训练一个新模型,可以从类似问题中训练过的模型入手。

(2)教师模型可以是预训练模型: 教师模型可以是预训练模型,也可以是针对特定问题在特定数据集上进行训练的模型。主要它能胜任任务就可以。

(3)一般来讲教师模型在训练第一阶段就已经训练好了,在后续训练过程中参数不再改变,但是都来好像出现了“教学相长”的蒸馏训练方法。

3、是否存在小模型在训练后反而比大模型更大的问题?

不存在。模型的大小由模型参数(权重、偏置)数量和层数所决定。小模型在设计之初其参数和层数数量已经确定,在训练过程中只是数值得到优化,但是个数并不发生改变,因而不会比大模型更大。     虽然小模型既要使用真实标签hard target进行训练(保证预测结果的准确性),又要使用大模型输出soft target进行训练(学习大模型的泛化能力,使小模型的输出与大模型相近),但是两者是同时进行的。

4、知识蒸馏目的、作用以及知识蒸馏与迁移学习关系

(1)知识蒸馏目的 ①将大模型转化为一个小模型,同时保留大模型的性能 ②将多个网络学到的知识转移到同一个网络中

(2)知识蒸馏作用 ①提升模型精度(小网络直接学习训练集往往精度没有大模型高) ②降低模型延时,压缩网络参数(小网络参数相较于大网络少,延时较小) ③标签之间的域转移(多教师训练学生,使之能学习到更多的知识)

(3)知识蒸馏与迁移学习关系   知识蒸馏可以看成是迁移学习的特例。   知识蒸馏可以将一个网络(教师网络)的知识迁移到另一个网络(学生网络)中,两个网络可以是同构或异构。   迁移学习在大数据集上进行预训练,然后使用预训练得到的参数在一个小数据集上进行微调。将预测能力迁移到另一个任务上

    我们倾向于用学习的参数值在训练过的模型中识别知识,这使得我们很难看到如何改变模型的形式而保持相同的知识。知识的一个更抽象的观点是,它是一个从输入向量到输出向量的学习好的映射,它将知识从任何特定的实例化中解放出来。

                                                                     —— 《Distilling the Knowledge in a Neural Network》

你可能感兴趣的:(知识蒸馏论文阅读,神经网络,深度学习)