模型压缩文献笔记_3:彩票假设及其家属。

笔记之前的话:

  第三次笔记,首先是对latex越用越熟练,markdown编辑器用来做文献笔记真的是绝绝子,好用到翘jiojio,我直接暴风记录。(味太冲了,蚌埠住了…)
  起初是看了一篇HYDRA的文章,因为这个名字特别有趣,“九头蛇”,我神盾局十年老粉就想正义执行一下。看了这篇文章->有一篇彩票定理的引文的引文->彩票定理的增强版,权重版彩票定理->彩票定理->rethinking the value of pruning network。在这种顺序下看了 一下这几篇文章,对我的启发还是挺深刻的——神经网络就是玄学。







HYDRA: Pruning Adversarially Robust Neural Networks

  神经网络的剪枝和鲁棒性研究各自为阵,一般的剪枝都没有考虑过模型的鲁棒性,剪完后的模型鲁棒性很差。这篇文章联合考虑了模型剪枝和鲁棒性,使模型在进行剪枝时能够感知到鲁棒性的变化——对每个连接会给一个综合“剪枝价值“和”鲁棒价值“的分数,并选择一条分数最小的连接进行剪枝。该方法实际上是一个寻找最小值的问题,可以用SGD来解决。
  另外,先前有文章讲到,在随机初始化的网络中,包含一个子网络拥有较好的performance。本文基于此研究发现,在一个鲁棒性较差的网络中,包含一个鲁棒性较好的子网络。还有,在一个(empirically,而非verifiable)鲁棒性较好的网络中,能找到一个鲁棒性较好的准确率接近sota的子网络。
  这篇文章引了很多次提出上文绿色内容的文章。
V. Ramanujan, M. Wortsman, A. Kembhavi, A. Farhadi, and M. Rastegari. What’s hidden in a randomly weighted neural network? arXiv preprint arXiv:1911.13299, 2019.
  这篇文章真正的理论创新点就是将上引文训练过程中的损失函数换成了鲁棒性研究中的一些损失函数,再加了一个初始化的放缩因子。感觉含金量不是特别高。但因为自己对鲁棒性研究基本没啥了解,这篇文章也只是看了个大概。虽然感觉理论创新不是特别足,但是实验的出来的效果是相当好,直接sota。一些小结论也比较有趣,如下图的:文中对鲁棒性剪枝大体上和基于权重剪枝类似,但是在”大权重“上也动了挺多刀的(这个基于权重鲁棒性剪枝方法稍微浏览了一下,没大看懂,是一个迭代的剪枝,也没看出来用了L1范数作惩罚啥的…)。另外,还有子网络鲁棒性相关的结果也是相当牛逼。
在这里插入图片描述







彩票和刘壮的Rethinking

The lottery ticket hypothesis: Finding sparse, trainable neural networks.

  上面这些文章多多少少都是基于彩票定理的,这篇文章听过很多次了,一直没有读,这次也大概读了一遍,了解个大概。
  彩票定理:一个随机初始化的密集网络中,存在一个子网络,对该子网络单独训练x轮,至少能够达到原密集网络同样训练x轮的o性m精度。这个子网络就叫winning ticket。
彩票定理1
  winning tickets的寻找方法:1. 初始化大网络的权重;2. 训练大网络;3. 将训练好的大网络中权重较小的连接剪掉;4. 保留下来的子网络就是winning ticket。 但是,找到的子网络权重的初值,只能用原先在大网络初始化时权重,并不能将子网权重再次初始化,不然的话就练不出(或者说练的很慢?反正是效果不好。)(如下图)。
彩票定理2

RETHINKING THE VALUE OF NETWORK PRUNING

  彩票这篇文章让我想起了这个暑假读的第一篇文章,rethinking the value of network pruning,那篇文章中提到了train from scratch,应该是指权重从头开始初始化训练,和彩票理论有明显的出入。重新浏览rethinking这篇文章,以及在知乎上看了作者本人回答后。整理一下:

  1. train from scratch的确时重新初始化权重进行训练,但是rethinking这篇文章的实验大多是针对结构化剪枝的,(最后提出的结论也是:对于结构化剪枝,剪枝后得到的结构比权重更重要);而彩票假设这篇文章的实验都是非结构化剪枝的,并且彩票定理文末future work中也提到了这一点“未来可以做更多关于结构化剪枝和彩票定理的研究”。
  2. rethinking这篇文章中提到当pruning ratio大到一定程度后,在大数据集(imagenet)上从头训练的效果并不好(但是文章中的百分之六十剪枝率的精度也才掉了一两个百分点啊…有这么严格吗?或者说剪枝率上去之后掉的更厉害?)。彩票假设这篇文章的数据集大多使用CIFAR10和MNIS这些小数据集,用winning ticket的效果比reinit(就是rethinking的train from scratch)的效果要好。
  3. 两篇文章的主要矛盾在于,小数据集CIFAR10,非结构化剪枝,究竟要不要from scratch训练。彩票定理认为winning ticket要比reinit要好很多;rethinking认为from scratch效果也很好。知乎中本人的回答是:

