Sistemi Sensoriali/Modelli al Computer/Simulazioni Neuronali
Introduzione
Sistema visivo
Sistema uditivo
Sistema somatosensoriale
Sistema gustativo
Sistema vestibolare
Simulazione del Potenziale di Azione
[modifica | modifica sorgente]Potenziale di Azione
[modifica | modifica sorgente]Il potenziale di azione è la variazione di tensione stereotipata utilizzata per propagare i segnali nel sistema nervoso.
Con i meccanismi descritti in seguito, un qualsiasi tipo di stimolo in arrivo può portare a una variazione del potenziale di tensione di una cellula nervosa. Stimoli di bassa intensità che non superano una certa soglia non hanno nessuna conseguenza (confronta Fig. 4 “Iniziazioni fallite). Ma quando stimoli di alta intensità raggiungono la soglia dei canali ionici voltaggio-dipendenti si verifica una reazione di feed-back che apre i canali degli ioni Na+ (confronta di seguito “Depolarizzazione”): si raggiunge un punto in cui la permeabilità per Na+ (che nello stato di riposo è circa l’1% della permeabilità di K+) è 20 volte maggiore rispetto a quella di K+. Nel mentre, la tensione aumenta da circa -60 mV a circa +50 mV, e a questo punto, le reazioni interne iniziano a chiudere i canali del Na+, bloccandoli, e ad aprire i canali del K+ per ripristinare lo stato di equilibrio. Durante questo “periodo refrattario” di circa 1 ms, nessuna depolarizzazione può generare un nuovo potenziale di azione, che può essere innescato solo dopo aver raggiunto lo stato di riposo.
Per simulare un potenziale di azione, prima dobbiamo definire gli elementi diversi della membrana cellulare e come descriverli analiticamente.
Membrana Cellulare
[modifica | modifica sorgente]La membrana cellulare è costituita da un doppio strato di proteine idrorepellenti e quasi impermeabile. La parte importante non è la membrana di per sé, ma i canali ionici che sono incorporati su di essa. Questi sono delle proteine sulla membrana cellulare e possono essere selettivamente aperti per determinati tipi di ioni. (Questa selettività è ottenuta dal posizionamento geometrico degli amminoacidi che compongono i canali ionici) Oltre agli ioni Na+ e K+ menzionati in precedenza, gli ioni tipicamente presenti nel sistema nervoso sono i cationi Ca2+, Mg2+ e gli anioni Cl-.
Stati dei Canali Ionici
[modifica | modifica sorgente]I canali ionici possono trovarsi in uno dei seguenti tre stati:
- Aperto (ad esempio, un canale del Na aperto consente il passaggio degli ioni Na+ e blocca tutti gli altri tipi di ioni).
- Chiuso, con la possibilità di aprirsi.
- Chiuso, incondizionatamente.
Stato di Riposo
[modifica | modifica sorgente]La tipica situazione predefinita, quando nulla accade, è caratterizzata dalla presenza dei canali del K+ aperti e gli altri canali chiusi. In questo caso ci sono due forze che determinano la tensione cellulare:
- La forza derivata dalla differenza di concertazione (chimica) tra la concentrazione intra-cellulare ed extra-cellulare di K+, provocata dalla continua attività delle pompe ioniche descritte in precedenza.
- La forza derivata dalla differenza di tensione (elettrica) tra l’interno e l’esterno della cellula
L’equilibrio viene definito dall’equazione di Nernst:
Dove R rappresenta la costante del gas, T la temperatura, z la valenza degli ioni, F la costante di Faraday, [X]o/i la concentrazione di ioni all’esterno o all’interno della membrana. Alla temperatura di 25° C, il rapporto RT/F è di 25mV, che provoca una tensione di riposo di
Utilizzando le usuali concentrazioni di ioni di K+ all’interno e all’esterno della membrana di un neurone, questa equazione porta a Ek+ = -75mV. Se vengono invece anche presi in considerazione i canali ionici di Na+ che di Cl-, lo stato di equilibrio viene meglio descritto dalla equazione di Goldman:
Dove Pi rappresenta la permeabilità degli ioni “i”, mentre [I] la concentrazione di I. In questo caso, utilizzando le tipiche concentrazioni di ogni tipo di ione, la cellula neuronale ha uno stato di riposo caratterizzato da una polarizzazione negativa attorno i -60 mV.
Attivazione dei Canali Ionici
[modifica | modifica sorgente]Una interessante caratteristica dei canali ionici è il fatto che la loro permeabilità può variare a dipendenza di:
- Uno stimolo meccanico (canali ionici attivati meccanicamente).
- Uno stimolo chimico (canali ionici attivati da ligando).
- Da una tensione esterna (canali ionici attivati dal voltaggio).
- Talvolta i canali ionici collegano direttamente due cellule, in tal caso vengono chiamati canali di giunzione.
Importante
- I sistemi sensoriali si basano essenzialmente su canali ionici, che vengono attivati da uno stimolo meccanico (pressione, suono, movimento), uno stimolo chimico (gusto, odore) o uno stimolo elettromagnetico (luce) e producono un "segnale neurale", ossia una variazione di tensione in una cellula nervosa.
- I potenziali d'azione usano i canali ionici attivati dal voltaggio per cambiare rapidamente e in modo affidabile lo "stato" del neurone.
- La comunicazione tra le cellule nervose avviene principalmente tramite canali ionici che sono attivati dai neurotrasmettitori, ossia sostanze chimiche emesse da una sinapsi dal neurone precedente. Ciò fornisce la massima flessibilità nell'elaborazione dei segnali neurali.
Modellare un canale ionico dipendente dal voltaggio
[modifica | modifica sorgente]Tramite la legge di Ohm viene messa in relazione la resistenza di un resistore, R, con la intensità della corrente che lo attraversa, I, e alla caduta di tensione (voltaggio) attraverso il resistore, V:
oppure
Dove è la conduttanza di un resistore. Se viene assunto che la conduttanza sia direttamente proporzionale alla probabilità che il canale ionico sia aperto, allora l’equazione diviene:
Nella quale equazione gmax è la conduttanza massima del canale, mentre n è la probabilità che il canale sia aperto.
Esempio: Canale ionico del Potassio (K)
I canali del potassio voltaggio-dipendenti (Kv) possono essere solo aperti o chiusi. Sia α il tasso con cui il canale passa dallo stato chiuso a quello aperto, e β il tasso con cui il canale passa dallo stato aperto a quello chiuso.
Poiché n rappresenta la probabilità che il canale sia aperto, la probabilità che il canale sia chiuso deve essere (1-n), poiché tutti i canali sono o aperti o chiusi. I cambiamenti nella conformazione del canale possono quindi essere descritti dalla formula:
Si noti che α e β dipendono dal voltaggio! Con una tecnica chiamata "voltage-clamping", Hodgkin e Huxley determinarono questi tassi nel 1952, e ottennero un'equazione simile alla seguente:
Se si desidera modellare solo un canale del potassio dipendente dal voltaggio, queste sarebbero le equazioni da cui partire. (Per i canali del sodio voltaggio-dipendenti, le equazioni sono un po' più complesse, poiché quei canali hanno tre possibili conformazioni: aperto, chiuso e inattivo.)
Equazione di Hodgkin-Huxley
[modifica | modifica sorgente]Risulta difficile determinare il comportamento preciso dei diversi tipi di canali ionici presenti sulle membrane cellulari insieme. In una prima approssimazione, il potenziale di azione può essere spiegato attraverso l’analisi di un circuito elettrico che simula una singola sezione di un neurone; questo é suddiviso nelle seguenti componenti: 1) capacitanza della membrana; 2) canale Na; 3) canale K; 4) corrente di dispersione; 5) canale Cl.
Questa è l’equazione finale del modello originale di Hodgkin-Huxley, dove vengono combinate le correnti dagli ioni di cloro e altre correnti di dispersione:
Nella quale m, h, e n sono funzioni dipendenti dal tempo e dal voltaggio che descrivono la permeabilità della membrana. Ad esempio, per i canali ionici K, n segue l’equazione descritta sopra, determinata sperimentalmente con il voltage-clamping. Queste equazioni descrivono la forma e la propagazione del potenziale di azione con elevata precisione! Il modello può essere risolto facilmente attraverso strumenti open source, come ad esempio il Python Dynamical Systems Toolbox PYDSTools. Un semplice file di soluzione è disponibile sotto [1], e l’output è mostrato di seguito.
Collegamenti per il completo modello di Hodgkin-Huxley
[modifica | modifica sorgente]Modello per la Generazione del Potenziale di Azione: il modello Fitzhugh-Nagumo
[modifica | modifica sorgente]Il modello di Hodgkin-Huxley ha quattro variabili dinamiche: il voltaggio, V, la probabilità che il canale K sia aperto, n(V),la probabilità che il canale Na sia aperto sapendo che era precedentemente chiuso, m(V), la probabilità che il canale Na sia aperto sapendo che era inizialmente inattivo, h(V). Un modello semplificato per la generazione di un potenziale di azione è il modello di Fitzhugh-Nagumo (FN). Questo modello ha solo due variabili dinamiche perché combina V con m in una singola variabile v, e n con h in una singola variabile r
Dove I è una corrente esterna iniettata nel neurone. Poiché il modello FN ha solo due variabili dinamiche, la sua dinamica completa può essere esplorata con i metodi del piano di fase (esempio di soluzione in Python qui [2]) ).
Simulazione di un Singolo Neurone con Retroazione Positiva (Positive Feedback)
[modifica | modifica sorgente]I seguenti due esempi sono tratti da [3] . Questo libro dispone di una ottima introduzione nel simulare semplici modelli neuroni, e una buona spiegazione delle informazioni di processo sottostanti.
Osserviamo inizialmente la risposta di un singolo neurone, con un input x(t), e con una retroazione su sé stesso. Il peso dell’input è v, mentre quello della retroazione è w. La risposta y(t) del neurone viene calcolata come
Questo mostra come una simulazione molto semplice può già catturare le proprietà di processo del segnale di un neurone reali.
"""Simulazione dell'effetto di feedback su un singolo neurone"""
import numpy as np
import matplotlib.pylab as plt
# Configurazione del sistema
is_impulse = True # 'True' per l'impulso, 'False' per un passo
t_start = 11 # inizializzare il tempo di avvio
n_steps = 100
v = 1 # peso dell'input
w = 0.95 # peso del feedback
# Stimolo
x = np.zeros(n_steps)
if is_impulse:
x[t_start] = 1 # attiva l'input solo in questo momento
else:
x[t_start:] = 1 # passo di input
# Risposta
y = np.zeros(n_steps) # inizializzare vettore output
for t in range(1, n_steps): # per ogni passo (primo escluso)
y[t] = w*y[t-1] + v*x[t-1] # calcolo output
# Rappresentazione grafica dei risultati
time = np.arange(n_steps)
fig, axs = plt.subplots(2, 1, sharex=True)
axs[0].plot(time, x)
axs[0].set_ylabel('Input')
axs[0].margins(x=0)
axs[1].plot(time, y)
axs[1].set_xlabel('Time Step')
axs[1].set_ylabel('Output')
plt.show()
Simulazione di un Semplice Sistema Neuronale
[modifica | modifica sorgente]Anche un semplice sistema neuronale può mostrare una variegata lista di comportamenti diversi, un esempio è il modello di Wilson del "locust-flight central pattern generator". Questa è la equazione che lo descrive:
Dove W è la matrice di connessione che descrive le RECURRENT connessioni di neuroni e l’input al sistema.
""" Feedback ricorrente in un network semplice:
versione lineare del "locust flight central pattern generator (CPG)" di Wilson """
import numpy as np
import matplotlib.pylab as plt
# Configurazione del sistema
v = np.zeros(4) # vettore di input
v[1] = 1
w1 = [ 0.9, 0.2, 0, 0] # valori di feedback per la prima unità
w2 = [-0.95, 0.4, -0.5, 0] # ... per la seconda unità
w3 = [ 0, -0.5, 0.4, -0.95] # ... per la terza unità
w4 = [ 0, 0, 0.2, 0.9 ] # ... per la quarta unità
W = np.vstack( [w1, w2, w3, w4] )
n_steps = 100
# Attivazione, avvio del sistema
x = np.zeros(n_steps) # inizializzazione vettore input
t_kick = 11
x[t_kick] = 1
# Simulazione
y = np.zeros( (4,n_steps) ) # inizializzazione vettore output
for t in range(1,n_steps): # per ogni passo
y[:,t] = W @ y[:,t-1] + v * x[t-1] # calcolo del risultato
# Rappresentazione grafica dei risultati
time = np.arange(n_steps)
plt.plot(time, x, '-', label='Input')
plt.plot(time, y[1,:], ls='dashed', label = 'Left Motorneuron')
plt.plot(time, y[2,:], ls='dotted', label='Right Motorneuron')
# Formato dei grafici
plt.xlabel('Time Step')
plt.ylabel('Input and Unit Responses')
plt.gca().margins(x=0)
plt.tight_layout()
plt.legend()
plt.show()
Sviluppo e Teoria dei Circuiti Neuromorfici
[modifica | modifica sorgente]Introduzione
[modifica | modifica sorgente]L’ingegneria neuromorfica utilizza sistemi di integrazione su larga scala (very-large-scale-integration VLSI) per costruire circuiti analogici e digitali, emulando l’architettura ed il comportamento neurobiologico. La maggior parte dei circuiti moderni usufruisce principalmente di componenti digitali perché sono veloci, precisi e insensibili a errori dovuti al disturbo (noise). A differenza dei circuiti analogici, che si rivelano più biologicamente rilevanti, i circuiti digitali richiedono alimentazioni più elevate e non sono in grado di eseguire processi parallelamente. I comportamenti biologici dei neuroni, come perdite attraverso la membrana cellulare oppure come le caratteristiche legate al potenziale di soglia, sono dipendenti dai parametri del substrato materiale e richiedono sistemi analogici per soddisfare una precisione elevata. Questo articolo fornisce un breve riassunto sui circuiti neuromorfici e sulla teoria di base delle loro componenti circuitali analogiche.
Attualità nel campo dell’Ingegneria Neuromorfica
[modifica | modifica sorgente]Recentemente, il campo dell'ingegneria neuromorfica ha vissuto un periodo di rapida crescita, ricevendo ampia attenzione da parte della stampa e della comunità scientifica. Nel 2013, dopo aver attirato l'attenzione della Commissione europea, è stato avviato il progetto Human Brain Project, finanziato con 1,2 miliardi di euro per dieci anni. Questo progetto propone di simulare computazionalmente il cervello umano a partire dal livello delle molecole e dei neuroni fino ai circuiti neuronali. Poco dopo questa notizia, l'Istituto Nazionale di Salute degli Stati Uniti annunciò il finanziamento del progetto BRAIN con cento milioni di dollari USA, mirato a ricostruire l'attività di ampie popolazioni di neuroni. Anche i laboratori aziendali di Hewlett-Packard e IBM stanno investigando in vari progetti neuromorfici.
Struttura e Fisica dei Transistor
[modifica | modifica sorgente]I transistor asemiconduttore di ossido di metallo a effeto di campo (MOSFET) sono componenti comuni dei circuiti integrati moderni. Questi sono classificati come dispositivi unipolari poiché ciascun transistor utilizza solo un tipo di portatori; i MOSFET a tipo negativo (nFET) utilizzano gli elettroni come portatori, mentre i MOSFET a tipo positivo (pFET) utilizzano le lacune come portatori.
Il MOSFET generale, rappresentato nella figura laterale, ha un gate metallico (G) e due diodi giunzione pn noti come source (S) e drain (D). C'è uno strato di ossido isolante che separa il gate dal bulk di silicio (B). Il canale che trasporta la carica si trova direttamente sotto questo strato di ossido. La corrente è in funzione delle dimensioni del gate.
Il source e il drain sono simmetrici e differiscono solo per le polarizzazioni applicate ad essi. Nel dispositivo nFET, il source e il drain sono realizzati su regioni di tipo n all'interno di un substrato di tipo p. Il substrato viene polarizzato tramite il contatto p-type nel bulk. La corrente positiva fluisce nel canale sotto il gate, dal drain al source. Il termine "source" (sorgente) indica che è la sorgente degli elettroni. Al contrario, nel dispositivo pFET, il source e il drain di tipo p si trovano in un bulk di tipo n che è all'interno di un substrato di tipo p. La corrente fluisce dal source al drain.
Quando i portatori si muovono a causa di un gradiente di concentrazione, questo fenomeno viene chiamato diffusione. Se i portatori vengono spostati a causa di un campo elettrico, si parla di deriva. Per convenzione, il drain del nFET è polarizzato a un potenziale più elevato rispetto al source, mentre il source è polarizzato ad un potenziale più elevato in un pFET.
In un nFET, quando viene applicata una tensione positiva al gate, si accumula carica positiva sul contatto metallico. Ciò attira gli elettroni dal bulk all'interfaccia ossido-di-silicio, creando un canale con carica negativa tra il source e il drain. Più alta è la tensione al gate, più spesso diventa il canale, il che riduce la resistenza interna e aumenta quindi la corrente in modo logaritmico. Per tensioni al gate basse, tipicamente al di sotto della tensione di soglia, , il canale non è ancora completamente conduttivo e l'aumento di corrente dal drain al source aumenta linearmente su una scala logaritmica. Questo regime, in cui , è chiamato regione sub-soglia. Oltre questa tensione di soglia, , il canale è completamente conduttivo tra il source e il drain e la corrente si trova nel regime super-soglia.
Affinché la corrente fluisca dal drain al source, deve esserci inizialmente un campo elettrico in grado di spostare i portatori attraverso il canale. La forza di questo campo elettrico è una funzione della differenza di potenziale applicata tra il source e il drain (Vds), e quindi controlla la corrente drain-source. Per valori bassi di Vds, la corrente aumenta linearmente in funzione di Vds per valori costanti di Vgs. Man mano che Vds aumenta oltre i 100mV, la corrente satura.
I pFET si comportano in modo simile ai nFET, tranne che i portatori sono lacune e le polarizzazioni dei contatti sono negate.
Nelle applicazioni digitali, i transistor operano o nella loro regione di saturazione (acceso) o sono spenti. Questo ampio intervallo di differenze di potenziale tra le modalità di accensione e spegnimento è la ragione per cui i circuiti digitali hanno un così alto consumo di energia. Al contrario, i circuiti analogici sfruttano la regione lineare dei transistor per produrre segnali continui con un minor consumo di energia. Tuttavia, poiché piccole variazioni nelle tensioni al gate o source-drain possono causare grandi variazioni di corrente, i sistemi analogici sono soggetti a rumore.
Il campo dell'ingegneria neuromorfica sfrutta la natura rumorosa dei circuiti analogici per replicare il comportamento neuronale stocastico [4] [5] . A differenza dei circuiti digitali sincronizzati alla frequenza di clock, i circuiti analogici sono in grado di generare potenziali d'azione con dinamiche temporali simili a quelle dei tempi biologici (circa 10 μsec). I potenziali vengono rallentati e le frequenze di emissione sono controllate allungando le costanti di tempo attraverso polarizzazioni di perdita e transistor resistivi variabili. Sono stati creati circuiti analogici capaci di emulare potenziali d'azione biologici con diverse dinamiche temporali, consentendo così ai circuiti in silicio di imitare il comportamento di apprendimento basato su spike neuronali [6] . Mentre i circuiti digitali possono contenere solo pesi sinaptici binari [0, 1], i circuiti analogici sono capaci di mantenere i pesi sinaptici all'interno di un intervallo continuo di valori, rendendo i circuiti analogici particolarmente vantaggiosi per i circuiti neuromorfici.
Circuiti statici di base
[modifica | modifica sorgente]Con una comprensione di come funzionano i transistor e come vengono polarizzati, è possibile razionalizzare dei circuiti analogici statici di base. Successivamente, questi circuiti statici di base verranno combinati per creare circuiti neuromorfici. Negli esempi di circuito seguenti, le tensioni del source, del drain e del gate sono fisse, e la corrente è l'output. Quando messo in pratica, la tensione di polarizzazione del gate è fissata a un valore sub-soglia (), il drain è mantenuto in saturazione (), e il source e il bulk sono collegati a terra (, ). Tutte le non idealità vengono ignorate.
Transistor Diodo-Connesso
[modifica | modifica sorgente]Un transistor nFET diodo-connesso ha il suo gate collegato al drain. Poiché il drain controlla la tensione del gate, le tensioni drain-gate si autoregolano in modo che il dispositivo assorba sempre la corrente di ingresso, I_ds. Ad un voltaggio superiore di molti microvolt, il transistor funzionerà in saturazione. Allo stesso modo, un transistor pFET collegato come diodo ha il suo gate collegato alla sorgente. Nonostante questo semplice dispositivo sembri funzionare solo come un cortocircuito, viene comunemente utilizzato nei circuiti analogici per copiare e regolare la corrente. In particolare nei circuiti neuromorfici, vengono utilizzati per rallentare i circuiti di scarica di corrente e aumentare le costanti di tempo del circuito per adattarsi a regimi temporali biologicamente plausibili.
Specchio di Corrente
[modifica | modifica sorgente]Uno specchio di corrente sfrutta la capacità del transistor diodo-collegato di assorbire corrente. Quando una corrente di ingresso viene forzata attraverso il transistor diodo-collegato, , il drain e il gate flottanti vengono regolati alla tensione appropriata che permette alla corrente di ingresso di passare. Poiché i due transistor condividono un nodo di gate comune, assorbirà la stessa corrente. Ciò costringe il transistor di uscita a duplicare la corrente di ingresso. L'uscita rifletterà la corrente di ingresso fintanto che:
Il guadagno dello specchio di corrente può essere controllato regolando questi due parametri. Quando si utilizzano transistor con dimensioni diverse, noto anche come specchio inclinato, il guadagno è:
Uno specchio di corrente con pFET è semplicemente uno specchio nFET ribaltato, dove il pFET collegato come diodo riflette la corrente di ingresso e costringe l'altro pFET a fornire corrente di uscita.
Gli specchi di corrente sono comunemente utilizzati per copiare correnti senza prelevare la corrente di ingresso. Ciò è particolarmente importante per i cicli di feedback, come quelli utilizzati per accelerare i potenziali d'azione e sommare le correnti di ingresso in una sinapsi.
Source Comune
[modifica | modifica sorgente]Un source comune è composto da un transistor di ingresso, , sovrapposto a un transistor di polarizzazione, Mb. La tensione di polarizzazione sub-soglia fissa () controlla il gate di , costringendolo ad assorbire una corrente costante, . Di conseguenza, viene anch'esso costretto ad assorbire la stessa corrente () indipendentemente dalla tensione di ingresso, .
Un source comune (chiamato anche in inglese con Source Follower oppure Common source) è chiamato così perché l'output, , seguirà con una leggera compensazione descritta da:
dove kappa è il fattore di pendenza sub-soglia, tipicamente inferiore a uno.
Questo semplice circuito viene spesso utilizzato come buffer. Poiché nessuna corrente può fluire attraverso il gate, questo circuito non assorbirà corrente dall'ingresso, una caratteristica importante per i circuiti a basso consumo energetico. I source comune possono anche isolare i circuiti, proteggendoli da sovratensioni o staticità. Un source comune con pFET differisce solo da un source comune con nFET nel fatto che il pFET di polarizzazione ha il suo bulk collegato a .
Nei circuiti neuromorfici, i source comune e simili vengono utilizzati come semplici integratori di corrente che si comportano come neuroni postsinaptici che raccolgono corrente da molti neuroni presinaptici.
Inverter
[modifica | modifica sorgente]Un inverter è composto da un pFET, , sovrapposto a un nFET, , con i loro gate collegati all'input, , e l'output collegato al nodo di sorgente comune, . Quando viene ricevuto un segnale ad alta intensità, il pFET è spento ma il nFET è acceso, scaricando efficacemente il nodo di output, , e invertendo il segnale. Al contrario, quando il segnale di input è basso, il nFET è spento ma il pFET è acceso, caricando il nodo .
Questo semplice circuito è efficace come un interruttore rapido. L'inverter è anche comunemente usato come buffer perché può produrre una corrente di output senza alimentare direttamente la corrente di input, poiché non viene consentito alcun flusso di corrente attraverso il gate. Quando due inverter vengono utilizzati in serie, possono essere utilizzati come un amplificatore non invertente. Questo esempio di amplificatore è stato utilizzato nel neurone di silicio Integrate-and-Fire originale di Mead et al., 1989 per creare un rapido spike di depolarizzazione simile a quello di un potenziale d'azione biologico [7] . Tuttavia, quando l'input fluttua tra segnali alti e bassi, entrambi i transistor sono in saturazione superthreshold dissipante di corrente, rendendolo un circuito molto energivoro.
Current Conveyor
[modifica | modifica sorgente]Il current conveyor è anche comunemente noto in inglese come un buffered current mirror. Composto da due transistor con i loro gate collegati a un nodo dell'altro, il current conveyor si auto-regola in modo che la corrente di output corrisponda alla corrente di input, in modo simile al current mirror.
Il current conveyor viene spesso utilizzato al posto dei current mirror per grandi array ripetitivi in serie. Ciò avviene perché la corrente del current mirror è controllata attraverso il gate, la cui capacità dell'ossido comporterà un ritardo nell'output. Sebbene questo ritardo sia trascurabile per un singolo current mirror di output, lunghe serie di current mirror accumuleranno ritardi significativi nell'output. Questi ritardi ostacolerebbero notevolmente i processi paralleli di grandi dimensioni, come quelli che cercano di emulare le strategie computazionali di reti neurali biologiche.
Coppia Differenziale
[modifica | modifica sorgente]La coppia differenziale è un circuito comparatore composto da due source follower con un bias comune che forza la corrente dell'input più debole a essere soppressa. Il transistor di bias costringerà a rimanere costante, collegando il nodo comune, , a una tensione fissa. Entrambi i transistor di input desiderano scaricare corrente proporzionale alle rispettive tensioni di input, e . Tuttavia, poiché il nodo comune deve rimanere fisso, i drain dei transistor di input devono aumentare proporzionalmente alle tensioni di gate. Il transistor con la tensione di input più bassa fungerà da strozzatura e permetterà meno corrente attraverso il suo drain. Il transistor perdente vedrà aumentare la tensione di source e quindi uscire dalla saturazione.
La coppia differenziale, nel contesto di un circuito neurale, può funzionare come una soglia di attivazione di un canale ionico al di sotto del quale il canale ionico a tensione controllata non si aprirà, impedendo al neurone di generare spike[8] .
Neuroni al Silicio
[modifica | modifica sorgente]Winner-Take-All
[modifica | modifica sorgente]Il circuito Winner-Take-All (WTA, in italiano 'Il vincitore prende tutto'), originariamente progettato da Lazzaro et al. [9] , è un circuito analogico a tempo continuo. Confronta gli output di un array di celle e consente solo alla cella con la corrente di output più alta di essere attiva, inibendo tutte le altre celle concorrenti.
Ogni cella è composta da un current-controlled conveyor e riceve correnti in ingresso, emettendo un'uscita su una linea comune che controlla un transistor di bias. La cella con la corrente di ingresso più alta emetterà anche la corrente più alta, aumentando la tensione del nodo comune. Ciò costringe le celle più deboli a spegnersi. Il circuito WTA può essere esteso per includere una grande rete di celle concorrenti. Un WTA "soft" restituisce anche la sua corrente di output all'input, aumentando efficacemente il guadagno della cella. Questo è necessario per ridurre il rumore e la commutazione casuale se l'array di celle ha una piccola gamma dinamica.
Le reti WTA sono comunemente utilizzate come forma di apprendimento competitivo nelle reti neurali computazionali che riguardano un processo decisionale distribuito. In particolare, le reti WTA sono state utilizzate per eseguire compiti di riconoscimento e classificazione a basso livello che assomigliano più da vicino all'attività corticale durante compiti di selezione visiva [10].
Neurone 'Integrate & Fire'
[modifica | modifica sorgente]Lo schema più generale di un neurone 'Integrate & Fire', noto anche come neurone Axon-Hillock, è il modello di neurone a impulsi più comunemente utilizzato [7]. Gli elementi comuni alla maggior parte dei circuiti Axon-Hillock includono: un nodo con una memoria del potenziale di membrana , un amplificatore, un ciclo di feedback positivo e un meccanismo per ripristinare il potenziale di membrana al suo stato di riposo, .
La corrente di input, , carica il , che viene memorizzato in un condensatore, C. Questo condensatore è analogo alla membrana cellulare lipidica che impedisce una libera diffusione degli ioni, creando il potenziale di membrana dalla differenza di carica accumulata su entrambi i lati della membrana lipidica. L'input viene amplificato per produrre un impulso di tensione. Una variazione del potenziale di membrana viene positivamente retroalimentata attraverso a , producendo un impulso più rapido. Questo assomiglia molto a come un'ilo assiale biologico, che è densamente ricoperto di canali del sodio a soglia di tensione, amplifica i potenziali sommati per produrre un potenziale d'azione. Quando viene prodotto un impulso di tensione, il bias di reset, , inizia a scaricare il nodo . Questo è simile ai canali sodio-potassio che pompano attivamente ioni sodio e potassio contro il gradiente di concentrazione per mantenere il potenziale di membrana a riposo.
Il neurone di silicio originale Axon Hillock è stato adattato per includere una soglia di attivazione con l'aggiunta di una coppia differenziale che confronta l'input con un bias di soglia [8]. Questo neurone di silicio a base di conduzione utilizza un integratore a coppia differenziale (DPI) con un transistor di scarico per confrontare l'input, , con la soglia, . I bias di scarico , periodo refrattario , adattamento e guadagno di feedback positivo, controllano indipendentemente la frequenza degli spike. Le ricerche si sono concentrate sull'implementazione dell'adattamento della frequenza degli spike per impostare i periodi refrattari e modulare le soglie [11]. L'adattamento consente al neurone di modulare la frequenza di scarica dell'output in funzione dell'input. Se c'è un input costante ad alta frequenza, il neurone si desensibilizzerà all'input e l'output diminuirà costantemente nel tempo. Il componente adattivo del circuito del neurone a base di conduzione è modellato attraverso il flusso di calcio e memorizza la memoria delle attività passate attraverso il condensatore adattivo, . L'avvento dell'adattamento della frequenza degli spike ha permesso di attuare cambiamenti al livello neuronale per controllare meccanismi di apprendimento adattivo al livello delle sinapsi. Questo modello di apprendimento neuronale è modellato sulla biologia[12] e sarà ulteriormente discusso in Silicon Synapses.
Sinapsi di Silicio
[modifica | modifica sorgente]La sinapsi di silicio più semplice, originariamente utilizzata da Mead et al., 1989 [7], consiste semplicemente di un source comune pFET che riceve un impulso di segnale basso in ingresso e produce in uscita una corrente unidirezionale, [13].
L'ampiezza dello spike è controllata dal bias di peso, , e la larghezza dell'impulso è direttamente correlata alla larghezza dell'impulso in ingresso che è impostata da . Il condensatore nel circuito della sinapsi di Lazzaro et al. (1993) è stato aggiunto per aumentare la costante di tempo dello spike a un valore biologicamente plausibile. Ciò ha rallentato il tasso con cui l'impulso si iperpolarizza e depolarizza ed è una funzione della capacità del condensatore.
Per gestire l'interazione competitiva ed eccitatoria/inibitoria di multipli input, l'integratore in dominio logaritmico utilizza e per regolare l'ampiezza della corrente di output, , in funzione della corrente di input, , secondo la seguente relazione:
controlla la velocità con cui è in grado di caricare il gate del transistor di output. governa la velocità con cui l'output viene sottratto. Questa natura competitiva è necessaria per imitare il comportamento biologico dei neurotrasmettitori che promuovono o sopprimono l'attività neuronale.
Sono stati sviluppati anche modelli sinaptici con integratori lineari di primo ordine che utilizzano filtri in dominio logaritmico in grado di modellare il decadimento esponenziale della corrente post-sinaptica eccitatoria (EPSC, dall'inglese "exitatory post-synaptic current") [14] . Questo è necessario per ottenere contorni di spike e costanti di tempo che siano biologicamente plausibili. Il guadagno è anche controllato indipendentemente dalla costante di tempo della sinapsi, il che è necessario per i meccanismi di apprendimento dipendenti dalla frequenza degli spike e dal timing degli spike.
Le sinapsi di silicio menzionate sopra si limitano a trasmettere le correnti dalle sorgenti presinaptiche, variando la forma dello spike lungo il percorso. Tuttavia, non contengono alcuna memoria degli spike precedenti, né sono in grado di adattare il loro comportamento in base alle dinamiche temporali. Tuttavia, queste capacità sono necessarie se i circuiti neuromorfici devono imparare come le reti neurali biologiche.
Secondo il postulato di Hebb, si ipotizza che comportamenti come l'apprendimento e la memoria avvengano a livello sinaptico [15] . Esso attribuisce il processo di apprendimento a un'adattazione neuronale a lungo termine in cui i contributi presinaptici e postsinaptici vengono rafforzati o indeboliti da modificazioni biochimiche. Questa teoria è spesso riassunta nel detto: "Neuroni che si attivano insieme, si collegano insieme". Le reti neurali artificiali modellano l'apprendimento attraverso queste modifiche "collegamenti" biochimiche con un singolo parametro, il peso sinaptico, . Un peso sinaptico è una variabile di stato del parametro che quantifica come uno spike di un neurone presinaptico influisce sull'output di un neurone postsinaptico. Due modelli di plasticità sinaptica di tipo Hebbiano includono la plasticità dipendente dalla frequenza degli spike (SRDP, dall'inglese spike-rate-dependent plasticity) e la plasticità dipendente dal timing degli spike (STDP, dall'inglese spike-timing-dependent plasticity). Sin dalla formulazione di questa teoria, l'attività neuronale biologica è stata dimostrata mostrare comportamenti che si avvicinano molto all'apprendimento di tipo Hebbiano. Un esempio di ciò è la modifica dei recettori sinaptici NMDA e AMPA che porta a un adattamento indotto dal flusso di calcio [16] .
L'apprendimento e la memoria a lungo termine delle informazioni nei neuroni biologici sono attribuiti all'adattamento indotto dai canali NMDA. Questi recettori NMDA sono dipendenti dalla tensione e controllano il flusso intracellulare di ioni di calcio. È stato dimostrato in studi sugli animali che la desensibilizzazione neuronale diminuisce quando il calcio extracellulare viene ridotto [16].
Dal momento che la concentrazione di calcio decade in modo esponenziale, questo comportamento può essere facilmente implementato sull'hardware utilizzando transistor subthreshold. Un modello di circuito che dimostra un comportamento biologico dipendente dal calcio è mostrato da Rachmuth et al. (2011) [17] . Il segnale di calcio, , regola l'attività dei canali AMPA e NMDA attraverso il nodo secondo le regole di apprendimento STDP e SRDP dipendenti dal calcio. L'output di queste regole di apprendimento è il peso sinaptico, , che è proporzionale al numero di canali AMPA e NMDA attivi. Il modello SRDP descrive il peso in termini di due variabili di stato, , che controlla la regola di aggiornamento, e , che controlla il tasso di apprendimento.
dove è il peso sinaptico, è la regola di aggiornamento, è il tasso di apprendimento e è una costante che permette al peso di deviare dalla saturazione in assenza di input.
Il canale NMDA controlla l'afflusso di calcio, . La dipendenza dalla tensione del recettore NMDA è modellata da e la meccanica del canale è controllata con un grande condensatore per aumentare la costante di tempo del calcio, . L'output viene copiato tramite specchi di corrente nei circuiti e per eseguire le funzioni di apprendimento.
Il circuito confronta con soglie di bias, e , che rispettivamente controllano la potenziamento a lungo termine o la depressione a lungo termine attraverso una serie di circuiti a coppia differenziale. L'output dei circuiti a coppia differenziale determina la regola di aggiornamento. È stato dimostrato che questo circuito presenta varie regole di apprendimento di tipo Hebbiano come osservato nell'ippocampo, e regole di apprendimento anti-Hebbiane utilizzate nel cervelletto.
Il circuito controlla quando può avvenire l'apprendimento sinaptico, consentendo gli aggiornamenti solo quando supera una soglia impostata da un circuito a differenziale, . Il tasso di apprendimento (LR) è modellato secondo l'equazione
dove è una funzione di e controlla il tasso di apprendimento, è la capacità del circuito e è la tensione di soglia del comparatore. Questa funzione dimostra che deve essere polarizzata per mantenere un livello elevato di al fine di simulare SRDT. Una corrente di perdifa, , é stata inclusa per scaricare a durante i periodi di inattività.
L'ambiente di simulazione NEURON
[modifica | modifica sorgente]Introduzione
[modifica | modifica sorgente]Neuron è un ambiente di simulazione con il quale è possibile simulare la propagazione di ioni e potenziali d'azione in neuroni biologici e artificiali, nonché in reti di neuroni [18]. L'utente può specificare la geometria del modello definendo e collegando parti cellulari del neurone, che possono essere dotate di vari meccanismi come canali ionici, clamp e sinapsi. Per interagire con NEURON, l'utente può utilizzare l'interfaccia utente grafica (GUI) o uno dei linguaggi di programmazione hoc (un linguaggio con una sintassi simile a C) o Python come interprete. La GUI contiene una vasta selezione delle funzionalità più utilizzate, come mostrato nell'esempio di screenshot nella figura a destra. D'altra parte, i linguaggi di programmazione possono essere utilizzati per aggiungere meccanismi più specifici al modello e per scopi di automazione. Inoltre, è possibile creare meccanismi personalizzati con il linguaggio di programmazione NMODL, che è un'estensione di MODL, un linguaggio di descrizione del modello sviluppato dal NBSR (National Biomedical Simulation Resource). Questi nuovi meccanismi possono quindi essere compilati e aggiunti ai modelli tramite la GUI o gli interpreti.
Neuron è stato inizialmente sviluppato da John W. Moore presso l'Università di Duke in collaborazione con Michael Hines. Attualmente viene utilizzato in numerosi istituti e università per scopi educativi e di ricerca. Esiste una vasta quantità di informazioni disponibili, compreso il sito web ufficiale che contiene la documentazione, il forum di NEURON e vari tutorial e guide. Inoltre, nel 2006 è stato pubblicato il libro di riferimento autoritativo su NEURON chiamato "The NEURON Book" [19] .
Per leggere i seguenti capitoli e lavorare con NEURON, è consigliata una conoscenza di base sulla fisiologia dei neuroni. Alcuni esempi di fonti di informazione sui neuroni sono il capitolo WikiBook o i video nell'introduzione del capitolo Advanced Nervous System Physiology su Khan Academy.
Non affronteremo comandi specifici o dettagli su come eseguire le azioni menzionate con NEURON, poiché questo documento non è inteso come un tutorial, ma solo come una panoramica delle possibilità e della struttura del modello all'interno di NEURON. Per ulteriori informazioni pratiche sull'implementazione con NEURON, consiglio i tutorial collegati di seguito e la documentazione sul sito web ufficiale [18].
Creazione del modello
[modifica | modifica sorgente]Geometria di una singola Cellula
[modifica | modifica sorgente]Inizieremo discutendo la creazione di una geometria del modello che consiste in un singolo neurone biologico. Una rappresentazione schematica di un neurone è mostrata nella Figura a destra. Successivamente viene mostrato un esempio di frammento di codice in cui viene specificata una cellula multi-compartimentale con un soma e due dendriti utilizzando il linguaggio di programmazione hoc.
load_file("nrngui.hoc")
// Creazione di un oggetto soma e di un array contenente 2 oggetti dendriti
ndend = 2
create soma, dend[ndend]
access soma
// Inizializzazione degli oggetti
soma {
nseg = 1
diam = 18.8
L = 18.8
Ra = 123.0
insert hh
}
dend[0] {
nseg = 5
diam = 3.18
L = 701.9
Ra = 123
insert pas
}
dend[1] {
nseg = 5
diam = 2.0
L = 549.1
Ra = 123
insert pas
}
// Connessione dei dentridi con la soma
connect dend[0](0), soma(0)
connect dend[1](0), soma(1)
// Creazione di un elettrodo nella soma
objectvar stim
stim = new IClamp(0.5)
// Inizializzazione dei parametri per il delay, la durata e l'ampiezza dell'oscillazione
stim.del = 100
stim.dur = 100
stim.amp = 0.1
// Inizializzazione del tempo finale
tstop = 300
Sezioni
[modifica | modifica sorgente]I blocchi di costruzione fondamentali in NEURON sono chiamati "sezioni". Inizialmente, una sezione rappresenta solo un tubo cilindrico con proprietà individuali come la lunghezza e il diametro. Una sezione può essere utilizzata per rappresentare diverse parti del neurone, come un soma, una dendrite o un assone, dotandola dei meccanismi corrispondenti come i canali ionici o le connessioni sinaptiche con altre cellule o stimoli artificiali. Una cellula neurale può quindi essere creata collegando gli estremi delle sezioni come si desidera, ad esempio in una struttura a albero, purché non ci siano loop. Il neurone specificato nel codice sopra viene visualizzato nella Figura a destra.
Segmenti
[modifica | modifica sorgente]Per modellare in modo più accurato la propagazione dei potenziali d'azione attraverso le sezioni, le sezioni possono essere divise in parti più piccole chiamate "segmenti". Un modello in cui le sezioni sono suddivise in più segmenti è chiamato modello "multi-compartimentale". Aumentare il numero di segmenti può essere visto come aumentare la granularità della discretizzazione spaziale, questo porta a risultati più accurati quando, ad esempio, le proprietà della membrana non sono uniformi lungo la sezione. Come impostazione predefinita, una sezione è costituita da un solo segmento.
Meccanismi di Membrana
[modifica | modifica sorgente]Le impostazioni predefinite di una sezione non contengono canali ionici, ma l'utente può aggiungerli [20] . Ci sono due tipi di meccanismi di membrana disponibili per i canali ionici, ovvero un modello di membrana per canali ionici passivi e un modello di membrana Hodgkin-Huxley che rappresenta una combinazione di canali ionici passivi e canali controllati dalla tensione. Se ciò non è sufficiente, gli utenti possono definire i propri meccanismi di membrana utilizzando il linguaggio di programmazione NMODL.
Processi Puntuali
[modifica | modifica sorgente]Oltre ai meccanismi di membrana definiti sulle aree di membrana, esistono anche meccanismi locali noti come "processi puntuali" che possono essere aggiunti alle sezioni. Alcuni esempi sono le sinapsi, come mostrato nella Figura a destra, e i clamp di tensione e corrente. Di nuovo, gli utenti sono liberi di implementare i propri meccanismi con il linguaggio di programmazione NMODL. La differenza chiave tra i processi puntuali e i meccanismi di membrana è che l'utente può specificare la posizione in cui il processo puntuale deve essere aggiunto alla sezione, poiché si tratta di un meccanismo locale [20].
Output e Visualizzazioni
[modifica | modifica sorgente]Le quantità calcolate possono essere monitorate nel tempo e rappresentate graficamente, per creare ad esempio un grafico della tensione in funzione del tempo all'interno di un segmento specifico, come mostrato nella schermata GUI di prima. È anche possibile creare animazioni, per mostrare ad esempio come si sviluppa la distribuzione della tensione all'interno dell'assone nel tempo. Si noti che le quantità vengono calcolate solo al centro di ogni segmento e ai confini di ogni sezione.
Creazione di una Rete di Cellule
[modifica | modifica sorgente]Oltre alla modellazione delle concentrazioni ioniche all'interno di singole cellule, è anche possibile connettere le cellule e simulare reti di neuroni. Per farlo, l'utente deve collegare sinapsi, che sono processi puntuali, ai neuroni postsinaptici e quindi creare oggetti "NetCon" che agiranno come connessione tra il neurone presinaptico e il neurone postsinaptico. Ci sono diversi tipi di sinapsi che l'utente può collegare ai neuroni, come AlphaSynapse
, in cui la conduttanza sinaptica decade secondo una funzione alfa, e ExpSyn
, in cui la conduttanza sinaptica decade in modo esponenziale. Come per gli altri meccanismi, è anche possibile creare sinapsi personalizzate utilizzando NMODL. Per l'oggetto NetCon è possibile specificare diversi parametri, come la soglia e il ritardo, che determinano le condizioni necessarie affinché il neurone presinaptico provochi un potenziale postsinaptico.
Neuroni Artificiali
[modifica | modifica sorgente]Oltre ai neuroni biologici di cui abbiamo discusso finora, esiste anche un altro tipo di neurone che può essere simulato con NEURON chiamato "artificiale". La differenza tra i neuroni biologici e quelli artificiali in NEURON è che il neurone artificiale non ha una dimensione spaziale e le sue cinetiche sono molto semplificate. Ci sono diversi integratori disponibili per modellare il comportamento delle cellule artificiali in NEURON, che si distinguono per il grado di semplificazione delle dinamiche dei neuroni biologici [21].
Per ridurre il tempo di calcolo per i modelli di cellule artificiali di neuroni che emettono impulsi e le reti neurali, gli sviluppatori di NEURON hanno scelto di supportare simulazioni basate sugli eventi. Questo ha notevolmente ridotto il carico computazionale della simulazione delle trasmissioni sinaptiche innescate dagli impulsi. Sebbene la modellazione delle cellule neuronali basate sulla conducibilità richieda una simulazione continua del sistema, NEURON può comunque sfruttare i vantaggi dei metodi basati sugli eventi per reti che contengono neuroni biologici e artificiali grazie al completo supporto alle simulazioni ibride. In questo modo, è possibile simulare qualsiasi combinazione di cellule artificiali e basate sulla conducibilità, ottenendo comunque il beneficio di un tempo di calcolo ridotto che deriva dalla simulazione basata sugli eventi delle cellule artificiali. [22] . L'utente ha la possibilità di aggungere nuove classi di neuroni artificiali tramite il linguaggio di programmazione NMODL.
Neuron con Python
[modifica | modifica sorgente]Dal 1984 NEURON ha fornito l'interprete hoc per la creazione ed esecuzione delle simulazioni. Il linguaggio hoc è stato esteso e mantenuto per essere utilizzato con NEURON fino ad oggi, ma poiché questa manutenzione richiede molto tempo ed è diventato un linguaggio orfano limitato agli utenti di NEURON, gli sviluppatori di NEURON desiderano un linguaggio di programmazione più moderno come interprete per NEURON. Poiché Python è diventato ampiamente utilizzato nell'ambito del calcolo scientifico, con molti utenti che creano pacchetti contenenti librerie di codice, ora è più attraente come interprete rispetto a hoc[23]. Ci sono tre modi per utilizzare NEURON con Python. Il primo modo è eseguire NEURON con il terminale accettando comandi interattivi di Python. Il secondo modo è eseguire NEURON con l'interprete hoc e accedere ai comandi di Python attraverso comandi speciali in hoc. Il terzo modo è utilizzare NEURON come modulo di estensione per Python, in modo che un modulo NEURON possa essere importato in script di Python o IPython.
Installazione
[modifica | modifica sorgente]Per utilizzare la modalità 1 e 2, ovvero utilizzare NEURON con Python incorporato, è sufficiente completare l'installazione semplice. Tuttavia, per utilizzare la terza modalità, ovvero NEURON come modulo di estensione per Python, è necessario compilare NEURON dal codice sorgente e installare la libreria condivisa di NEURON per Python, come spiegato in questa guida di installazione.
Comandi NEURON in Python
[modifica | modifica sorgente]Poiché NEURON è originariamente sviluppato con hoc come interprete, l'utente deve chiamare esplicitamente le funzioni e le classi hoc da Python. Tutte le funzioni e le classi che esistevano per hoc sono accessibili in Python tramite il modulo "neuron", sia quando si utilizza Python incorporato in NEURON sia quando si utilizza NEURON come modulo di estensione. Ci sono solo alcune differenze minori tra i comandi NEURON in hoc e Python, quindi non dovrebbero esserci molte complicazioni per gli utenti quando si passa da uno all'altro [23]. Ci sono alcuni vantaggi nell'utilizzare NEURON con Python invece di hoc. Uno dei principali vantaggi è che Python offre molte più funzionalità perché è un linguaggio completo orientato agli oggetti e perché esistono una vasta gamma di strumenti di analisi disponibili per la scienza e l'ingegneria. Inoltre, il caricamento di meccanismi creati da altri utenti da script NMODL è diventato più facile, il che rende NEURON più attraente per le simulazioni di meccanismi molto specifici [23]. Ulteriori dettagli su NEURON in combinazione con Python possono essere trovati [1].
Tutorial
[modifica | modifica sorgente]Ci sono molti tutorial disponibili online per iniziare con NEURON e due di essi sono elencati di seguito.
Nel primo tutorial inizierai imparando come creare una cellula a compartimento singolo e finirai creando una rete di neuroni come mostrato nella Figura a destra, contenente meccanismi cellulari personalizzati. Nel frattempo, sarai guidato attraverso le funzionalità di NEURON per i template, l'automazione, l'ottimizzazione del tempo di calcolo e l'estrazione dei dati risultanti. Il tutorial utilizza comandi hoc, ma le procedure sono quasi le stesse in Python.
Il secondo tutorial mostra come creare una cellula con una membrana cellulare passiva e uno stimolo sinaptico, e come visualizzare i risultati con il modulo Python matplotlib.
Ulteriori Articoli
[modifica | modifica sorgente]Oltre a quanto menzionato in questa introduzione a NEURON, ci sono molte altre opzioni disponibili che vengono continuamente estese e migliorate dagli sviluppatori. Una spiegazione dettagliata di NEURON si trova in "The NEURON book" [19], che è il libro di riferimento ufficiale. Inoltre, il sito web ufficiale contiene molte informazioni e collegamenti ad altre fonti.
Referenze
[modifica | modifica sorgente]Due ulteriori fonti sono "An adaptive silicon synapse", di Chicca [24] e "Analog VLSI: Circuits and Principles", di Liu [25].
- ↑ T. Haslwanter, Hodgkin-Huxley Simulations [Python], in private communications, 2012.
- ↑ T. Haslwanter, Fitzhugh-Nagumo Model [Python], in private communications, 2012.
- ↑ T. Anastasio, Tutorial on Neural systems Modeling, su sinauer.com, 2010.
- ↑ E Aydiner, AM Vural, B Ozcelik, K Kiymac, U Tan, A simple chaotic neuron model: stochastic behavior of neural networks, 2003.
- ↑ WM Siebert, Some implications of the stochastic behavior of primary auditory neurons, 1965.
- ↑ G Indiveri, F Stefanini, E Chicca, Spike-based learning with a generalized integrate and fire silicon neuron, 2010.
- ↑ 7,0 7,1 7,2 CA Mead, Analog VLSI and Neural Systems, 1989.
- ↑ 8,0 8,1 RJ Douglas, MA Mahowald, Silicon Neuron, 2003.
- ↑ J Lazzaro, S Ryckebusch, MA Mahowald, CA Mead, Winner-Take-All: Networks of Complexity, 1989.
- ↑ M Riesenhuber, T Poggio, Hierarchical models of object recognition in cortex, 1999.
- ↑ E Chicca, G Indiveri, R Douglas, An event-based VLSI network of Integrate-and-Fire Neurons, 2004.
- ↑ G Indiveri, E Chicca, R Douglas, A VLSI reconfigurable network of integrate-and-fire neurons with spike-based learning synapses, 2004.
- ↑ J Lazzaro, J Wawrzynek, Low-Power Silicon Neurons, Axons, and Synapses, 1993.
- ↑ S Mitra, G Indiveri, RE Cummings, Synthesis of log-domain integrators for silicon synapses with global parametric control, 2010.
- ↑ DO Hebb, The organization of behavior, 1949.
- ↑ 16,0 16,1 PA Koplas, RL Rosenberg, GS Oxford, The role of calcium in the densensitization of capsaisin responses in rat dorsal root ganglion neurons, 1997.
- ↑ G Rachmuth, HZ Shouval, MF Bear, CS Poon, A biophysically-based neuromorphic model of spike rate-timing-dependent plasticity, 2011.
- ↑ 18,0 18,1 Neuron, for empirically-based simulations of neurons and networks of neurons, su neuron.yale.edu.
- ↑ 19,0 19,1 Nicholas T. Carnevale, Michael L. Hines, The NEURON book, 2009.
- ↑ 20,0 20,1 NEURON Tutorial 1, su anc.ed.ac.uk.
- ↑ M.L. Hines and N.T. Carnevale, The NEURON Simulation Environment, 2002.
- ↑ Romain Brette, Michelle Rudolph, Ted Carnevale, Michael Hines, David Beeman, James M. Bower, Markus Diesmann, Abigail Morrison, Philip H. Goodman, Frederick C. Harris, Jr., Milind Zirpe, Thomas Natschläger, Dejan Pecevski, Bard Ermentrout, Mikael Djurfeldt, Anders Lansner, Olivier Rochel, Thierry Vieville, Eilif Muller, Andrew P. Davison, Sami El Boustani, Alain Destexhe, Simulation of networks of spiking neurons: A review of tools and strategies, 2002.
- ↑ 23,0 23,1 23,2 Hines ML, Davison AP, Muller E. NEURON and Python. Frontiers in Neuroinformatics. 2009;3:1. doi:10.3389/neuro.11.001.2009., NEURON and Python, 2009.
- ↑ E Chicca, G Indiveri, R Douglas, An adaptive silicon synapse, 2003.
- ↑ SC Liu, J Kramer, T Delbrück, G Indiveri, R Douglas, Analog VLSI: Circuits and Principles, 2002.