一种基于重要数据进行知识蒸馏的方法与流程

文档序号:32942713发布日期:2023-01-14 09:35阅读:23来源:国知局
一种基于重要数据进行知识蒸馏的方法与流程

1.本发明涉及一种根据训练数据对测试数据的影响力分数来挑选重要数据从而进行知识蒸馏的模型以及方法,属于神经网络模型优化领域。


背景技术:

2.近些年来,深度神经网络(dnn)在各个领域都取得了较大的成功,因为神经网络能从训练数据中获取大量的知识,即完成特定任务所需要的特征量,现实生活中的一些复杂的任务,如:目标识别,图像分类,机器翻译等推动了dnn的发展。而在dnn的发展过程中,增大网络深度、增加模型参数数量和扩张训练数据的规模似乎成为一个主流。
3.在网络层数方面,dnn也从最开始的几层(lenet-5)到现在的上百层(resnet-152),模型深度的增加可以使逼近函数的效果更好,特征的抽象程度越高,因此可以在某些特定任务上效果越好;在模型参数方面,从一开始的lenet、alexnet、resnet开始,模型参数的数量逐渐增加,2017年transformer结构的提出,使得深度学习模型参数数量突破了1亿,到了bert网络模型的提出,使得参数量首次超过3亿规模;在数据集方面,以gpt网络系列为例,gpt-1的数据集使用了1万本书的bookcorpus,25亿单词量;而到gpt-3的时候,数据集将语料规模扩大到570gb的cc数据集(4千亿词)+webtext2(190亿词)+bookcorpus(670亿词)+维基百科(30亿词)。可以看出,现在的dnn的发展正在向更深的层数,更多的参数和更大量的训练数据方向不断靠近。
4.但是dnn也不是单纯的比网络深度,参数数量,数据量大小。一方面,随着模型规模的不断变大,训练所付出的成本也开始呈现指数增加;另一方面,当模型规模足够大时,模型性能的提升也开始变得更加困难,如果想让测试准确度提升1%,可能就需要更多的数据集增量和计算增量。因此,寻找一种能够在小模型,低数据量下还能够保持原始模型性能的方法成为一个亟待解决的问题。


技术实现要素:

5.本发明的目的是针对dnn在发展过程中的模型结构不断加深、模型参数不断变多、训练数据量不断增大而导致的训练成本大幅度上升且模型性能提高较小的问题,提出了一种基于部分重要训练样本来进行知识蒸馏的方法,利用不同的训练样本对测试样本在模型准确度方面的影响程度挑选出一部分含有重要知识的训练样本,然后再将这部分训练样本输入到原始的教师模型(t-net)中产生重要信息,最后再通过知识蒸馏将这部分重要信息传递给学生模型(s-net)。
6.本发明为解决上述问题采用以下技术方案:
7.一种基于重要数据进行知识蒸馏的方法,该方法首先根据训练数据对测试数据的影响力分数来挑选出影响力分数排名靠前的训练数据,然后再利用这一部分训练数据来进行知识蒸馏,其中:
8.选取重要的训练数据时候我们采取利用记录模型参数梯度下降的方法来量化数
据对模型的影响,通过将训练数据和测试数据对模型参数梯度下降的方向和距离做点积运算得到训练数据对测试数据的影响力分数。
9.知识蒸馏通常将一个较为复杂、网络性能较好的神经网络模型作为t-net,将另一个结构较为简单、网络性能较差的神经网络模型作为s-net;然后在s-net训练的时候先将训练数据放入到t-net中产生关于训练数据的知识,然后再利用这些知识来指导s-net的训练,从而提高s-net的性能。
10.一种基于重要数据进行知识蒸馏的方法,包含步骤如下:
11.步骤1:对t-net进行训练:首先将t-net在数据集上进行训练,在多个训练的epoch后,使得t-net达到最好的性能,这时停止t-net的训练并将t-net保存下来;
12.步骤2:求训练数据对测试数据的影响力分数:将训练数据和测试数据分别输入到训练好的t-net中,然后再利用不同的训练数据和测试数据对t-net的参数下降方向的影响,来计算出训练数据对测试数据的影响力分数,影响力分数大则说明该训练数据对测试数据的预测有支持的效果,该训练数据在模型中的训练能更加有利于模型性能的提高;
13.步骤3:挑选出重要的训练数据:由于训练和测试的数据样本可能会很多,如果求每一个训练样本对每一个测试样本的影响力分数将会花费很长的时间,所以我们选取每一类测试数据中具有代表性的训练数据;然后将所有的训练数据与选取出来的这些测试数据求影响力分数,最后对影响力分数进行排序,挑选出影响力分数排名靠前的训练数据;
14.步骤4:利用挑选出的训练数据进行知识蒸馏:将步骤3提取的具有代表性的训练数据来进行知识蒸馏;
15.步骤4.1:首先将挑选出的训练数据放入到t-net中,然后通过t-net会产生该训练数据的一个logits,这个logits是t-net输出的该训练数据属于每一类的得分;然后再将这个训练数据输入到s-net中,同样也会产生一个]ogits,这个logits是s-net输出的该训练数据属于每一类的得分;将s-net和t-net产生的logits进行kldivloss的运算,最后将结果记为l
soft

