ChatGPT:「更貼近生物機制」的 PyTorch 神經網路
- Dominant language
- Jupyter Notebook
- Stars
- 2
- Forks
- 0
- PR merge metrics
- No merged PRs in 30d
Description
下面給你一個「更貼近生物機制」的 PyTorch 神經網路範例:
它把你前面列的**突觸五步驟**抽象成可計算的元件:
* **LIF 神經元**(膜電位整合與放電)
* **導納型(conductance-based)突觸** + **短期可塑性(Tsodyks–Markram;囊泡釋放/再回收)**
* **STDP(spike-timing-dependent plasticity)學習規則**
* **興奮性反轉電位 $E_\text{exc}$** 與**漏電/去極化動力學**,以**PSP** 形式影響膜電位
* **神經遞質清除**以指數衰減(對應受體關閉/回收)
> 對應生理步驟(你列的 1–5):
> 1️⃣ 動作電位→Ca²⁺:以 **pre-spike** 觸發 Tsodyks–Markram 的**釋放機率/利用率 $u$** 上升
> 2️⃣ 囊泡釋放:可用資源 $x$ 與 $u$ 的乘積 $r=u\cdot x$ 代表**釋放量**(進入突觸間隙)
> 3️⃣ 受體結合:**突觸導納 $g$** 藉由 $g \mathrel{+}= W r$ 增加,並隨時間衰減
> 4️⃣ 產生 PSP:**突觸電流** $I_\text{syn}=g\,(E_\text{rev}-V)$ 推動 **LIF** 膜電位
> 5️⃣ 清除/回收:$g$ 指數衰減;$x$ 朝 1 復原;$u$ 向基線衰減
---
## 可執行 PyTorch 範例(單層 E→E,可加 I 突觸擴充)
```python
# pip install torch
import torch
import torch.nn as nn
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
# ====== 生理參數(以毫秒為單位換算為秒;僅示意,非唯一定值) ======
dt = 1e-3 # 1 ms
T = 0.5 # 500 ms 模擬窗
steps = int(T / dt)
N_in = 100 # 輸入 presyn 神經元數
N_out = 64 # postsyn LIF 神經元數
batch = 32 # 迷你批次
# LIF 參數
tau_m = 20e-3 # 膜時間常數
E_L = -0.065 # 漏電反轉電位 (V)
V_th = -0.050 # 閾值
V_reset = -0.065
refractory = int(2e-3 / dt) # 2 ms 不應期
# 導納型突觸(興奮性)
tau_syn = 5e-3 # AMPA 類快速突觸
E_exc = 0.0 # 興奮性反轉電位(約 0 mV)
# Tsodyks–Markram 短期可塑性(STP)
U = 0.2 # 基本利用率(近似 Ca2+ 促進釋放)
tau_d = 0.8 # 資源恢復(秒)—抑鬱型
tau_f = 0.2 # 利用率衰減(秒)—促進型
# STDP 參數(pair-based)
tau_pre = 20e-3
tau_post = 20e-3
A_plus = 1e-3
A_minus = 1.05e-3
w_min, w_max = 0.0, 0.05
# ====== 模型權重 ======
W = torch.rand(N_in, N_out, device=device) * 0.01
W.requires_grad = False # 我們用 STDP 直接更動,不走反向傳播
# ====== 狀態變數 ======
# LIF 狀態
V = torch.full((batch, N_out), E_L, device=device)
ref_count = torch.zeros((batch, N_out), dtype=torch.long, device=device)
# 突觸導納(postsyn)
g_exc = torch.zeros((batch, N_out), device=device)
# Tsodyks–Markram(presyn 每個突觸終端)
x = torch.ones((batch, N_in), device=device) # 可用囊泡資源
u = torch.zeros((batch, N_in), device=device) # 利用率(近似 Ca2+ 促通)
# STDP 痕跡
pre_trace = torch.zeros((batch, N_in), device=device)
post_trace = torch.zeros((batch, N_out), device=device)
# ====== 輸入:泊松脈衝 ======
def poisson_spikes(rate_hz, steps, shape):
# rate_hz: 每秒發放率
p = rate_hz * dt
return torch.bernoulli(torch.full((steps,) + shape, p, device=device))
in_rate = 8.0 # Hz
X = poisson_spikes(in_rate, steps, (batch, N_in)) # [T, B, N_in]
# ====== 模擬迴圈 ======
spike_hist = []
for t in range(steps):
pre_spike = X[t] # [B, N_in] 0/1
# --- STP 時間常數衰減 ---
x = 1.0 - (1.0 - x) * torch.exp(-dt / tau_d)
u = u * torch.exp(-dt / tau_f)
# --- Pre spike 觸發釋放量 r = u*x*pre ---
u = u + U * (1.0 - u) * pre_spike
r = u * x * pre_spike
x = x - r # 資源被釋放而下降
# --- 導納突觸更新(受體開啟) ---
g_exc = g_exc * torch.exp(-dt / tau_syn) + (r @ W) # [B, N_out]
# --- 突觸電流 & LIF 膜電位整合 ---
I_syn = g_exc * (E_exc - V) # conductance-based
# 不在不應期者才積分
active = (ref_count <= 0).float()
V = V + active * (dt * ((E_L - V) / tau_m + I_syn))
# --- 產生 spikes 與重置/不應期 ---
post_spike = (V >= V_th).float()
spike_hist.append(post_spike.detach().cpu())
V = torch.where(post_spike.bool(), torch.full_like(V, V_reset), V)
ref_count = torch.where(post_spike.bool(), torch.full_like(ref_count, refractory), ref_count)
ref_count = torch.clamp(ref_count - 1, min=0)
# --- STDP 痕跡衰減 ---
pre_trace *= torch.exp(-dt / tau_pre)
post_trace *= torch.exp(-dt / tau_post)
# --- 痕跡在尖峰時更新 ---
pre_trace = pre_trace + pre_spike
post_trace = post_trace + post_spike
# --- STDP 權重更新(以批次內總和近似) ---
# LTP:pre 在 t 觸發,與最近 post 痕跡相關
dW_plus = (pre_spike.transpose(0,1) @ post_trace) / batch # [N_in, N_out]
# LTD:post 在 t 觸發,與最近 pre 痕跡相關
dW_minus = (pre_trace.transpose(0,1) @ post_spike) / batch
W += A_plus * dW_plus - A_minus * dW_minus
W.clamp_(w_min, w_max)
spike_hist = torch.stack(spike_hist) # [T, B, N_out]
print("模擬完成,postsyn 平均發放率(Hz) =",
spike_hist.float().mean().item() / dt / batch)
```
### 怎麼跑
* 直接執行檔案即可(CPU 也能跑)。
* 想觀察學習:把 `in_rate` 調高、或延長 `T`,並記錄 `W` 的分佈;也可加上第二組輸入圖樣(不同發放率/相位),觀察 STDP 將權重集中到能「預測」post-spike 的輸入上。
### 怎麼擴充更「生物」
* 加入 **抑制性突觸**($E_\text{inh}\approx -0.070$ V、$\tau_\text{inh}\approx 10\!\sim\!15$ ms),形成 E/I 平衡網路。
* 將 LIF 改為 **AdEx**(自適應指數整合-放電),能重現更多放電型態。([[Physiology Journals](https://journals.physiology.org/doi/abs/10.1152/jn.00686.2005?utm_source=chatgpt.com)][1], [[Scholarpedia](https://www.scholarpedia.org/article/Adaptive_exponential_integrate-and-fire_model?utm_source=chatgpt.com)][2], [[brian2.readthedocs.io](https://brian2.readthedocs.io/en/stable/examples/frompapers.Brette_Gerstner_2005.html?utm_source=chatgpt.com)][3])
* 將 AMPA/NMDA 分離,NMDA 加上 **Mg²⁺ 電壓阻塞**(非線性導納),更貼近受體動力學。([[PMC](https://pmc.ncbi.nlm.nih.gov/articles/PMC9130461/?utm_source=chatgpt.com)][4])
* 調整 **Tsodyks–Markram** 參數以模擬**促進**或**抑鬱**突觸(例如短期促進:$\tau_f$ 大、$U$ 小)。([[Scholarpedia](https://www.scholarpedia.org/article/Short-term_synaptic_plasticity?utm_source=chatgpt.com)][5], [[zpkilpat.github.io](https://zpkilpat.github.io/appm4370/papers/tsodyks98.pdf?utm_source=chatgpt.com)][6])
* 改用「指數雙相」或三跡 STDP、或**受體/鈣濃度**依賴的可塑性規則。([[PMC](https://pmc.ncbi.nlm.nih.gov/articles/PMC3187646/?utm_source=chatgpt.com)][7], [[ScienceDirect](https://www.sciencedirect.com/science/article/pii/S0896627312007039?utm_source=chatgpt.com)][8])
---
## 為什麼說這個模型「更生物」?
* **LIF / AdEx** 來自經典生物物理簡化,能近似多種放電現象。([[lcnwww.epfl.ch](https://lcnwww.epfl.ch/gerstner/PUBLICATIONS/SpikingNeuronM-extracts.pdf?utm_source=chatgpt.com)][9], [[cns.nyu.edu](https://www.cns.nyu.edu/~eorhan/notes/lif-neuron.pdf?utm_source=chatgpt.com)][10], [[CENL](https://cenl.ucsd.edu/CompNeuro/Readings/week13/Brette-Gerstner%2BAdaptive-exponential-integrate-fire-effective%2BJNP%2B2005.pdf?utm_source=chatgpt.com)][11])
* **Conductance-based 突觸**使用 $I=g(V-E_\text{rev})$ 形式,對應受體導納開關與反轉電位。([[PMC](https://pmc.ncbi.nlm.nih.gov/articles/PMC9130461/?utm_source=chatgpt.com)][4], [[Physical Review Link Manager](https://link.aps.org/doi/10.1103/PhysRevX.12.011044?utm_source=chatgpt.com)][12])
* **Tsodyks–Markram STP** 把「釋放機率(近似 Ca²⁺ 觸發)」與「囊泡庫存」分離,能重現短期促進/抑鬱與頻率依賴。([[Scholarpedia](https://www.scholarpedia.org/article/Short-term_synaptic_plasticity?utm_source=chatgpt.com)][5], [[zpkilpat.github.io](https://zpkilpat.github.io/appm4370/papers/tsodyks98.pdf?utm_source=chatgpt.com)][6], [[PMC](https://pmc.ncbi.nlm.nih.gov/articles/PMC3268177/?utm_source=chatgpt.com)][13])
* **STDP** 以 pre/post 時序決定 LTP/LTD,對應大量皮層實驗。([[PMC](https://pmc.ncbi.nlm.nih.gov/articles/PMC3187646/?utm_source=chatgpt.com)][7], [[ScienceDirect](https://www.sciencedirect.com/science/article/pii/S0896627312007039?utm_source=chatgpt.com)][8])
---
### 參考文獻(可查核來源)
* Gerstner & Kistler,《Spiking Neuron Models》(Cambridge Univ. Press):LIF/AdEx 與可塑性綜述(含可下載書摘)。([[lcnwww.epfl.ch](https://lcnwww.epfl.ch/gerstner/PUBLICATIONS/SpikingNeuronM-extracts.pdf?utm_source=chatgpt.com)][9])
* Orhan(2012)LIF 筆記,對 LIF 推導與行為有簡明回顧。([[cns.nyu.edu](https://www.cns.nyu.edu/~eorhan/notes/lif-neuron.pdf?utm_source=chatgpt.com)][10])
* Brette & Gerstner(2005)**AdEx** 原始論文;Brian2 官方範例頁。([[Physiology Journals](https://journals.physiology.org/doi/abs/10.1152/jn.00686.2005?utm_source=chatgpt.com)][1], [[brian2.readthedocs.io](https://brian2.readthedocs.io/en/stable/examples/frompapers.Brette_Gerstner_2005.html?utm_source=chatgpt.com)][3])
* Scholarpedia:**短期可塑性(STP)**、**STDP** 條目(含 Tsodyks–Markram 與 Bi & Poo)。([[Scholarpedia](https://www.scholarpedia.org/article/Short-term_synaptic_plasticity?utm_source=chatgpt.com)][5])
* Carannante et al.(2022):AMPA/NMDA **導納型**後突觸電流的數學模型。([[PMC](https://pmc.ncbi.nlm.nih.gov/articles/PMC9130461/?utm_source=chatgpt.com)][4])
* Feldman(2012)、Dan & Poo(2004)**STDP 綜述**。([[ScienceDirect](https://www.sciencedirect.com/science/article/pii/S0896627312007039?utm_source=chatgpt.com)][8])
---
如果你願意,我可以把上面程式改成 **E/I 雙群網路(含 GABA$_A$**)並加上 **NMDA**,或輸出發放率/權重分佈圖,甚至做個**小型非監督學習**示範(例如兩個不同發放模式的輸入,觀察 STDP 自發學到 selectivity)。
[1]: https://journals.physiology.org/doi/abs/10.1152/jn.00686.2005?utm_source=chatgpt.com "Adaptive Exponential Integrate-and-Fire Model as an Effective ..."
[2]: https://www.scholarpedia.org/article/Adaptive_exponential_integrate-and-fire_model?utm_source=chatgpt.com "Adaptive exponential integrate-and-fire model"
[3]: https://brian2.readthedocs.io/en/stable/examples/frompapers.Brette_Gerstner_2005.html?utm_source=chatgpt.com "Example: Brette_Gerstner_2005 - Brian 2 - Read the Docs"
[4]: https://pmc.ncbi.nlm.nih.gov/articles/PMC9130461/?utm_source=chatgpt.com "Data-Driven Model of Postsynaptic Currents Mediated by ..."
[5]: https://www.scholarpedia.org/article/Short-term_synaptic_plasticity?utm_source=chatgpt.com "Short-term synaptic plasticity"
[6]: https://zpkilpat.github.io/appm4370/papers/tsodyks98.pdf?utm_source=chatgpt.com "Neural Networks with Dynamic Synapses"
[7]: https://pmc.ncbi.nlm.nih.gov/articles/PMC3187646/?utm_source=chatgpt.com "A History of Spike-Timing-Dependent Plasticity - PMC"
[8]: https://www.sciencedirect.com/science/article/pii/S0896627312007039?utm_source=chatgpt.com "The Spike-Timing Dependence of Plasticity"
[9]: https://lcnwww.epfl.ch/gerstner/PUBLICATIONS/SpikingNeuronM-extracts.pdf?utm_source=chatgpt.com "Spiking Neuron Models"
[10]: https://www.cns.nyu.edu/~eorhan/notes/lif-neuron.pdf?utm_source=chatgpt.com "The Leaky Integrate-and-Fire Neuron Model"
[11]: https://cenl.ucsd.edu/CompNeuro/Readings/week13/Brette-Gerstner%2BAdaptive-exponential-integrate-fire-effective%2BJNP%2B2005.pdf?utm_source=chatgpt.com "Adaptive Exponential Integrate-and-Fire Model as an ..."
[12]: https://link.aps.org/doi/10.1103/PhysRevX.12.011044?utm_source=chatgpt.com "Emergence of Irregular Activity in Networks of Strongly ..."
[13]: https://pmc.ncbi.nlm.nih.gov/articles/PMC3268177/?utm_source=chatgpt.com "A Role for Short-Term Synaptic Facilitation and Depression ..."
Contributor guide
No contributing guide indexed for this repository
Assessment
This issue has not been assessed yet.