Learning both Weights and Connections for Efficient Neural Networks 论文进一步的实验与思考

Learning both Weights and Connections for Efficient Neural Networks 论文进一步的实验与思考

上一篇文章我实验了net-300-100网络去识别手写数字体,通过剪枝发现,每一次的激活神经元个数没有明显的变化,而且每次都要激活50%左右,同时浅层的权重可以被大量的剪枝掉,最后只剩下300多个,下面我们就做一个实验,把第一层的个数增加到600个神经元,看看相应的实验结果

net-600-100 实验

下面就是基于以上的代码,使用手写数字体的数据集进行的实验,我会记录实验过程中的数据变化过程。

初次训练网络

在这里插入图片描述
比net-300-100强了一丢丢,几乎可以忽略不计。

神经元激活

从上图可以看出,经过20次的迭代,网络的正确率已经到达了97%
对于数字6的图像进行识别,图像的非零点数是155个,第一层神经元激活个数303,第二层神经元激活个数76,识别结果是6正确

层数 个数
fc1 303
fc2 76
fc3 结果是6

通过这个数据,可以看出第一层网络好像激活的概率大概在50%左右。

为了证实这个想法,我再做一个net-1200-100 的实验。

正确的个数到了9749个,确实又有了一丢丢的进步,
对于数字6的图像进行识别,图像的非零点数是155个,第一层神经元激活个数623,第二层神经元激活个数77,识别结果是6正确

层数 个数
fc1 623
fc2 77
fc3 结果是6

进一步印证了我的想法。下面我再试一个小的网络做一个对比,更有说服力。

为了证实这个想法,我再做一个net-150-100 的实验。

正确的个数到了9697个,确实是最差的那一个,但是其实结果并没有差很多。
对于数字6的图像进行识别,图像的非零点数是155个,第一层神经元激活个数78,第二层神经元激活个数74,识别结果是6正确
这个明显说明50%左右的激活率是没有毛病的,其实这个结果也可以解释,因为我用的RELU的激活函数,激活和不激活是以0为界的,就是随机的将数据切分为两部分,按照随机的来说,就是应该激活一半的神经元。

层数 个数
fc1 78
fc2 74
fc3 结果是6

在这里插入图片描述

第一层权重的深度分布图

在这里插入图片描述

权重柱状图

下图是全部参数的柱状图、第一层参数的柱状图、第二层参数的柱状图、第三层参数的柱状图,可以看出参数都基本集中的0附近,成中心分布的样子。其实这个参数的分布并没有太大的差异,下面就进行剪枝操作。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述在这里插入图片描述

剪枝99.5

经过非常多次剪枝99.5%然后参数再训练,整个网络的性能还是会慢慢提升的
计算出来的阈值是:0.013283501705269006
在这里插入图片描述
在这里插入图片描述

层数 个数
fc1 78
fc2 71
fc3 1

下图是全部参数的柱状图、第一层参数的柱状图、第二层参数的柱状图、第三层参数的柱状图,可以看出参数都基本集中的0附近,成中心分布的样子。其实这个参数的分布并没有太大的差异,下面就进行剪枝操作。
在这里插入图片描述
在这里插入图片描述在这里插入图片描述
在这里插入图片描述

此时,一共有2657个神经元,第一层652个,第二层1433个,第三层572个

通过上面的数据,和第一次的进行对比,我这里做到了两次剪枝之后的权重的个数都是2657个,总数是一样的,但是两次网络的正确率还是差别很大的,net-300-100的正确率只有65%而net-600-100却做到了89%的正确率,要说网络中真正多出来的东西,那就是多了300个激活函数,说明网络中激活函数,对整个网络的影响还是很大的。
然后再看第一层神经元是652个,net-300-100剪枝后的神经元是300个,这里发现,其实第一层的权重差不多就是输入层神经元的个数。也说明了从浅层中提取出了更多的特征。下次可以做一个实验,通过增加net-300-100中把100变成200,看看剪枝后的正确率是否有提高。

net-300-200 实验

下面就是基于以上的代码,使用手写数字体的数据集进行的实验,我会记录实验过程中的数据变化过程。

初次训练网络

在这里插入图片描述
比net-300-100强了一丢丢,几乎可以忽略不计。

神经元激活

在这里插入图片描述
从上图可以看出,经过20次的迭代,网络的正确率已经到达了97%
对于数字6的图像进行识别,图像的非零点数是155个,第一层神经元激活个数303,第二层神经元激活个数76,识别结果是6正确

层数 个数
fc1 190
fc2 137
fc3 结果是6

剪枝99.104

经过非常多次剪枝99.5%然后参数再训练,整个网络的性能还是会慢慢提升的
计算出来的阈值是:0.012800342721641052
在这里插入图片描述
这惊讶的正确率,此时的权重数量是一样的,但是正确率确实飙升。
在这里插入图片描述
在这里插入图片描述

层数 个数
fc1 49
fc2 98
fc3 6

