从感知机到神经网络
深度学习的"砖块"——神经元——其实非常简单。一个神经元干的事,跟逻辑回归几乎一样。
生物神经元 vs 人工神经元
生物神经元 人工神经元
输入 x1 ──w1─┐
树突 ──→ 细胞体 ──→ 轴突 输入 x2 ──w2─┼─→ Σ + b → f() → 输出
(接收) (处理) (输出) 输入 x3 ──w3─┘
数学形式:
- 给每个输入 x_i 一个权重 w_i
- 求加权和
z = w1*x1 + w2*x2 + ... + wn*xn + b - 经过一个激活函数
f(z)得到输出
y = f( sum(w_i * x_i) + b )
感知机:第一个能学习的神经元
1958 年,Frank Rosenblatt 提出了感知机(Perceptron)。激活函数是阶跃函数:
f(z) = 1, if z >= 0
f(z) = 0, if z < 0
它能学会线性可分的数据(类似逻辑回归),但学不会异或——这个发现直接导致了第一个 AI 寒冬。
多层感知机(MLP):突破线性
把多个神经元堆叠成多层,就突破了感知的局限:
输入层 隐藏层 输出层
┌─→ ● ─┐
x1 ────────────┤ ├──→ ● ──→ y
└─→ ● ─┘
x2 ────────────┤ │
└─→ ● ─┘
x3 ────────────┘
万能近似定理(Universal Approximation Theorem):只要隐藏层有足够多的神经元,MLP 能以任意精度逼近任何连续函数。
这个定理很猛,但有代价——我们需要找到合适的权重。1960 年代没人知道怎么训练多层网络,直到 1986 年反向传播算法被重新发现。
激活函数:让网络"非线性"
如果激活函数还是线性的(比如 f(z) = z),那多层堆叠等价于单层——线性变换的组合还是线性的。要让多层有意义,激活函数必须非线性。
常用的:
| 激活函数 | 公式 | 范围 | 特点 |
|---|---|---|---|
| Sigmoid | 1 / (1 + e^(-z)) | (0, 1) | 老的,但梯度消失严重 |
| Tanh | tanh(z) | (-1, 1) | 0 中心,稍好 |
| ReLU | max(0, z) | [0, ∞) | 现代默认,简单高效 |
| Leaky ReLU | max(0.01*z, z) | (-∞, ∞) | 解决神经元死亡 |
| Softmax | e^(z_i) / sum(e^(z_j)) | (0, 1) 和为1 | 多分类输出 |
用 PyTorch 实现一个 MLP
import torch
import torch.nn as nn
class MLP(nn.Module):
def __init__(self, input_dim, hidden_dim, output_dim):
super().__init__()
self.net = nn.Sequential(
nn.Linear(input_dim, hidden_dim), # 全连接
nn.ReLU(), # 激活
nn.Linear(hidden_dim, hidden_dim), # 第二层
nn.ReLU(),
nn.Linear(hidden_dim, output_dim) # 输出
)
def forward(self, x):
return self.net(x)
# 用法
model = MLP(input_dim=784, hidden_dim=128, output_dim=10) # MNIST 分类
x = torch.randn(32, 784) # batch=32, 28*28 像素
y_pred = model(x)
print(y_pred.shape) # torch.Size([32, 10])
关键概念:网络的"容量"
网络的"学习能力"由这些因素决定:
- 层数(深度):更深 → 更抽象的特征
- 每层神经元数(宽度):更宽 → 更多的特征组合
- 激活函数:影响非线性能力
- 参数量:总参数量 ≈ 表达能力上限
但不是越大越好——会过拟合。下一章的反向传播和训练技巧会讲怎么"训好"而不是"训坏"。
小结
- 神经元 = 加权和 + 激活函数,和逻辑回归本质一样
- 多层堆叠 = 多层感知机(MLP),理论上能逼近任何函数
- 激活函数必须非线性,否则多层没意义
- ReLU 是现代默认;Softmax 用于多分类输出
- 下一章讲怎么训练这些网络:反向传播 + 梯度下降
练习思考
- 为什么单层感知机学不会异或(XOR)?画一下四个点的位置想想。
- 用 PyTorch 跑一个 3 层 MLP,在 MNIST 上达到 95% 以上准确率。
- 试着把激活函数从 ReLU 换成 Sigmoid,观察训练速度和最终精度的变化。
章末小测验
检验你对《从感知机到神经网络》的掌握程度。
1
为什么单层感知机学不会异或(XOR)?
2
激活函数为什么必须是非线性的?
学完这章, 你可能想看
讨论区(0)
加载评论中...