当前位置: 代码迷 >> 综合 >> Learning both Weights and Connections for Efficient Neural Networks 论文进一步的实验与思考
  详细解决方案

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

热度:129   发布时间:2023-09-23 02:30:45.0

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

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

net-600-100 实验

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

初次训练网络

Learning both Weights and Connections for Efficient Neural Networks 论文进一步的实验与思考
比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

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

第一层权重的深度分布图

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

权重柱状图

下图是全部参数的柱状图、第一层参数的柱状图、第二层参数的柱状图、第三层参数的柱状图,可以看出参数都基本集中的0附近,成中心分布的样子。其实这个参数的分布并没有太大的差异,下面就进行剪枝操作。
Learning both Weights and Connections for Efficient Neural Networks 论文进一步的实验与思考
Learning both Weights and Connections for Efficient Neural Networks 论文进一步的实验与思考
Learning both Weights and Connections for Efficient Neural Networks 论文进一步的实验与思考Learning both Weights and Connections for Efficient Neural Networks 论文进一步的实验与思考

剪枝99.5

经过非常多次剪枝99.5%然后参数再训练,整个网络的性能还是会慢慢提升的
计算出来的阈值是:0.013283501705269006
Learning both Weights and Connections for Efficient Neural Networks 论文进一步的实验与思考
Learning both Weights and Connections for Efficient Neural Networks 论文进一步的实验与思考

层数 个数
fc1 78
fc2 71
fc3 1

下图是全部参数的柱状图、第一层参数的柱状图、第二层参数的柱状图、第三层参数的柱状图,可以看出参数都基本集中的0附近,成中心分布的样子。其实这个参数的分布并没有太大的差异,下面就进行剪枝操作。
Learning both Weights and Connections for Efficient Neural Networks 论文进一步的实验与思考
Learning both Weights and Connections for Efficient Neural Networks 论文进一步的实验与思考Learning both Weights and Connections for Efficient Neural Networks 论文进一步的实验与思考
Learning both Weights and Connections for Efficient Neural Networks 论文进一步的实验与思考

此时,一共有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 实验

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

初次训练网络

Learning both Weights and Connections for Efficient Neural Networks 论文进一步的实验与思考
比net-300-100强了一丢丢,几乎可以忽略不计。

神经元激活

Learning both Weights and Connections for Efficient Neural Networks 论文进一步的实验与思考
从上图可以看出,经过20次的迭代,网络的正确率已经到达了97%
对于数字6的图像进行识别,图像的非零点数是155个,第一层神经元激活个数303,第二层神经元激活个数76,识别结果是6正确

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

剪枝99.104

经过非常多次剪枝99.5%然后参数再训练,整个网络的性能还是会慢慢提升的
计算出来的阈值是:0.012800342721641052
Learning both Weights and Connections for Efficient Neural Networks 论文进一步的实验与思考
这惊讶的正确率,此时的权重数量是一样的,但是正确率确实飙升。
Learning both Weights and Connections for Efficient Neural Networks 论文进一步的实验与思考
Learning both Weights and Connections for Efficient Neural Networks 论文进一步的实验与思考

层数 个数
fc1 49
fc2 98
fc3 6

下图是全部参数的柱状图、第一层参数的柱状图、第二层参数的柱状图、第三层参数的柱状图,可以看出参数都基本集中的0附近,成中心分布的样子。其实这个参数的分布并没有太大的差异,下面就进行剪枝操作。
Learning both Weights and Connections for Efficient Neural Networks 论文进一步的实验与思考
Learning both Weights and Connections for Efficient Neural Networks 论文进一步的实验与思考Learning both Weights and Connections for Efficient Neural Networks 论文进一步的实验与思考
Learning both Weights and Connections for Efficient Neural Networks 论文进一步的实验与思考

此时,一共有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
Learning both Weights and Connections for Efficient Neural Networks 论文进一步的实验与思考
这惊讶的正确率,此时的权重数量其实很少了,但是正确率没有变化。
Learning both Weights and Connections for Efficient Neural Networks 论文进一步的实验与思考
Learning both Weights and Connections for Efficient Neural Networks 论文进一步的实验与思考

层数 个数
fc1 22
fc2 47
fc3 7

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

  相关解决方案