共计 1720 个字符,预计需要花费 5 分钟才能阅读完成。
神经网络基础与正向传播
BP 神经网络(Backpropagation Neural Network)是多层感知机的典型代表,其核心是通过反向传播算法调整网络参数。我们先回顾正向传播过程:

- 输入层 :接收原始特征向量 $X=(x_1,x_2,…,x_n)$
- 隐藏层计算 :对第 $l$ 层,$z^l=W^l a^{l-1}+b^l$,$a^l=\sigma(z^l)$,其中 $\sigma$ 为激活函数
- 输出层 :最后一层输出 $\hat{y}=a^L$
以 Sigmoid 激活函数为例:
def sigmoid(z):
return 1 / (1 + np.exp(-z))
反向传播数学推导(核心部分)
损失函数定义
采用均方误差损失:
$$
J(W,b) = \frac{1}{2m}\sum_{i=1}^m (\hat{y}^{(i)} – y^{(i)})^2
$$
关键导数计算(链式法则)
-
输出层误差 :
$$
\delta^L = \frac{\partial J}{\partial z^L} = (\hat{y} – y) \odot \sigma'(z^L)
$$ -
隐藏层误差传播 :
$$
\delta^l = ((W^{l+1})^T \delta^{l+1}) \odot \sigma'(z^l)
$$ -
参数梯度 :
$$
\frac{\partial J}{\partial W^l} = \delta^l (a^{l-1})^T
$$
$$
\frac{\partial J}{\partial b^l} = \delta^l
$$
Python 实现代码
import numpy as np
class BPNetwork:
def __init__(self, layers):
self.weights = [np.random.randn(y, x)*0.1
for x, y in zip(layers[:-1], layers[1:])]
self.biases = [np.zeros((y, 1)) for y in layers[1:]]
def backprop(self, x, y):
# 前向传播
activation = x
activations = [x]
zs = []
for w, b in zip(self.weights, self.biases):
z = np.dot(w, activation) + b
zs.append(z)
activation = sigmoid(z)
activations.append(activation)
# 反向传播
delta = (activations[-1] - y) * sigmoid_prime(zs[-1])
nabla_w = [np.zeros(w.shape) for w in self.weights]
nabla_b = [np.zeros(b.shape) for b in self.biases]
nabla_w[-1] = np.dot(delta, activations[-2].T)
nabla_b[-1] = delta
for l in range(2, len(self.weights)+1):
delta = np.dot(self.weights[-l+1].T, delta) * sigmoid_prime(zs[-l])
nabla_w[-l] = np.dot(delta, activations[-l-1].T)
nabla_b[-l] = delta
return nabla_w, nabla_b
常见问题与优化策略
- 梯度消失 / 爆炸 :
- 使用 ReLU 等改良激活函数
- 采用 Batch Normalization
-
梯度裁剪(Gradient Clipping)
-
学习率选择 :
- 初始建议值 0.01~0.1
-
使用自适应优化器(Adam, RMSprop)
-
初始化策略 :
- He 初始化:$W \sim N(0, \sqrt{2/n_{in}})$
- Xavier 初始化:$W \sim N(0, \sqrt{1/n_{in}})$
最佳实践建议
- 数据预处理:标准化输入特征
- 使用早停法(Early Stopping)防止过拟合
- 监控训练过程中的 loss 和准确率曲线
- 尝试不同的网络结构(层数、神经元数量)
思考题
如何改进基础反向传播算法?可考虑:
– 引入动量(Momentum)加速收敛
– 使用二阶优化方法(如 Hessian 矩阵)
– 采用随机梯度下降的变体(Mini-batch)
– 结合进化算法优化超参数
正文完
