CVPR 2020 | 模型压缩新范式_滤波器嫁接技术

CVPR 2020 | Filter Grafting for Deep Neural Networks
https://github.com/fxmeng/filter-grafting

1.滤波器嫁接动机

本文提出了一种全新的学习范式:滤波器嫁接,用于提高神经网络的特征表达能力。构建滤波器嫁接技术的动机是通常在训练完的网络中存在一些无效的滤波器,很多网络模型剪枝的文献中就会把这些无效的滤波器剪切掉。而本文考虑重新激活这些无效滤波器,在不增加模型推理时间的前提下,有效提升网络性能。因为这些看似无效的滤波器不一定是真的无效的,比如在集成学习中,当单个弱分类器效果差时,它们的组合反而会得到更强的性能。这说明无效的滤波器是可以被激活的。所谓的激活就是通过将外部信息移植到到这些无效滤波器中,该过程被定义为滤波器嫁接。滤波器嫁接的关键是选择合适的信息源,那么应该从哪里嫁接信息? 本论文深入研究了这个问题,作者认为我们应该从外部(其他网络)而不是从内部(自网络)嫁接信息。通常,可以并行地训练多个网络。选择完嫁接源后,在特定的训练阶段,将一个网络中高效的滤波器移植到另一个网络无效的滤波器中。通过嫁接,每个网络可以从其他网络学习外部信息。论文的贡献有:

  • 提出了一种新的学习范式,称为滤波器嫁接。嫁接可以在不改变网络结构的情况下,重新激活无效的过滤器,提高神经网络的潜力。
  • 提出了一种基于熵的准则和自适应加权策略,进一步提高了滤波器嫁接方法的性能。
  • 在分类和识别任务上进行了大量的实验,并证明嫁接可以显著提高DNNs的性能。例如,嫁接的MobileNetV2在CIFAR-100上达到78.32%的正确率,比未嫁接的MobileNetV2高约7%。
2.嫁接与裁剪,蒸馏的区别

滤波器裁剪旨在去除无效的滤波器,以加速网络的推理。而滤波器嫁接打算激活这些无效的滤波器。值得注意的是,尽管滤波器嫁接的动机与剪枝相反,但嫁接仍然需要选择一个合适的标准来决定哪些滤波器是不重要的。下图展示了裁剪和嫁接的主要区别。

嫁接可能涉及并行地训练多个网络。因此,这个过程类似于蒸馏学习。嫁接和蒸馏的区别在于,蒸馏是一个两阶段的过程。首先,我们需要训练一个大模型(老师),然后使用训练好的大模型来教一个小模型(学生)。而嫁接是一个单阶段的过程,在训练过程中进行滤波器嫁接。此外如下代码所示,我们在每个epoch中嫁接权值,而不是在每个迭代中移植权值,从而大大降低了网络之间的通信成本。

if __name__ == '__main__':
    for epoch in range(start_epoch, args.epochs):
        train(epoch)
        test(epoch)
        state = {
            'net': net.state_dict(),
        }
        torch.save(state, '%s/ckpt%d_%d.t7' % (args.s, args.i % args.num, epoch))
        grafting(net, epoch)
3.如何计算滤波器的重要性

正如上所述,不论是裁剪还是嫁接,都需要选择一个合适的标准来决定哪些滤波器是不重要的。通常情况下多数裁剪文献中都利用L1范数来评价滤波器的重要性,然而本文提出了不同观点并利用熵(entropy)来评价滤波器的重要性,具体分析如下。

(1)L1范数(L1 norm)
如下公式所示,以一层滤波器为单位,L1范数的计算就是将当前层滤波器中所有的卷积层参数进行逐点求绝对值并求和。现有的文献中普遍认为L1范数越接近零,当前滤波器越不重要。但最近的研究表明,更小更不重要的标准并不总是正确的。一个特殊的情况是,一个权重分布在 0–1之间的滤波器肯定比所有权重都为1的滤波器更好。很显然,L1范数准则只关注滤波器权值的绝对值,并没有关注权值的变化。因此利用L1范数评价滤波器的好坏是不全面的。

(2)熵(entropy)
基于上述分析,本文提出利用熵的形式来衡量滤波器权重的变化程度,以此为依据来判别滤波器的好坏。具体来说,计算熵的方法为将滤波器权重按照大小等分为离散的几个区间,并计算区间对应的概率,最后利用熵的公式计算整个滤波器的熵。如公式4,5结合起来,首先计算一层滤波器中一个卷积层的熵,并求和。公式6表示直接将当前层的滤波器进行权重划分后计算熵。

