共计 1589 个字符,预计需要花费 4 分钟才能阅读完成。
从单层感知机开始
理解神经网络的正向传播,最好从最简单的单层感知机入手。单层感知机只包含输入层和输出层,没有隐藏层。它的计算过程可以表示为:

output = activation_function(W * X + b)
其中:
– W 是权重矩阵
– X 是输入向量
– b 是偏置项
– activation_function 是激活函数
扩展到多层神经网络
当我们在单层感知机的基础上加入隐藏层,就形成了多层神经网络。正向传播的过程就是数据从输入层,经过各隐藏层,最终到达输出层的过程。
对于第 l 层,其正向传播的计算公式为:
Z^{[l]} = W^{[l]}A^{[l-1]} + b^{[l]}
A^{[l]} = g^{[l]}(Z^{[l]})
其中:
– Z^[l] 是第 l 层的线性计算结果
– A^[l] 是第 l 层的激活输出
– g^[l] 是第 l 层的激活函数
Python 实现
下面我们用 NumPy 来实现一个三层神经网络的正向传播过程:
import numpy as np
# 定义激活函数
def sigmoid(z):
return 1/(1+np.exp(-z))
def relu(z):
return np.maximum(0,z)
# 初始化参数
def initialize_parameters(layer_dims):
parameters = {}
L = len(layer_dims)
for l in range(1, L):
parameters['W' + str(l)] = np.random.randn(layer_dims[l], layer_dims[l-1]) * 0.01
parameters['b' + str(l)] = np.zeros((layer_dims[l], 1))
return parameters
# 正向传播
def forward_propagation(X, parameters):
caches = []
A = X
L = len(parameters) // 2
for l in range(1, L):
A_prev = A
W = parameters['W' + str(l)]
b = parameters['b' + str(l)]
Z = np.dot(W, A_prev) + b
A = relu(Z)
caches.append((A_prev, W, b, Z))
# 输出层使用 sigmoid 激活
WL = parameters['W' + str(L)]
bL = parameters['b' + str(L)]
ZL = np.dot(WL, A) + bL
AL = sigmoid(ZL)
caches.append((A, WL, bL, ZL))
return AL, caches
避坑指南
- 权重矩阵初始化
- 不要将所有权重初始化为 0,这会导致所有神经元学习相同的特征
-
小随机数初始化是更好的选择,比如乘以 0.01
-
维度不匹配错误
- 常见错误:权重矩阵的列数不等于前一层的神经元数
- 调试方法:在每步计算后打印矩阵维度
-
记住公式:W^[l].shape = (n^[l], n^[l-1])
-
数值稳定性
- 对于 sigmoid 函数,当 z 很大或很小时会出现数值溢出
- 解决方法:对输入数据进行标准化处理
- 可以考虑使用更稳定的激活函数如 ReLU
思考题
- 如何验证正向传播计算的正确性?
- 可以通过手动计算几个样本的结果来验证
-
也可以使用已知的神经网络库进行对比
-
不同激活函数对输出范围的影响?
- sigmoid 将输出限制在 (0,1)
- tanh 将输出限制在 (-1,1)
-
ReLU 没有上限
-
当输入特征维度变化时,需要调整哪些参数?
- 需要调整第一层权重矩阵的维度
- 其他层的维度可以保持不变
- 注意检查所有矩阵乘法的维度兼容性
总结
通过本文的讲解和代码实现,我们了解了 BP 神经网络正向传播的完整过程。从单层感知机的基础计算,扩展到多层神经网络的结构,再到具体的 Python 实现和注意事项。希望这些内容能帮助初学者更好地理解和实现神经网络的正向传播。
在实际应用中,要特别注意矩阵维度的匹配和数值稳定性问题。通过反复练习和调试,你会逐渐掌握这些概念的。
正文完
发表至: 未分类
近三天内
