参考书目:《神经计算建模实战——基于brainpy》 吴思

0.引言

上一篇笔记中的HH模型可以精准刻画离子通道的开启与关闭,从而模拟动作电位的产生细节。其缺点在于当需要模拟动作电位发放细节时,HH模型需要较小的数值积分步长,并且其变量较多,计算代价较大。

从更宏观的角度上来看,我们模拟神经网络时,往往更加关注一个神经元对其他神经元的影响,因此细致模拟膜电位变化过程是非必要的。因此,在模拟大规模神经网络时,需要重新引入一些简化的神经元模型。本文从最基础的泄露整合发放LIF模型出发,介绍一些简化模型(包括二次整合发放QIF模型、指数整合发放ExpIF模型、适应性指数整合发放AdEx模型、Izhikevich模型、Hindmarsh-Rose模型、泛化整合发放GIF模型)以及brainpy代码实现。

1.泄露整合发放LIF模型

1.1 LIF模型定义

LIF模型将细胞膜简化为单通道电路,在达到膜电位阈值前,神经元的膜电位主要由泄露通道调控,泄露通道的电阻可被建模为常值R。神经元的静息电位为,神经元脉冲发放的膜电位阈值为,神经元产生脉冲后的重置膜电位为,不应期时长为(最初的LIF模型没有考虑不应期),接受输入电流。当膜电位超过阈值,神经元发放脉冲,之后进入不应期,此时膜电位不发生变化。其等效电路图如下:

根据基尔霍夫定律和电位发放规律,列出LIF模型的数学表达式如下:

第一个等式中的表示模型的时间常数,越大则模型的动力学变化越慢。

1.2 LIF模型的代码实现

利用brainpy编程如下:

import brainpy as bp
import brainpy.math as bm
import numpy as np
import matplotlib.pyplot as pltclass LIF(bp.dyn.NeuGroup):def __init__(self,size,V_rest=0.,V_reset=-5.,V_th=20.,R=1.,tau=10.,t_ref=5.,name=None):super(LIF,self).__init__(size=size,name=name)#初始化参数self.V_rest = V_restself.V_reset = V_resetself.V_th = V_thself.R = Rself.tau = tauself.t_ref = t_ref#初始化变量self.V = bm.Variable(bm.random.randn(self.num) + V_reset)self.input = bm.Variable(bm.zeros(self.num))self.t_last_spike = bm.Variable(bm.ones(self.num)* -1e7) #上一次脉冲发放时刻self.refractory = bm.Variable(bm.zeros(self.num,dtype=bool)) #是否处于不应期self.spike = bm.Variable(bm.zeros(self.num,dtype=bool)) #脉冲发放状态#积分函数self.integral = bp.odeint(f=self.derivative,method='exp_auto')#定义膜电位关于时间变化的微分方程def derivative(self,V,t,R,Iext):dvdt = (-V + self.V_rest + R * Iext) / self.taureturn dvdt#更新函数def update(self,tdi):t,dt = tdi.t,tdi.dtrefractory = (t - self.t_last_spike) <= self.t_ref #是否处于不应期V = self.integral(self.V,t,self.R,self.input,dt=dt) #根据时间步长更新膜电位V = bm.where(refractory,self.V,V)spike = V>self.V_th #更新脉冲状态self.spike.value = spikeself.t_last_spike = bm.where(spike,t,self.t_last_spike) #更新上次脉冲时间self.V.value = bm.where(spike,self.V_reset,V)self.refractory.value = bm.logical_or(refractory,spike)self.input[:]=0#重置外界输入

初始化一个LIF模型并进行数值模拟,外界输入电流恒定为20.5mA,模拟时长200ms,利用DSRunner运行:

group = LIF(1)
runner = bp.dyn.DSRunner(group,monitors=['V'],inputs=('input',20.5))
#外界输入电流恒定为20.5mA
runner(200)plt.plot(runner.mon.ts,runner.mon.V)
plt.xlabel('t(ms)')
plt.ylabel('V')
plt.show()

输出结果如图:

由图可知,LIF模型并不能模拟真实情况下动作电位的形状。在发放动作电位前,LIF 神经元膜电位的增长速度将逐渐降低,并非像真实神经元那样先缓慢增长,在达到一定值之后转为迅速增长。之后介绍的QIF模型针对此缺陷进行了改进。

