ANN Converse to SNN|(2) Max-Norm
Fast-Classifying, High-Accuracy Spiking Deep Networks Through Weight and Threshold Balancing
作者:Peter U. Diehl,Daniel Neil, Jonathan Binas,Matthew Cook,Shih-Chii Liu and Michael Pfeiffer
会议:IJCNN2015
原文链接:paper
代码:https://github.com/dannyneil/spiking_relu_conversion
python版本代码:https://github.com/luaGeeko/Spiking-DeepNetworks_1
作者首次提出权重归一化的概念,虽然在之前Cao的文章中(博客链接)在实验部分对每层的阈值进行了不同的设置,但是Diehl的工作更加实现了自动确定,后续有工作证明权重归一化与阈值平衡在转换的过程中起到了相同的作用。同时作者也指出ReLU函数可以认为是没有不应期的IF模型在脉冲发放率的近似,这是在Cao的工作上的另一个推进。
主要工作
作者仔细分析了转换的方法会产生误差的原因在于
- 神经元没能接受足够的输入而引发脉冲,导致此单元的脉冲发放率低于预期
- 神经元接受了太多输入,导致神经元每个仿真步都产生多个脉冲(作者在这里的意思应该是导致膜电势高于阈值太多,从基于事件的角度确实会导致神经元产生太多脉冲),原因在于要么神经元接受了太多脉冲或者某些权重比阈值高太多
- 由于脉冲输入的概率特性,脉冲串不均匀,可能会导致某个特征集过度**或者没怎么**的情况
同时提出了转换方法的步骤:
- 使用ReLU**函数,bias设置为0,使用反向传播进行训练
- 直接将权重进行映射
- 使用权重归一化
作者使用IF神经元模型
作者同样指出阈值和权重之间的平衡关系,权重对应了神经元要接受的输入,而阈值则负责决定是否发放脉冲,当二者比值较大时,神经元的脉冲发放率会提高,反之会降低,因此二者关系要做好平衡。为了保证输入足够小而防止神经元过度放电,最稳妥的办法就是假设所有的可能的正的活动同时发生,然后将权重按照可能的最大值进行缩放,如果连最大值都只能在一个时间步内发放一个脉冲,那么就不会有同时发放多个脉冲的事情了。为此,作者提出了两种方法:model-based normalization和data-based normalization。
Model-based Normalization
Model-based Norm不使用数据集,针对每层的每个神经元的所有连接的和找最大,之所以用和是因为要使归一化后该神经元释放脉冲后不会再次立刻释放脉冲,然后将每层的每个神经元的所有连接除以这个最大值。(该方法的从根本上杜绝了信息剩余,但全部正值对应的连接同时发放脉冲且所有负的权重对应的神经元都不活动的发生几率实在太小太小,这会大大减速网络运行,且易受噪声干扰)
matlab代码
function [net, norm_constants] = normalize_nn_model(varargin)
net = varargin{1};
if(nargin ~= 1)
dofinal = varargin{2};
end
if (dofinal)
endlayer = numel(net.size)-1;
else
endlayer = numel(net.size)-2;
end
for l = 1 : endlayer
weight_sum = max(sum(max(0,net.W{l}),2));
norm_constants(l) = 1 ./ weight_sum;
net.W{l} = net.W{l} ./ weight_sum;
end
end
Data-based Normalization
Data-based norm使用训练数据集寻找最大**值对权重进行缩放,是考虑到训练集和测试集具有相同的分布,因此最大**值通常是接近的。算法的第10行之所以是将最大值除以先前层的缩放值作为本层的缩放系数,是考虑到当先前层权重做了缩放后,对应的本层的输入也会缩小,本层的最大**值也就有原来的最大变成了最大值除以之前的缩放值。第5-7行寻找最大权重的原因是排除个别权重特别大,当其输入被**后反而比得到的**值更大的情况,但是这种情况通常来说比较小。
matlab代码
function [nn, factor_log] = normalize_nn_data(nn, x)
% Repropagate Activations
nn.testing = 1;
nn = nnff(nn, x, zeros(size(x,1), nn.size(end)));
nn.testing = 0;
previous_factor = 1;
for l = 1 : numel(nn.size)-1
% Find the max and rescale
weight_max = max(max(max(0, nn.W{l})));
activation_max = max(max(max(0, nn.a{l+1})));
scale_factor = max(weight_max, activation_max);
applied_inv_factor = scale_factor / previous_factor;
nn.W{l} = nn.W{l} / applied_inv_factor;
factor_log(l) = 1 / applied_inv_factor;
previous_factor = applied_inv_factor;
end
实验
作者使用泊松编码,设计了全连接和卷积网络结构在MNIST数据集上进行了测试,
上述实验可以看到使用归一化后,SNN的性能可以与ANN相当。注意到作者将输入脉冲发放率作为了一个超参数,同时加上之前提到的阈值,二者都会对神经元的脉冲发放造成影响,作者也将二者作为因变量分析了其对分类性能的影响:输入脉冲编码频率越高,网络神经元能发放的脉冲也就越多,在一定阈值下,对网络预测的影响不是很大;神经元阈值越高。神经元脉冲越难发放,可以看到,当神经元阈值较低时,网络的分类能力大幅下降,同样,当阈值特别高时,网络中**值比较小的神经元在仿真时间内可能永远都无法发放脉冲,将直接导致分类性能的下降。
最后作者列举了一下snn在MNIST上的分类性能。
总结
归一化是我认为的整个conversion方法的基石,但是作者的max-norm只在MSE loss和MNIST进行了实验,因此无法辨别出最大归一化的缺点就是对复杂网络和大型数据集不友好,增加相当多的时间延迟。
下一篇: CNN简介