🌟 引言
大家在训练BP神经网络时,有没有遇到过训练速度慢、容易陷入局部最优的问题?传统的梯度下降法对初始权重和阈值太敏感,今天给大家介绍一个2022年提出的金豺优化算法(Golden Jackal Optimization, GJO),用它优化BP神经网络的初始参数,亲测有效!文末附完整MATLAB代码~
🔥 为什么需要优化算法?
BP神经网络通过反向传播更新参数,但初始权重和阈值对结果影响极大(如图1)。传统方法随机初始化,可能导致:
- ❌ 收敛速度慢
- ❌ 陷入局部最优解
- ❌ 模型不稳定
而GJO这类智能算法通过模拟金豺狩猎行为全局寻优,找到最佳初始参数,提升模型性能。
🦊 金豺优化算法(GJO)原理速览
GJO模拟雄性金豺和雌性金豺协作捕猎的过程,核心分为三步:
- 1.侦察阶段:雄性豺利用猎物气味确定大致方向
- 2.包围阶段:雌性豺联合缩小包围圈
- 3.攻击阶段:共同扑向最优位置(全局最优解)
数学上通过位置向量更新实现,公式简化后:
雄性位置更新:Y1 = Y_M - E*|L*Y_M - 当前解|
雌性位置更新:Y2 = Y_F - E*|L*Y_F - 当前解|
新位置 = (Y1 + Y2) / 2
其中E和L为自适应系数,控制搜索范围。
🚀 MATLAB实现优化主循环
%% 优化主循环
for iter = 1:maxIter
% 计算猎物逃逸能量(线性递减)
E = 1.5 * (1 - (iter/maxIter)^2);
% 更新每个个体位置
for i = 1:popSize
% 计算距离参数
r1 = rand;
RL = 0.05 * levyFlight(paramDim); % 莱维飞行扰动
% 位置更新公式
if abs(E) >= 1 % 探索阶段
newPos = population(i,:) + r1*(Male - Female) + RL;
else % 开发阶段
newPos = (Male + Female)/2 + E*(Male - population(i,:)) + RL;
end
% 边界检查
newPos = max(newPos, lb);
newPos = min(newPos, ub);
% 评估新位置
newFitness = computeFitness(newPos, net, p_train, t_train);
% 更新个体
if newFitness < fitness(i)
population(i,:) = newPos;
fitness(i) = newFitness;
end
end
% 记录当前最优值
bestFitness = fitness(sortedIdx(1));
bestFitnessHistory(iter) = bestFitness;
% 更新曲线数据
set(hPlot, 'XData', 1:iter, 'YData', bestFitnessHistory(1:iter));
% 自动调整坐标轴范围
xlim([1 max(iter,2)]); % 保证至少显示2个点
currentY = ylim;
pad = range(currentY)*0.1;
ylim([min(bestFitnessHistory(1:iter))-pad, max(bestFitnessHistory(1:iter))+pad]);
% 添加迭代标注
text(iter, bestFitness, sprintf(' %.2f',bestFitness),...
'VerticalAlignment','bottom',...
'FontSize',8);
drawnow;
% 更新领导个体
[~, sortedIdx] = sort(fitness);
Male = Female;
Female = population(sortedIdx(1), :);
% 显示迭代信息
fprintf('Iteration %d, Best Fitness: %.4f\n', iter, fitness(sortedIdx(1)));
end
更多完整代码:利用matlab实现金豺优化算法(GJO)优化BP神经网络