ANN Converse to SNN|(1) 开篇之作

Spiking Deep Convolutional Neural Networks for Energy-Efficient Object Recognition

作者:Yongqiang Cao, Yang Chen,Deepak Khosla
期刊:International Journal of Computer Vision
发表时间:2015
原文链接:paper

Conversion方法的开山之作,(在此之前也有类似思想的几个工作,后续会补充),训练SNN的困难很大,诸如STDP等生物可解释性方法在无监督上尚且效果不佳,在监督学习中,如何引入监督信号也是一大困难。作者想到能否定制一个与SNN结构相同的ANN结构,使用反向传播算法训练定制好的ANN,然后将得到的权重直接映射到SNN中去,作者使用的网络也较简单。

主要工作

作者指出,转换的方法遇到的一大困难是不可接受的精度损失,可能的原因有三个:

  • 一是CNN网络中的负值很难在SNN中准确的表达,负值的来源主要有三个:
    • tanh激活函数的输出在-1和1之间
    • 每个卷积层输出的特征图来源于输入的加权和加上偏置,当权重和偏置同时为负时会导致输出为负(关于加权输出为负的情况有很多,作者这里只列出了一种显而易见的情况)
    • 对输入的预处理可能产生负值
  • SNN很难表示偏置,不管bias是正还是负,SNN中没有这个概念
  • Maxpooling在SNN中需要使用两层来表示,增加复杂性的同时会造成精度下降

对于网络中的负值,作者指出,一种可能的方法是使用抑制性神经元,建立一个双脉冲发放机制的网络,但是会double神经元的数量并使得SNN连接更加复杂,为避免上述困难,作者提出CNN的网络要进行如下处理:

  • 首先是确保网络各层输出为正值
    • 对输入的预处理结果使用abs函数
    • 将tanh激活函数改用ReLU激活函数(这在现在已经不再是问题)
  • 去除卷积和全连接层的偏置项
  • 使用均值池化(作者说的是Spatial Linear Subsampling)而不是空间最大池化,stride要无重叠
使用LIF神经元模型

V ( t ) = V ( t − 1 ) + L + X ( t ) I f V ( t ) ≥ θ , s p i k e a n d r e s e t V ( t ) = 0 I f V ( t ) < V m i n , r e s e t V ( t ) = V m i n V(t)=V(t-1)+L+X(t)\\ If\quad V(t) \geq \theta,\quad spike\quad and\quad reset\quad V(t)=0\\ If\quad V(t)<V_{min} ,\quad reset\quad V(t)=V_{min} V(t)=V(t1)+L+X(t)IfV(t)θ,spikeandresetV(t)=0IfV(t)<Vmin,resetV(t)=Vmin对于SNN中的LIF(经过实验,作者后续指出使用IF神经元更好)的阈值,作者将其作为了超参数进行设置,后续许多工作探讨了阈值选择的重要性。

SNN的对预处理的输入进行泊松编码,设像素强度为 I i j k I_{ijk} Iijk,其中ij表示空间位置,k表示通道位置,该像素在时刻t对应的输入为
i f r a n d < c I i j k , t h e n s p i k e if \quad rand < c I_{ijk}, \quad then \quad spike ifrand<cIijk,thenspike其中 c c c用来控制最大脉冲发放频率,若像素强度为0-1,当 c = 1 c=1 c=1时,最大脉冲发放频率为1KHz;若 c = 0.8 c=0.8 c=0.8,最大像素1仅有 80 % 80\% 80%的概率发放脉冲;如果 c > 1 c>1 c>1则会使部分像素强度没有区别,故这里的泊松编码的最大脉冲发放频率为1KHz,作者此处设置 c = 1 3 c = \frac{1}{3} c=31

实验

作者在Tower Dasaset和CIFAR-10上进行了验证。

在cifar-10实验之后,作者指出在复杂网络和任务上通常需要更多的仿真时间来达到与ANN相同的性能,同时指出三点改进

  • 使用IF神经元模型
    V ( t = V ( t − 1 ) + I ( t ) V(t = V(t-1)+I(t) V(t=V(t1)+I(t)

  • 使用软重置方法(作者并未提出这种说法)
    i f s p i k e , V ( t ) = V ( t ) − θ if \quad spike, \quad V(t) = V(t) - \theta ifspike,V(t)=V(t)θ

  • 第一个卷积层的阈值要进行改动(后续工作有分析为什么改动)

基于IF神经元和软重置的有效行会在后续的文章中进行说明,基于阈值改动的原因在max-norm的博客中进行说明。

总结

作为第一个提出的转换的方法,其中像泊松编码、IF模型(包括负值截断)、软重置、均值池化、阈值调整等技术一直沿用到现在,虽然没有明确指出ANN到SNN映射的理论,但已经注意到负值对整个转换过程的影响。

  • 5
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,以下是一个简单的Spike Response Model (SRM)的Matlab实现代码: ``` % SRM model parameters tau_m = 10; % Membrane time constant (ms) theta = -50; % Membrane threshold (mV) tau_s = 2; % Synaptic time constant (ms) w = 1; % Synaptic weight % Simulation parameters dt = 0.1; % Time step (ms) T = 1000; % Simulation time (ms) t = 0:dt:T; % Time vector % Input spike train spikes = zeros(size(t)); spikes(1:100:end) = 1; % Membrane potential and spike train v = zeros(size(t)); spike_train = zeros(size(t)); % Simulation loop for i = 2:length(t) dvdt = (-v(i-1) + w*spikes(i-1))/tau_m; v(i) = v(i-1) + dt*dvdt; if v(i) > theta spike_train(i) = 1; v(i) = 0; end end % Plot results figure; subplot(2,1,1); plot(t, spikes); title('Input spike train'); xlabel('Time (ms)'); ylabel('Spike train'); subplot(2,1,2); plot(t, spike_train); title('Output spike train'); xlabel('Time (ms)'); ylabel('Spike train'); ``` 在上面的代码中,我们首先设置了SRM模型的参数,包括膜时间常数tau_m、膜阈值theta、突触时间常数tau_s和突触权重w。然后,我们设置了模拟的参数,包括时间步长dt、模拟时间T和时间向量t。接下来,我们创建了一个输入脉冲列spikes。我们使用一个简单的方法,在每100个时间步长之间设置一个脉冲,以模拟一个周期为100ms的输入信号。然后,我们使用模拟循环来计算SRM模型的膜电位v和输出脉冲列spike_train。如果膜电位v超过了阈值theta,我们就会发射一个脉冲,并将膜电位v重置为0。最后,我们绘制了输入脉冲列和输出脉冲列。 希望这个代码能够帮助你更好地理解SRM模型。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值