1.3 LIF模型的其他性质

根据LIF模型,可解出其数学表达式,由此可知当电流强度大于引发神经元膜电位到达阈值电位的基强度电流时,才能产生动作电位。在此例中,即输入电流需超过20才能产生动作电位,不信的话,可以试试。

试试就试试:

duration = 200
neu1 = LIF(1,t_ref=5.)
neu1.V[:] = bm.array([-5.]) #   V初始值
runner = bp.dyn.DSRunner(neu1,monitors=['V'],inputs=('input',20))
runner(duration)
plt.plot(runner.mon.ts,runner.mon.V,label=r'$I=20$')neu2 = LIF(1,t_ref=5.)
neu2.V[:] = bm.array([-5.]) #   V初始值
runner = bp.dyn.DSRunner(neu2,monitors=['V'],inputs=('input',20.1))
runner(duration)
plt.plot(runner.mon.ts,runner.mon.V,label=r'$I=20.1$')neu3 = LIF(1,t_ref=5.)
neu3.V[:] = bm.array([-5.]) #   V初始值
runner = bp.dyn.DSRunner(neu3,monitors=['V'],inputs=('input',19.9))
runner(duration)
plt.plot(runner.mon.ts,runner.mon.V,label=r'$I=19.9$')neu4 = LIF(1,t_ref=5.)
neu4.V[:] = bm.array([-5.]) #   V初始值
runner = bp.dyn.DSRunner(neu4,monitors=['V'],inputs=('input',19))
runner(duration)
plt.plot(runner.mon.ts,runner.mon.V,label=r'$I=19$')neu5 = LIF(1,t_ref=5.)
neu5.V[:] = bm.array([-5.]) #   V初始值
runner = bp.dyn.DSRunner(neu5,monitors=['V'],inputs=('input',21))
runner(duration)
plt.plot(runner.mon.ts,runner.mon.V,label=r'$I=21$')plt.xlabel('t(ms)')
plt.ylabel('V')
plt.legend()
plt.show()

试试的结果如下:

当输入电流<20时,不产生动作电位,大于20产生动作电位。强度为 20 的电流不能激发动作电位,因为此时神经元的膜电位随时间无限逼近但并不能达到

2 二次整合发放(QIF)模型

2.1 QIF模型定义

为了弥补LIF模型在动作电位上的表征缺陷,Latham等人提出了二次整合发放模型(Quadratic Integrate-and-Fire model),其微分方程的二阶项更好地模拟了动作电位:

,其中

与LIF模型的方程相比,QIF模型的第一个式子右侧是关于V的二次方程,即代表膜电位的上升由慢变快。代表神经元的兴奋阈值,控制了神经元的发放频率和发放前膜电位增长速度。当膜电位达到峰值后,膜电位被重置为,代码如下:

import brainpy as bp
import brainpy.math as bm
import numpy as np
import matplotlib.pyplot as pltclass QIF(bp.dyn.NeuGroup):def __init__(self,size,V_rest=-65.,V_reset=-68.,V_th=-30.,V_c=-50.0,a_0=.07,R=1.,tau=10.,t_ref=5.,name=None):super(QIF,self).__init__(size=size,name=name)#初始化参数self.V_rest = V_restself.V_reset = V_resetself.V_th = V_thself.V_c =V_cself.a_0 = a_0self.R = Rself.tau = tauself.t_ref = t_ref#初始化变量self.V = bm.Variable(bm.random.randn(self.num) + V_reset)self.input = bm.Variable(bm.zeros(self.num))self.t_last_spike = bm.Variable(bm.ones(self.num)* -1e7) #上一次脉冲发放时刻self.refractory = bm.Variable(bm.zeros(self.num,dtype=bool)) #是否处于不应期self.spike = bm.Variable(bm.zeros(self.num,dtype=bool)) #脉冲发放状态#积分函数self.integral = bp.odeint(f=self.derivative,method='exp_auto')#定义膜电位关于时间变化的微分方程def derivative(self,V,t,Iext):dvdt = (self.a_0 * (V-self.V_rest) * (V-self.V_c) + self.R * Iext) /self.taureturn dvdt#更新函数def update(self,tdi):t,dt = tdi.t,tdi.dtrefractory = (t - self.t_last_spike) <= self.t_ref #是否处于不应期V = self.integral(self.V,t,self.input,dt=dt) #根据时间步长更新膜电位V = bm.where(refractory,self.V,V)spike = V>self.V_th #更新脉冲状态self.spike.value = spikeself.t_last_spike = bm.where(spike,t,self.t_last_spike) #更新上次脉冲时间self.V.value = bm.where(spike,self.V_reset,V)self.refractory.value = bm.logical_or(refractory,spike)self.input[:]=0#重置外界输入group = QIF(1)
runner = bp.dyn.DSRunner(group,monitors=['V'],inputs=('input',8.)) #恒定电流8mA
runner(500) #500msplt.plot(runner.mon.ts,runner.mon.V)
plt.ylabel('V')
plt.show()

