多教师多学生模型知识蒸馏

这两天要研究这个方向,准备先找几篇论文看看。

第一篇:

【MULTI-TEACHER KNOWLEDGE DISTILLATION FOR COMPRESSED VIDEO ACTION RECOGNITION ON DEEP NEURAL NETWORKS】

在google一搜multi-teacher knowledge distillation就出来这一篇,虽然看着不太靠谱,但是看论文主要是为了找灵感,所以我还是打算认真看看。碰巧今天又在重感冒,脑子迷迷糊糊的,就用了大量时间看相关工作的介绍,当作是复习之前的知识蒸馏的基本原理啦。

墨迹到下午脑子清醒了点,就开始挑刺啦。有一说一,我写作业的时候都不会用重复甩公式的法子来凑字数,这篇论文介绍个别人已经介绍了几百遍的蒸馏原理还能把一样的公式放两遍的???明明都在一页上,怕我们看不着吗???语法错误不谈了,看得我脑壳疼。直接说说这个模型。

我本来以为多老师模型传递知识是个多么高级的方法啊,原来就直接加权平均???加权平均还能发个论文的???这不就是个模型集成吗???作者们估计也觉得不好意思了,再后面说多学生的时候就一句话带过了“n the results of the separate students was fused for final prediction.” 我看了眼图,明白了,还是加权平均。虽然论文不长,一看就是水论文,但是整篇论文唯一一个原创公式就是加权平均也太扯啦。
q t T = μ 1 × q t 1 T + μ 2 × q t 2 T + μ 3 × q t 3 T μ 1 + μ 2 + μ 3 q^T_t=\frac{\mu_1\times q^T_{t_1}+\mu_2\times q^T_{t_2}+\mu_3\times q^T_{t_3}}{\mu_1+\mu_2+\mu_3} qtT=μ1+μ2+μ3μ1×qt1T+μ2×qt2T+μ3×qt3T
一个加权平均还整的挺高级有分母有分子的,最扯的是我还真就认认真真看了半天。
果然看论文的时候还是需要在脑子清醒的时候看。

第二篇

【Deep Mutual Learning】

深度互学习这个idea易于理解并且看起来十分可行。核心思想是同时训练的不同模型在次要分类上的差异成为了可以用来相互借鉴的额外信息。即使是一起训练的模型,在方向上也存在差异,这个idea就是让两个或多个模型边训练边学习,一边学习groundtruth一边学习同伴给出的信息,即互为导师也互为学生。
两个模型的损失函数分别为
L Θ 1 = L C 1 + D K L ( p 2 ∣ ∣ p 1 ) L_{\Theta_1}=L_{C_1}+D_{KL}(p_2||p_1) LΘ1=LC1+DKL(p2p1)
L Θ 2 = L C 1 + D K L ( p 1 ∣ ∣ p 2 ) L_{\Theta_2}=L_{C_1}+D_{KL}(p_1||p_2) LΘ2=LC1+DKL(p1p2)
在训练过程中,模型是交替更新的,更新完第一个模型后,再计算下一个模型要更新的梯度,依此反复。
再多个模型一起学习的情况下,第二个损失函数要取多模型的均值。在蒸馏学习中,硬目标损失永远是占主导的,别的损失起到的都是指导作用。也可以把剩下多个模型看成一个集成来进行指导,不过看成集成的效果不如分开指导的效果好。
L Θ k = L C k + 1 K − 1 ∑ l = 1 , l ≠ k k D K L ( p l ∣ ∣ p k ) L_{\Theta_k}=L_{C_k}+\frac{1}{K-1}\sum^k_{l=1,l\ne k}D_{KL}(p_l||p_k) LΘk=LCk+K11l=1,l=kkDKL(plpk)

目前已经开始按照这个做了,先用了两个模型,然后暗搓搓地加上了soft target这一部分,结果还没跑出来,训练速度相对来说有点慢,感觉要跑很久的样子。

第三篇

【Be Your Own Teacher: Improve the Performance of Convolutional Neural Networks via Self Distillation】

这篇论文把一个网络看成了好几个小分类器,对每个小分类器都计算损失。损失主要有三种:

  1. 标签和来自所有分类器的输出的交叉熵损失。
  2. 学生和老师的softmax层的kl散度损失。
  3. 中间层的L2损失。

这里的老师模型指的是最深层的分类器,学生模型指所有浅层的分类器。中间层的部分使用啦bottleneck使得特征图大小变得一致,和之前使用普通regressor的思想其实是一样的。

创新点在于模型内部蒸馏,虽然用的各种损失都是之前别人提出来的,但也还算可以吧。不过可能不是很适合我正在做的这个模型,有时间的话可以多看看。

### 教师学生模型知识蒸馏用于图像分割的代码实现 在处理图像分割任务时,采用教师-学生框架的知识蒸馏技术能够有效提升小型化网络性能。下面展示了一个基于PyTorch平台构建此类系统的简化版本。 ```python import torch from torch import nn, optim from torchvision.models.segmentation import fcn_resnet50 as teacher_model from torchvision.models.segmentation import deeplabv3_mobilenet_v3_large as student_model class DistillLoss(nn.Module): """定义损失函数""" def __init__(self, temperature=4.0): super(DistillLoss, self).__init__() self.temperature = temperature def forward(self, outputs_student, outputs_teacher): loss_kd = (nn.KLDivLoss()(torch.log_softmax(outputs_student / self.temperature, dim=1), torch.softmax(outputs_teacher / self.temperature, dim=1)) * (self.temperature ** 2)) return loss_kd def train_one_epoch(model_teach, model_stud, dataloader, optimizer, criterion_ce, criterion_kd, alpha=0.9, device='cuda'): """ 单轮次训练逻辑 :param model_teach: 教师模型实例 :param model_stud: 学生模型实例 :param dataloader: 数据加载器 :param optimizer: 优化算法对象 :param criterion_ce: 交叉熵损失计算模块 :param criterion_kd: 蒸馏损失计算模块 :param alpha: 权重参数控制两种损失的比例,默认设置为0.9意味着更重视来自教师的信息传递 :return: None """ for images, targets in dataloader: images = images.to(device) targets = {k: v.to(device) for k, v in targets.items()} # 前向传播获取预测结果 with torch.no_grad(): out_teach = model_teach(images)['out'] out_stud = model_stud(images)['out'] # 计算总损失 loss_1 = criterion_ce(out_stud, targets['masks'].squeeze(1).long()) loss_2 = criterion_kd(out_stud, out_teach) total_loss = alpha * loss_2 + (1 - alpha) * loss_1 # 反向传播更新权重 optimizer.zero_grad() total_loss.backward() optimizer.step() # 初始化并配置环境变量 device = 'cuda' if torch.cuda.is_available() else 'cpu' model_teacher = teacher_model(pretrained=True).to(device) for param in model_teacher.parameters(): # 冻结教师模型参数 param.requires_grad_(False) model_student = student_model().to(device) criterion_cross_entropy = nn.CrossEntropyLoss(ignore_index=255) distillation_criterion = DistillLoss() optimizer_adam = optim.Adam(filter(lambda p: p.requires_grad, model_student.parameters()), lr=1e-4) train_one_epoch(model_teacher, model_student, your_dataloader_here, optimizer_adam, criterion_cross_entropy, distillation_criterion, device=device)[^4] ``` 此段代码展示了如何利用预训练好的大型卷积神经网络作为教师指导较小规模的学生网络学习语义分割任务的能力。通过调整`alpha`超参可平衡原始标签监督与软目标之间的关系,在实际应用中可根据需求微调这一比例以获得最佳效果。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值