Index
不借助外部库(如numpy、PyTorch或Tensorflow)的情况下从零构建一个神经网络
这段代码实现了一个基于反向传播算法的多层感知机(MLP),用于分类任务。以下是对代码运行逻辑的详细分析:
1. 类与函数结构
- Sigmoid函数及导数:实现激活函数及其导数计算。
- Neuron类:表示单个神经元,包含权重、偏置、delta(误差项)和输出值。提供加权和计算、激活、设置delta等方法。
- Layer类:表示神经网络层,管理多个神经元,负责激活所有神经元并计算误差传播。
- Network类:整合多个层,实现前向传播、反向传播、权重更新和训练逻辑。
2. 前向传播流程
- 输入传递:输入数据依次通过各隐藏层,每层的输出作为下一层的输入。
- 神经元激活:每个神经元计算输入的加权和,应用Sigmoid函数得到输出。
- 输出层结果:最终输出层的激活结果作为预测值。
3. 反向传播与权重更新
- 输出层误差计算:计算实际输出与期望值的差值(误差)。
- Delta计算:
- 输出层:误差乘以Sigmoid导数得到delta。
- 隐藏层:使用下一层神经元的delta和权重计算当前层的误差贡献,再乘以Sigmoid导数。
- 权重更新:根据delta、学习率和前一层输出值调整权重和偏置。
4. 训练过程
- 迭代训练:指定训练轮数(epoch),逐样本训练。
- One-hot编码:将类别标签转换为二进制向量。
- 误差计算与传播:每个样本前向传播后计算误差,反向传播调整参数。
- 均方误差(MSE):计算模型输出与期望值的均方误差,但当前实现存在错误(见下文)。
5. 代码问题与改进点
-
MSE计算错误:
原代码错误地将类别索引传入MSE函数,而非One-hot编码的期望值,导致类型错误。 -
损失函数选择:使用平方误差对分类问题效率较低,建议改为交叉熵损失。
-
输入校验:未检查输入维度与网络结构是否匹配,可能导致运行时错误。
6. 关键逻辑验证
- Delta计算正确性:通过链式法则验证,隐藏层delta计算正确。
- 权重更新规则:符合梯度下降原理,权重更新量为学习率乘以梯度(delta乘输入)。
- 反向传播顺序:从输出层到输入层逐层计算,确保误差正确传播。
7. 示例执行流程
假设网络结构为2-2-1(输入2节点,隐藏层2节点,输出1节点),训练样本为([0.5, 0.1], 0): 1. 前向传播:输入经隐藏层计算,输出层生成预测值。 2. 误差计算:预测值与期望值[1, 0](假设修正后)的差值。 3. 反向传播:计算各层delta,从输出层开始反向调整权重。 4. 权重更新:根据delta和学习率更新参数,减小预测误差。
总结
该代码正确实现了MLP的核心逻辑,但需修正MSE计算错误,并建议改进损失函数及增加输入校验。理解代码逻辑需重点掌握前向传播、反向传播的数学原理及类的交互方式。