神经网络的百年进化:从生物启发到数字革命2

1. 起源(1940s-1980s)


1943年:McCulloch-Pitts神经元模型

数学原理
McCulloch和Pitts提出的神经元模型(M-P模型)是第一个形式化的神经元数学模型,其核心思想是:

  • 输入信号通过加权求和后,若总和超过阈值则激活(输出1),否则不激活(输出0)。
  • 公式化表达
    y = { 1 if  ∑ i = 1 n w i x i ≥ θ 0 otherwise y = \begin{cases} 1 & \text{if } \sum_{i=1}^n w_i x_i \geq \theta \\ 0 & \text{otherwise} \end{cases} y={10if i=1nwixiθotherwise
    其中,( x_i ) 是输入,( w_i ) 是权重,( \theta ) 是阈值。

代码实现

import numpy as np

class MPNeuron:
    def __init__(self, weights, threshold):
        self.weights = np.array(weights)
        self.threshold = threshold
    
    def activate(self, inputs):
        weighted_sum = np.dot(inputs, self.weights)
        return 1 if weighted_sum >= self.threshold else 0

# 示例:实现逻辑AND运算(权重=[1,1],阈值=1.5)
neuron = MPNeuron(weights=[1, 1], threshold=1.5)
print(neuron.activate([0, 0]))  # 输出0
print(neuron.activate([1, 1]))  # 输出1

意义与局限性

  • 意义:首次将生物神经元抽象为数学计算单元,为后续神经网络奠定基础。
  • 局限性:权重和阈值需手动设定,无法自动学习(无训练机制)。

原始论文
Warren S. McCulloch & Walter Pitts (1943). A Logical Calculus of the Ideas Immanent in Nervous Activity.


1958年:感知机(Perceptron)

数学原理
Frank Rosenblatt的感知机在M-P模型基础上引入权重可训练性

  • 输入为 ( \mathbf{x} = [x_1, x_2, …, x_n] ),权重为 ( \mathbf{w} = [w_1, w_2, …, w_n] )。
  • 预测输出 ( y_{\text{pred}} = \text{step}(\mathbf{w}^T \mathbf{x} + b) ),其中 ( \text{step}(z) = \begin{cases} 1 & z \geq 0 \ 0 & \text{otherwise} \end{cases} )。
  • 权重更新规则(通过梯度下降):
    Δ w i = η ( y true − y pred ) x i \Delta w_i = \eta (y_{\text{true}} - y_{\text{pred}}) x_i Δwi=η(ytrueypred)xi
    w i ← w i + Δ w i w_i \leftarrow w_i + \Delta w_i wiwi+Δwi
    其中 ( \eta ) 是学习率,( b ) 是偏置项。

代码实现

class Perceptron:
    def __init__(self, input_size, lr=0.1):
        self.weights = np.zeros(input_size)
        self.bias = 0
        self.lr = lr
    
    def step(self, z):
        return 1 if z >= 0 else 0
    
    def train(self, X, y, epochs=100):
        for _ in range(epochs):
            for x, y_true in zip(X, y):
                z = np.dot(x, self.weights) + self.bias
                y_pred = self.step(z)
                error = y_true - y_pred
                self.weights += self.lr * error * x
                self.bias += self.lr * error
    
    def predict(self, X):
        return [self.step(np.dot(x, self.weights) + self.bias) for x in X]

# 示例:训练感知机解决逻辑OR问题
X = np.array([[0,0], [0,1], [1,0], [1,1]])
y = np.array([0, 1, 1, 1])
perceptron = Perceptron(input_size=2)
perceptron.train(X, y, epochs=10)
print(perceptron.predict(X))  # 输出 [0, 1, 1, 1]

XOR问题的数学证明
XOR函数无法用单层感知机解决,因为其决策边界是非线性的:

  • 假设存在权重 ( w_1, w_2 ) 和偏置 ( b ),需满足:
    { w 1 ⋅ 0 + w 2 ⋅ 0 + b < 0 ( 0 ⊕ 0 = 0 ) w 1 ⋅ 0 + w 2 ⋅ 1 + b ≥ 0 ( 0 ⊕ 1 = 1 ) w 1 ⋅ 1 + w 2 ⋅ 0 + b ≥ 0 ( 1 ⊕ 0 = 1 ) w 1 ⋅ 1 + w 2 ⋅ 1 + b < 0 ( 1 ⊕ 1 = 0 ) \begin{cases} w_1 \cdot 0 + w_2 \cdot 0 + b < 0 \quad (0 \oplus 0 = 0) \\ w_1 \cdot 0 + w_2 \cdot 1 + b \geq 0 \quad (0 \oplus 1 = 1) \\ w_1 \cdot 1 + w_2 \cdot 0 + b \geq 0 \quad (1 \oplus 0 = 1) \\ w_1 \cdot 1 + w_2 \cdot 1 + b < 0 \quad (1 \oplus 1 = 0) \\ \end{cases} w10+w20+b<0(00=0)w10+w21+b0(01=1)w11+w20+b0(10=1)w11+w21+b<0(11=0)
    联立方程无解,矛盾。

原始论文
Frank Rosenblatt (1958). The Perceptron: A Probabilistic Model for Information Storage and Organization in the Brain.


1969年:Minsky的批判

核心论点
Marvin Minsky和Seymour Papert在《Perceptrons》一书中指出:

  1. 单层感知机无法解决非线性问题(如XOR),且扩展到多层网络缺乏有效的训练算法。
  2. 计算复杂度爆炸:多层感知机的理论分析困难,缺乏数学工具支持。

数学分析示例
书中使用群论和几何学证明,单层感知机无法识别简单拓扑性质(如连通性):

  • 设图像为二值像素矩阵,判断是否连通。
  • 结论:任何线性分类器无法用有限个局部特征组合解决此问题。

代码验证XOR不可分性

# 尝试用感知机拟合XOR问题(必然失败)
X_xor = np.array([[0,0], [0,1], [1,0], [1,1]])
y_xor = np.array([0, 1, 1, 0])
perceptron_xor = Perceptron(input_size=2)
perceptron_xor.train(X_xor, y_xor, epochs=100)
print(perceptron_xor.predict(X_xor))  # 输出 [0, 0, 0, 0](完全错误)

影响

  • 直接导致1970年代神经网络研究经费被大幅削减(第一次AI寒冬)。
  • 推动AI研究转向符号主义(如专家系统)。

书籍链接
Marvin Minsky & Seymour Papert (1969). Perceptrons: An Introduction to Computational Geometry.


总结

  • McCulloch-Pitts模型:将生物神经元抽象为数学逻辑门,但缺乏学习能力。
  • 感知机:首次实现可训练分类器,但因线性局限性引发AI寒冬。
  • Minsky的批判:揭示了连接主义的理论瓶颈,迫使研究者转向更复杂的网络结构和算法(如反向传播)。

这些早期工作为后续深度学习的发展埋下伏笔——尽管短期内受挫,但为1980年代反向传播算法的突破奠定了基础。

2. 复兴与突破(1980s-2000s)


1986年:反向传播算法(Backpropagation)

数学原理
反向传播算法通过链式法则将损失函数的梯度从输出层逐层反向传播至输入层,解决了多层神经网络的参数优化问题。核心步骤:

  1. 前向传播:计算每一层的输出 ( a^{(l)} = \sigma(z^{(l)}) ),其中 ( z^{(l)} = W^{(l)} a^{(l-1)} + b^{(l)} ),( \sigma ) 为激活函数。
  2. 损失计算:如均方误差 ( L = \frac{1}{2} \sum_{i=1}^n (y_i - a{(L)}_i)2 )。
  3. 反向传播梯度
    • 输出层误差:( \delta^{(L)} = (a^{(L)} - y) \odot \sigma’(z^{(L)}) )
    • 隐藏层误差:( \delta^{(l)} = (W^{(l+1)T} \delta^{(l+1)}) \odot \sigma’(z^{(l)}) )
    • 参数梯度:( \frac{\partial L}{\partial W^{(l)}} = \delta^{(l)} a^{(l-1)T} ),( \frac{\partial L}{\partial b^{(l)}} = \delta^{(l)} )
  4. 参数更新:使用梯度下降 ( W^{(l)} \leftarrow W^{(l)} - \eta \frac{\partial L}{\partial W^{(l)}} )。

代码实现(手动实现反向传播)

import numpy as np

class MLP:
    def __init__(self, layers):
        self.weights = [np.random.randn(layers[i], layers[i+1]) for i in range(len(layers)-1)]
        self.biases = [np.random.randn(layers[i+1]) for i in range(len(layers)-1)]
    
    def sigmoid(self, z):
        return 1 / (1 + np.exp(-z))
    
    def sigmoid_derivative(self, z):
        return self.sigmoid(z) * (1 - self.sigmoid(z))
    
    def train(self, X, y, epochs=1000, lr=0.1):
        for _ in range(epochs):
            # 前向传播
            activations = [X]
            zs = []
            for w, b in zip(self.weights, self.biases):
                z = np.dot(activations[-1], w) + b
                zs.append(z)
                activations.append(self.sigmoid(z))
            
            # 反向传播
            delta = (activations[-1] - y) * self.sigmoid_derivative(zs[-1])
            for i in reversed(range(len(self.weights)-1)):
                delta = np.dot(delta, self.weights[i+1].T) * self.sigmoid_derivative(zs[i])
                dw = np.dot(activations[i].T, delta)
                db = np.sum(delta, axis=0)
                self.weights[i] -= lr * dw
                self.biases[i] -= lr * db

# 示例:训练一个2层网络解决XOR问题
X = np.array([[0,0], [0,1], [1,0], [1,1]])
y = np.array([[0], [1], [1], [0]])
mlp = MLP([2, 4, 1])  # 输入层2节点,隐藏层4节点,输出层1节点
mlp.train(X, y, epochs=10000, lr=0.1)
print(mlp.sigmoid(np.dot(X, mlp.weights[0]) + mlp.biases[0]))  # 查看隐藏层输出

意义与局限性

  • 意义:首次实现多层网络自动训练,开启深度学习时代。
  • 局限性:梯度消失/爆炸问题未解决(如使用Sigmoid激活函数时)。

原始论文
Rumelhart, D. E., Hinton, G. E., & Williams, R. J. (1986). Learning representations by back-propagating errors. Nature.


1989年:卷积神经网络(CNN)雏形

数学原理
LeNet的核心创新:

  1. 卷积层:通过局部连接和权重共享减少参数。
    • 输入图像 ( I \in \mathbb{R}^{H \times W} ),卷积核 ( K \in \mathbb{R}^{k \times k} ),输出特征图 ( O \in \mathbb{R}^{(H-k+1) \times (W-k+1)} ),其中 ( O_{i,j} = \sum_{m=0}^{k-1} \sum_{n=0}^{k-1} I_{i+m,j+n} K_{m,n} )。
  2. 池化层(如最大池化):下采样特征图,增强平移不变性。
    • ( O_{i,j} = \max(I_{2i:2i+2, 2j:2j+2}) )。

代码实现(PyTorch复现LeNet)

import torch
import torch.nn as nn

class LeNet(nn.Module):
    def __init__(self):
        super().__init__()
        self.conv1 = nn.Conv2d(1, 6, kernel_size=5)  # 输入通道1,输出通道6
        self.pool = nn.MaxPool2d(kernel_size=2, stride=2)
        self.conv2 = nn.Conv2d(6, 16, kernel_size=5)
        self.fc1 = nn.Linear(16*4*4, 120)
        self.fc2 = nn.Linear(120, 84)
        self.fc3 = nn.Linear(84, 10)
    
    def forward(self, x):
        x = self.pool(torch.relu(self.conv1(x)))  # 输出尺寸:6@12x12 → 6@6x6
        x = self.pool(torch.relu(self.conv2(x)))   # 输出尺寸:16@8x8 → 16@4x4
        x = x.view(-1, 16*4*4)
        x = torch.relu(self.fc1(x))
        x = torch.relu(self.fc2(x))
        x = self.fc3(x)
        return x

# 示例:在MNIST数据集上训练LeNet
from torchvision import datasets, transforms
transform = transforms.Compose([transforms.ToTensor(), transforms.Normalize((0.5,), (0.5,))])
train_data = datasets.MNIST(root='./data', train=True, download=True, transform=transform)
train_loader = torch.utils.data.DataLoader(train_data, batch_size=64, shuffle=True)

model = LeNet()
criterion = nn.CrossEntropyLoss()
optimizer = torch.optim.SGD(model.parameters(), lr=0.01)

for epoch in range(5):
    for images, labels in train_loader:
        outputs = model(images)
        loss = criterion(outputs, labels)
        optimizer.zero_grad()
        loss.backward()
        optimizer.step()
    print(f'Epoch {epoch+1}, Loss: {loss.item():.4f}')

意义与局限性

  • 意义:首次将卷积和池化结合,显著降低参数数量,适应图像平移不变性。
  • 局限性:受限于当时算力(如CPU计算),无法训练深层网络。

原始论文
LeCun, Y., et al. (1989). Backpropagation Applied to Handwritten Zip Code Recognition. Neural Computation.


1990s:支持向量机(SVM)的竞争

数学原理
SVM通过最大化分类间隔实现高效分类:

  1. 原始问题
    min ⁡ w , b 1 2 ∥ w ∥ 2 s.t. y i ( w T x i + b ) ≥ 1 , ∀ i \min_{w,b} \frac{1}{2} \|w\|^2 \quad \text{s.t.} \quad y_i(w^T x_i + b) \geq 1, \forall i w,bmin21w2s.t.yi(wTxi+b)1,i
  2. 对偶问题(引入拉格朗日乘子 ( \alpha_i )):
    max ⁡ α ∑ i = 1 n α i − 1 2 ∑ i , j α i α j y i y j x i T x j \max_{\alpha} \sum_{i=1}^n \alpha_i - \frac{1}{2} \sum_{i,j} \alpha_i \alpha_j y_i y_j x_i^T x_j αmaxi=1nαi21i,jαiαjyiyjxiTxj
    s.t. α i ≥ 0 , ∑ i = 1 n α i y i = 0 \text{s.t.} \quad \alpha_i \geq 0, \sum_{i=1}^n \alpha_i y_i = 0 s.t.αi0,i=1nαiyi=0
  3. 核技巧:将输入映射到高维空间 ( \phi(x) ),用核函数 ( K(x_i, x_j) = \phi(x_i)^T \phi(x_j) ) 避免显式计算。

代码实现(SVM分类)

from sklearn import svm
from sklearn.datasets import make_moons
from sklearn.model_selection import train_test_split

# 生成非线性数据集
X, y = make_moons(n_samples=100, noise=0.2, random_state=42)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3)

# 训练SVM(使用RBF核)
clf = svm.SVC(kernel='rbf', gamma='auto')
clf.fit(X_train, y_train)
print(f'Test Accuracy: {clf.score(X_test, y_test):.2f}')

# 对比单层感知机的性能
from sklearn.linear_model import Perceptron
perceptron = Perceptron()
perceptron.fit(X_train, y_train)
print(f'Perceptron Accuracy: {perceptron.score(X_test, y_test):.2f}')

SVM的优势

  • 理论完备:凸优化问题保证全局最优解。
  • 小样本高效:依赖支持向量而非全部数据。
  • 核方法:通过非线性核(如RBF)处理复杂边界。

原始论文
Cortes, C., & Vapnik, V. (1995). Support-Vector Networks. Machine Learning.


总结

  • 反向传播:赋予多层网络生命力,但受梯度问题制约。
  • CNN:开辟视觉任务新路径,等待硬件革命。
  • SVM:凭借理论和工程优势压制神经网络十余年。

这一时期的突破为21世纪深度学习崛起埋下伏笔:反向传播算法是深度学习的引擎,CNN成为计算机视觉基石,而SVM的竞争则倒逼神经网络改进理论缺陷(如ReLU激活函数解决梯度消失)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值