拓冰建站拓冰建站
首页 / 资讯中心 / 正文

冯洛伊曼拓扑鲸鱼算法优化KELM超参数的原理与实现

先说结论标准鲸鱼算法WOA去优化KELM的超参数最大的问题不是跑不出结果而是结果不稳定。同样的数据集、同样的代码第二次运行可能就比第一次低了几个百分点。我在这个方向上折腾了很长时间最后引入冯洛伊曼拓扑结构种群多样性稳住了实验结果也终于能看了。这篇把冯洛伊曼拓扑鲸鱼算法的原理、Matlab实现、KELM的训练流程以及核函数对比实验的完整思路都过一遍给正准备做这类研究或者课程设计的同学一份可以直接参考的模板。1. 标准鲸鱼算法优化KELM的两难困境1.1 精度和稳定性之间的跷跷板鲸鱼算法模拟座头鲸的泡泡网捕食策略核心是三套位置更新机制包围猎物、螺旋气泡网攻击、随机搜索。它的优点是参数少、结构直观Matlab实现半小时就能写完。但真正用在KELM超参数优化上时问题就很现实搜索前期收敛得飞快中后期种群几乎全部挤在一起个体之间的差异越来越小最终大概率停在某个局部最优点附近。为什么会出现这种局面因为标准WOA里所有个体都直接朝向全局最优个体更新。信息流是全连接的而且没有任何延迟一旦某个鲸鱼偶然发现一个有希望的参数区域整个种群会迅速向它靠拢。这在函数优化里有时是好事但对于KELM超参数优化这类低维但多峰的目标函数来说反而容易过早锁定一个局部区域。我举个例子你就明白了。假设你要优化两个参数正则化系数C和RBF核的gamma值。搜索空间虽然只有两个维度但目标函数表面一点也不平滑——不同的参数组合对应的交叉验证精度差异很大而且存在大量局部尖峰。标准WOA跑到第10代可能就全员集中在某一个山头上剩下的40代基本在做局部微调很难跳出。1.2 多样性崩溃是智能优化算法的通病这里的关键概念是种群多样性。所谓多样性不是看个体在搜索空间里分布得有多散而是看它们携带的搜索方向有多不同。标准WOA的引导机制决定了每个个体都在朝同一个最优解靠拢收敛速度快的同时多样性快速下降陷入局部最优几乎成为必然。那为什么不做全局优化把迭代次数调大更新机制改一改这些我都试过。提高迭代次数只是让问题从早期陷入变成中期陷入对最终结果帮助有限。真正有效的一个思路是从信息传播结构上下手——不要让最好的个体影响所有人而是让每个个体只受它周围一小部分邻居的影响。这就是冯洛伊曼拓扑Von Neumann topology的出发点。2. 冯洛伊曼拓扑鲸鱼算法原理与Matlab实现思路2.1 冯洛伊曼邻域结构到底改了什么我个人总结冯洛伊曼拓扑做的事情其实很简单把原本所有人都向全局最优学习的信息传播方式改成每个人只向上下左右四个邻居学习的局部传播方式。具体来说种群中的N个个体被排列成一个二维网格比如20个个体排成4行5列。每个个体只与上、下、左、右四个方向的邻居直接通信。信息要跨越整个种群必须经过多跳传播而不是一次广播。这在群体智能里的直接效果是搜索过程被划分成了多个相对独立的搜索派系不同派系可以在不同区域同时探索整体陷入局部最优的概率大大降低。有人可能会问那岂不是丢失了全局信息收敛变慢了确实会变慢但慢是有价值的。KELM超参数优化本身并不要求极端快速的收敛它更看重最终解的质量和多次运行的稳定性。在实验中冯洛伊曼拓扑版本的WOA收敛代数通常比标准WOA多出20%到30%但最终找到的参数组合在测试集上的表现明显更稳多次重复实验的标准差降了将近一半。2.2 三种位置更新机制的改写方式标准WOA有三种位置更新方式包围猎物、螺旋气泡网攻击、随机搜索。引入冯洛伊曼拓扑后不需要改变这三种机制的数学形式只需要把引导个体换掉。原版中包围和螺旋阶段的引导个体是全局最优X*。拓扑版本里引导个体变成邻居最优个体X_ngbest也就是当前个体四个邻居里适应度最好的那个。为了让算法不完全丢失全局信息实际操作中我采用了一种混合策略以50%的概率使用全局最优X*作为引导个体另外50%的概率使用邻居最优X_ngbest作为引导个体。这样做的好处是兼顾探索和开发偶尔用全局最优信息可以加速收敛平时则让各个局部搜索组保持自己的节奏。随机搜索阶段X_rand引导保持不变这一支本来就负责跳出局部最优。包围猎物的更新公式变为D |C .* X_guide - X(t)| X(t1) X_guide - A .* D螺旋更新变为D |X_guide - X(t)| X(t1) D .* exp(b .* l) .* cos(2 .* pi .* l) X_guide其中X_guide就是混合后的引导个体。其余参数向量A、C、l、b的计算方式与标准WOA完全一致。2.3 Matlab里建立邻居索引的关键代码冯洛伊曼拓扑的代码实现也没有想象中复杂。核心是把一维的种群索引映射到二维网格然后根据网格坐标算出四个邻居的索引。function [nbr_idx] get_von_neumann_neighbors(idx, rows, cols) % 将一维索引映射到二维网格坐标 [r, c] ind2sub([rows, cols], idx); % 四个方向的邻居坐标使用取模实现环形边界 up [mod(r-2, rows)1, c]; down [mod(r, rows)1, c]; left [r, mod(c-2, cols)1]; right [r, mod(c, cols)1]; % 将坐标重新转回一维索引 nbr_coords [up; down; left; right]; nbr_idx sub2ind([rows, cols], nbr_coords(:,1), nbr_coords(:,2)); end这里的环形边界策略是重点。我使用取模运算让网格首尾相接边界处的个体不会缺少邻居。比如第1行的个体它的上方邻居是最后一行第1列的个体左方邻居是最后一列。如果不用环形边界角落个体只有两个邻居信息传播会出现明显的偏置实验结果也会受影响。在完整的主循环里对每个个体调用这个函数获取邻居索引后比较它们的适应度选出最好的邻居个体再按概率决定是否用全局最优替代。整个过程不超过20行代码。3. KELM及其核函数被优化的对象本身才是关键3.1 从ELM到KELM为什么要引入核映射KELM是对极限学习机的改进。ELM的隐藏层节点权重是随机生成的输出权值通过最小二乘解析求解训练速度极快。但随机隐层在很多问题上不够稳定隐藏层节点数量需要人为设定泛化能力也受随机性的影响。KELM把ELM的随机隐层映射换成了预先定义好的核映射。这样做的直接收益是不需要再指定隐藏层节点数量只需要选择一个合适的核函数和正则化系数稳定性大幅提升。KELM的输出函数可以写成f(x) [K(x, x1), K(x, x2), ..., K(x, xN)] * (I/C Omega)^(-1) * T其中Omega是核矩阵Omega(i,j) K(xi, xj)C是正则化系数T是训练目标矩阵。我把这个公式拆开理解KELM其实是在做一种基于核的岭回归核函数决定了样本在高维空间中的相似性度量正则化系数C则控制模型复杂度和训练误差之间的平衡。3.2 四种核函数的适用边界核函数的选择直接决定了KELM的性能上限。我在实验里对比了四种最常见的核函数核函数数学表达式待优化参数典型特点线性核K(x,y) x·yC适合线性可分数据参数最少计算快多项式核K(x,y) (γ·x·y coef0)^degreeC, γ, degree, coef0能拟合非线性边界但参数多阶数过高易过拟合RBF核K(x,y) exp(-γ·x-ySigmoid核K(x,y) tanh(γ·x·y coef0)C, γ, coef0源自神经网络参数搭配不当容易不收敛RBF核是默认首选原因在于它的映射空间维度可以理解为无穷维理论上能逼近任意连续函数而且只有一个gamma参数优化压力小。线性核适合高维稀疏数据比如文本分类场景。多项式核在小规模数据集上能拟合复杂的决策边界但degree取太大时会过度拟合。Sigmoid核实现神经网络式的映射实际使用时对gamma和coef0的组合非常敏感在部分数据集上甚至会出现核矩阵不正定的情况。3.3 核参数与正则化系数的耦合效应还有一点容易被忽视C和核参数不是独立起作用的。在RBF核下gamma大意味着每个样本的影响范围小模型倾向于刻画局部细节此时需要更大的C来防止训练误差过小gamma小则模型偏平滑C稍微大一点就容易欠拟合。两者是强耦合的。我在优化时始终将它们作为一个整体向量来编码而不是分开单独调优。这也是为什么用智能优化算法而不是网格搜索的原因之一——二维甚至更高维的参数组合用网格搜索在指数级的组合里会非常耗时。4. 优化流程设计参数编码、适应度构建与整体管线4.1 参数编码与对数搜索策略冯洛伊曼拓扑鲸鱼算法优化的对象是KELM超参数组合。对于RBF核鲸鱼个体的位置向量是[C, gamma]对于多项式核则是[C, gamma, degree, coef0]。这里有一个实操要点C和gamma这类参数跨度可以达到几个数量级直接线性编码会让小数值区域的搜索精度严重不足。我采用对数刻度编码搜索范围设置为C ∈ [10^(-2), 10^3]编码时取log10gamma ∈ [10^(-3), 10^2]编码时取log10这样鲸鱼位置的[-2, 3]区间均匀采样映射回去就是指数级的覆盖范围。多项式核的degree是整数需要在每次更新后取整coef0则用[-1, 1]线性范围即可。4.2 适应度函数与交叉验证策略适应度函数直接决定优化方向。我采用5折交叉验证的平均分类准确率作为适应度值。每一轮优化中每条鲸鱼位置对应的参数组合都要训练5次KELM然后求平均准确率。由于WOA默认是最大化适应度准确率本身就是越大越好直接作为适应度即可。如果做的是回归任务适应度可以换成交叉验证的RMSE的负数同样满足最大化框架。需要提醒的是交叉验证的折数不同适应度函数的地形就会有差异。3折交叉验证方差小但地形更平滑10折交叉验证对参数更敏感但计算量大得多。5折是我试下来效率和解的质量比较平衡的选择。4.3 整体算法流程与Matlab代码骨架完整流程如下% 1. 初始化种群 % Positions是N x dim矩阵每条鲸鱼一组[C, gamma] for t 1:Max_iter for i 1:N % 2. 计算冯洛伊曼邻居 nbr_idx get_von_neumann_neighbors(i, rows, cols); % 3. 找出邻居中最优个体 [~, best_nbr] max(Fitness(nbr_idx)); X_guide Positions(nbr_idx(best_nbr), :); % 4. 以50%概率用全局最优替代引导个体 if rand 0.5 X_guide X_star; end % 5. 计算A, C, l等参数按WOA三种机制更新位置 % 注意生成候选位置后要做越界修正并保证degree等整数参数取整 % 6. 计算新位置的适应度 acc kelm_cv_acc(X_train, Y_train, decode(Positions(i,:)), 5); % 如果优于当前个体适应度则更新否则保留原位置 end % 7. 更新全局最优X_star和收敛曲线 end % 8. 用最优参数在完整训练集上训练最终KELM在测试集上评估这里我特意采用了贪婪保留策略——如果新位置的适应度不如当前位置则不替换。这个细节对稳定性帮助很大能防止好的参数组合在更新过程中被覆盖掉。KELM的训练函数骨架如下function Beta kelm_train(X_train, Y_train, C, kernel_type, kernel_params) % 计算核矩阵 K compute_kernel_matrix(X_train, X_train, kernel_type, kernel_params); n size(K, 1); % 岭回归求解输出权重 Beta (K eye(n) / C) \ Y_train; end预测阶段只需要计算测试样本和训练样本的核矩阵然后乘上Beta即可。5. 核函数对比实验同一套优化框架下的公平较量5.1 实验数据集与评测协议为了让核函数对比有说服力我选了三类经典的UCI数据集Wine178样本13维3类、Sonar208样本60维2类和Heart270样本13维2类。这三个数据集在特征维度、样本数量和类别数上差异明显可以较好地暴露不同核函数的偏好。评测协议如下每种核函数使用同一个冯洛伊曼拓扑鲸鱼算法框架独立优化其参数种群数20迭代次数505折交叉验证作为适应度每个数据集按7:3划分训练集和测试集且划分固定保证所有核函数在同一份数据上比较每组实验重复10次统计测试集准确率的均值和标准差。这样设计的目的就是排除随机划分对结论的干扰让核函数之间的差异真正反映模型本身的能力。5.2 实验结果如何解读以Wine数据集为例一次复现实验的结果大致如下核函数优化后的代表性参数测试集准确率RBF核C≈87.2, gamma≈0.3497.4%多项式核C≈12.6, gamma≈1.1, degree3, coef00.596.8%线性核C≈5.494.1%Sigmoid核C≈0.8, gamma≈0.02, coef0-0.592.3%这个结果符合预期RBF核在非线性分类问题上有结构性优势多项式核也能逼近到接近的水平但如果degree再往上调会出现过拟合验证集准确率反而下降。Sigmoid核在这个数据集上表现得不够稳定10次重复实验的标准差明显更大。在Sonar这种高维小样本数据上情况略有变化。线性核的表现没有想象中差甚至在某些划分下接近RBF核因为高维数据本身线性可分的概率更大。Heart数据集上RBF核仍然是首选但多项式核和RBF核的差距缩小了。我的核心观察是RBF核是泛化性能最稳的默认选择几乎任何数据集上都不会给出灾难性的结果多项式核适合你了解数据内在阶数关系的场景线性核在高维稀疏场景值得一试Sigmoid核除非有明确依据否则不建议作为首选。5.3 核函数选择建议在做这类对比研究时一个常见的诉求是给自己的结论寻找理论依据。我的建议是不要只看最终精度排序要结合算法收敛曲线和多次重复的标准差一起说。比如RBF核不仅精度高而且多次重复的标准差更小这说明它对参数变化不敏感稳定性好这才是它作为首选核函数的真正理由。另外核函数对比一定要在同一个优化器、同一份数据划分下进行否则不同实验之间的差异根本分不清是核函数造成的还是优化器运气造成的。6. 踩坑记录与实操建议6.1 核矩阵可逆性问题这是我最先踩的坑。Sigmoid核的核矩阵不满足Mercer条件在高维空间里可能出现非正定矩阵直接用(I/C Omega)求逆时会发生数值警告甚至产生NaN。解决方法是给核矩阵对角线加一个微小扰动也就是jitterK K 1e-8 * eye(size(K));这个trick同样适用于RBF核在gamma过大时导致核矩阵接近奇异的情况。C的值不要设得太小否则正则化项不足以克服数值奇异性。我一般把C的下界设置为0.01实测下来数值稳定了很多。6.2 拓扑布局的敏感性冯洛伊曼拓扑的网格形状对结果有微妙影响。20个个体排成4行5列和5行4列邻居关系不同搜索结果也会略有差异。我做了多组对比实验正方形网格接近正方形的信息传播最均匀效果最好。还有一个容易被忽略的点种群规模最好选择能组成接近正方形网格的数字。16可以排成4×425排成5×520排成4×5。如果种群数是素数比如17就只能排成1×17退化成了一条链冯洛伊曼拓扑的优势会大打折扣。这种情况建议调整种群规模而不是强行使用素数。6.3 随机性与复现性处理得到最终结果前我花了不少时间处理随机性问题。WOA本身的初始化是随机的这没有问题但在做核函数对比实验时为了让每个核函数在同一起跑线上竞争我在每次实验前固定了随机种子并把训练测试划分固定保存下来。这样才能保证观察到的差异是核函数本身的差异而不是随机种子带来的差异。个人体会是做完整个对比研究最大的收获不是某个核函数一定比另一个好而是理解了优化方法和模型结构是耦合的这件事。再好的优化器如果模型本身的核函数选得不对也很难出效果反过来核函数选得再好标准的WOA一直在局部最优里打转参数调不准同样白搭。如果接下来想继续扩展可以考虑引入动态拓扑调整在搜索前期使用冯洛伊曼拓扑保持多样性后期逐步切换成全局拓扑加速收敛。这个方向上没有太多现成方案实现起来也有很多细节可以挖掘。
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门