如何在脉冲神经网络中将 "boolean spike result" 映射到 "floating point input current value"?
How to map "boolean spike result" to "floating point input current value" in spiking neural network?
我的问题是关于尖峰神经网络。典型的尖峰神经元的输入通常是一些浮点值,表示其流入电流,通常以 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;
}
这很好,如果它的目的是确定输入图像与某些 class 的关系,或者打开或关闭电机或 lamp。但是主要问题来了:模型没有描述神经元互连。我们不能将一个神经元连接到下一个神经元,因为它通常发生在大脑内部。
如何将前一个神经元的bool isSpiked
值转换为下一个神经元的float I
输入值 ?
这不是一个典型的 SO 问题,但这是答案。
当然你的模型不能回答你的问题,因为它是一个神经元模型。对于连接(大脑或其他地方的突触),您需要一个突触模型。在生物学中,突触前尖峰(即 "input spike" 到突触)导致突触后膜电导的时间依赖性变化。这种电导变化在生物体中的形状近似具有所谓的双指数形状:
突触前峰值发生在时间 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).
我的问题是关于尖峰神经网络。典型的尖峰神经元的输入通常是一些浮点值,表示其流入电流,通常以 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;
}
这很好,如果它的目的是确定输入图像与某些 class 的关系,或者打开或关闭电机或 lamp。但是主要问题来了:模型没有描述神经元互连。我们不能将一个神经元连接到下一个神经元,因为它通常发生在大脑内部。
如何将前一个神经元的bool isSpiked
值转换为下一个神经元的float I
输入值 ?
这不是一个典型的 SO 问题,但这是答案。
当然你的模型不能回答你的问题,因为它是一个神经元模型。对于连接(大脑或其他地方的突触),您需要一个突触模型。在生物学中,突触前尖峰(即 "input spike" 到突触)导致突触后膜电导的时间依赖性变化。这种电导变化在生物体中的形状近似具有所谓的双指数形状:
突触前峰值发生在时间 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).