ANN to SNN 学习算法
最近集中看了几篇ANN to SNN的学习算法,主要对里面的关键算法进行简单的总结,理解还不够透彻,欢迎私聊或者评论。
论文发表年份是从上到下,最好是从上到下看,因为其他作者的论文里面会写到前人的一些贡献和启发,虽然我第一篇看的是Spiking-YOLO。第二篇的作者公开了他的代码,Diehl大佬的两篇论文都公开了代码,可以加深对论文的理解。
- Spiking Deep Convolutional Neural Networks for Energy-Efficient Object Recognition
- Fast-Classifying, High-Accuracy Spiking Deep Networks Through Weight and Threshold Balancing
- Going deeper in spiking neural networks Vgg and residual architecture
- Spiking-YOLO Spiking Neural Network for Energy-Efficient Object Detection
第一篇:Spiking Deep Convolutional Neural Networks for Energy-Efficient Object Recognition
可以结合这篇博客进行理解:Spiking Deep Convolutional Neural Networks for Energy-Efficient Object Recognition
- 该论文描述了一种将CNN转换为SNN的方法:首先对CNN的结构进行裁剪,使其符合SNN的要求;然后对经过裁剪的CNN进行训练,得到权重,最后将学习到的网络权值直接应用到由裁剪的CNN所得到的SNN结构中。(这篇论文主要是写对网络架构的改变,没写到权重的映射、阈值的调整,后面的几篇论文的侧重点就是在权重和阈值了。)
- CNN如何进行裁剪(限制),得到SNN结构(emmm,这篇作者把网络结构介绍的相当仔细,生怕读者看不懂CNN到SNN的变化过程,爱了爱了)
这是一个典型的CNN架构:
这是一个被裁剪后的CNN架构:
这是最终转换来的SNN架构(具体转换方法,看看论文里面的,比较简单)
这是SNN架构的一些细节:包括脉冲编码,卷积层和池化层以及最后的全连接层
- 实验结果:写了识别率和能耗两个方面。
第二篇:Fast-Classifying, High-Accuracy Spiking Deep Networks Through Weight and Threshold Balancing
可以结合这篇博客进行理解:Fast-Classifying, High-Accuracy Spiking Deep Networks Through Weight and Threshold Balancing
这篇文章有具体的代码。提出需要同时控制阈值和权重,因此用一个缩放因子进行限制。两种归一化方法:model-based normalization 和 data-based normalization。对网络结构的转换和第一篇的转换思想类似。其中,model-based正则化:考虑所有可能的正的激活值,并且通过可能的最大激活值(同时也是下一层的输入)对权重缩放。如果最大的正输入仅仅对应单个脉冲,那么网络同一个神经元在一个timestep内至多发射一个脉冲。通过这样做,脉冲神经网络变得具有鲁棒性——可以接受任意高的输入发射率并且完全消除由于太多输入而导致的转换损失。data-based正则化:对于这个方法,在训练完网络后,训练集前向传播,我们将ReLU过后的激活值保存下来,接着,权重根据最大的可能激活值缩放,所以这种情况下也只会同时发射一个脉冲。另外,这种方法也需要将最大的输入权重考虑进去(即它的缩放因子是激活值和权重绝对值的最大值),因为如果不考虑权重的话还是有可能出现在一个timestep内需要发射多次脉冲,但这个方法需要训练集和测试集同分布。
第三篇:Going deeper in spiking neural networks Vgg and residual architecture
- 针对ANN转SNN,提出几个ANN结构的约束:不用Bias,使用dropout;池化层采用平均池化。
- 提出ANN转SNN的normalization方法:Spike-Norm 和之前的方法区别在于:前两种方法时对ANN层面进行改动,这个方法是对SNN层面进行修改的。对于一个经过训练的神经网络,第一步是在足够大的时间窗下为网络生成输入泊松脉冲序列。泊松脉冲序列允许我们记录加权脉冲的最大总和,这将被网络的第一神经层接收(输入编码过程)。为了使神经元的时间延迟最小化,同时保证神经元的触发阈值不过低,我们根据第一层接收到的最大尖峰输入对第一层进行加权归一化。设置第一层的阈值后,在第一层的输出端为我们提供一个具有代表性的脉冲序列,使我们能够为下一层生成输入脉冲流,依次类推。
- 提出一种可以用在SNN的残差结构块:两条通路连接处加入Relu函数,这和ResNet结构有所不同;残差网络的两条通路设置成相同的阈值;前几层网络采用较小的卷积层进行卷积。
第四篇:Spiking-YOLO Spiking Neural Network for Energy-Efficient Object Detection
可以结合这篇博客进行理解:Spiking-YOLO:脉冲神经网络高效的目标检测
作者贡献:
- 深度SNN的首个目标检测模型首次提出了一个在深度SNN中实现高效目标检测的模型Spiking YOLO。在非平凡数据集上,Spiking YOLO的结果与原始DNN相当,即98%。
- 逐通道归一化 提出了了一个针对深度SNN的细粒度归一化方法。所提出的方法能够在多个神经元中获得更高但适当的放电率,从而在深度SNN中实现了快速、准确的信息传输。(感觉结合作者的实验结果,这个归一化效果不是很明显)
- 阈值不平衡的有符号神经元提出了一种在SNN域中准确有效地实现leaky-ReLU的方法。该方法易于在最小开销的神经形态芯片上实现。(这个方法的效果比较明显,具有借鉴价值)