【Learning both Weights and Connections for Efficient Neural Networks】论文笔记

本文介绍了一种基于权重裁剪的网络压缩技术,该技术通过移除网络中不重要的连接来减少模型参数的数量,同时保持较高的预测准确性。文章详细讨论了裁剪过程包括训练、设置阈值进行裁剪及再训练等步骤,并对正则化、Dropout概率调整、裁剪比重等注意事项进行了说明。

追随Song Han大神的第一篇网络压缩论文(NIPS’15),论文链接:https://arxiv.org/abs/1506.02626
这篇论文只是简单介绍了裁剪的思路,并没有涉及到网络加速。

效果:

作者用了4个网络实验
Lenet-300-100, pruning reduces the number of weights by 12×
Lenet-5, pruning reduces the number of weights by 12×
AlexNet, pruning reduces the number of weights by 9×
VGG-16, pruning reduces the number of weights by 12×
修剪后的网络精度下降很低,有的还有所提高。

主要思想:

修剪网络中不重要的连接(直接置0处理),个人感觉有点像Dropout,但是和Dropout具体实现不同。(Dropout不修剪参数,只是随机选择,参数具体内容还在)

分3步:
1)训练网络,得到训练好的权重
2)设定一个阈值,对权重进行裁剪(个人在代码中选取的阈值是α*weight.std)
3)利用裁剪完的权重进行retrain(再训练),对保留下来的参数进行微调

注意事项:

正则化:

作者采用了L2范数,关于L1范数和L2范数对裁剪产生的影响,作者在论文后的实验中谈到。

Dropout概率的调整:

retrain期间的Dropout概率与原始训练时的Dropout概率相关,作者在论文中给出了计算公式。
这里写图片描述

裁剪比重:

网络中不同层参数裁剪的比例不同。卷积层参数裁剪比例应较小,裁剪过多会对网络的精度造成很大影响;因为全连接层的参数数量最多,而且全连接层对网络精度的提升效果并不是很大,所以全连接层裁剪比例应较大,笔者实验也证明了这一点。作者在论文中同时也给出了裁剪比例测试结果。
这里写图片描述

迭代裁剪:

其实就是循环裁剪(笔者认为retrain过程中训练一次,裁剪一次)

去除无效神经元:

就是将0输入和0输出的神经元裁剪掉

权重保存:

这点作者在论文中并没有提到,其实裁剪完的权重如果正常保存的话所占空间和原始权重是一样的,因为都还是float型,即便里面置0,但是所占空间的大小是不会变的。
笔者在裁剪完后发现了这个问题,最开始笔者采取只保存权重中的非0值和非0值的索引位置,但是发现这种保存方式在裁剪率较低的情况下会导致权重文件所占的空间比原始权重大,只有当裁剪比例达到一定程度时权重文件所占空间才会比原始权重小。
通过拜读了Song Han大神的下一篇论文【Deep Compression: Compressing Deep Neural Networks with Pruning, Trained Quantization and Huffman Coding】(ICLR’2016)看到了更好的解决方案。

树突在人工神经网络中能赋予其准确、稳健和参数高效的学习能力,主要体现在以下几个方面。 从准确学习能力来看,树突可以通过非线性处理增强网络对复杂模式的捕捉能力。树突具有非线性的整合特性,能够对输入信号进行复杂的加权和非线性变换,这使得网络可以更精准地拟合复杂的函数。例如,在处理图像识别任务时,树突的非线性整合可以帮助网络更好地区分不同物体的特征,提高识别的准确性。 在稳健学习能力方面,树突能够增强网络对噪声和干扰的抵抗能力。树突的多分支结构可以对输入信号进行分布式处理,当部分输入受到噪声干扰时,其他分支的正常输入仍能保证网络的稳定输出。比如在语音识别中,即使输入的语音信号存在一定的背景噪声,树突的分布式处理特性可以使网络依然能够准确识别语音内容。 对于参数高效学习能力,树突的引入可以减少网络所需的参数数量。树突的局部计算特性使得网络可以在局部区域进行高效的信息处理,避免了传统神经网络中大量全局参数的使用。这不仅降低了网络的计算复杂度,还减少了过拟合的风险。例如在自然语言处理任务中,使用带有树突的神经网络可以在较少参数的情况下实现较好的语言模型效果。 ```python # 以下是一个简单的带有树突模拟的神经网络示例 import numpy as np # 模拟树突的非线性函数 def dendritic_nonlinearity(x): return np.tanh(x) # 简单的神经网络层带有树突模拟 class DendriticNeuralLayer: def __init__(self, input_size, output_size): self.weights = np.random.randn(input_size, output_size) self.bias = np.random.randn(output_size) def forward(self, x): # 树突的非线性处理 dendrite_output = dendritic_nonlinearity(np.dot(x, self.weights) + self.bias) return dendrite_output # 示例使用 input_size = 10 output_size = 5 layer = DendriticNeuralLayer(input_size, output_size) input_data = np.random.randn(1, input_size) output = layer.forward(input_data) print(output) ```
评论 19
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值