脉冲神经网络(Spiking neural network, SNN)将脉冲神经元作为计算单元能够模仿人类大脑的信息编码和处理过程。不同于CNN使用具体的值(continuous)进行信息传递SNN通过脉冲序列(discrete)中每个脉冲发射时间(temporal)进行信息的传递能够提供稀疏但强大的计算能力。脉冲神经元将输入累积到膜电压当达到具体阈值时进行脉冲发射能够进行事件驱动式计算。由于脉冲事件的稀疏性以及事件驱动的计算形式SNN能提供卓越的能源利用效率是神经形态结构的首选神经网络
尽管SNN有很多好处但目前仅能处理相对简单的任务由于神经元复杂的动态性以及不可导的操作暂时没有一个可扩展的训练方法。DNN-to-SNN是近期广泛的SNN训练方法该方法将目标DNN转化成SNN的中间DNN网络进行训练然后转成SNN并复用其训练的参数在小数据集分类上能达到不错的性能但是在大数据集上分类结果不太理想
论文打算使用DNN-to-SNN转化方法将SNN应用到更复杂的目标检测领域中图片分类只需要选择分类就好而目标检测则需要神经网络进行高度准确的数字预测难很多。在深入分析后论文实现YOLO的转换主要面临以下两个问题
论文直接使用DNN-to-SNN转换方法将SNN应用到目标检测中发现性能下降得十分严重在分析性能下降原因后得出两个主要原因a) 大量神经元的脉冲发射频率过低 b) SNN缺少leaky-ReLU的高效实现
在SNN中根据输入的幅度产生脉冲序列进行无损的内容传递是极为重要的。但在固定时间激活过度或激活不足的神经元内将可能导致内容损失这和临界电压V t h V_{th}Vth的设置有关。设置过高神经元需要累积很长时间的电压才能发射脉冲相反则会过多地发射脉冲。发射频率通常定义为N T \frac{N}{T}TNN NN为T TT个timestep的脉冲发射总数最大的发射率为100%即每个timestep都发射脉冲
为了防止神经元的激活过度和激活不足权值和临界电压都需要精心地选择。为此很多研究提出了归一化的方法比如常用的Layer-wise normalization(layer-norm)。该方法通过该层的最大化激活值来归一化层的权值如公式4w ww和b bb为权重λ \lambdaλ为输出特征图最大值。经过归一化后神经元的输出就归一到[ 0 , 1 ] [0,1][0,1]方便设定临界电压。由于最大激活值λ \lambdaλ从训练集得到的所以测试集和训练集需要有相同的分布但论文实验发现这种常规的归一化方法在目标检测任务上会导致明显的性能下降
图1展示了通过layer-norm后的各层每个channel的最大激活值蓝色和红色的线分别为每层的平均激活值和最小激活值。可以看到每层的归一化后的激活值偏差较大总体而言layer-norm使得神经元的channel偏向激活不足这在仅需选择分类的图片分类任务是不被察觉的但对于需要预测准确值的检测任务的回归则不一样。比如传递0.7则需要在10个timestep脉冲7次0.007则需要在1000timestep脉冲7次。当tempstep本身就很少时过低的发射率可能会因发射不到足够的脉冲而导致信息丢失
从上面的分析可以看出channle-norm能够避免过小的归一化激活值从而保持较高的脉冲发射频率使得神经元能够在短时间内准确地传递信息是深度SNN在解决更高级的机器学习问题的一种可行解决方案
论文提出Spiking-YOLO是脉冲神经网络在目标检测领域的首次成功尝试实现了与卷积神经网络相当的性能而能源消耗极低。论文内容新颖比较前沿推荐给大家阅读
离心弦:楼主知道这个模型是怎么预测的吗?论文上说训练时预测出N个框,然后和ground true进行二分图的matching,将最佳matching的框和GT去求Loss。那预测时怎么办?我模型预测出N个框,直接进行得分筛选吗?源码里面也没有预测的部分。