输出结果:可以看到动作电位时,V的上升由慢变快

2.2 QIF模型的基强度电流

根据QIF的微分方程可求出本例中基强度电流为3.94

模拟不同的输入电流:

duration=500
group1 = QIF(1)
runner = bp.dyn.DSRunner(group1,monitors=['V'],inputs=('input',5.))
runner(duration)
plt.plot(runner.mon.ts,runner.mon.V,label=r'$I=5.$')group2 = QIF(1)
runner = bp.dyn.DSRunner(group2,monitors=['V'],inputs=('input',4.))
runner(duration)
plt.plot(runner.mon.ts,runner.mon.V,label=r'$I=4.$')group3 = QIF(1)
runner = bp.dyn.DSRunner(group3,monitors=['V'],inputs=('input',3.))
runner(duration)
plt.plot(runner.mon.ts,runner.mon.V,label=r'$I=3.$')group4 = QIF(1)
runner = bp.dyn.DSRunner(group4,monitors=['V'],inputs=('input',2.))
runner(duration)
plt.plot(runner.mon.ts,runner.mon.V,label=r'$I=2.$')plt.xlabel('t(ms)')
plt.ylabel('V(mV)')
plt.legend()
plt.show()

得到图像如下:

2.3 对QIF模型的影响

理论推导如下:

在之前的例子中,可以求得,下面测试的取值对QIF神经元发放频率及发放曲线的影响:

duration = 600
group1 = QIF(1,a_0=0.005)
runner = bp.dyn.DSRunner(group1,monitors=['V'],inputs=('input',5.))
runner(duration)
plt.plot(runner.mon.ts,runner.mon.V,label=r'$a0=0.005$')group2 = QIF(1,a_0=0.045)
runner = bp.dyn.DSRunner(group2,monitors=['V'],inputs=('input',5.))
runner(duration)
plt.plot(runner.mon.ts,runner.mon.V,label=r'$a0=0.045$')group3 = QIF(1,a_0=0.085)
runner = bp.dyn.DSRunner(group3,monitors=['V'],inputs=('input',5.))
runner(duration)
plt.plot(runner.mon.ts,runner.mon.V,label=r'$a0=0.085$')plt.xlabel('t(ms)')
plt.ylabel('V(mV)')
plt.legend()
plt.show()

测试结果如下:随着的增长,神经元发放频率先增加后降低,阈下膜电位变化曲线从平滑上升变为先缓慢上升,后急速上升。因此不仅影响了 QIF 模型的发放频率,还刻画了膜电位的上升曲线。

2.4 神经元模型

QIF模型的微分方程可以通过数学推导转化为更简洁的形式,得到神经元模型,其与的QIF模型等价,其方程为:

