共计 2037 个字符,预计需要花费 6 分钟才能阅读完成。
核心概念:BP 神经网络如何工作
BP 神经网络的核心是 前向传播计算预测值 和反向传播更新权重。前向传播的数学表达很简单:

h_j = f(\sum_{i} w_{ij}x_i + b_j)
其中 $f$ 是激活函数,$w_{ij}$ 是权重,$b_j$ 是偏置。反向传播则是通过链式法则计算损失函数对各个参数的梯度:
\frac{\partial L}{\partial w_{ij}} = \frac{\partial L}{\partial h_j} \cdot \frac{\partial h_j}{\partial w_{ij}}
梯度下降的更新公式为:
w_{ij} = w_{ij} - \eta \cdot \frac{\partial L}{\partial w_{ij}}
这里 $\eta$ 就是学习率,控制着参数更新的步长。
数据准备:标准化处理
数据标准化能显著提升神经网络训练效果。我们使用 sklearn 的 StandardScaler:
from sklearn.preprocessing import StandardScaler
import matplotlib.pyplot as plt
# 原始数据示例
X = np.random.rand(100, 3) * 100 # 100 样本,3 个特征
# 标准化前后对比
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)
plt.figure(figsize=(12,4))
plt.subplot(121)
plt.boxplot(X)
plt.title('原始数据')
plt.subplot(122)
plt.boxplot(X_scaled)
plt.title('标准化后数据')
plt.show()
标准化后的数据会集中在 0 附近,标准差为 1,这样不同特征对网络的影响程度会更均衡。
模型构建:三层神经网络实现
使用 Keras 构建包含 1 个隐藏层的网络:
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense
model = Sequential([Dense(64, activation='relu', input_shape=(X_train.shape[1],)), # 隐藏层
Dense(1) # 输出层
])
model.compile(
optimizer='adam',
loss='mse', # 回归任务常用 MSE
metrics=['mae']
)
关键参数选择依据:
- 隐藏层神经元数量:一般取输入特征数的 1 - 2 倍,可通过网格搜索确定
- 激活函数:
- ReLU:适合隐藏层,解决梯度消失问题
- Sigmoid:输出层用于分类,回归任务一般不使用
- 损失函数:
- MSE(均方误差):对异常值敏感但数学性质好
- MAE(平均绝对误差):更鲁棒但收敛较慢
模型调优技巧
1. 学习率动态调整
使用 ReduceLROnPlateau 回调自动降低学习率:
from tensorflow.keras.callbacks import ReduceLROnPlateau
reduce_lr = ReduceLROnPlateau(
monitor='val_loss',
factor=0.5,
patience=3,
min_lr=1e-6
)
2. Early Stopping
防止过拟合的实用方法:
from tensorflow.keras.callbacks import EarlyStopping
es = EarlyStopping(
monitor='val_loss',
patience=10,
restore_best_weights=True
)
3. L2 正则化
在 Dense 层添加权重正则化:
from tensorflow.keras.regularizers import l2
model.add(Dense(64, activation='relu',
kernel_regularizer=l2(0.01)))
新手避坑指南
- 特征相关性检查
import seaborn as sns
sns.heatmap(df.corr(), annot=True)
高度相关的特征会导致权重更新不稳定。
-
Batch Size 选择
-
太小:训练波动大
- 太大:内存不足
-
建议从 32/64 开始尝试
-
神经元死亡问题
如果使用 ReLU 且发现很多神经元的输出恒为 0,可以尝试:
– 降低学习率
– 改用 LeakyReLU
– 更好的参数初始化
性能评估
在 Boston Housing 数据集上的测试结果:
| 网络结构 | RMSE | MAE |
|---|---|---|
| 单隐藏层(64) | 3.12 | 2.34 |
| 双隐藏层(64+32) | 2.98 | 2.21 |
| 三隐藏层 | 3.05 | 2.28 |
可见不是层数越多越好,需要根据数据复杂度选择。
扩展阅读
- 时间序列预测可以尝试 LSTM 网络
- 特征工程对提升效果至关重要
- 集成多个神经网络能进一步提升鲁棒性
在实际项目中,建议先用简单模型建立 baseline,再逐步增加复杂度。记住:模型效果 = 数据质量(70%)+ 特征工程(20%)+ 算法选择(10%)。
正文完