16.步骤4.2:将训练数据输入到s-net中产生的logits进行softmax运算,最后会得到该训练数据为某一个类别的概率,最后将结果记为l
hard

17.步骤4.3:将步骤4.1的l
soft
和步骤4.2的l
hard
进行加权求和,最后得到s-net的最终kdloss=αl
soft
+βl
hard
;将挑选出来的训练数据根据教师的指导然后根据这个kdloss来进行反向传播来更新s-net的参数,并最终得到性能达到最好的s-net;
18.步骤5:性能和运算成本的比较:最后将步骤4.3得到的s-net在不同的训练数据量下与标准的t-net以及不进行知识蒸馏的s-net进行性能和运算成本的比较;在性能比较方面主要是比较模型在数据集上的的测试准确度,在运算成本比较方面主要是比较模型运行所占用的内存以及训练一个epoch的时间。
19.进一步地,所述的步骤2中,求训练数据对测试数据的影响力分数的具体步骤包括以下:
20.1)记录模型参数的检查点分别对应于模型参数迭代的t1,t2,.....,tn,用vk和v
′j来表示第k个训练实例和第j个测试实例,用βi表示和检查点之间的步长;
21.2)根据模型参数的检查点我们可以得知当实例输入到模型中在进行反向梯度更新时引起的模型参数梯度的变化情况,我们用来表示当第k个训练实例输入到模型中引起的模型参数在检查,点处的梯度变化情况,用来表示当第j个测试实例输入到模型中引起的模型参数在检查点的梯度变化情况;
22.3)最后我们将训练实例vk和测试实例v
′j在检查点处引起的模型参数的梯度变化做点积,并将知检查点之间的步长βi作为路径长度,在路径长度βi上对模型梯度的变化做积分得到最后第k个训练实例和第j个测试实例在检查点a处的影响力分数,最终将模型中各个检查点处的积分求和就可以得到第k个训练实例和第j个测试实例的影响力分数。最终计算训练样本对测试样本的影响力分数的公式如下所示:
[0023][0024]
进一步地,所述步骤4.1中,具体步骤包括以下:
[0025]
知识蒸馏过程的t-net的目标函数不再由之前的单一loss组成,而是由soft target和hard target加权得到,如下公式所示:
[0026]
loss=αl
soft
+βl
hard
[0027]
首先将t-net和s-net在同温度t下的softmax输出的相对熵(relative entropy)作为l
soft
,可以使用温度t这个变量来对softmax的输出进行平滑操作,ki=exp(zi/t)/∑jexp(zi/t),当t越大时softmax输出越平滑,负标签携带的信息也会被相对地放大,模型训练将更加关注负标签;当t=1时,上述公式就变成了传统的softmax公式。
[0028]
进一步地,所述步骤4.2中,具体步骤包括以下:
[0029]
首先得到训练数据输入到s-net在t=1下的softmax输出,然后再得到该训练数据的真实标签值,最后对softmax输出和真实标签值做交叉熵计算,最后得到l
hard