下图是全部参数的柱状图、第一层参数的柱状图、第二层参数的柱状图、第三层参数的柱状图,可以看出参数都基本集中的0附近,成中心分布的样子。其实这个参数的分布并没有太大的差异,下面就进行剪枝操作。
在这里插入图片描述
在这里插入图片描述在这里插入图片描述
在这里插入图片描述

此时,一共有2663个神经元,第一层1102个,第二层835个,第三层725个

通过上面的数据,前两次进行对比,权重的个数都是2663个左右,总数是一样的,但是网络的正确率还是差别很大的,net-300-100的正确率只有65%而net-600-100却做到了89%的正确率,而net-300-200却做到了96%的正确率,这次网络中激活函数的增加还没有net-600-100增加的多,但是却达到了最高的正确率。
再看权重的分布情况,此时虽然增加的是第二层网络的个数,但是第一层的参数却增加了很多,同时第二层的参数减少了。这种变化像是,参数在各层之间进行了均等。
其实我认为,非线性激活函数的存在,可以相当于很多权重,由泰勒展开定理我们可以知道,函数都可以用无数个简单的函数来表示,所以多了激活函数后,增加了第二层的表达能力,就不需要很多参数来拟合这些非线性,所以可以节约下来参数给第一层,提取出更多的特征值。但是刚刚的激活神经元个数可以看出,仅仅激活了49个第一层的神经元,却达到了很高的正确率。可能特征的多少不太重要,特征的精细度对识别的影响较大。
还有一个神奇的现象就是,我把第二层激活函数去掉,好像整个正确率不会有很大的改变,第二层的激活函数像是一个摆设一样,这也很令我费解,既然增加了第二层的神经元,正确率上升很多,但是激活函数好像有不太重要,跟我的分析产生了一些矛盾。不过经过思考好像也是可以解释的,可能对结果的正确性的确定是和特征有关的,我们100个中间层时,输出结果时不管输入多少特征,决策的特征只有100个,而变成200的时候,决策的特征就有200个翻了两倍,所以正确率会飙升。然后再讨论激活函数的问题,因为我用的relu的激活函数,本来就是线性的,激活的数值是不会有变化的,同时我们训练的过程中是强化跟特征有关的权重,所以和解无关的特征对应的权重基本被我们设置为0了,所以这个数值激活不激活对我们的结果其实影响不太大。这样解释,就可以解释上面的问题了。
那下面就可以实验net-300-300了,来看一看实验结果是怎么样的。

net-300-300 实验

一直按上面实验,其实结果是大同小异的,300-300的网络在同样的参数量的情况下是可以做到96%的正确率的。但是这其中是因为,我做实验过程中出现了一个失误,这个失误也出现在了300-200网络中,所以300-200网络的正确率才会飙升。

实验过程中出现了重大的问题

由于论文中指出,权重小的权重相对于不重要,所以可以删除掉而不影响准确率。但是这似乎是有些问题了,我在实验中多剪去了一些权重,所以多出来了很多零权重,然后把零权重训练,之后的网络正确率瞬间就上来了,在达到同样的正确率的情况下,这种训练的网络可以减少更多的权重,以我用300-300的实验为例,我把权重剪枝到99.5也就是权重只剩下1641个,比当初的网络权重快少一半了,但是正确率仍然是96%。在同样的正确率下,用这种训练一些小权重的方法,可以大大减少权重的数量。这也从侧面说明一些问题,好像并不是说小的权重就不重要,我们整个网络中还是需要有大有小的权重的。
还有一个重要的问题,就是最有一层的隐藏层的激活函数可以去掉,对输出结果其实并没有很大的影响,但是第一层的隐藏层的激活函授去掉之后网络的正确率就烂掉了。

剪枝99.5

经过非常多次剪枝99.5%然后参数再训练,整个网络的性能还是会慢慢提升的
计算出来的阈值是:0.012652947250753777
在这里插入图片描述
这惊讶的正确率,此时的权重数量其实很少了,但是正确率没有变化。
在这里插入图片描述
在这里插入图片描述

层数 个数
fc1 22
fc2 47
fc3 7

此时就激活很好的神经元,却仍然以很高的正确率把数字识别成功。
下图是全部参数的柱状图、第一层参数的柱状图、第二层参数的柱状图、第三层参数的柱状图,可以看出参数都基本集中的0附近,成中心分布的样子。其实这个参数的分布并没有太大的差异,下面就进行剪枝操作。
在这里插入图片描述
在这里插入图片描述在这里插入图片描述
在这里插入图片描述
此时,一共有1641个神经元,第一层1043个,第二层268个,第三层330个
从这个每层的神经元个数中,或许我们也可以看出一些问题来,因为后面层的权重较大,如果剪枝是按全部的百分比进行剪枝的话,大量的浅层的权重就会被剪枝掉,但是其实那些权重其实是有用的,或许权重较小的或许真的不重要,只是我们的剪枝方式有问题,导致一些不重要的权重变大,然后就一直无法被剪掉,从而抢占了有用权重的位置。
用了这种方法,就连300-100在剪枝99%时的正确率也是96%,这就是这么的神奇。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章