ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

蒸馏论文七(Variational Information Distillation)

2021-08-03 15:29:54  阅读:615  来源: 互联网

标签:Information target pred self Distillation channels num 互信息 Variational


本文介绍一种知识蒸馏的方法(Variational Information Distillation)。

1. 核心思想

作者定义了将互信息定义为:

在这里插入图片描述
如上式所述,互信息为 = 教师模型的熵值 - 已知学生模型的条件下的教师模型熵值。

我们有如下常识:当学生模型已知,能够使得教师模型的熵很小,这说明学生模型以及获得了能够恢复教师模型所需要的“压缩”知识,间接说明了此时学生模型已经学习的很好了,也就是说明上式中的H(t|s)很小,从而使得互信息I(t;s)会很大。因此,就可以通过最大化互信息的方式来进行蒸馏学习。
在这里插入图片描述
如图所示,学生网络与教师网络保持高互信息(MI),通过学习并估计教师网络中的分布,激发知识的传递,使相互信息最大化。

2. 损失函数

由于p(t|s)难以计算,作者根据IM算法,利用一个可变高斯q(t|s)来模拟p(t|s)

在这里插入图片描述
上述公式中的大于等于操作用到了KL散度的非负性。由于蒸馏过程中H(t)和需要学习的学生模型参数无关,因此最大化互信息就转换为最大化可变高斯分布的问题。

作者利用一个均值,方差可学习的高斯分布来模拟上述的q(t|s)
在这里插入图片描述
式子中可学习的方差定义如下:
在这里插入图片描述
其中阿尔法c是可学习参数。

class VIDLoss(nn.Module):
    """Variational Information Distillation for Knowledge Transfer (CVPR 2019),
    code from author: https://github.com/ssahn0215/variational-information-distillation"""
    def __init__(self,
                 num_input_channels,
                 num_mid_channel,
                 num_target_channels,
                 init_pred_var=5.0,
                 eps=1e-5):
        super(VIDLoss, self).__init__()

        def conv1x1(in_channels, out_channels, stride=1):
            return nn.Conv2d(in_channels, out_channels,kernel_size=1, padding=0,bias=False, stride=stride)
        
        # 通过一个卷积网络来模拟可变均值
        self.regressor = nn.Sequential(
            conv1x1(num_input_channels, num_mid_channel),
            nn.ReLU(),
            conv1x1(num_mid_channel, num_mid_channel),
            nn.ReLU(),
            conv1x1(num_mid_channel, num_target_channels),
        )

        # 可学习参数
        self.log_scale = torch.nn.Parameter(
            np.log(np.exp(init_pred_var-eps)-1.0) * torch.ones(num_target_channels)
            )

        self.eps = eps

    def forward(self, input, target):
        # pool for dimentsion match
        s_H, t_H = input.shape[2], target.shape[2]
        if s_H > t_H:
            input = F.adaptive_avg_pool2d(input, (t_H, t_H))
        elif s_H < t_H:
            target = F.adaptive_avg_pool2d(target, (s_H, s_H))
        else:
            pass

        # 均值方差
        pred_mean = self.regressor(input)
        pred_var = torch.log(1.0+torch.exp(self.log_scale))+self.eps
        pred_var = pred_var.view(1, -1, 1, 1)

        # 利用均值和方差可学习的高斯分布来模拟概率
        neg_log_prob = 0.5*(
            (pred_mean-target)**2/pred_var + torch.log(pred_var)
            )

        loss = torch.mean(neg_log_prob)
        return loss

源代码
参考文献:CVPR 2019 | VID_最大化互信息知识蒸馏

标签:Information,target,pred,self,Distillation,channels,num,互信息,Variational
来源: https://blog.csdn.net/weixin_44579633/article/details/119350631

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有