共计 1723 个字符,预计需要花费 5 分钟才能阅读完成。
万能近似定理的数学本质
万能近似定理 (Universal Approximation Theorem) 最早由 Cybenko 在 1989 年证明,其核心表述为:
对于任何连续函数 $f:[0,1]^n \rightarrow \mathbb{R}^m$ 和 $\epsilon>0$,存在一个单隐藏层神经网络 $h$,使得 $|f(x)-h(x)|<\epsilon$ 对所有 $x\in[0,1]^n$ 成立
关键点在于:
1. 隐藏层需要足够多的神经元(宽度而非深度)
2. 激活函数必须是非多项式、有界的 ” 挤压 ” 函数(如 Sigmoid)
3. 定理只保证存在性,不涉及具体训练方法
激活函数对比实验
Sigmoid 函数
$$\sigma(z) = \frac{1}{1+e^{-z}}$$
– 优点:输出范围(0,1),符合概率解释
– 缺点:饱和区梯度接近 0
Tanh 函数
$$\tanh(z) = \frac{e^z – e^{-z}}{e^z + e^{-z}}$$
– 优点:输出范围(-1,1),中心对称
– 缺点:同样存在梯度消失
ReLU 函数
$$\text{ReLU}(z) = \max(0,z)$$
– 优点:计算简单,缓解梯度消失
– 缺点:负区间完全失效
PyTorch 完整实现
import torch
import torch.nn as nn
from sklearn.datasets import make_moons
# 生成非线性可分数据
X, y = make_moons(n_samples=1000, noise=0.1)
X = torch.FloatTensor(X)
y = torch.FloatTensor(y.reshape(-1, 1))
# 定义网络结构
class SingleHiddenLayer(nn.Module):
def __init__(self, input_dim=2, hidden_dim=10):
super().__init__()
self.hidden = nn.Linear(input_dim, hidden_dim) # 关键:单隐藏层
self.output = nn.Linear(hidden_dim, 1)
self.activation = nn.Tanh() # 选择激活函数
def forward(self, x):
x = self.activation(self.hidden(x))
return torch.sigmoid(self.output(x)) # 输出层用 sigmoid
# 训练配置
model = SingleHiddenLayer(hidden_dim=20)
criterion = nn.BCELoss()
optimizer = torch.optim.SGD(model.parameters(), lr=0.1)
# 训练循环
for epoch in range(1000):
optimizer.zero_grad() # 梯度清零
y_pred = model(X)
loss = criterion(y_pred, y)
loss.backward()
optimizer.step()
性能优化关键点
学习率与批大小
通过网格搜索得到的实验数据:
| 批大小 | 最优学习率 | 收敛步数 |
|---|---|---|
| 16 | 0.1 | 450 |
| 32 | 0.05 | 600 |
| 64 | 0.01 | 850 |
结论:更大的批大小需要更小的学习率
隐藏单元数量影响
hidden_units = [5, 10, 20, 50, 100]
test_acc = [0.82, 0.89, 0.93, 0.95, 0.96]

常见问题解决方案
梯度消失识别
- 现象:损失值长期不下降
- 解决方案:
- 改用 ReLU 激活函数
- 添加 BatchNorm 层
- 使用残差连接
输出层选择原则
- 二分类:Sigmoid + BCELoss
- 多分类:Softmax + CrossEntropy
- 回归:恒等映射 + MSELoss
思考题分析
当出现训练误差为 0 但测试误差高时,可能违反:
1. 定理要求的连续函数前提(数据噪声过大)
2. 有限样本下的过拟合(需要正则化)
3. 优化算法未能找到全局最优解(需要调整学习策略)
实践建议
对于实际项目中的非线性问题,建议:
1. 优先尝试单隐藏层结构
2. 隐藏单元数从输入维度的 2 - 5 倍开始
3. 配合适当的正则化手段
4. 监控训练 / 验证损失曲线
通过理解万能近似定理的边界条件,我们能更明智地设计网络结构,避免陷入 ” 越深越好 ” 的误区。
