基于级联相关神经网络的非线性过程自适应辨识系统
1. 项目介绍
本项目实现了一个基于级联相关(Cascade-Correlation)神经网络的自适应辨识系统。该系统旨在解决非线性动态系统的建模问题,通过从最小网络结构开始,根据残留误差自动“生长”出所需的隐藏层单元,从而避免了传统神经网络需要预先试凑网络结构的弊端。
程序内置了一个复杂的非线性动态系统仿真模型,用于生成训练和测试数据。算法通过不断迭代,分阶段训练输出层权重和候选隐藏单元权重,逐步构建深度级联网络,直到达到预设的逼近精度或网络规模限制。
2. 功能特性
- 自适应网络结构设计:网络从仅有输入层和输出层开始,自动逐层增加隐藏单元,无需人工设定隐藏层节点数。
- 非线性动态系统仿真:内置非线性差分方程生成器,能够产生具有复杂动态特性的时间序列数据。
- 分阶段训练策略:采用级联相关算法核心策略,将网络训练分解为“输出层训练(最小化均方误差)”和“候选单元训练(最大化相关性)”两个独立阶段,极大提高了收敛速度。
- 候选池机制:在生长阶段并在多个候选单元中并行训练,选择相关性得分最高的最优单元加入网络,确保网络生长的鲁棒性。
- 动量加速算法:在权重更新过程中引入动量项(Momentum),平滑梯度波动,加速训练收敛。
- 可视化分析:提供完整的训练过程监控,包括真实值与预测值对比、MSE收敛曲线以及网络生长节点的标记。
3. 系统要求与使用方法
系统要求
- MATLAB R2016b 或更高版本
- Deep Learning Toolbox (主要用于
mapminmax 归一化函数,如无此工具箱需自行替换归一化实现)
使用方法
- 确保 MATLAB 工作路径包含本项目的脚本文件。
- 在 MATLAB 命令窗口或编辑器中直接运行主函数。
- 程序将自动执行数据生成、模型训练、网络生长、测试评估及绘图全过程。
4. 详细实现逻辑与代码分析
本项目的主要逻辑封装在单一入口函数中,具体执行流程如下:
4.1 数据生成与预处理
- 非线性系统建模:代码首先通过迭代计算生成非线性时间序列数据。系统模型包含二次项和分式非线性特性,并引入正弦控制信号作为输入。
* 状态方程形式:
y(k) = f(y(k-1), y(k-2)) + u(k-1)
- 特征工程:构建适用于时间序列预测的输入特征向量
[u(k-1), y(k-1), y(k-2)],即利用前一时刻的控制输入和历史两拍的系统输出预测当前输出。 - 归一化:使用
mapminmax 将输入和目标数据映射到 [-1, 1] 区间,以配合双曲正切(Tanh)激活函数的敏感区。 - 数据集划分:按 7:3 的比例将时序数据划分为训练集和测试集。
4.2 级联相关网络初始化
- 设定最大隐藏单元数(10层)、目标误差(0.005)、候选池大小(8个)等超参数。
- 初始化一个没有隐藏单元的网络结构,输入层直接连接输出层。连接权重初始化为随机小数值。
4.3 级联相关迭代训练(主循环)
程序进入
while 循环,直到满足误差要求或达到最大层数。循环内部包含三个关键阶段:
#### 阶段 1:输出层训练 (Train Output Layer)
- 目标:在隐藏层结构和权重固定的情况下,仅调整连接到输出层的权重,以最小化预测均方误差(MSE)。
- 输入构造:输出层的输入包括偏置、原始输入特征以及当前所有已存在的隐藏单元输出。
- 算法:使用基于梯度的反向传播算法(线性激活函数),结合动量项更新权重
W_out。 - 终止条件:达到最大迭代次数
max_epochs_out 或误差小于阈值。 - 如果在此阶段误差已满足要求,则直接结束训练,停止生长。
#### 阶段 2:候选单元训练 (Candidate Training)
- 触发条件:若输出层训练后误差仍未达标,且未达到最大层数,则开始生长新单元。
- 残差计算:计算当前网络对训练数据的预测残差
Residuals = Y_true - Y_pred。 - 候选池初始化:生成一组(如8个)候选单元,每个单元接收来自输入层和所有既有隐藏层的输入。
- 相关性最大化:
* 训练目标不是最小化误差,而是
最大化候选单元输出与网络当前残差之间的协方差(Correlation)。
* 使用梯度上升法用来更新候选单元的输入权重。
* 候选单元使用
tanh 激活函数,以捕捉非线性特征。
- 优选:训练结束后,计算每个候选单元的最终相关性得分,选择得分最高的一个作为最佳候选单元。
#### 阶段 3:安装新单元 (Install Unit)
- 冻结权重:将选中的最佳候选单元的输入权重永久固定(冻结),使其成为网络的一个新的永久隐藏层。
- 网络扩展:
* 更新隐藏单元列表
hidden_units。
* 扩展输出层权重矩阵
W_out,增加一列以接收这个新隐藏单元的输出信号。
4.4 模型测试与评估
- 使用测试集数据进行验证。
- 通过辅助函数
calc_hidden_outputs 模拟级联结构的前向传播,逐层计算所有隐藏单元的响应。 - 将最终的线性输出结果进行反归一化,恢复到原始物理量纲。
- 计算测试集上的均方误差(MSE)。
4.5 结果可视化
程序最后生成一个包含三个子图的窗口:
- 辨识效果对比:绘制系统真实输出与模型预测输出的波形对比,直观展示拟合能力。
- 误差收敛曲线:绘制训练过程中的 MSE 对数曲线,并用红色圆点标记网络“生长”(添加新隐藏层)的时刻,展示误差阶梯式下降的过程。
- 网络拓扑统计:通过柱状图和文字说明,展示最终形成的网络结构(输入节点数、级联深度、输出节点数)。
5. 关键算法与函数说明
main(): 主流程控制函数,包含数据流和训练状态机。calc_hidden_outputs(X, hidden_units): 这是一个关键的辅助逻辑。由于级联网络的特殊性(第 N 层隐藏单元接收来自 Input 和第 1 到 N-1 层隐藏单元的输入),该函数负责按顺序逐层计算隐藏层的激活值,构建用于下一层或输出层的扩展输入矩阵。- 相关性计算公式 (Correlation Score):代码中实现了特定的相关性度量
S,即残差与候选输出协方差绝对值的和。这是级联相关算法区别于传统 BP 算法的核心,确保新加入的神经元能最大程度地修正当前网络的剩余误差。