Bootstrap

转载—脉冲神经网络之Tempotron学习算法

脉冲神经网络之Tempotron简介(一)

原创  2017年10月15日 22:45:07
  • 34
脉冲神经网络之Tempotron简介

       脉冲神经网络(SNN)这个概念在上个世纪就被提出,现在也不算什么新的模型。但它和传统BP神经网络还是很不一样的,最近加入的实验室做的就是这个方向,因此一直在学这个东西。这篇文章就由本人用来记录些学习过的内容,同时也作分享用,有理解错的地方希望有大佬能来指正吐舌头

       脉冲神经网络比传统人工神经网络更能模仿生物神经元之间的连接与通信,能够进行复杂的时空信息的处理。但SNN模仿的脉冲具有不连续和非线性的特征,因此在构建对该神经网络的监督学习算法上比较困难。根据SNN实现的特征可以将监督学习的算法分为在线/离线、单脉冲/多脉冲、多层/单层的学习算法。这里要介绍的Tempotron就是单脉冲输出的监督学习算法。

        该算法在论文《The tempotron : a neuron that learns spike timing based decisions》被详细地阐述。这一篇博客中先之阐述在该论文中提出的监督算法的基本概念,有时间再写一篇从代码的角度详细阐述具体实现方法。

        脉冲神经网络神经元的基本模型是:对于一个神经元,接受来自前端突触(上一层的脉冲输入)之后膜电位(membrane voltage)升高,当膜电位升高到一个阈值(V threshold)之上时,该神经元就发出一个脉冲作为输出,之后立刻shut所有与该神经元连接的前端突触不再接受脉冲,此时膜电位回落到复位电压并维持一段时间,之后才重新接受脉冲输入。知道了神经元基本的工作方式,我们如何用SNN去处理一个分类问题?第一步,我们要考虑如何将样本编码为和时间相关的脉冲序列,比如如何将图像中(255,255,255)这样的数据转换成脉冲神经网络可以理解的脉冲序列;第二步,如何构建一个神经元的模型,这个就是刚才说的那个基本模型;第三步,要求确定一个学习算法,从而对神经网络进行训练,这里就采用Temptron监督方法。

        Temptron方法提出:神经元后突触膜电位(PSPs, Postsynaptic Potentials)是所有与之相连的上一层脉冲输入的加权和。膜电位的计算公式:

                                                            

       从公式中可以看出,膜电位是将每个前端突触输入的脉冲在当前时间的大小K(t - ti)加权(乘wi)再求和,最后加上复位电压(Vrest)。其中K代表kernel,是介于0~1之间的数值,代表了在t时间下ti时间点传入的脉冲的贡献,K的计算公式如下:

K(t - t[i]) = V0(exp(- (t - t[i]) / taum) - exp( - (t - t[i]) / taus))

       画成图像基本上是这个样子:

                                                                              

       从公式中可以看出,K在脉冲发出的ti时间点处数值最高,在其他点数值相对下降,表示前端突触在这个时间点有最大的脉冲输入(afferent),随着t-t[i]增大,该突触贡献的脉冲输入减小。taum和taus是控制整个K(t)图像大致形状的参数,在我们构建脉冲神经网络时就是超参数。V0在K的公式中作用在于将K normalize到0~1的范围内。当ti > t时,K是不存在(vanishing)的,因为不存在在当前时间之后的脉冲数值。在一个时间窗口中,如果V(t)达到了V threshold,那么该神经元就输出脉冲(fire)并迅速返回复位电压,并在一段时间内不再接受输入(称为不应期)。

       既然输出神经元仅有输出1和不输出0两个状态,当应用于分类任务时如何输出多个类别?这里可以采用二进制编码的方式输出不同类别。以MNIST数据集为例,输出的类别一共有26种,如果用二进制编码,26个类别在16(2^4)和32(2^5)之间,因此可以采用5位二进制数表示26个类别,因此脉冲神经网络有5个输出节点,输出类如00000表示A ,而00001表示B,以此类推。

       

     回顾一下我们训练脉冲神经网络的目标,即是通过训练使得该神经网络输出神经元对对应的样本产生正确的膜电位。通俗来说,比如只有一个输出神经元,我们期望能够识别是否输入了A这个字母,那么当输入A时,该输出神经元输出脉冲,当输入其他字母时该神经元抑制输出。因此假设对每一个输出神经元,当输出类别要求该神经元不发送脉冲(输出0)时,如果输出神经元发出了脉冲(可理解为事与愿违),该批训练(epoch)就更新与该神经元相连的上一层神经元的权重,更新的目的就是抑制该输出神经元的膜电位,于是更新权重时所有与该输出层神经元连接的输入层神经元的连接权重会减小,减小的数值是:

                                                                     

其中K是和上面同样的函数,数值在0~1之间,于是λ就定义了每次更新权重时更新数值的幅度(或许可以理解为类似学习率的东西)。tmax表示在一个时间窗口(0,T)内该输出层神经元达到电压最大值Vmax的时间。同理,当该输出层神经元输出为0(未发放脉冲),但目标是输出1时,此次更新就会对每个权重增加一个上面的数值,结果就是增大了输出层神经元的膜电位,最终达到发放脉冲的目的。

                                                              
       上图为训练过后的输出层神经元的膜电位在一个时间窗口内的变化。 从上图可以看出,所有符合输出(图中黑线+)脉冲被刺激,所有输出与结果不符的(途中灰色-)脉冲被抑制。最终符合样本分类结果的脉冲被输出,模型达到了预期效果。
        学习的过程中麻烦了学长很多。。先写到这里待更吧。
;