共计 1251 个字符,预计需要花费 4 分钟才能阅读完成。
从单层感知机到多层网络
理解 BP 神经网络的正向传播,最好从单层感知机开始。单层感知机的计算非常简单:输入向量 x 乘以权重矩阵 W,加上偏置 b,再通过激活函数得到输出。用数学公式表示就是:

a = W * x + b
y = σ(a)
其中 σ 代表激活函数。这个简单的计算过程,其实就是神经网络正向传播的基础。
正向传播的数学推导
当网络结构扩展到多层时,每一层的计算都遵循相同的模式。以一个 3 层网络为例(输入层、隐藏层、输出层),正向传播的过程可以这样表示:
-
输入层到隐藏层:
z1 = W1 * x + b1 a1 = σ(z1) -
隐藏层到输出层:
z2 = W2 * a1 + b2 y = σ(z2)
这里的关键是要理解权重矩阵的维度。比如 W1 的维度是 (隐藏层节点数, 输入特征数),这样才能保证矩阵乘法正确进行。
Python 实现
下面我们用 NumPy 来实现这个正向传播过程:
import numpy as np
# 定义激活函数
def sigmoid(x):
return 1 / (1 + np.exp(-x))
def relu(x):
return np.maximum(0, x)
# 网络参数
input_size = 3
hidden_size = 4
output_size = 1
# 初始化权重和偏置
W1 = np.random.randn(hidden_size, input_size) * 0.01
b1 = np.zeros((hidden_size, 1))
W2 = np.random.randn(output_size, hidden_size) * 0.01
b2 = np.zeros((output_size, 1))
# 正向传播
def forward(x):
# 输入层到隐藏层
z1 = np.dot(W1, x) + b1
a1 = relu(z1) # 使用 ReLU 激活
# 隐藏层到输出层
z2 = np.dot(W2, a1) + b2
y = sigmoid(z2) # 使用 Sigmoid 激活
return y
# 测试
x = np.random.randn(input_size, 1)
y_pred = forward(x)
print(f"预测输出: {y_pred}")
避坑指南
在实现正向传播时,有几个常见问题需要注意:
- 权重初始化:
- 不要初始化为 0,这会导致所有神经元学习相同的东西
-
小随机数初始化是个不错的起点
-
维度匹配:
- 确保矩阵乘法的维度匹配
- 使用 print 语句检查中间结果的 shape
-
常见错误是忘记转置或者搞错维度顺序
-
数值稳定性:
- 对于 sigmoid 等函数,注意防止数值溢出
- 可以考虑添加数值稳定性的实现
思考题
- 如何验证正向传播计算的正确性?
- 可以通过手工计算几个简单的例子来验证
-
或者使用已知权重的网络测试
-
不同激活函数对输出范围的影响?
- sigmoid 输出在 0 - 1 之间
- tanh 输出在 - 1 到 1 之间
-
ReLU 输出在 0 到无穷大
-
当输入特征维度变化时,需要调整哪些参数?
- 需要调整第一层权重矩阵的列数
- 其他层的参数保持不变
总结
通过本文的学习,你应该已经掌握了 BP 神经网络正向传播的基本原理和实现方法。记住,理解矩阵维度和激活函数的作用是关键。实践是最好的老师,建议你多尝试不同的网络结构和参数设置,观察它们对输出的影响。
正文完
