1.2 人工神經元的生物學原型與 M-P 模型(1943)#
一、歷史背景:當神經外科醫生遇上邏輯學家#
1943 年,神經生理學家 Warren McCulloch 與年僅 18 歲的邏輯學天才 Walter Pitts 在《Bulletin of Mathematical Biophysics》發表《A Logical Calculus of the Ideas Immanent in Nervous Activity》。這篇論文完成了一件石破天驚的事:用命題邏輯描述神經網路的計算,證明由神經元組成的網路原則上可以計算任何圖靈機可計算的函數。
這篇論文誕生的背景是:
- Cajal 的神經元學說(1888-1906):Santiago Ramón y Cajal 用染色法確立了神經系統由離散的神經元構成,神經元之間在突觸處以特定方向傳遞訊號——這是「神經元可以作為獨立計算單元」的解剖學基礎。
- Sherrington 的突觸理論(1906):Charles Sherrington 提出突觸有興奮性與抑制性之分,且存在「加總」現象——多個微弱輸入可以累積觸發動作電位。
- 圖靈機(1936):提供了「計算」的嚴格定義,使人們能問「神經系統能計算什麼」。
- 二戰期間的計算需求:控制論(Cybernetics,Wiener 1948)運動正把生物體與機器視為同構的訊息處理系統。
McCulloch 的目標是回答一個哲學-科學混合的問題:大腦這團「濕軟的物質」,憑什麼能進行邏輯思考? 他的答案是:只要神經元的行為可以被簡化為二值的「全有全無」事件,神經網路就是一台邏輯機器。
二、生物學原型:神經元到底在做什麼#
在建立數學模型之前,必須理解被建模的對象。生物神經元的結構與功能如下:
flowchart LR
D[樹突 Dendrites<br>接收其他神經元的輸入] --> S[細胞體 Soma<br>整合所有輸入訊號]
S -->|"膜電位超過閾值<br>(約 -55 mV)"| A[軸突丘 Axon Hillock<br>觸發動作電位]
A --> AX[軸突 Axon<br>長距離傳導電脈衝]
AX --> T[突觸終端<br>釋放神經傳導物質]
T --> N[下一個神經元的樹突]關鍵的生理事實,每一条都對應了 M-P 模型的一個數學假設:
| 生物事實 | M-P 模型的數學對應 |
|---|---|
| 動作電位是「全有全無」(all-or-none)的二值事件 | 神經元輸出 \(y \in \{0, 1\}\) |
| 突觸有興奮性(促進放電)與抑制性(阻止放電) | 輸入有正權重與負權重(甚至硬抑制) |
| 細胞體對大量突觸輸入做空間加總 | 對輸入求加權和 |
| 存在放電閾值(threshold,約 -55 mV) | 閾值函數 \(\theta\) ,超過才輸出 1 |
| 軸突有傳導延遲、不應期 | 離散時間步的同步更新 |
值得注意的是模型的極簡主義:McCulloch 與 Pitts 刻意拋棄了學習、連續動力學、時間整合等所有複雜性,只保留「加權求和 + 閾值 + 二值輸出」這個骨架。這種抽象正是它成功的關鍵——捨棄生物寫實性,換取可計算性。這一取捨的原則(在生物合理性和數學可解性之間取捨)貫穿了之後八十年的神經網路史。
三、M-P 神經元的數學模型#
3.1 單一神經元的數學定義#
M-P 神經元接收 \(n\) 個二值輸入 \(x_1, \dots, x_n \in \{0, 1\}\) ,其計算規則為:
其中:
- \(w_i\) 是突觸權重: \(w_i > 0\) 表興奮性突觸, \(w_i < 0\) 表抑制性突觸;
- \(\theta\) 是放電閾值;
- 輸出 \(y \in \{0,1\}\) 代表「是否放電」。
用更現代的寫法,可以把 \(-\theta\) 視為偏置 \(b = -\theta\) ,把階躍函數記為 \(H(\cdot)\) :
這個形式讀者會在感知器(第 2 章)、多層感知器(第 3 章)中反覆看到——M-P 模型就是一切人工神經元的直系祖先,後來的所有改進(Sigmoid、ReLU、可學習權重、反向傳播)都是在此骨架上逐步放寬限制。
3.2 M-P 神經元可以計算基本邏輯閘#
McCulloch 與 Pitts 的核心洞見:適當選擇權重與閾值,單一 M-P 神經元可實作任意布爾函數(以兩輸入為例):
| 邏輯閘 | 權重 \((w_1, w_2)\) | 閾值 \(\theta\) | 驗證 |
|---|---|---|---|
| AND | \((1, 1)\) | \(2\) | 僅 \((1,1)\) 時和為 \(2 \geq 2\) |
| OR | \((1, 1)\) | \(1\) | 任一輸入為 1 即放電 |
| NOT | \((-1)\) | \(0\) | 輸入 0 時和為 \(0 \geq 0\) ,輸入 1 時和為 \(-1 < 0\) |
| NAND | \((-1, -1)\) | \(-1\) | 和 \(\geq -1\) 僅當非兩者皆 1 |
由於 {NAND} 是邏輯完備的(任何布爾函數都可由 NAND 組合而成),多層 M-P 神經元網路可以計算任意有限布爾函數。這就是 McCulloch-Pitts 的「邏輯演算」:大腦若由這樣的單元構成,它就是一台邏輯機器。
flowchart TB
subgraph OR閘 ["OR 閘:w=(1,1), θ=1"]
x1a[x1] --> s1((Σ))
x2a[x2] --> s1
s1 -->|"Σ ≥ 1 ?"| ya[y]
end
subgraph AND閘 ["AND 閘:w=(1,1), θ=2"]
x1b[x1] --> s2((Σ))
x2b[x2] --> s2
s2 -->|"Σ ≥ 2 ?"| yb[y]
end3.3 網路層次:可以表達任意布爾電路#
將 M-P 神經元逐層連接(前一層的輸出作為後一層的輸入),可以合成更複雜的函數。例如 XOR 需要兩層:
第一層兩個神經元分別計算 OR 與 NAND,第二層對它們做 AND。這個例子埋下了整個領域最重要的伏筆:XOR 不是線性可分的,單層做不到,多層才行——十七年後(1969)正是這個事實引發了第一次 AI 寒冬(見 2.2 節)。M-P 論文其實已給出多層解法,但「如何自動學出這些權重」的問題,要到 1986 年反向傳播才真正解決。
四、程式碼實作:從閘電路到極簡網路#
4.1 純 Python 實作 M-P 神經元與邏輯閘#
import numpy as np
class MPNeuron:
"""McCulloch-Pitts 神經元:加權和 + 閾值,權重為人工設定(不可學習)"""
def __init__(self, weights, threshold):
self.w = np.array(weights, dtype=float)
self.theta = threshold
def __call__(self, x):
return 1 if np.dot(self.w, x) >= self.theta else 0
# 以權重與閾值「手工設計」四種邏輯閘
AND = MPNeuron([ 1, 1], 2)
OR = MPNeuron([ 1, 1], 1)
NAND = MPNeuron([-1, -1], -1)
NOT = MPNeuron([-1], 0)
inputs = [(0,0), (0,1), (1,0), (1,1)]
for gate, name in [(AND, "AND"), (OR, "OR"), (NAND, "NAND")]:
print(name, [gate(x) for x in inputs])
# AND [0, 0, 0, 1]
# OR [0, 1, 1, 1]
# NAND [1, 1, 1, 0]
# XOR:單一 M-P 神經元無法實作(請讀者嘗試所有 w, θ 組合驗證)
# 但兩層網路可以:
XOR = lambda x1, x2: AND((OR((x1, x2)), NAND((x1, x2))))
print("XOR", [XOR(a, b) for a, b in inputs]) # [0, 1, 1, 0]
4.2 指出模型的致命限制:權重不能學習#
M-P 模型的權重與閾值是人工設計的。上面的程式碼裡,是我們「告訴」機器 AND 的定義,而不是它自己學的。要成為真正的學習系統,必須回答:給定樣本,權重能否自動調整? 這個問題的第一個回答,就是 1949 年的 Hebb 法則與 1957 年的感知器。
4.3 用 PyTorch 重新檢視:可學習版本的前夜#
import torch
import torch.nn as nn
# 同一個數學結構,但權重改為可學習參數(先預告第 3 章的形式)
inputs = torch.tensor([[0.,0.],[0.,1.],[1.,0.],[1.,1.]])
targets = torch.tensor([[0.],[1.],[1.],[1.]]) # OR
neuron = nn.Linear(2, 1) # y = w·x + b
loss_fn = nn.MSELoss()
opt = torch.optim.SGD(neuron.parameters(), lr=0.1)
for epoch in range(100):
loss = loss_fn(neuron(inputs), targets)
opt.zero_grad(); loss.backward(); opt.step()
print("學到的 w, b =", neuron.weight.data, neuron.bias.data)
print("預測 =", neuron(inputs).round().flatten().tolist())
# 同樣的 M-P 數學,只是把「人設權重」換成「誤差驅動的權重更新」
五、M-P 模型的歷史地位與局限#
5.1 它證明了什麼#
- 神經活動可以被形式邏輯刻畫:全有全無的放電行為足以支撐命題邏輯運算。
- 神經網路具備圖靈完備的潛力:結合圖靈機的無限帶模型,M-P 網路(加記憶)可計算任何可計算函數——大腦沒有原理上的計算障礙。
- 開創了「以簡御繁」的建模傳統:抽象掉生物細節、保留計算本質。今天的深度網路(ReLU 單元就是廣義 M-P 神經元)仍遵循這一傳統。
5.2 它沒有解決什麼(引出後續歷史)#
| 未解問題 | 後續發展 |
|---|---|
| 權重如何自動設定(學習) | Hebb 法則(1949)→ 感知器(1957) |
| 抑制的處理過於簡化(硬抑制不可微) | 可微激活函數(Sigmoid,1960s-1986) |
| 二值輸出無法表達「程度」與機率 | 連續輸出與機率詮釋 |
| XOR 需要多層,但多層網路無訓練演算法 | 反向傳播(1986) |
5.3 Hebb 法則:學習的第一次定義(1949)#
Donald Hebb 在《The Organization of Behavior》提出著名的學習假說:
「當細胞 A 的軸突足夠接近並反覆參與激發細胞 B,某種成長代謝會發生,使 A 激發 B 的效率提高。」
通俗版即「一起放電的細胞連在一起(cells that fire together, wire together)」。其數學雛形為:
即權重增量正比於前後神經元的共同活動。Hebb 法則第一次把「學習」從哲學概念變成可寫進程式碼的局部更新規則,是無監督學習與自組織網路(如 Hopfield 網路、自組織映射)的理論源頭。但它沒有「誤差」的概念——只能增強關聯,不能糾正錯誤。誤差驅動的學習要等感知器登場(第 2 章)。
timeline
title 從生物到演算法的接力
1888 : Cajal 神經元學說(離散單元)
1906 : Sherrington 突觸與加總
1936 : 圖靈機(計算的定義)
1943 : M-P 模型(神經元 = 邏輯閘)
1949 : Hebb 法則(學習的第一條規則)
1957 : 感知器(誤差驅動的可學習神經元)六、本節重點#
- M-P 模型(1943)基於三個生物學簡化:二值全有全無輸出、突觸的正負加權、閾值觸發,將神經元抽象為「加權和 + 階躍函數」。
- 適當設定權重與閾值,單一 M-P 神經元可實作 AND、OR、NOT、NAND 等邏輯閘;多層組合可表達任意布爾函數(XOR 需兩層)。
- M-P 模型在理論上證明了神經網路的計算通用性,為「大腦即計算機」的現代神經科學與 AI 觀點奠基。
- 模型的核心局限:權重不可學習、階躍函數不可微、二值輸出無程度概念——這些限制決定了之後三十年的技術演進方向。
- Hebb 法則(1949)首次將學習形式化為局部權重更新規則,但缺乏誤差信號,無法做監督式糾錯。
- 「表示(M-P 結構)已備、學習未至」——感知器將接下這一棒。
七、思考問題#
- M-P 模型捨棄了神經元的連續動力學、時間整合與適應性。請說明哪些真實神經行為無法用它表達?這種簡化是缺陷還是特徵?
- 請證明:不存在單一 M-P 神經元(即單一超平面)可以實作 XOR。提示:列出四個點在平面上的幾何分布。
- Hebb 法則 \(\Delta w_{ij} = \eta x_i y_j\) 只會使權重增強,長期運行會發生什麼?現代哪些機制(如 Oja 規則、突觸穩態)解決了這個不穩定問題?
- M-P 論文已用兩層網路實作 XOR,為何 1969 年 Minsky-Papert 的批評仍具殺傷力?(提示:問題不在「能不能表示」,而在「能不能學到」。)
- 現代深度學習的 ReLU 單元與 M-P 神經元有何異同?請比較兩者的輸出空間與可微性。