文章目录
- Introduction
- Related Work
- 网络稀疏化(Network Slimming)
- why choose chennel-level sparsify
- how to implement
- 在模型中加入BN(Batch Normalization)层
本文中的方法来自于论文《Learning Effcient Convolutional Network through Network Sliming》
论文:Learning Effcient Convolutional Network through Network Sliming
Introduction
CNN模型压缩最主要的是下面三个方面:
- 模型大小(model size),其中包含训练参数和关联的网络结构。
- 运行内存(run-time memory),包括加载训练参数等。
- 计算操作数量(numbers of computing operation)。
相比于CNN网络,该方法做了以下修改:
- 训练的时候,在第层和第层加入了一层chennel scaling factors的训练层,他们与前一层的卷积层意一一对应,与后一层卷积层使用全连接。
- 在训练完成之后,检查scaling层的参数,如果参数低于某一阈值就删除该chnnel,并且还要对其他channel进行微调。
Related Work
其他CNN模型压缩的方法还有:
- Low-rank Decomposition,该方法对全连接层有奇效。
- Weight Quantuzation,该方法通过hash将权重由一个较大的范围转变到一个较小的范围。例如,在MNIST中,将像素的值由。
- weight pruning/Sparsify,权重剪枝,将一些值较小的一些权重删去,从而达到压缩的目的。
- structured pruning/sparsify,t通过随机停用一些channel来达到压缩的目的,类似于TensorFlow中的Dropout层通过将一定数量的channel变为0类似。
- neural architecture learning,这个类似于CNN中的Inception模型,让网络在预先的几个模型中进行学习,选择最好的。
网络稀疏化(Network Slimming)
稀疏化:按照我的理解即是淘汰部分对结果影响较低的权重、或者通道等。
why choose chennel-level sparsify
稀疏化可以用于不同维度。我们可以在weight-level、kernel-level、channel-level、layer-level进行稀疏化。
在weight-level、kernel-level进行处理,能够具有较高的压缩效率,同时还兼具灵活性和普遍性,但是往往需要软件以及硬件支持才能在准确度兼具的情况下进行。
相反,在layer-level层面上进行,就缺乏灵活性和普遍性,事实上只有在层数>50时,对layer进行稀疏化才能获得较好的效果。
在chennel层面进行稀疏化,能够在一定程度上兼具上述优点,同时不需要软件和硬件支持。
how to implement
在scaling层,如果仅仅只将factor较小的channel删除,那么仅仅只能压缩十分之一。因此,还需要对其他channel进行微调(fine-tune),在这里映入了L1-pealty loss即在最终的loss函数中加入正则化。
其中,
下面是关于smooth-L1的解释:
is a hyper-parameter here and is usually taken as 1. appears near
Smooth L1-loss combines the advantages of L1-loss (steady gradients for large values of ) and L2-loss (less oscillations(振荡,因为L1正则化当x在0附近时,会在-1,1振荡) during updates when
Another form of smooth L1-loss is Huber loss. They achieve the same thing. Taken from Wikipedia, Huber loss is
——引用自StackExchange
在模型中加入BN(Batch Normalization)层
在BN层中对数据进行下列变化:
事实上,如果我们不加入BN层,scaling层的factor值就无法代表重要性(虽然我们依然可以通过参数来选择channel),因为我们可以将权重的值扩大n倍,将factor的值缩小n倍,而不会影响输出结果。
(待续)