[0030]
有益效果:
[0031]
本发明首先在一个自定义的s-net和t-net上利用mnist数据集验证了发明方法,为了进一步验证发明的有效性,继续在resnet-34原始模型和resnet-34的s-net上利用cifar-10数据集进一步评估了发明。
[0032]
实验结果表明相较于其它模型优化的方法,我们所提出的方法能够让s-net在模型结构较为简单、训练数据量较小的情况下达到与标准的t-net几乎相同的测试准确度,而且还能有效降低模型的运算成本。在mnist数据集上,可以用9.6%的训练数据就可以达到用全部训练数据的效果,在训练数据包含较多的特征时,使用部分重要训练数据进行知识蒸馏能够让s-net具有比同等条件下t-net更好的性能;在cifar-10数据集上,低数据量情况下s-net的测试准确度总是可以高于t-net。
[0033]
在运算成本方面,用部分重要数据进行知识蒸馏可以在模型运行内存和模型运行时间成本两方面都优于原始模型。
附图说明
[0034]
图1为本发明的处理流程示意图;
[0035]
图2为本发明自定义的s-net和t-net的模型架构图。
[0036]
图3为本发明resnet-34的s-net的模型架构图。
[0037]
图4为本发明实施挑选重要的训练数据的处理流程图。
[0038]
图5为本发明对挑选出的训练数据进行知识蒸馏的流程图。
具体实施方式
[0039]
下面将参照附图更详细地描述本发明的优选实施方式。虽然附图中显示了本发明的优选实施方式,然而应该理解,可以以各种形式实现本发明而不应被这里阐述的实施方式所限制。
[0040]
如图1所示,本发明提出了一种基于部分重要训练样本来进行知识蒸馏的方法,利用不同的训练样本对测试样本在模型准确度方面的影响程度挑选出一部分含有重要知识的训练样本,然后再将这部分训练样本放到原始的t-net中产生重要信息,最后通过知识蒸馏将这部分重要信息传递给s-net。
[0041]
如图2所示,本发明自定义的t-net和s-net,该模型采用深度学习模型,自定义的t-net各层具体参数以表1为例,自定义的s-net具体参数以表2为例。
[0042]
名称参数设置卷积层1输入通道=1,输出通道=32,步长=1,卷积核=(3x3),填充=1卷积层2输入通道=32,输出通道=64,步长=1,卷积核=(3x3),填充=1全连接层1输入通道=9216,输出通道=128全连接层2输入通道=128,输出通道=10
[0043]
表1
[0044]
名称参数设置全连接层1输入通道=784,输出通道=128全连接层2输入通道=128,输出通道=64全连接层3输入通道=64,输出通道=10
[0045]
表2
[0046]
如图3所示,本发明采用采用resnet-34的s-net,该s-net具体参数以表3为例。
[0047][0048]
表3
[0049]
t-net和s-net采用深度学习模型,主要包括卷积神经网络编码器,其中:
[0050]
在自定义的t-net中卷积神经网络编码器主要包含2层卷积层,通过局部感受野的特性,使其能够从输入的图像中提取局部特征;
[0051]
在resnet-34的s-net中卷积神经网络编码器主要包含15层卷积层,通过局部感受野的特性,使其能够从输入的图像中提取局部特征;
[0052]
一种基于重要数据进行知识蒸馏的方法,包含步骤如下:
[0053]
步骤1:对t-net进行训练:首先将t-net在数据集上进行训练,在多个训练的epoch后,使得t-net达到最好的性能,这时停止t-net的训练并将t-net保存下来;
[0054]
步骤2:求训练数据对测试数据的影响力分数:将训练数据和测试数据分别输入到训练好的t-net中,然后再利用不同的训练数据和测试数据对t-net参数的下降方向的影响,来计算出训练数据对测试数据的影响力分数。影响力分数大则说明该训练数据对测试数据的预测有支持的效果,该训练数据在模型中的训练能更加有利于模型性能的提高;
[0055]
步骤3:挑选出重要的训练数据:由于训练和测试的数据可能很多,如果对每一个训练数据求对每一个测试数据的影响力分数将会花费很长的时间,所以我们选取每一类测试数据中具有代表性的训练数据。然后将所有的训练数据与选取出来的这些测试数据求影
响力分数,最后对影响力分数进行排序,挑选出影响力分数排名靠前的训练数据;
[0056]
步骤4:利用挑选出的训练数据进行知识蒸馏:将步骤3选取的具有代表性的训练数据来进行知识蒸馏;
[0057]
步骤4.1:首先将挑选出的训练数据放入到t-net中,然后通过t-net会产生该训练数据的一个logits,这个logits是t-net输出的该训练数据属于每一类的得分;然后再将这个训练数据输入到s-net中,同样也会产生一个logits,这个logits是s-net输出的该训练数据属于每一类的得分;将s-net和t-net产生的logits进行kldivloss的运算,最后将结果记为l
soft

