项目:基于MATLAB的BP神经网络及其动量-自适应学习率改进算法
项目介绍
本项目实现了一个基于MATLAB的手写BP(反向传播)神经网络模型,特别集成了动量法(Momentum)和自适应学习率(Adaptive Learning Rate)两项改进技术。与标准的BP网络相比,该程序能够显著提高训练速度,增强算法在非线性函数拟合任务中的收敛稳定性,并有效缓解传统算法容易陷入局部极小值的问题。项目不依赖于MATLAB神经网络工具箱的内置函数,而是通过底层的矩阵运算完整复现了神经元的前向传递和梯度反向传播过程。
功能特性
- 改进算法实现:程序集成了动量因子和学习率动态调整逻辑,有效抑制训练中的数值震荡。
- 灵活的拓扑结构:采用单隐藏层结构(1-10-1布局),支持自定义隐藏层神经元数量以适应不同复杂度的拟合需求。
- 动态反馈机制:包含权重回滚算法,当单次迭代误差大幅上升时,程序会自动放弃当次更新并降低学习率。
- 全流程覆盖:涵盖了信号生成、数据归一化、训练集/测试集划分、网络训练、预测验证以及结果的可视化分析。
使用方法
- 启动MATLAB软件,并将当前文件夹设置为代码所在的目录。
- 打开主程序脚本并在编辑器中点击运行。
- 训练完成后,程序将自动弹出可视化窗口。
- 在MATLAB命令行窗口(Command Window)查看最终的迭代次数、MSE和MAE等性能指标。
系统要求
- 运行环境:MATLAB R2016a或更高版本。
- 硬件需求:基础的计算机配置即可满足矩阵运算需求。
程序实现逻辑与核心算法
- 实验数据构造
程序以非线性正弦复合函数 y = sin(x) + 0.5 * cos(2x) 为模拟对象。该函数具备周期性与非线性特征,能有效检验神经网络的非线性映射能力。程序将数据按照8:2的比例划分为训练集和测试集。
- 数据预处理
代码实现了手动的 Min-Max 归一化逻辑,将输入和输出数据映射至 [0, 1] 区间。这一过程通过计算训练集的极值来执行,并在测试阶段使用同样的极值进行数据映射,确保了数据的一致性。
- 网络初始化
程序使用正态分布随机数(randn)初始化权值矩阵(W1, W2)和阈值向量(B1, B2)。同时,为支持动量法,程序额外维护了四个存放上一次更新增量的变量(dW_old, dB_old),用于计算后续的惯性分量。
- 改进算法迭代循环(核心逻辑)
前向传播:隐藏层使用 Sigmoid 激活函数处理线性权重和;输出层采用线性激活函数,直接输出预测结果。
自适应学习率策略:在每轮迭代起始处判断误差变化。若当前误差超出了前一次误差的1.04倍(max_err_ratio),则判定为更新步长过大,程序将执行回滚逻辑,即撤销权重更新并按0.7倍降低学习率;若误差下降,则尝试以1.05倍微增学习率。
反向传播与梯度计算:根据输出层残差利用链式法则计算梯度。隐藏层梯度计算中包含了 Sigmoid 函数的导数项(out * (1 - out))。
动量法修正:权重的最终更新量并非仅取决于当前梯度。更新公式采用了 (1 - 动量因子) * 学习率 * 梯度 + 动量因子 * 旧更新量 的逻辑,利用 0.9 的动量因子保留训练趋势。
- 预测与性能评估
训练完成后的网络通过测试集进行泛化能力验证。通过反归一化公式将网络输出还原为原始量纲,并计算均方误差(MSE)和平均绝对误差(MAE)作为量化评价标准。
- 结果可视化
程序生成包含三张子图的结果窗口:
第一张图以半对数坐标(semilogy)展示 MSE 随迭代次数的演化过程。
第二张图对比了测试集预测值与真实函数的匹配程度。
第三张图以柱状图形式展现测试集的残差分布情况。