learning rate可能是问题的关键。我们在CIFAR-10上实验发现,当使用0.01作为starting learning rate时,winning ticket是有帮助的;当使用0.1作为starting learning rate时,是大概没有的(见下图)。彩票定理3
对于structured pruning,我们也在L1-norm filter pruning [2]上做了实验。无论大小learning rate, winning ticket均没有帮助
至于为什么即使对unstructured pruning, 也只有当小learning rate的时候LTH才成立,我的一个naive的猜想是(并没有经过实验验证,轻喷),当learning rate较小时,最终训完时候的weights和original initialization时候的weights距离较小(不一定是L2 distance,可能是更抽象的)所以如果使用original initialization来对小model进行初始化,相当于leak了一些training完后的大model的信息。极端一点的话,甚至可以说,使用了winning ticket的这个小model并不是从scratch训的,而是已经某种程度上based on这个已经train了很久的大model了,所以它能train的相对好。当使用大learning rate时,训完的weights和init的相差较远,就不存在这个原因了。

  上面最后一段rethinking作者的猜想,在彩票定理这篇文章中也有出现过。就是winning ticket本身的权重,就接近于最后得到的权重(但彩票定理又自己否认了自己的这个猜想,因为实验得到的结果是有些彩票训练前后的权重相差很大)。然后rethinking作者在知乎回答中强调了“不一定是L2 distance,可能是更抽象的)。然后的然后,有另一篇文章阐述了权重版的彩票定理。感觉从另一个层面印证了这个rethinking作者在知乎上的猜想。







Deconstructing Lottery Tickets: Zeros, signs, and the supermask

  这篇文章是上面提到很多次的”逆大天的权重版彩票定理“。这篇文章的原本是想回答彩票定理中很多未被解决的问题,如为啥权重重新初始化后效果就不好了。意外发现了supermask,就是权重彩票。但这篇文章的实验还是在小数据集上CIFAR10和MNIST上利用小网络实现的。

mask criteria

  因为彩票那片论文中提到初始化的值对结构会有影响,因此这篇文章顺沿这个思路,对mask的函数不仅仅是训练后的权重 w f w_f wf,另外还加上了一个初始权重 w i w_i wi。下图给出了本篇文章的几个判断标准。
在这里插入图片描述  用这几个标准进行”彩票实验“,最后得出的结果:其中large_final就是原版彩票实验采用的方法,本文提出的其他几个方法中,只有magnitude_increase的标准最后得到的结果和large_final的结果近似。但其他几个方法,如large_init_large_final,movement,标准下得到的子网络性能也能超过原网络。

权重彩票2
  本文最主要的两个创新点在于:在彩票的基础上增加了Mask-1 actions、Mask-0 actions实验,并且发现了supermask。前者是”彩票实验“中,可以随机初始化的权重;后者是和”彩票实验“中一样,应该被剪掉的权重。

Mask-1 actions

  本文对初始化也有不同的操作。

  1. 保持原先(所有)参数的分布,重新初始化。
  2. 保持原先(保留下来的)参数分布,重新初始化。
  3. 保持原先(保留下来的)参数的正负号,再乘以一个常数(原先所有分布的标准差)
    这三种方法进行彩票实验,结果如下:
    权重彩票3
      作者在实验中还加了另外一个限定条件”sign“,当连符号也一起初始化时,彩票实验的效果很差(虚线所示)。如果把符号固定成和原先权重符号相同,再用上三种方法初始化,都得到较好的实验结果(实线所示)。在文中,他们说 :

optimizers work well anywhere in the correct sign quadrant for the weights, but encounter difficulty crossing the zero barrier between signs.

Mask-0 actions

  在论文的这一部分,作者探索了0值的重要性。做了一个对比试验,一个是百分百还原彩票实验,另一个是把彩票实验中原先应该给“冻结为零“的权重”冻结为初始值“,最后发现前者的效果更好。作者怀疑是mask是掩盖本来就要在训练过程中趋向于0的权重。
  为了验证这一假设,作者做了一个mask-0实验,将一部分要被剪去的权重设置为0,另一部分随机初始化。
权重彩票4
  上图显示了三种不同的mask-0策略的效果。variant1和variant2的区别在于 w i > w f w_i > w_f wi>wf,且未被pruned权重的取值。variant1和variant2都比原版彩票实验效果要好,验证了上面作者的猜想。另外,variant2效果要略好于variant1。(启发)

