【问题标题】:How to map "boolean spike result" to "floating point input current value" in spiking neural network?如何在尖峰神经网络中将“布尔尖峰结果”映射到“浮点输入电流值”?
【发布时间】:2018-10-19 13:46:26
【问题描述】:

我的问题是关于尖峰神经网络。典型尖峰神经元的输入通常是一些浮点值,表示其流入电流,通常以 mA 或类似单位表示,如下面的简单示例:

static const float 
      dt = 1.0/1000,  // sampling period
      gL = 0.999,     // leak conductance
      vT = 30.0;      // spiking voltage threshold
float mV = 0;         // membrane voltage

// Leaky integrate-and-fire neuron model step
bool step_lif_neuron(float I) { // given input current "I", returns "true" if neuron had spiked
    mV += (I - mV*gL)*dt;
    if( mV > vT ) { // reset? heaviside function is non-differentiable and discontinuous
        mV = 0;
        return true;
    }
    return false;
}

这很好,如果它的目的是确定输入图像与某个类的关系,或者打开或关闭电机或灯。但这里出现了主要问题:模型不描述神经元互连。我们无法将一个神经元连接到下一个神经元,因为它通常发生在大脑内部。

如何将前面神经元的bool isSpiked转换为下一个神经元的float I输入值

【问题讨论】:

    标签: neural-network mapping simulation neuroscience


    【解决方案1】:

    这不是典型的 SO 问题,但这是答案。

    当然,您的模型无法回答您的问题,因为它是一个神经元模型。对于连接(大脑中或其他地方的突触),您需要一个突触模型。在生物学中,突触前尖峰(即突触的“输入尖峰”)导致突触后膜电导随时间变化。这种电导变化在生物体内的形状近似具有所谓的双指数形状:

    突触前尖峰发生在时间 0。

    这种电导变化导致(时间依赖性)电流进入突触后神经元(即接收输入的神经元)。为简单起见,许多模型直接模拟输入电流。常见的形状是

    • 双指数(现实)
    • alpha(类似于双指数)
    • 指数(更简单但仍能捕捉最重要的属性)
    • 矩形(更简单,便于理论模型)
    • 三角形(最简单,一个时间步长只需一个脉冲)。

    这是在最大相同高度下缩放的比较:

    并针对相同的总电流进行缩放(在时间过程中如此积分):

    那么在尖峰 NN 模型中,尖峰如何导致另一个神经元中的输入电流?

    假设您直接对电流建模,您需要选择要在模型中使用的电流时间进程。然后,每当一个神经元发出尖峰信号时,您就会将您选择的形状的电流注入到连接的神经元中。

    作为一个例子,使用指数电流:突触后神经元有一个变量I_syn,它给出突触输入,每次突触前神经元尖峰时,它会根据连接的权重递增,在所有其他时间步长中它会衰减与突触的时间常数成指数关系(指数衰减)。

    伪代码:

    // processing at time step t
    I_syn *= exp(-delta_t / tau_synapse)  // delta_t is your simulation time step
    
    foreach presynaptic_spike of neuron j:
       I_syn += weight_of_connection(j)
    

    这个话题不是用一两个情节或一个方程式来回答的。我只是想指出主要概念。您可以在您选择的计算神经科学教科书中找到更多详细信息,例如在Gerstner's Neuronal Dynamics (which is available via website)

    【讨论】:

    • 我认为输入电流通常是通过“点积”产生的:I_syn=0; foreach(j): I_syn += X(J)*W(j); ,不是吗?但问题是关于X(J)。我什至考虑过对其进行二值化,从某种意义上说,“如果 X(J) 真的是布尔值,那么我们将只是通过增加权重或不增加权重来操作,就像一些输入电流一样”。正如你所说,那将是 a() = dirac delta。
    • 点积 X·W 在 ANN 中所做的事情(即非尖峰神经网络)。使用 delta 形电流(如您所说)或指数电流(如果您通过跟踪实现它们,如我显示的代码中所示)时,您可以在尖峰网络中执行相同的操作。
    • 如果你尝试在想象中运行你的代码,第一个语句会导致未定义的行为:I_syn *= something,但 I_syn 的内容是未定义的,它可能是垃圾或一些大值,所以我们几乎肯定会在那里得到NaN。你如何初始化它?开头有什么?另外,tau_synapse 是什么?是常量吗?如果它是常量并且dt 是常量,那么我们甚至不需要计算昂贵的exp()
    • 这就是为什么它是伪代码。 I_syn 在模拟开始时通常为零(这意味着您假设在开始之前没有尖峰),tau_synapse 是指数的衰减,请参阅 Gerstner 的书以了解取决于类型的可能值的范围突触,当然你也可以预先计算衰减。
    • 那么它是否应该像“摩擦”一样工作,假设电流 = 速度(在运动学运动中):v *= 0.99; v += a*dt;?我理解正确吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-01-19
    • 1970-01-01
    • 2011-07-24
    • 2016-01-28
    • 2022-07-08
    • 2010-09-19
    • 1970-01-01
    相关资源
    最近更新 更多