前向传播
概念
前向传播(Forward Propagation)是神经网络从输入到输出逐层计算的过程。给定输入
逐层递推公式
设网络共有
其中:
是第 层的输出(也是第 层的输入) 是第 层的权重矩阵 是第 层的偏置 是第 层的激活函数
具体示例:两层隐藏网络
考虑一个完整的网络结构:
设具体维度:
- 输入
:形状 — 2 维特征 :形状 — 第 1 层 16 个神经元 :形状 — 第 2 层 3 个神经元(3 类输出)
第 1 层(Linear + ReLU):
第 2 层(Linear):
最终
代码实现:SequentialModel.forward()
src/nn/models/sequentialModel.py:69-89:
python
def forward(self, inputData: np.ndarray) -> np.ndarray:
# 缓存输入,供 backward 使用
self.inputCache = inputData
outputData = inputData
# 按顺序通过每一层
for layer in self.layers:
outputData = layer.forward(outputData)
# 缓存最终输出,供 backward 校验
self.outputCache = outputData
return outputDataself.layers是一个有序列表(如[LinearLayer, ReLULayer, LinearLayer])- 每层的
forward()内部会缓存自己的inputCache和outputCache - 模型的
inputCache保存网络的原始输入,outputCache保存最终输出
模式:训练 vs 评估
BaseLayer 维护一个 isTraining 标志,通过 train() 和 eval() 切换。
python
def train(self):
self.isTraining = True
def eval(self):
self.isTraining = False当前实现中,isTraining 标志主要影响:
Dropout(尚未实现,但接口已预留)BatchNorm(尚未实现,但接口已预留)SequentialModel.add_layer()— 新添加的层会继承模型的训练/评估模式
训练时通常调用 model.train(),评估和预测时调用 model.eval()。
前向传播中的缓存机制
前向传播的关键副作用是缓存中间结果,因为反向传播需要用到这些值:
| 缓存变量 | 所在类 | 用途 |
|---|---|---|
inputCache | BaseLayer | 存储层的输入,用于计算权重梯度(如 X^T @ dY) |
outputCache | BaseLayer | 存储层的输出,用于计算激活函数的导数(如 y(1-y)) |
对于 LinearLayer.backward(),需要 inputCache 来计算
对于 SigmoidLayer.backward(),需要 outputCache 来计算
这便是为什么在前向传播中必须保存这些中间值——它们构成了反向传播所需计算图的一半信息。