65.9K
CodeProject 正在变化。 阅读更多。
Home

Neuro-Sim

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.99/5 (84投票s)

2015年10月4日

CPOL

25分钟阅读

viewsIcon

97311

downloadIcon

727

生物神经元的中间模拟。

一些预告截图

源代码

除了文章中的链接,如果你想获取最新更新或为项目做出贡献,源代码托管在 GitHub 上:https://github.com/cliftonm/neurosim

引言

在本文中,我将介绍一个神经元模拟器和学习工具。通常,神经元模拟要么高度理想化,由一个输入层、一个或多个隐藏层以及一个输出层组成。信号根据权重和求和阈值在网络中传播。此图是一个基本示例

(来自 http://www.scielo.br/scielo.php?pid=S0100-06832013000100010&script=sci_arttext

相反,其他神经元模拟器将是极低级别的,模拟钠、钾和钙通道。您可以阅读更多相关信息,但这里是一个开始:http://www.ncbi.nlm.nih.gov/books/NBK26910/

本文介绍的是一种中间方案,其中输入刺激(兴奋性或抑制性)的电特性会影响动作电位。此外,还模拟了神经元特性,例如其不应期(从动作电位中恢复所需的时间)。典型动作电位的大致图如下所示

(来自 https://en.wikipedia.org/wiki/Action_potential

在此处介绍的软件中,典型图如下所示(它没有那么漂亮的曲线)

“起搏器”神经元在 Neuro-Sim 中的理想化动作电位

Neuro-Sim 让您可以尝试特定的神经配置

模拟反射动作

以及玩转完整的网络,这看起来非常令人着迷

神经网络运行中的快照

本文开头引用约吉·贝拉(Yogi Berra)名言的原因是,尽管我们对神经元了解很多,但关于神经元群如何产生意识、思考能力等等,仍有许多理论(坦率地说,还有未知之处)。此外,请记住,大多数神经元研究都是侵入性的,需要探针来测量膜电位和/或电刺激神经元。在我看来,实际实现能够思考的神经网络仍然停留在理论领域。

历史

我最初在80286处理器时代(30年前,哦天哪),用C++写了一个非常相似的模拟器,以8Mhz运行,当时增加一个80287数学协处理器是一个显著的改进!那时,我只能模拟一个20x20的神经元网格,而且它还是断断续续地运行。本文介绍的模拟器可以轻松处理8000多个神经元,而且是在我的2.3Ghz i7笔记本电脑上以单线程运行,包括UI更新。所以,这曾是我多年来一直想复活的搁置项目之一,很高兴终于实现了。在当今的计算机上实现这一点最让我惊讶的是,我曾预计必须在线程中实现神经元“求和与发放”计算,并将其分批分配给可用的CPU。事实并非如此!所有神经元计算都在应用程序的主线程中运行。对于更大的网络,我预计需要平衡多个CPU上的工作负载,但我尚未测试该实现。

未模拟的内容

神经元的各种特性未被模拟。如果此处使用的术语不熟悉,请阅读下一节“神经元:速成班”。最值得注意的是,Neuro-Sim 没有考虑

  • 沿轴突的传播时间。

  • 有髓鞘与无髓鞘轴突(影响传播时间)。

  • 受体在树突或胞体上的位置(影响局部膜电位变化如何影响轴突丘)。

  • 相对不应期(目前,整个不应期是绝对的——神经元不能再次放电)。

  • 突触前促进或抑制——有些突触不是直接连接到树突或细胞体,而是连接到突触前神经元的突触前节点,促进或抑制特定的突触。

  • 没有特定的时间基准——程序实现了一个无量纲的“滴答”,所有求和都发生在这个“滴答”中,然后是任何动作电位的“发放”。恢复率基于每个“滴答”的变化,不考虑“滴答”实际是什么时间单位。

鉴于这些限制,仍然可以创建非常有趣的网络和研究。

学习

此模拟器不实现任何“学习”算法。从生物学角度来看,神经网络学习的概念非常复杂且知之甚少,其中包括以下概念:

  • 突触发生 - 神经元之间突触的形成。这在整个生命过程中发生,但在早期大脑发育中最为普遍,也涉及“突触修剪”——消除突触,这通常发生在出生到青春期之间。

  • 神经发生 - 由神经干细胞或祖细胞生成神经元。同样,这在产前发育中最为活跃,但有一些证据表明它作为学习和记忆的一部分发生在成人中。

  • 赫布理论2(神经可塑性)- 突触的效率可以根据突触前和突触后神经元之间动作电位的时间相关性而增加或减少。这意味着,如果突触前神经元放电并且突触后神经元也在特定时间范围内放电,则突触得到加强。如果突触前神经元放电但突触后神经元不放电(或突触后神经元放电而突触前神经元不放电),则突触强度减弱。

  • 髓鞘形成的变化——一些理论/研究表明,学习还涉及通过髓鞘形成提高神经元效率,即使在成年人中也是如此(抱歉,没有参考文献。)

还有其他理论和研究,但这些是主要的研究。它们都没有充分解释“学习”是什么,以及“记忆”的相关作用是如何运作的,但它们是值得玩味有趣的初级概念。也许未来的实现会解决这些问题。

神经元:速成班

关于神经元,有几个术语需要了解。本节是神经元速成班,绝不完整。我将大量引用维基百科的各种定义(是的,我已经向他们捐款)。虽然我在这里大量引用维基百科,但 Neuro-Sim 的基础来自《神经科学原理》一书,该书现已出版到第五版(我正在使用的是第二版!)这本书如此具有开创性,以至于它有自己的网页

Neuron

“神经元(/ˈnjʊərɒn/ nyewr-on 或 /ˈnʊərɒn/ newr-on;也称为神经细胞或神经细胞)是一种电兴奋细胞,通过电信号和化学信号处理和传输信息。这些神经元之间的信号通过突触发生,突触是与其他细胞的特殊连接。神经元可以相互连接形成神经网络。神经元是中枢神经系统(CNS)的大脑和脊髓以及周围神经系统(PNS)神经节的核心组成部分。特殊类型的神经元包括:感觉神经元,它们对触觉、声音、光线以及影响感觉器官细胞的所有其他刺激做出反应,然后将信号发送到脊髓和大脑;运动神经元,它们接收来自大脑和脊髓的信号,引起肌肉收缩并影响腺体输出;以及中间神经元,它们在神经网络中将神经元连接到大脑或脊髓同一区域内的其他神经元。
典型的神经元由细胞体(胞体)、树突和轴突组成。”1

说神经元是电兴奋的并不完全准确,因为神经元之间的实际交流通常是化学性的——**神经递质**在兴奋神经元的**突触前间隙**中释放,并被接收神经元的**突触后间隙**接收,这会影响接收神经元的局部膜电位。还有许多种类的神经元,每种都有不同的行为,包括那些通过电连接而不是化学连接的神经元。

树突

“树突(源自希腊语 δένδρον déndron,“树”)是神经元的树状突起,其作用是将从其他神经细胞接收到的电化学刺激传播到树突所投射的神经元的细胞体或胞体。电刺激通过突触(位于树突树的各个点)由上游神经元(通常是它们的轴突)传输到树突上。树突在整合这些突触输入和决定神经元产生动作电位的程度方面发挥着关键作用。”3

树突处的突触连接通常会导致局部膜电位变化,要么是兴奋性的,要么是抑制性的。这种变化会传播到轴突丘(见下文)进行求和。根据距离的不同,轴突丘处的实际电位变化将小于突触位置处的电位变化。Neuro-Sim 中未模拟此效应。

轴突

“轴突(源自希腊语 ἄξων áxōn,轴),也称为神经纤维,是神经细胞或神经元的细长投射,通常将电脉冲从神经元的细胞体传导出去。轴突的功能是将信息传输到不同的神经元、肌肉和腺体……轴突通过称为突触的连接点与其他细胞(通常是其他神经元,但有时是肌肉或腺体细胞)接触。在突触处,轴突的膜紧密地邻接目标细胞的膜,特殊的分子结构用于跨间隙传输电或电化学信号……一个轴突,连同其所有分支,可以支配大脑的多个部分并产生数千个突触末梢。”4

神经元的一些更奇怪的行为,例如没有轴突(信号传输到树突)或轴突终止于其他轴突上的突触,是 Neuro-Sim 未模拟的众多例外中的两个。

轴突丘

“轴突丘是胞体中最后一个将突触输入传播的膜电位求和并传输到轴突的部位……抑制性突触后电位(IPSPs)和兴奋性突触后电位(EPSPs)都在轴突丘中求和,一旦超过触发阈值,动作电位就会通过轴突的其余部分传播(并“反向”传播到树突,如神经反向传播中所示)。触发是由于高度密集的电压门控钠通道之间的正反馈,这些通道在轴突丘(和郎飞结)处具有临界密度,但在胞体中没有。

在其静息状态下,神经元处于极化状态,其内部相对于周围环境约为-70 mV。当突触前神经元释放兴奋性神经递质并结合到突触后树突棘时,配体门控离子通道打开,允许钠离子进入细胞。这可能使突触后膜去极化(负电荷减少)。这种去极化将向轴突丘传播,随着时间和距离呈指数衰减。如果短时间内发生多个此类事件,轴突丘可能会充分去极化,以使电压门控钠通道打开。这会启动一个动作电位,然后沿着轴突传播。”5

换句话说,虽然当然更复杂,但轴突丘是膜电位局部变化(通常来自树突上的突触,但也来自细胞体本身)的总和。如果轴突丘(或轴突的第一个未髓鞘化节段)的膜电位超过特定阈值,就会发生动作电位——神经元放电。

突触

“在神经系统中,突触[1]是一种允许神经元(或神经细胞)将电或化学信号传递给另一个神经元的结构……突触对神经功能至关重要:神经元是专门将信号传递给单个靶细胞的细胞,而突触是它们实现这一目的的方式。在突触处,信号传递神经元(突触前神经元)的质膜与靶细胞(突触后细胞)的膜紧密邻接。突触前和突触后位点都包含大量的分子机制,这些机制将两个膜连接在一起并执行信号传递过程。在许多突触中,突触前部分位于轴突上,但一些突触后位点位于树突或胞体上。”6

突触的建模实际上相当复杂。突触的空间位置很重要,因为突触后神经元上局部发生的去极化会随着时间和距离向轴突丘传播而减弱(Neuro-Sim中未建模)。此外,根据神经递质和突触类型,神经递质可能不会立即“清除”,从而允许持续去极化(Neuro-Sim中也未建模)。如前所述,突触前促进和抑制(影响突触前间隙,而不是突触后神经元)也是可能的(Neuro-Sim中同样未建模)。这些只是突触的一些有趣特征。

不应期

“不应期是由于电压门控钠通道的失活特性和钾通道关闭的滞后造成的。电压门控钠通道具有两种门控机制,激活机制在去极化时打开通道,失活机制在复极化时关闭通道。当通道处于失活状态时,它不会响应去极化而打开。大多数钠通道保持失活状态的时期是绝对不应期。在此期间之后,有足够的电压激活钠通道处于关闭(激活)状态以响应去极化。然而,响应复极化而打开的电压门控钾通道关闭速度不如电压门控钠通道快;为了返回到激活的关闭状态。在此期间,额外的钾电导意味着膜处于更高的阈值,需要更大的刺激才能引起动作电位放电。此时期是相对不应期。”7

这里突出的部分是存在一个绝对不应期,在此期间神经元无法再次放电(通常约1毫秒),以及一个动作电位阈值更高的相对不应期。后者未在 Neuro-Sim 中建模。

静息电位

“静息细胞相对静态的膜电位称为静息膜电位(或静息电压),与称为动作电位和分级膜电位的特定动态电化学现象相对。”8

静息电位可针对特定神经元“研究”进行配置,并在“网络”模式下进行分组分配。

阈值电位

“阈值电位是膜电位必须去极化到的临界水平,以启动动作电位。”9

在某些条件下,神经元的去极化可能发生得足够缓慢,以至于需要比正常阈值更高的阈值才能启动动作电位。事实上,如果去极化发生得足够缓慢,任何程度的去极化都无法实现动作电位。Neuro-Sim中未对此行为进行建模。然而,阈值电位可针对特定的神经元“研究”进行配置,并在“网络”模式下进行分组分配。

动作电位

“在生理学中,动作电位是指细胞膜电位迅速上升和下降的短暂事件,遵循一致的轨迹。动作电位发生在几种类型的动物细胞中,称为兴奋性细胞,包括神经元、肌肉细胞和内分泌细胞,以及一些植物细胞。在神经元中,它们在细胞间通信中起着核心作用。在其他类型的细胞中,它们的主要功能是激活细胞内过程。例如,在肌肉细胞中,动作电位是导致收缩的事件链中的第一步。在胰腺的β细胞中,它们引发胰岛素释放。[a] 神经元中的动作电位也称为“神经冲动”或“尖峰”,神经元产生动作电位的时间序列称为其“尖峰序列”。发出动作电位的神经元通常被称为“放电”。10

动作电位值可针对特定神经元“研究”进行配置,并在“网络”模式下进行分组分配。

起搏器神经元

起搏器神经元是一种以规律间隔自发放电的神经元。Neuro-Sim 在网络模拟中使用起搏器神经元来启动(并维持)网络活动。起搏器神经元的数量可在“网络”模式下配置。

一个有趣的简单“研究”网络由两个起搏器神经元组成,其中一个神经元抑制或刺激另一个起搏器神经元。稍后我们将看到几个这样的例子,在目标起搏器神经元中实现简单的频率分频和频率增加。

髓鞘

“髓鞘是一种脂肪状白色物质,包围轴突介电(电绝缘)材料,形成一层,即髓鞘,通常只包围神经元的轴突。它对神经系统的正常功能至关重要。它是神经胶质细胞的一种增生。

髓鞘的产生称为髓鞘化。在人类中,髓鞘化始于胎儿发育的第14周,尽管出生时大脑中几乎没有髓鞘。在婴儿期,髓鞘化迅速发生,导致儿童快速发育,包括第一年内的爬行和行走。髓鞘化持续到生命的青少年阶段。”11

除了总是拼错这个词之外,髓鞘化是电信号能够快速且无衰减地沿着轴突传播到突触前末梢的原因。没有髓鞘化,我们的神经系统将根本无法工作。

Neuro-Sim中使用的其他术语

不应期恢复率

这是一个可配置选项,用于神经元从动作电位或抑制性输入后发生的超极化状态恢复到其静息电位的速度。

超极化过冲

这是动作电位后膜电位被设置到的水平。

静息电位恢复率

这是神经元从未导致动作电位的去极化事件恢复到其静息电位的速率。

模拟模式

Neuro-Sim 实现了两种模拟模式:网络模式和研究模式。

网络模式

网络模式,显示动作电位衰减图

在网络模式下,所有神经元的配置都相同,但您可以控制

  1. 连接数

  2. 连接之间的最大距离(或轴突长度)

  3. 连接“半径”——连接距离轴突末端的分散程度

  4. 起搏器神经元的数量——以规律间隔放电以启动模拟的神经元。

还有两种查看图表的方式

  1. 动作电位衰减图——如上图所示。当神经元放电时,绘图仪会将神经元显示为白色,并在10个步骤内将其图表从黄色、红色最终衰减到黑色。

  2. 膜电位图——如下图所示,此图将神经元绘制成

    1. 放电时为白色

    2. 不应期时为红色

    3. 以及代表神经元膜电位的绿色阴影(实际上很难看清)

    4. 处于静息电位状态的神经元为黑色。

网络模式,显示膜电位图

研究模式

研究模式:反射模拟

 

在学习模式下,用户可以创建具有特定特征和连接的单个神经元。每个神经元都有一个“探针”,在示波器上显示其活动。上面的屏幕截图演示了一个示例,“反射”模拟。配置值和用法将在后面描述。

用户界面

点击此处查看 Neuro-Sim 启动时的全尺寸截图。

我们首先来看用户界面。有两个显示器:左侧是神经网络或研究网络(如下所示),右侧是研究网络中神经元的示波器(“示波器”)显示。下方有三个选项卡

  1. 神经元 - 默认神经元配置

  2. 研究 - 用于研究其状态显示在示波器上的小型网络

  3. 网络 - 用于配置神经元连接和模拟大型神经网络

神经元配置选项

配置默认神经元

可以为神经元配置的六个值是

  1. 静息电位——默认情况下,静息电位为-65mv(毫伏)。这代表神经元的静止状态。

  2. AP阈值——这是动作电位阈值——如果求和部位(轴突丘)的膜电位达到或超过此值,则会发生动作电位(神经元“放电”)

  3. AP值——这是动作电位值,默认为40mv。

  4. 恢复率——此值表示以速率返回静息电位——每个“滴答”的膜电位变化。

  5. HP过冲——这是从静息电位中减去的值,以表示动作电位后的超极化。默认值20mv表示动作电位后的超极化值为-65 - 20,即-85mv。

  6. RP返回率——此值表示去极化后返回静息电位——每个“滴答”的膜电位变化。当神经元去极化而未达到动作电位阈值时,此值会从每个“滴答”的去极化膜电位中减去,最终使神经元返回其静息电位。

这些值可以在模拟的“网络模式”中实时更改。

网络模式配置选项

网络模式配置选项

在网络模式下,可以配置以下内容

  1. 连接数

  2. 连接之间的最大距离(或轴突长度)

  3. 连接“半径”——连接距离轴突末端的分散程度

  4. 起搏器神经元的数量——以规律间隔放电以启动模拟的神经元。

  5. 绘图类型——动作电位衰减图或膜电位图(如前所述)。

研究模式

研究模式神经元配置

在研究模式下,可以从网络中添加和删除单个神经元。每个神经元的选项也可以有特定的配置

可以为神经元配置的六个值是

  1. RP:静息电位——默认情况下,静息电位为-65mv(毫伏)。这代表神经元的静止状态。

  2. APT:AP阈值——这是动作电位阈值——如果求和部位(轴突丘)的膜电位达到或超过此值,则会发生动作电位(神经元“放电”)

  3. APV:AP值——这是动作电位值,默认为40mv。

  4. RRR:恢复率——此值表示以速率返回静息电位——每个“滴答”的膜电位变化。

  5. HPO:HP过冲——这是从静息电位中减去的值,以表示动作电位后的超极化。默认值20mv表示动作电位后的超极化值为-65 - 20,即-85mv。

  6. RPRR:RP返回率——此值表示去极化后返回静息电位——每个“滴答”的膜电位变化。当神经元去极化而未达到动作电位阈值时,此值会从每个“滴答”的去极化膜电位中减去,最终使神经元返回其静息电位。

  7. LKG:泄漏——这表示去极化率(每“滴答”),用于创建起搏器神经元

  8. PCOLOR:示波器绘图颜色——此值自动分配

  9. Conn:神经元的连接

连接

连接是“连接到”神经元和突触后膜电位变化(括号中)的逗号分隔列表。例如

3(40),4(40),6(40)

表示突触前神经元连接到神经元3、4和6(上图中神经元编号“n”),并且在每种情况下都会导致40mv的突触后去极化。兴奋性突触用正值表示,抑制性突触用负值表示。例如,这里是一个抑制性突触

5(-40)

网络

研究模式网络图

在研究模式下,网络使用神经元的理想化表示进行绘制

  • 细胞体由圆形表示。

  • 兴奋性突触表示为白色三角形。

  • 抑制性突触表示为黑色三角形。

此外,当运行模拟时,当神经元放电时,“细胞体”(圆圈)会变红,并像动作电位衰减图一样经历衰减过程。

调整研究模式图

在研究图中移动神经元后

用户可以点击并拖动神经元“主体”(圆圈)来创建所需的视觉图。上面的屏幕截图显示了相同的网络,但神经元位于不同的位置。此外,当点击神经元“主体”时,神经元配置网格中的相应条目将被选中,这使得更容易弄清哪个神经元是什么。(当然,这个用户界面可以大大改进!)

暂停/恢复/步进

您可以通过点击“恢复”来开始模拟。您也可以通过点击“暂停”来暂停模拟。暂停时,“步进”按钮将被启用。“步进”将运行模拟器,直到一个神经元放电。

研究模式示例

我准备了几个示例供您玩。

起搏器神经元

起搏器神经元示例

这是一个非常简单的示例,说明了起搏器神经元的活动。起搏器神经元对于为网络播种或模拟外部刺激很有用(如反射示例中所示)。

分频器示例

分频神经元示例

在此示例中,一个简单的分频神经“电路”说明了循环动作电位如何导致突触后神经元以分级方式求和动作电位,并最终在达到突触后神经元的动作电位阈值时放电。

频率降低器示例

频率降低示例

在此示例中,使用基线起搏器神经元(红色轨迹)来说明一个起搏器神经元(青色轨迹)如何用于降低第二个起搏器神经元(白色轨迹)的放电速率。这是一个抑制信号作用的很好例子,因为每当突触前神经元(青色轨迹)放电时,都可以看到目标神经元上的抑制作用(极化)。

频率增加器示例

频率增加示例

与前面的例子类似,使用基线神经元(红色轨迹)来展示突触前起搏器神经元(青色轨迹)如何增加突触后起搏器神经元(白色轨迹)的放电频率。在这里,突触前起搏器神经元以兴奋性方式作用于突触后神经元,通过进一步去极化神经元来增加其放电率。

反射动作示例

这是最有趣的例子,因为它模拟了膝跳反射

膝跳反射(图片来源:http://cbsetextbooks.weebly.com/21-neural-control-and-coordination.html

在Neuro-Sim中,这被建模为

反射动作模型

在此示例中,连接到“肌梭”(红色圈出)的神经元具有传入通路,连接到响应刺激而抽动的“肌肉”中的神经元(绿色)。信号也发送到“大脑”,大脑试图通过兴奋一个试图激活运动终板处肌肉的神经元来阻止收缩。然而,这是不可能的,因为传入神经元通过一个中间神经元产生抑制反应,阻止“大脑”在连接到运动终板的神经上产生肌肉收缩。

反射动作的示波器和网络轨迹

上图描绘了示波器轨迹和放电神经元。请注意右下角的神经元不放电,因为中间神经元正在抑制它,因此,作为一个人,您无法阻止您的腿向上抽动!

幕后

模拟器真的没有那么多!

神经元状态

神经元实现了一个状态机,它决定神经元是处于整合(求和兴奋性和抑制性输入)、执行动作电位还是处于不应期

public void Tick()
{
  switch (actionState)
  {
    case State.Integrating:
      Integrate();
      Fired = FireOnActionPotential();

      if (!Fired)
      {
        // Incrementally return to resting potential.
        int dir = Math.Sign(config.RestingPotential - CurrentMembranePotential);
        // Get the min delta so that we return exactly to the resting potential on the last step.

        if (dir == -1) // current membrane potential > resting potential, so return at some rate to the resting potential.
        {
          CurrentMembranePotential += config.RestingPotentialReturnRate;
        }

      break;

    case State.Firing:
      Fired = false;
      ++actionState; // hold for one 1 tick
      break;

    case State.RefractoryStart:
      // refactory period start
      CurrentMembranePotential = config.RestingPotential - config.HyperPolarizationOvershoot;
      ++actionState;
      break;

    case State.AbsoluteRefractory:
      // refactory period, linear ramp back to the resting potential.
      CurrentMembranePotential += config.RefractoryRecoveryRate;

      if (CurrentMembranePotential >= config.RestingPotential)
      {
        // Done with absolute refractory period.
        inputs.Clear(); // The neuron doesn't integrate any inputs during the absolute refractory period.
        actionState = State.Integrating;
      }

      break;

    case State.RelativeRefractory:
      // Not implemented.
      break;
  }
}

神经元数学

所有数学都是基于整数的。整数“电位”表示在整数的上位24位,而小数部分表示在下位8位。这(理论上)加快了积分的处理速度,因为我们可以完全在整数数学中进行。这个概念通过观察默认神经元的配置来阐明

public NeuronConfig()
{
  RestingPotential = -65 << 8;
  ActionPotentialThreshold = -35 << 8;
  ActionPotentialValue = 40 << 8;
  RefractoryRecoveryRate = 1 << 8;
  HyperPolarizationOvershoot = 20 << 8;
  RestingPotentialReturnRate = -8;
}

 

网络绘图

网络图的性能通过使用CPian“ratamoa”在2006年这篇文章中证明的FastPixel实现得到了改进。这允许快速像素写入

public void Plot(FastPixel fp, Point location, Color color)
{
  fp.SetPixel(location, color);
  fp.SetPixel(location + new Size(1, 0), color);
  fp.SetPixel(location + new Size(0, 1), color);
  fp.SetPixel(location + new Size(1, 1), color);
}

其中每个神经元绘制为一个2x2的方框。

研究绘图

研究网络中的神经元使用标准 Graphics 函数渲染。最复杂的代码在这里,它计算如何绘制连接的“轴突”和“突触”

protected void DrawSynapse(Pen pen, Graphics gr, Point start, Point end, Connection.CMode mode)
{
  double t = Math.Atan2(end.Y - start.Y, end.X - start.X);
  double endt = Math.Atan2(start.Y - end.Y, start.X - end.X);

  // start at the circumference of the circle.
  Size offset = new Size((int)(5 * Math.Cos(t)), (int)(5 * Math.Sin(t)));

  // end at the circumference of the target neuron circle.
  Point endOffset = new Point((int)(15 * Math.Cos(endt)), (int)(15 * Math.Sin(endt)));
  end.Offset(endOffset);
  gr.DrawLine(pen, start + offset, end);

  // the synapse is a triangle whose base is opposite and perpendicular to the endpoint.
  double v1angle = t - 0.785398163;
  double v2angle = t + 0.785398163;

  Point v1 = new Point((int)(10 * Math.Cos(v1angle)), (int)((10 * Math.Sin(v1angle))));
  v1.Offset(end);

  Point v2 = new Point((int)(10 * Math.Cos(v2angle)), (int)((10 * Math.Sin(v2angle))));
  v2.Offset(end);

  switch (mode)
  {
    case Connection.CMode.Excitatory:
      // A white triangle.
      gr.DrawLine(pen, end, v1);
      gr.DrawLine(pen, end, v2);
      gr.DrawLine(pen, v1, v2);
      break;

    case Connection.CMode.Inhibitory:
      // A black triangle.
      gr.FillPolygon(brushBlack, new Point[] { end, v1, v2 }, System.Drawing.Drawing2D.FillMode.Winding);
      break;
  }
}

这涉及计算突触前体和突触后体之间的角度,以及通过代表神经元体的圆的宽度来保持连接偏移。

轴突是“虚拟化的”,因为多个连接都从突触前体源以不同的方向延伸,因此看起来神经元有多个轴突

神经元有一个轴突,但看起来有三个

如上图所示,左边的神经元似乎有三个轴突连接到其他三个神经元——这是为了方便绘制网络。

结论

作为神经元膜电位通过整合、动作和不应期的初步模拟,Neuro-Sim 是一个有趣且有用的工具,可用于玩简单的神经元网络。我发现“网络模式”非常引人入胜,但目前它不代表任何具体内容。添加外部刺激(声音、图像等)或许是下一个合乎逻辑的步骤,同时探索学习和记忆。

参考文献

1 - 神经元:https://en.wikipedia.org/wiki/Neuron
2 - 赫布理论:https://en.wikipedia.org/wiki/Hebbian_theory
3 - 树突:https://en.wikipedia.org/wiki/Dendrite
4 - 轴突:https://en.wikipedia.org/wiki/Axon
5 - 轴突丘:https://en.wikipedia.org/wiki/Axon_hillock
6 - 突触:https://en.wikipedia.org/wiki/Synapse
7 - 不应期:https://en.wikipedia.org/wiki/Refractory_period_(physiology)
8 - 静息电位:https://en.wikipedia.org/wiki/Resting_potential
9 - 阈值电位:https://en.wikipedia.org/wiki/Threshold_potential
10 - 动作电位:https://en.wikipedia.org/wiki/Action_potential
11 - 髓鞘化:https://en.wikipedia.org/wiki/Myelin

© . All rights reserved.