2020李宏毅学习笔记——33.Network Compression(2_6)

3.为什么要pruning?
首先有一个问题:既然最后要得到一个小的network,那为什么不直接在数据集上训练小(有local minima的问题)的模型,而是先训练大模型?

  • 解释一:模型越大,越容易在数据集上找到一个局部最优解,而小模型比较难训练,有时甚至无法收敛
  • 解释二:2018年的一个发表在ICLR的大乐透假设(Lottery Ticket Hypothesis)观察到下面的现象:首先看最左边的网络,它表示大模型,我们随机初始化它权重参数(红色)。然后我们训练这个大模型得到训练后的模型以及权重参数(紫色)。最后我们对训练好的大模型做pruning得到小模型。
    在这里插入图片描述
    红色箭头代表随机初始化的权重
    紫色箭头代表训练后的权重
    绿色代表另外一个随机初始化的权重
    在这里插入图片描述
    下面就是见鬼的时刻,作者把小模型拿出来后随机初始化参数(绿色,右上角),结果发现根本无法训练。然后他又把最开始的大模型的随机初始化的权重复制到小模型上(即把对应位置的权重参数复制过来,右下角),结果发现正常训练!!!

就像我们买彩票,买的彩票越多,中奖的几率才会越大。而最开始的大模型可以看成是由超级多的小模型组成的,也就是对大模型随机初始化参数会得到各种各样的初始化参数的小模型,有的小模型可能根本就无法训练,但是有的就可以,所以上图中右下角的小模型套用大模型对应位置的初始化参数,其实就是使用了**“中奖”了的那个部分的参数。**

4.Rethinking the Value of Network Pruning
这个文献提出了不同见解,说是不用prun,直接随机初始化,然后是可以训练起来的。Scratch-B比Scratch-E训练epoch多一些,可以看到比Lottery Ticket Hypothesis微调的结果要好。
在这里插入图片描述

5.实际操作一波
模型pruning可以从weight和neuron两个角度进行,但是哪一个比较好呢,结果是neuron

  • weight pruning
    每个节点的输出和输出节点数都会变得****不规则,这样一来有两个方面的问题:——使用Pytorch,Keras实现起来不方便 - GPU是对矩阵运算做加速,现在都变得不规则,看起来似乎GPU面对这种情况也无能为力。2016年的一篇文章对AlexNet就做了这样的实验,实验结果是模型参数去掉了将近90%,最后的准确率降低了2%左右,说明weight pruning的确能够在保证模型准确率的同时减少了模型大小,but!!!最后实验发现模型计算的速度似乎并没有提速,甚至对有的结构的修改使得速度降低了。
    实际上
    直接
    不改变模型,直接把prune后的weight设置为0即可。或者NaN代替prune后的weight可以做
    在这里插入图片描述
    不同的GPU并不一定weight越小越快,有的反而更慢
    在这里插入图片描述
  • neuron pruning
    删减neuron之后网络结构能够保持一定的规则,实现起来**方便,**而且也能起到一定的加速作用
    在这里插入图片描述
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值