五,知识蒸馏
本文只简单介绍这个领域的开篇之作-Distilling the Knowledge in a Neural Network,这是蒸 "logits"方法,后面还出现了蒸 "features" 的论文 。想要更深入理解,中文博客可参考这篇文章-知识蒸馏是什么?一份入门随笔 。知识蒸馏(knowledge distillation),是迁移学习(transfer learning)的一种,简单来说就是训练一个大模型(teacher)和一个小模型(student),将庞大而复杂的大模型学习到的知识,通过一定技术手段迁移到精简的小模型上 , 从而使小模型能够获得与大模型相近的性能 。
在知识蒸馏的实验中,我们先训练好一个
teacher
网络,然后将 teacher
的网络的输出结果 \(q\) 作为 student
网络的目标 , 训练 student
网络,使得 student
网络的结果 \(p\) 接近 \(q\),因此,student
网络的损失函数为 \(L = CE(y,p)+\alpha CE(q,p)\) 。这里 CE
是交叉熵(Cross Entropy) , \(y\) 是真实标签的 onehot
编码,\(q\) 是 teacher
网络的输出结果,\(p\) 是 student
网络的输出结果 。但是 , 直接使用
teacher
网络的 softmax 的输出结果 \(q\),可能不大合适 。因此,一个网络训练好之后 , 对于正确的答案会有一个很高的置信度 。例如,在 MNIST 数据中,对于某个 2 的输入 , 对于 2 的预测概率会很高,而对于 2 类似的数字,例如 3 和 7 的预测概率为 \(10^-6\) 和 \(10^-9\) 。这样的话 , teacher
网络学到数据的相似信息(例如数字 2 和 3,7 很类似)很难传达给 student
网络,因为它们的概率值接近0
。因此,论文提出了 softmax-T
(软标签计算公式),公式如下所示:\[q_{i} = \frac{z_{i}/T}{\sum_{j}z_{j}/T}\]这里 \(q_i\) 是 \(student\) 网络学习的对象(soft targets),\(z_i\) 是
teacher
模型 softmax
前一层的输出 logit
。如果将 \(T\) 取 1 , 上述公式变成 softmax,根据 logit 输出各个类别的概率 。如果 \(T\) 接近于 0,则最大的值会越近 1,其它值会接近 0,近似于 onehot
编码 。所以,可以知道
student
模型最终的损失函数由两部分组成:- 第一项是由小模型的预测结果与大模型的“软标签”所构成的交叉熵(cross entroy);
- 第二项为预测结果与普通类别标签的交叉熵 。
T
的取值会影响最终的结果,一般而言 , 较大的 T 能够获得较高的准确度,T(蒸馏温度参数) 属于知识蒸馏模型训练超参数的一种 。T 是一个可调节的超参数、T 值越大、概率分布越软(论文中的描述),曲线便越平滑 , 相当于在迁移学习的过程中添加了扰动,从而使得学生网络在借鉴学习的时候更有效、泛化能力更强,这其实就是一种抑制过拟合的策略 。知识蒸馏的整个过程如下图:
文章插图
student
模型的实际模型结构和小模型一样,但是损失函数包含了两部分 , 分类网络的知识蒸馏 mxnet 代码示例如下::# -*-coding-*-: utf-8"""本程序没有给出具体的模型结构代码,主要给出了知识蒸馏 softmax 损失计算部分 。"""import mxnet as mxdef get_symbol(data, class_labels, resnet_layer_num,Temperature,mimic_weight,num_classes=2):backbone = StudentBackbone(data)# Backbone 为分类网络 backbone 类flatten = mx.symbol.Flatten(data=https://www.huyubaike.com/biancheng/conv1, name="flatten")fc_class_score_s = mx.symbol.FullyConnected(data=https://www.huyubaike.com/biancheng/flatten, num_hidden=num_classes, name='fc_class_score')softmax1 = mx.symbol.SoftmaxOutput(data=https://www.huyubaike.com/biancheng/fc_class_score_s, label=class_labels, name='softmax_hard')import symbol_resnet# Teacher modelfc_class_score_t = symbol_resnet.get_symbol(net_depth=resnet_layer_num, num_class=num_classes, data=https://www.huyubaike.com/biancheng/data)s_input_for_softmax=fc_class_score_s/Temperaturet_input_for_softmax=fc_class_score_t/Temperaturet_soft_labels=mx.symbol.softmax(t_input_for_softmax, name='teacher_soft_labels')softmax2 = mx.symbol.SoftmaxOutput(data=https://www.huyubaike.com/biancheng/s_input_for_softmax, label=t_soft_labels, name='softmax_soft',grad_scale=mimic_weight)group=mx.symbol.Group([softmax1,softmax2])group.save('group2-symbol.json')return group
推荐阅读
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- tensorflow-gpu版本安装及深度神经网络训练与cpu版本对比
- Learning Records 计算机网络
- Springboot 之 Filter 实现超大响应 JSON 数据压缩
- 手机网络怎么连接上电视(手机通过type-c连接电视)
- 一 网络安全主动进攻之DNS基础和ettercap实现DNS流量劫持
- TCP和UDP的区别与联系以及网络字节序和主机字节序的转换函数实践
- Go的网络编程详解
- 红米note11Pro怎么设置5G_设置5G网络方法
- Springboot 之 Filter 实现 Gzip 压缩超大 json 对象
- 对循环神经网络参数的理解|LSTM RNN Input_size Batch Sequence