李宏毅学习笔记20.Network Compression

简介

这个内容也是新的:NETWORK COMPRESSION
由于未来我们的模型有可能要运行在很多类似手机,手表,智能眼镜,无人机上,这些移动终端的算力和存储空间有限,因此要对模型进行压缩(变小)。本节内容从五个方面进行展开。当然也可以根据具体的硬件平台定制专门的模型架构(本节不涉及这些内容)。
We will not talk about hard-ware solution today.
公式输入请参考:在线Latex公式

Network Pruning

Network can be pruned

Networks are typically over-parameterized (there is significant redundant weights or neurons)很多权重、神经元在计算的过程中输出总是0,或者输出总是很小,对结果基本没有影响,因此:
Prune them!(盘他!)
人脑就有类似的东西:
在这里插入图片描述

How to Prune

先要训练一个很大的模型(不大也不用处理了)
然后评估出重要的权重或神经元
对于权重可以用L1或者L2等方法来评估(不展开)
对于神经元可以根据输出是否接近于0来评估(不展开)
移除不重要的权重或神经元
After pruning, the accuracy will drop (hopefully not too much)
要对处理后的模型进行微调,进行recovery。
注意:Don’t prune too much at once, or the network won’t recover.
循环到第一步。
在这里插入图片描述

Why Pruning

为什么要进行Prun,而不是直接训练一个小的模型?How about simply train a smaller network?
It is widely known that smaller network is more
difficult to learn successfully.
• Larger network is easier to optimize? 是的,关于这个问题李老师有专门的视频,不过要翻墙:
https://www.youtube.com/watch?v=_VuWvQUMQVk
有空再写,这块应该是另外一个专题。
另外一个解释:
Lottery Ticket Hypothesis

Lottery Ticket Hypothesis

根据prune的步骤:
在这里插入图片描述
红色箭头代表随机初始化的权重
紫色箭头代表训练后的权重
绿色代表另外一个随机初始化的权重
如果直接用pruned的小模型来进行训练,但是使用的是另外一组随机初始化的权重(和红色和紫色的不一样),你会发现是行不通的。
在这里插入图片描述
同样用pruned的小模型来进行训练,但是使用的是原始的初始化权重(和红色一样的),会发现很容易就搞定。
在这里插入图片描述
理论就是说:训练模型就像买彩票,有时候训练得很好,有时候训练失败。一个巨大的模型实际上可以由很多小的子模型组成,每一种子模型就是一种可能的初始化,模型越大,包含的子模型越多,大模型对于某组参数能够训练起来的几率越大,因为总有一组子模型可以适用这组参数。(就好比买彩票,买得越多中奖几率越高。)然后我们把适用这组参数的子模型抽取(prune)出来。

Rethinking the Value of Network Pruning

文献:https://arxiv.org/abs/1810.05270(这个文章貌似和上面的文章同一个会议ICLR)
这个文献提出了不同见解,说是不用prun,直接随机初始化,然后是可以训练起来的。
在这里插入图片描述
Scratch-B比Scratch-E训练epoch多一些,可以看到比Lottery Ticket Hypothesis微调的结果要好。

Practical Issue

在这里插入图片描述
可以看到,通过prune权重后模型变得不规则了,例如中间粉色部分少了两个神经元,左边吃两个input,右边吃四个input,像这种不规则的网络我们的类似karas估计都不支持,而且不对称不好用矩阵运算,无法做GPU加速。
Hard to implement, hard to speedup ……
实际上直接不改变模型,直接把prune后的weight设置为0即可。
弹幕君:用NaN代替prune后的weight可以做。
实验表明,去掉95%的weight后,精度只掉2%左右,但是速度变慢了:
在这里插入图片描述
如果prune神经元,其实效果也还不错:
在这里插入图片描述
The network architecture is regular.
Easy to implement, easy to speedup…

Knowledge Distillation

Knowledge Distillation
Do Deep Nets Really Need to be Deep?
在这里插入图片描述
这里注意,小模型不是直接学习图片对应的答案1,而是学习大模型输出的分布,大模型的输出带有更加丰富的信息。(1和7长得蛮像的。Providing the information that “1” is similar to “7”)。所以这里的损失函数用的是交叉熵,不能用简单的平方差之类的。
其原理是:大模型可以看做是很多个小模型做的Ensemble结果,但是Ensemble之后太大,不适合放到移动终端,因此我们想办法找一个小的模型来模仿这个Ensemble的结果。
在这里插入图片描述

Temperature

在做Knowledge Distillation过程中,最后一步softmax的时候有一个小小的trick,原始的计算分类y的几率的方法是:
y i = e x p ( x i ) ∑ j e x p ( x j ) y_i=\cfrac{exp(x_i)}{\sum_jexp(x_j)} yi=jexp(xj)exp(xi)
那么就会有:
在这里插入图片描述
会发现这样小模型根本没有学到另外两个分类的信息。
因此把上面的几率计算公式修改为:
y i = e x p ( x i / T ) ∑ j e x p ( x j / T ) y_i=\cfrac{exp(x_i/T)}{\sum_jexp(x_j/T)} yi=jexp(xj/T)exp(xi/T)
当然T=100的时候:
在这里插入图片描述
发现我们通过T把y的差距变小了,导致各个分类都有几率,小模型学习的信息就丰富了。
T是超参数。