【brainpy学习笔记】简化神经元模型1——LIF、QIF模型相关推荐

  1. 【brainpy学习笔记】突触可塑性模型2——Hebb学习律、Oja法则与BCM法则

    参考书目:<神经计算建模实战--基于brainpy> 吴思 书接上文: [brainpy学习笔记]突触可塑性模型1--STP/STDP模型_Fellyhosn的博客-CSDN博客https ...

  2. 【brainpy学习笔记】突触模型2——化学突触的生理学模型、电突触模型

    参考书目:<神经计算建模实战--基于brainpy> 吴思 书接上文: [brainpy学习笔记]突触模型1--化学突触的现象学模型https://blog.csdn.net/Fellyh ...

  3. OPENMP学习笔记(1)——简介,模型,运行

    OPENMP学习笔记(1)--简介,模型,运行 简介: OpenMP的英文全称是Open Multiprocessing,一种应用程序接口(API,即Application Program Inter ...

  4. 学习笔记【Java 虚拟机④】内存模型

    若文章内容或图片失效,请留言反馈.部分素材来自网络,若不小心影响到您的利益,请联系博主删除. 总目录 学习笔记[Java 虚拟机①]内存结构 学习笔记[Java 虚拟机②]垃圾回收 学习笔记[Java ...

  5. 深度学习笔记 第五门课 序列模型 第三周 序列模型和注意力机制

    本文是吴恩达老师的深度学习课程[1]笔记部分. 作者:黄海广[2] 主要编写人员:黄海广.林兴木(第四所有底稿,第五课第一二周,第三周前三节).祝彦森:(第三课所有底稿).贺志尧(第五课第三周底稿). ...

  6. cips2016+学习笔记︱简述常见的语言表示模型(词嵌入、句表示、篇章表示)

    在cips2016出来之前,笔者也总结过种类繁多,类似词向量的内容,自然语言处理︱简述四大类文本分析中的"词向量"(文本词特征提取)事实证明,笔者当时所写的基本跟CIPS2016一 ...

  7. 学习笔记:马尔可夫模型

    马尔可夫模型 马尔可夫 安德雷·马尔可夫(Andrey Markov),俄国数学家,在概率论.数理统计和随机过程等领域做出了重要贡献,20世纪初期提出了一种数学模型,即马尔可夫过程Markov Pro ...

  8. 视频教程 | Egret Pro 入门学习笔记(10):认识模型

    今天的视频是通过点击按钮切换网格,以及点击按钮切换材质,来一起认识下EgretPro中的基础模型与基础材质,加深对模型的认识以及熟练Egret2d与EgretPro之间的UI交互. 大家都知道,在3D ...

  9. 【brainpy学习笔记】突触模型1——化学突触的现象学模型

    参考书目:<神经计算建模实战--基于brainpy> 吴思 0 引言 之前的章节介绍了单个神经元的建模,而神经元与神经元之间通过突触相连接,从而形成了一个网络.因此,要形成整个网络还需要对 ...

最新文章

  1. 如何检查文件是否是python中的目录或常规文件? [重复]
  2. SQL 判断两个时间段是否有交叉
  3. 基础之实战猜年龄游戏
  4. nagios学习笔记(二)
  5. 高性能、低成本的高防 IP 产品能现实吗?
  6. animation停留_这些Animation动画技巧与细节你知道么
  7. centos 时间同步_ftp同步更新,ftp远程文件同步更新日志详情
  8. 跨平台加密版 SQLite 3 - wxSQLite3
  9. python 爬虫代码_Python 你见过三行代码的爬虫吗
  10. Spring Boot笔记-线程池调度计划仅运行一次
  11. android融云监听消息,关于android:融云-IMkit-拦截或监听所有发送消息
  12. 富人是如何发财的——思考致富的方法
  13. sed原理及p参数的运用的分析
  14. bigdecimal java 最大值_Java中的数学运算BigDecimal
  15. python的chr可以转换中文吗,chr()在python中怎么实现编码的转换
  16. onenote快捷键_onenote快捷键的高效用法
  17. 线性代数(同济) 第六版 复习
  18. 16个Javascript的Web UI库、框架及工具包
  19. ..以前似乎用作函数或命令,与其在此处作为变量名称的用法冲突?
  20. 金九银十,一个新的王者在8月即将加冕——Treasure project(TPC)重磅来袭,你参与了吗?

热门文章

  1. 开开心心爬APP,结果一坑连一坑
  2. JAVA毕设项目售楼系统(Vue+Mybatis+Maven+Mysql+sprnig+SpringMVC)
  3. 弱矩阵组织下,项目经理如何最大程度影响项目
  4. 斗地主单机版V1.5根据正宗的斗地主规则改编的单机游戏简体中文绿色免费版
  5. RTKLIB demo5对Glonass模糊度固定的算法优化
  6. 【Java 23 种设计模式】原则(1)
  7. 计算机脑机接口永生,马斯克宣布脑机接口将在8月更新,“大脑永生”能否变成现实?...
  8. 实时多人脸检测和识别
  9. ImageIo外部字体导入
  10. 上半年GDP数据出炉!上北深广强者恒强,几个省份增长是意外惊喜