Supermasks

  作者为了探究训练过程究竟“优化”了模型多少。他们用large_final mask(其实就是彩票原文的方法)对原先的大网络进行掩膜。不加训练,直接进行测试,在MNIST数据集上仍然有接近百分之四十的正确率。
  为了寻找更优秀的supermask,作者结合之前做过的实验,定义了一个large_final_same_sign的mask criterion,这个criterion的mask能在MNIST上达到 80 % 80\% 80%的精度,在CIFAR-10上有 24 % 24\% 24%的精度。如果再加上mask-1 action中的第三个策略(即将网络剩余的权重设置为保持正负号的标准差常数,而非倒带为原先的初始值),达到的效果更加惊人:在MNIST上达到 86 % 86\% 86%的精度,在CIFAR-10上有 41 % 41\% 41%的精度。
  本文还提出了尝试优化mask的方法: w ′ = w i ⊙ g ( m ) w^{\prime}=w_{i} \odot g(m) w=wig(m)这个式子就是常见的掩膜的式子,其中的 m m m是可以训练的。 g ( m ) = Bern ⁡ ( S ( m ) ) g(m)=\operatorname{Bern}(S(m)) g(m)=Bern(S(m)) Bern ⁡ ( ⋅ ) \operatorname{Bern}(·) Bern()是伯努利分布。 S ( m ) S(m) S(m)是sigmoid函数。该掩膜可以通过SGD函数来训练。训练得到的mask在MNIST上的准确率达到 95.3 % 95.3\% 95.3%在CIFAR-10上的准确率达 65.4 % 65.4\% 65.4%

权重彩票5

最终实验结果汇总:

权重彩票6quanzhongciap
  上面的S.C.是signed constant,就是mask-1 action中的第三个方法。DWR为Dynamic Weight Rescaling approach。





What’s Hidden in a Randomly Weighted Neural Network?

  这一篇又是上一篇“权重版彩票定理”工作的延续,也是第一篇九头蛇那篇论文工作的基础。在这篇文章中明确提出了:在充足参数冗余的随机初始化的网络中,存在一组子网络精度能够达到相同参数量、训练后的网络。在权重版彩票定理中寻找supermask的方法是用SGD,这篇文章提出了一个新的算法:edge-popup算法:对每个随机的权重打分,保留分数最高的k个权重。指出了上一篇寻找supermask方法的缺陷:在他们的算法中,即使每个权重的概率 p p p是固定的,该算法也从来不会观察一个相同的子网络两次。这会导致梯度估计非常不稳定,会使得训练困难。

edge-popup algorithm

  该算法给每个u和v之间的edge两个值,一个是本身神经网络的权重 w u v w_{uv} wuv,另一个是该算法提供的分数 s u v s_{uv} suv。算法全过程只更新 s u v s_{uv} suv,不更新权重。直观上,bp算法可以知道loss“想要”v的input改变多少(一个参数乘上一个负梯度)。如果u的output和负梯度是“同一阵营“的,那么 s u v s_{uv} suv的值就会增加。
权重彩票7
  上图给出了一个大略的实现方法,最重要的公式就是: s u v ← s u v − α ∂ L ∂ I v Z u w u v s_{u v} \leftarrow s_{u v}-\alpha \frac{\partial \mathcal{L}}{\partial \mathcal{I}_{v}} \mathcal{Z}_{u} w_{u v} suvsuvαIvLZuwuv
  下面给出该公式的具体的细节:对于上式中的 I \mathcal{I} I Z \mathcal{Z} Z,有: I v = ∑ u ∈ V ( ℓ − 1 ) w u v Z u \mathcal{I}_{v}=\sum_{u \in \mathcal{V}^{(\ell-1)}} w_{u v} \mathcal{Z}_{u} Iv=uV(1)wuvZu。其实这个式子就是非常普通的前馈网络的公式。该算法最终是为了找到一个子网络 G = ( V , E ) \mathcal{G}=(\mathcal{V}, \mathcal{E}) G=(V,E),每次前馈需要计算的也只是被选中的top-k个值,所以该关系进化为: I v = ∑ ( u , v ) ∈ E w u v Z u \mathcal{I}_{v}=\sum_{(u, v) \in \mathcal{E}} w_{u v} \mathcal{Z}_{u} Iv=(u,v)EwuvZu 或者 I v = ∑ u ∈ V ( ℓ − 1 ) w u v Z u h ( s u v ) \mathcal{I}_{v}=\sum_{u \in \mathcal{V}^{(\ell-1)}} w_{u v} \mathcal{Z}_{u} h\left(s_{u v}\right) Iv=uV(1)wuvZuh(suv)(二者等价)其中,对于前 k k k个排名的edge, h ( s u v ) h\left(s_{u v}\right) h(suv)为1,也就是 ( u , v ) ∈ E (u, v) \in \mathcal{E} (u,v)E,其余为0。因为 h ( ⋅ ) h(·) h()是一个二值函数,并不能直接求导,这里利用了straight-through gradient estimator(STE)进行估计。(量化常用的方法)即 g ^ s u v = ∂ L ∂ I v ∂ I v ∂ s u v = ∂ L ∂ I v w u v Z u \hat{g}_{s_{u v}}=\frac{\partial \mathcal{L}}{\partial \mathcal{I}_{v}} \frac{\partial \mathcal{I}_{v}}{\partial s_{u v}}=\frac{\partial \mathcal{L}}{\partial \mathcal{I}_{v}} w_{u v} \mathcal{Z}_{u} g^suv=IvLsuvIv=IvLwuvZu。最终,公式进化为上述公式。 s ~ u v = s u v − α ∂ L ∂ I v w u v Z u \tilde{s}_{u v}=s_{u v}-\alpha \frac{\partial \mathcal{L}}{\partial \mathcal{I}_{v}} w_{u v} \mathcal{Z}_{u} s~uv=suvαIvLwuvZu
  文章还给出了该算法每次迭代都能够使得损失函数进一步缩小的详细数学证明,并不是特别难理解。这里不做详细解释。