Parameter Quantization

  1. Using less bits to represent a value
  2. Weight clustering
    例如,模型参数如下表:
    在这里插入图片描述
    然后做聚类(可以用kmean)
    在这里插入图片描述
    然后就变成:
    在这里插入图片描述
    可以看到,每个参数不用保存具体的数值,而是只需要保存参数所属的类别(取均值所得)即可。
  3. Represent frequent clusters by less bits, represent rare clusters by more bits
    • e.g. Huffman encoding

Binary Connect

Binary Connect: https://arxiv.org/abs/1511.00363
Binary Network: https://arxiv.org/abs/1602.02830
XNOR-net: https://arxiv.org/abs/1603.05279
这个模型中的权重都是+1或者-1
在这里插入图片描述
当有一个权重是一个实数(蓝色的点,是我们随机初始化的一个值)
在这里插入图片描述
然后找一个离蓝点最近的一个Binary Weight,计算梯度
在这里插入图片描述
然后用蓝点按照红色的方向做update:
在这里插入图片描述
然后循环:
在这里插入图片描述
红箭头:Negative gradient Update direction (compute on binary weights)
蓝箭头:Update direction (compute on binary weights) (compute on real weights)
最后停止update后,用离得最近的Binary Weight作为结果。
在这里插入图片描述
结果还不错,可以看到把权重限制为+1或者-1相当于加上了正则化。

Architecture Design

Low rank approximation

先来看看全连接的神经网络模型
在这里插入图片描述
中间char一层线性层:
在这里插入图片描述
模型参数变成:
在这里插入图片描述
如果k不太大那么参数就会减少。当然,加入了linear层之后会限制模型。

标准CNN参数计算

下图中的filter的参数量为72个。
在这里插入图片描述
这里filter要和输入的channel相同高度,每个filter处理所有的channel。

Depthwise Separable Convolution

  1. Depthwise Convolution
    在这里插入图片描述
    可以看到filter的高度为1,filter的数量等于输入的channel,每个filter负责一个channel
    可以看到参数量为:3×3×2=18
    Filter number = Input channel number
    Each filter only considers one channel.
    The filters are 𝑘 × 𝑘 matrices
    There is no interaction between channels.
  2. Pointwise Convolution
    这里和标准的CNN做卷积的步骤一样,只不过filter的大小是1×1:
    在这里插入图片描述
    这里的输入是第一步的结果。这里的参数数量是2×4=8
    两个步骤用到的参数为:18+8=26个
    下面看一下比较:
    标准的CNN中,粉色的左上角的结果和黄色左下角的结果怎么来的?如下图所示:
    在这里插入图片描述
    Depthwise Separable Convolution多了中间步骤:
    在这里插入图片描述
    可以看到,上面相当于
    在这里插入图片描述
    左下角的:
    在这里插入图片描述
    对比标准的CNN可以发现实际上相当于把原来的18个输入拆分成了两层,第一层9个,第二层2个。
    𝐼: number of input channels
    𝑂: number of output channels
    𝑘 × 𝑘: kernel size
    标准的CNN:
    在这里插入图片描述
    简化后:
    在这里插入图片描述
    把两个模型的参数相除得到比较:
    k × k × I + I × O k × k × I × O = 1 O + 1 k × k \cfrac{k×k×I+I×O}{k×k×I×O}=\cfrac{1}{O}+\cfrac{1}{k×k} k×k×I×Ok×k×I+I×O=O1+k×k1

To learn more ……

• SqueezeNet
• https://arxiv.org/abs/1602.07360
• MobileNet
• https://arxiv.org/abs/1704.04861
• ShuffleNet
• https://arxiv.org/abs/1707.01083
• Xception
• https://arxiv.org/abs/1610.02357

Dynamic Computation

思想:
在这里插入图片描述

Possible Solutions

  1. Train multiple classifiers,针对不同场景使用不同的模型,但是这样会占用大量的空间。
  2. Classifiers at the intermedia layer,把模型中间的隐藏层抽取出来,做classifier
    这样可以根据算力在不同的layer的位置进行分类。

在这里插入图片描述
缺点:
第一:但是这样的效果不好,因为前面的layer抽取的feature对于做分类效果不好(CNN的前面的隐藏层抽取的特征比较小,不适合分类)。
在这里插入图片描述
第二:由于中间接了Classifier,会影响最终的分类结果,因为在训练的时候中间层就想要做分类,所以模型会促使参数在第一层就抽取大特征,这样会使得后面的结果变差。
在这里插入图片描述
解决方案:Multi-Scale Dense Networks,不展开。
在这里插入图片描述

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

oldmao_2000

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

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

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

打赏作者

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

抵扣说明:

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

余额充值