如下代码所示,为将当前层的所有滤波器输入,并对其整体进行划分,代码中将区间划分为了10个,并直接计算当前层的滤波器的熵量。本文采用的也是下述代码中的计算方式,也就是公式6。

def entropy(x, n=10):
    x = x.reshape(-1)
    scale = (x.max() - x.min()) / n
    entropy = 0
    for i in range(n):
        p = torch.sum((x >= x.min() + i * scale) * (x < x.min() + (i + 1) * scale), dtype=torch.float) / len(x)
        if p != 0:
            entropy -= p * torch.log(p)
    return float(entropy.cpu())
4.滤波器嫁接详解

文章中作者将原始网络中无效的滤波器称为砧木,将有意义的滤波器称为接穗,这与嫁接的植物学解释是一致的。滤波器嫁接的目的是将信息(权重)从接穗转移到砧木,因此选择有用的信息是嫁接的关键。在本文中,作者提出了三种获取接穗的方法。
(1)噪声作为接穗
噪声作为接穗:利用均值为0,方差为delta的高斯噪声作为接穗,使得L1范数很小的无效滤波器变得更有效。当然随着迭代次数的增加,需要适当降低高斯噪声方差的值,因为过大的方差会导致网络难以收敛。

(2)内部滤波器作为接穗
内部滤波器作为接穗:利用当前网络中,其余熵值比较大,对结果输出有较大影响的滤波器作为接穗,此类嫁接发生在单个网络中。具体来说,对于每一个参数层,计算滤波器的熵值并设置一个阈值γ。滤波器的熵值小于γ,则认为这些滤波器是无效的。然后将第i个熵值最大滤波器的权值移入第i个熵值最小滤波器。由于这种嫁接技术发生在网络内部,因此无法增加额外的信息。具体过程如下图所示:

(3)外部滤波器作为接穗

外部滤波器作为接穗:针对在单一网络中加入随机噪声和权值的缺点,可以从其他网络中选择外部滤波器作为接穗。具体来说,可以并行地训练两个网络,分别记作M1和M2。在每个epoch的训练中,我们将M1的有效滤波器权值嫁接到M2的无效滤波器中。该过程中的嫁接发生在层级,而不是滤波器级,这意味着我们将M1中某一层中所有滤波器权重嫁接到同一层的M2中。

在进行嫁接时,具体的操作如下公式所示,通过对接穗和砧木的权重进行加权后,得到最终的嫁接参数。其中阿尔法值要大于0.5,因为接穗的权重更有效。

正如上述公示所示,在此过程中,我们需要解决如何确定权重系数的问题。确定权重系数有两个要点:
第一:当M2的熵值和M1的熵值相同时,阿尔法的值为0.5;当M2的熵值大于M1的熵值时,阿尔法的值大于0.5。
第二:即使M2的熵值和M1的熵值相差非常大的情况下,阿尔法的值也不能是0或无穷。
基于上述两个要点 ,文章利用如下公式进行阿尔法参数的约束,从示意图中可以看出,该公式对应的阿尔法值满足上述提出的两个要点。最终嫁接的代码如下所示。

def grafting(net, epoch):
    while True:
        try:
            checkpoint = torch.load('%s/ckpt%d_%d.t7' % (args.s, args.i - 1, epoch))['net']
            break
        except:
            time.sleep(10)
    model = collections.OrderedDict()
    for i, (key, u) in enumerate(net.state_dict().items()):
        if 'conv' in key:
            w = round(args.a / np.pi * np.arctan(args.c * (entropy(u) - entropy(checkpoint[key]))) + 0.5, 2)
        model[key] = u * w + checkpoint[key] * (1 - w)
    net.load_state_dict(model)
5.结果分析

下表展示了三种不同的嫁接方式对网络最终结果的影响,很明显利用外部滤波器嫁接得到了最好的性能。

下表展示了利用L1范数和熵值两种指标评价滤波器好坏后,嫁接策略的性能。从结果中可以看出,利用熵值有更好的性能,进一步说明了熵值是一种更优秀的评价滤波器好坏的准则。

下表展示了由于嫁接是模型间的权值传递,当外部信息(权值)变化较大时,网络能够更好地学习。抽样顺序和学习率带来的权重变化丰富了嫁接信息,从而鼓励模型更好地学习。另外,在进行嫁接时,所有网络在数据加载器和学习速率方面使用不同的超参数。

下表展示了嫁接策略对模型最终结果的增益优于传统的蒸馏学习等方法,体现了嫁接策略的有效性。

最终作者还对嫁接后的模型进行了滤波器有效性分析,进一步证明了嫁接策略的有效性。很明显,经过嫁接策略后无效滤波器的数量显著减少。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章