CVPR 2019 | SP_相似性保存知识蒸馏

CVPR 2019 | Similarity-Preserving Knowledge Distillation

1.保持相似性知识蒸馏(SPKD)

在这篇论文中,作者提出了一种新的知识蒸馏形式,该方法是作者观察到相似语义的输入往往会使得神经网络输出相似的激活模式这一现象启发得到的。该知识蒸馏方法被称为保持相似性知识蒸馏(SPKD),该方法使得教师网络中相似(不同)激活的输入样本对,能够在学生网络中产生相同(不同)的激活,从而指导学生网络的学习。下图展示了整个学习的过程,从图中可以看出,在每个batch的训练中,给定当前batch大小为b,我们从输入样本中计算成对的相似矩阵,最终通过学生网络和教师网络之间的相似矩阵进行损失计算,指导学习。该方法整体上和PKT那种基于概率分布的网络有些类似,但我个人认为PKT的方式要优于本文,基于概率分布的方式更符合网络训练的模式。

2.相似性编码矩阵

本文提出的蒸馏学习方案的前提是,假设,如果两个输入在教师网络中产生高度相似的激活,那么引导学生网络走向一个学习方向,该方向也会导致这两个输入在学生中产生高度相似的激活。相反,如果两个输入在老师身上产生不同的激活,我们也希望这些输入在学生身上产生不同的激活。如下图所示:在CIFAR-10数据集中,由经过训练的WideResNet-16-1和WideResNet-40-2网络生成的激活相似矩阵G (Eq. 2)。每一列代表一个单独的批处理,每个轴上按ground truth类分组输入(批处理大小= 128)。较亮的颜色表示较高的相似值。从下图中可以证明上述假设,对于同一类的输入,激活大部分是相似的,而对于跨不同类的输入,则是不同的。

如下公式和代码所示,本文利用L2norm的方式来编码相似矩阵。这进一步说明了本文的编码策略其实是粗糙的,整体来说本文的思想是好的,但编码策略略显不足。


def similarity_loss(self, f_s, f_t):
        bsz = f_s.shape[0]
        f_s = f_s.view(bsz, -1)
        f_t = f_t.view(bsz, -1)

        G_s = torch.mm(f_s, torch.t(f_s))
        # G_s = G_s / G_s.norm(2)
        G_s = torch.nn.functional.normalize(G_s)
        G_t = torch.mm(f_t, torch.t(f_t))
        # G_t = G_t / G_t.norm(2)
        G_t = torch.nn.functional.normalize(G_t)

        G_diff = G_t - G_s
        loss = (G_diff * G_diff).view(-1, 1).sum(0) / (bsz * bsz)
        return loss
3.结果及分析

本文的特点:虽然本文的编码策略有些粗糙。但本文的特点在于,于之前的蒸馏方法鼓励学生模仿老师的直接输出不同。因为它的目的是保存输入样本的成对激活相似性,而不是教师的表现空间。在保留相似性知识蒸馏法中,要求学习后的学生空间中很好地保留教师空间中的成对相似性,而不要求学生能够表达教师的直接输出。当然这种策略从下方的结果中也可以看出是有效的,PKT算法也是利用类似成对的损失进行蒸馏,只不过将编码换成了概率分布的方式~

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yuanCruise

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值