[0058]
步骤4.2:将训练数据输入到s-net中产生的logits进行softmax运算,最后会得到改训练数据为某一个类别的概率,最后将结果记为l
hard

[0059]
步骤4.3:将步骤4.1的l
soft
和步骤4.2的l
hard
分别进行加权求和,最后得到s-net的最终kdloss=αl
soft
+βl
hard
;将挑选出来的训练数据根据教师的指导然后根据这个kdloss来进行反向传播来更新s-net的参数,并最终得到性能达到最好的s-net;
[0060]
步骤5:性能和运算成本的比较:最后将步骤4.3得到的s-net在不同的训练数据量下与标准的t-net以及不进行知识蒸馏的s-net进行性能和运算成本的比较;在性能比较方面主要是比较不同模型的测试准确度,在运算成本比较方面主要是比较模型的运行所占用的内存以及训练时间。
[0061]
进一步地,所述的步骤2中,求训练数据对测试数据的影响力分数的具体步骤包括以下:
[0062]
1)记录模型参数的检查点分别对应于模型参数迭代的t1,t2,.....,tn,用vk和v
′j来表示第k个训练实例和第j个测试实例,用βi表示和检查点之间的步长。
[0063]
2)根据模型参数的检查点我们可以得知当实例输入到模型中在进行反向梯度更新时引起的模型参数梯度的变化情况,我们用来表示当第k个训练实例输入到模型中引起的模型参数在检查点处的梯度变化情况,用来表示当第j个测试实例输入到模型中引起的模型参数在检查点的梯度变化情况。
[0064]
3)最后我们将训练实例vk和测试实例v
′j在检查点处引起的模型参数的梯度变化做点积,并将知检查点之间的步长βi作为路径长度,在路径长度βi上对模型梯度的变化做积分得到最后第k个训练实例和第j个测试实例在检查点a处的影响力分数,最终将模型中各个检查点处的积分求和就可以得到第k个训练实例和第j个测试实例的影响力分数,最终计算训练样本对测试样本的影响力分数的公式如下所示:
[0065][0066]
进一步地,所述步骤4.1中,具体步骤包括以下:
[0067]
知识蒸馏过程的t-net的目标函数不再由之前的单一loss组成,而是由对soft target和hard target加权得到,如下公式所示:
[0068]
loss=αl
soft
+βl
hard
[0069]
首先将t-net和s-net在同温度t下的softmax输出的相对熵(relative entropy)
作为l
soft
,可以使用温度t这个变量来对softmax的输出进行平滑操作,ki=exp(zi/t)/∑jexp(zi/t),当t越大时softmax输出越平滑,负标签携带的信息也会被相对地放大,模型训练将更加关注负标签;当t=1时,上述公式就变成了传统的softmax公式。
[0070]
进一步地,所述步骤4.2中,具体步骤包括以下:
[0071]
首先得到训练数据输入到s-net在t=1下的softmax输出,然后再得到该训练数据的真实标签值,最后对softmax输出和真实标签值做交叉熵操作,最后得到l
hard

[0072]
本发明能够让s-net在模型结构较为简单、训练数据量较小的情况下达到与t-net在模型结构较为复杂、训练数据量较大的情况下几乎相同的测试准确度,而且还能有效降低模型的运算成本。在mnist数据集上,可以用9.6%的训练数据就可以达到用全部训练数据的效果,在训练数据包含较多的特征时,使用部分重要训练数据进行知识蒸馏能够让s-net具有比同等条件下t-net更好的性能;在cifar-10数据集上,低数据量情况下s-net的测试准确度总是可以高于t-net;在运算成本方面,用部分重要数据进行知识蒸馏可以在模型运行内存和模型运行时间成本两方面都优于原始模型。
[0073]
以上已经描述了本发明的各实施例,上述说明是示例性的,并非穷尽性的,并且也不限于所披露的各实施例。在不偏离所说明的各实施例的范围和精神的情况下,对于本技术领域的普通技术人员来说许多修改和变更都是显而易见的。
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1