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

    技术2022-07-11  83

    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之后网络结构能够保持一定的规则,实现起来**方便,**而且也能起到一定的加速作用
    Processed: 0.027, SQL: 9