Experiment

  实验过程的各个参数不做赘述,主要讲一下实验获得的结果:
  首先是CIFAR10,小网络的结果,两个水平线是原模型经过SGD和Adam方法训练后达到的精度,其余的两根线是两种不同分布的权重初始化后达到的精度。
权重彩票8
  还给出了和上一篇文章的对比,进步还是非常明显的。
权重彩票9
  本文还给出了大网络,大数据集(ImageNet)上的结果:
权重彩票10
  在CIFAR-10上,由本文提出的算法得到的未经训练的网络效果和训练后的原网络效果一样好。在ImageNet上,该算法得到的网络在ResNet50上达不到训练后的效果,但是能够达到ResNet34的效果。在ResNet101上由该算法得到的网络性能甚至超过了VGG16。

Proving the Lottery Ticket Hypothesis: Pruning is All You Need

  在文章貌似在知乎上很火,大致浏览了一下,用数学证明了上一篇文章:一个充足过度参数的神经网络,不用改变权重,也能有一个和训练后网络精度近似的子网络。
  这是一篇纯数学的论文了感觉是…这么多公式看的我头肿,有空补一下。。。

  • 11
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
题目描述 有 $n$ 种不同面额的硬币,每种硬币的数量无限。假设硬币面额为 $a_1,a_2,...,a_n$,现在要用这些硬币来找零 $m$ 元,求最少需要的硬币个数。 样例 输入:5,[1,2,5] 输出:2 算法1 (动态规划) $O(nm)$ 很明显,这是一道动态规划的问题。 设 $f[i][j]$ 为只考虑前 $i$ 种硬币,总面值为 $j$ 元时所需的最少硬币数。 显然,对于 $f[i][j]$,我们可以选择不取第 $i$ 种硬币,此时 $f[i][j]=f[i-1][j]$。也可以选择取第 $i$ 种硬币,此时 $f[i][j]=f[i][j-a_i]+1$。 于是,状态转移方程为: $$f[i][j]=\min(f[i-1][j],f[i][j-a_i]+1)$$ 注意,当 $j<a_i$ 时,显然不能取第 $i$ 种硬币,因此 $f[i][j]=f[i-1][j]$。 最终答案即为 $f[n][m]$。 时间复杂度 状态数为 $nm$,转移复杂度为 $O(1)$,故总时间复杂度为 $O(nm)$。 参考文献 无 C++ 代码 class Solution { public: int coinChange(vector<int>& coins, int amount) { int n = coins.size(); vector<vector<int>> f(n+1,vector<int>(amount+1,0x3f3f3f3f)); for(int i=0;i<=n;++i) f[i][0] = 0; for(int i=1;i<=n;++i){ for(int j=1;j<=amount;++j){ if(j<coins[i-1]) f[i][j] = f[i-1][j]; else f[i][j] = min(f[i-1][j],f[i][j-coins[i-1]]+1); } } return f[n][amount]>=0x3f3f3f3f?-1:f[n][amount]; } }; Java 代码 class Solution { public int coinChange(int[] coins, int amount) { int n = coins.length; int[][] f = new int[n+1][amount+1]; for(int i=0;i<=n;++i) f[i][0] = 0; for(int i=1;i<=n;++i){ for(int j=1;j<=amount;++j){ if(j<coins[i-1]) f[i][j] = f[i-1][j]; else f[i][j] = Math.min(f[i-1][j],f[i][j-coins[i-1]]+1); } } return f[n][amount]>=0x3f3f3f3f?-1:f[n][amount]; } }

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值