共计 1630 个字符,预计需要花费 5 分钟才能阅读完成。
背景介绍
BP 神经网络(Backpropagation Neural Network)是一种多层前馈神经网络,通过误差反向传播算法训练网络参数。它广泛应用于模式识别、函数逼近、数据分类等领域。BP 神经网络的核心思想是通过梯度下降法最小化损失函数,调整网络权重和偏置。

数学推导
前向传播
前向传播过程可以表示为:
$$
z^{(l)} = W^{(l)}a^{(l-1)} + b^{(l)}
$$
$$
a^{(l)} = f(z^{(l)})
$$
其中,$W^{(l)}$ 是第 l 层的权重矩阵,$b^{(l)}$ 是偏置向量,$f$ 是激活函数。
反向传播
反向传播通过链式法则计算梯度:
- 计算输出层误差:
$$
\delta^{(L)} = \nabla_a J \odot f'(z^{(L)})
$$
- 计算隐藏层误差:
$$
\delta^{(l)} = ((W^{(l+1)})^T \delta^{(l+1)}) \odot f'(z^{(l)})
$$
- 计算梯度:
$$
\frac{\partial J}{\partial W^{(l)}} = \delta^{(l)} (a^{(l-1)})^T
$$
$$
\frac{\partial J}{\partial b^{(l)}} = \delta^{(l)}
$$
MATLAB 实现
网络结构初始化
% 定义网络结构
inputSize = 4; % 输入层节点数
hiddenSize = 5; % 隐藏层节点数
outputSize = 3; % 输出层节点数
% 初始化权重
W1 = randn(hiddenSize, inputSize) * 0.01; % 输入层到隐藏层
b1 = zeros(hiddenSize, 1);
W2 = randn(outputSize, hiddenSize) * 0.01; % 隐藏层到输出层
b2 = zeros(outputSize, 1);
激活函数实现
function a = sigmoid(z)
% Sigmoid 激活函数
a = 1./(1+exp(-z));
end
function g = sigmoidGradient(z)
% Sigmoid 导数
g = sigmoid(z).*(1-sigmoid(z));
end
训练过程实现
% 训练参数
learningRate = 0.1;
numIterations = 1000;
for i = 1:numIterations
% 前向传播
z1 = W1 * X + b1;
a1 = sigmoid(z1);
z2 = W2 * a1 + b2;
a2 = sigmoid(z2);
% 计算损失
J = 0.5 * sum((a2 - y).^2);
% 反向传播
delta2 = (a2 - y) .* sigmoidGradient(z2);
delta1 = (W2' * delta2) .* sigmoidGradient(z1);
% 更新参数
W2 = W2 - learningRate * delta2 * a1';
b2 = b2 - learningRate * delta2;
W1 = W1 - learningRate * delta1 * X';
b1 = b1 - learningRate * delta1;
end
调参指南
学习率选择
- 初始尝试 0.1
- 观察损失曲线:震荡过大则减小,收敛过慢则增大
- 常用自适应学习率算法:Adam, RMSprop
隐藏层节点数
- 一般取输入节点数的 1 / 2 到 2 倍
- 可通过交叉验证选择最优值
迭代次数设置
- 观察验证集误差不再下降时停止
- 设置早停机制防止过拟合
常见问题
梯度消失
解决方案:
– 使用 ReLU 等非饱和激活函数
– 采用批归一化 (Batch Normalization)
– 使用残差连接
过拟合
预防方法:
– 增加正则化项 (L1/L2)
– 使用 Dropout
– 早停 (Early Stopping)
性能优化
向量化编程
- 避免使用 for 循环处理样本
- 尽量使用矩阵运算
并行计算
% 使用 parfor 并行计算
parfor i = 1:numWorkers
% 并行计算任务
end
延伸阅读
- 《神经网络与深度学习》- Michael Nielsen
- Deep Learning Specialization – Andrew Ng
练习题
- 尝试修改激活函数为 ReLU,比较训练效果
- 实现 L2 正则化项
- 编写早停机制代码
正文完
