K. Hornik, M. Stinchcombe, and H. White. Multilayer feed- forward networks are universal approximators. Neural Net- works, 2(5):359-366, 1989 论文解读
万能近似定理(Universal Approximation Theorem)揭示了多层前馈神经网络的本质能力:用简单的非线性函数像搭乐高积木一样,拼接出任何连续函数。就像用无数小积木块能搭出任意形状的城堡,神经网络通过组合隐藏层的激活函数(如Sigmoid、ReLU),能以任意精度逼近定义在有限空间内的复杂函数。
f ( x ) = W 2 ⋅ σ ( W 1 x + b 1 ) + b 2 f(x) = W_2 \cdot \sigma(W_1 x + b_1) + b_2 f(x)=W2⋅σ(W1x+b1)+b2
符号 | 解释 | 类比 |
---|---|---|
x x x | 输入向量 | 乐高积木的“原材料” |
W 1 , b 1 W_1, b_1 W1,b1 | 隐藏层权重和偏置 | 积木的“连接方式” |
σ ( ⋅ ) \sigma(\cdot) σ(⋅) | 激活函数(如Sigmoid) | 积木的“形状变换器” |
W 2 , b 2 W_2, b_2 W2,b2 | 输出层权重和偏置 | 最终拼接的“胶水” |
意义:通过非线性激活 σ \sigma σ将线性变换 W 1 x + b 1 W_1 x + b_1 W1x+b1映射到高维空间,再组合成目标函数。缺点:理论要求隐藏层宽度无限,实际需权衡计算资源。
σ ( z ) = 1 1 + e − z \sigma(z) = \frac{1}{1 + e^{-z}} σ(z)=1+e−z1
∥ f ( x ) − g ( x ) ∥ < ϵ \|f(x) - g(x)\| < \epsilon ∥f(x)−g(x)∥<ϵ
公式 | 表达式 | 特点 | 适用场景 |
---|---|---|---|
ReLU激活 | σ ( z ) = max ( 0 , z ) \sigma(z) = \max(0, z) σ(z)=max(0,z) | 计算高效,缓解梯度消失 | 深度网络 |
Tanh激活 | σ ( z ) = e z − e − z e z + e − z \sigma(z) = \frac{e^z - e^{-z}}{e^z + e^{-z}} σ(z)=ez+e−zez−e−z | 输出零中心化,梯度更稳定 | RNN、GAN |
多项式函数 | σ ( z ) = z 2 \sigma(z) = z^2 σ(z)=z2 | 无法满足万能近似条件 | 线性逼近 |
关键差异:ReLU和Tanh虽非线性,但Hornik证明只要激活函数是非多项式的连续函数,即可实现万能逼近。
假设目标函数 g ( x ) g(x) g(x)可展开为:
g ( x ) ≈ ∑ k = 0 ∞ a k x k g(x) \approx \sum_{k=0}^\infty a_k x^k g(x)≈k=0∑∞akxk
神经网络通过隐藏层组合非线性项 σ ( w x + b ) \sigma(w x + b) σ(wx+b),等价于用非多项式基函数重构 g ( x ) g(x) g(x)。例如Sigmoid的泰勒展开包含无限高阶项,从而覆盖多项式无法表达的复杂度。
import numpy as np
import matplotlib.pyplot as plt
from tensorflow import keras
from sklearn.model_selection import train_test_split
import shap
# 生成数据
X = np.linspace(-3, 3, 1000).reshape(-1, 1)
y = np.sin(X) + 0.1 * np.random.randn(*X.shape)
# 构建模型(单隐藏层,10个神经元)
model = keras.Sequential([
keras.layers.Dense(10, activation='sigmoid', input_shape=(1,)),
keras.layers.Dense(1)
])
model.compile(optimizer='adam', loss='mse')
# 训练并预测
history = model.fit(X, y, epochs=500, verbose=0)
y_pred = model.predict(X)
# 可视化
plt.figure(figsize=(10, 6))
plt.scatter(X, y, s=5, label='Noisy Data', alpha=0.4)
plt.plot(X, y_pred, c='red', lw=2, label='NN Prediction')
plt.title('Universal Approximation: Sin Wave Fitting', fontsize=14)
plt.xlabel('x', fontsize=12)
plt.ylabel('y', fontsize=12)
plt.grid(True, linestyle='--', alpha=0.6)
plt.legend()
plt.show()
# SHAP解释
explainer = shap.DeepExplainer(model, X[:100])
shap_values = explainer.shap_values(X[:10])
shap.summary_plot(shap_values, X[:10], plot_type='bar')
#万能近似定理
#UniversalApproximation
#激活函数
#Sigmoid
#ReLU
#函数逼近
#神经网络架构
#SHAP解释
#Keras