化極限學(xué)習(xí)機(jī):從ELM隨機(jī)性痛點(diǎn)看參數(shù)尋優(yōu)實(shí)戰(zhàn))
做機(jī)器學(xué)習(xí)調(diào)參這些年我一直對極限學(xué)習(xí)機(jī)ELM又愛又恨。愛的是它訓(xùn)練速度確實(shí)快恨的是它那套隨機(jī)生成輸入權(quán)重和隱層偏置的機(jī)制導(dǎo)致每次跑出來的結(jié)果方差極大換個(gè)隨機(jī)種子預(yù)測精度就跟過山車一樣。后來我在實(shí)際項(xiàng)目中嘗試用天牛須算法BAS和正余弦算法SCA做了一版混合改進(jìn)的BAS-SCA優(yōu)化ELM方案用雙重搜索機(jī)制去替代ELM的隨機(jī)初始化實(shí)測下來不但精度上去了穩(wěn)定性也比單用BAS或單用SCA好不少。這篇就把這套方案的完整思路、融合機(jī)制、代碼實(shí)現(xiàn)和調(diào)參經(jīng)驗(yàn)一次講清楚給同樣被ELM隨機(jī)性困擾的朋友做個(gè)參考。1. 先從ELM的痛點(diǎn)聊起為什么要優(yōu)化它1.1 ELM的隨機(jī)權(quán)重問題到底影響多大極限學(xué)習(xí)機(jī)的核心邏輯說起來很簡單輸入層到隱層的權(quán)重 W 和偏置 b 隨機(jī)生成然后用解析方式求解輸出層權(quán)重 β。因?yàn)?β 是通過最小二乘或嶺回歸一步計(jì)算出來的所以訓(xùn)練過程不需要反向傳播速度自然快得離譜。但問題恰恰出在那個(gè)“隨機(jī)生成”上——ELM的理論基礎(chǔ)之一是只要隱層節(jié)點(diǎn)足夠多隨機(jī)映射也能把原始特征投影到高維空間使得原本線性不可分的問題變得線性可分。理論沒問題實(shí)際操作中卻隱藏著一個(gè)巨大的坑隨機(jī)權(quán)重不同隱層輸出矩陣 H 就不同最終求出來的 β 也完全不同模型的泛化性能跟著劇烈波動(dòng)。我在回歸任務(wù)上做過一個(gè)簡單實(shí)驗(yàn)同一個(gè)數(shù)據(jù)集隱層節(jié)點(diǎn)設(shè)為20連續(xù)跑10次原始ELM測試集RMSE的極差能差出30%以上。這在工業(yè)落地場景中是很難接受的——你今天訓(xùn)練好一個(gè)模型上線明天重新訓(xùn)練一遍性能就變了下游業(yè)務(wù)根本沒法穩(wěn)定復(fù)用。所以業(yè)內(nèi)很自然的思路就是用一個(gè)優(yōu)化算法去搜索出一組更優(yōu)的初始權(quán)重和偏置讓ELM不再完全依賴“隨機(jī)抽卡”而是通過尋優(yōu)讓每次訓(xùn)練都能落在更優(yōu)的參數(shù)區(qū)間。1.2 BAS和SCA為什么會(huì)出現(xiàn)在同一個(gè)解決方案里既然要優(yōu)化ELM選擇哪個(gè)優(yōu)化算法就成了關(guān)鍵。我當(dāng)時(shí)最先嘗試的是天牛須算法BAS因?yàn)樗慕Y(jié)構(gòu)非常簡單不需要群體協(xié)作只靠一只“天?!庇脙筛毺綔y左右兩側(cè)的氣味濃度差異就能朝更優(yōu)方向移動(dòng)。BAS收斂速度快、計(jì)算開銷小用起來很順手。但它的問題也很明顯單一個(gè)體沒有種群信息共享天牛只能感知當(dāng)前點(diǎn)附近的局部梯度特別容易陷進(jìn)局部最優(yōu)。一旦初始位置選得不好后面再怎么走都翻不出那個(gè)局部坑。后來我在另一個(gè)項(xiàng)目里接觸了正余弦算法SCA它的設(shè)計(jì)思路跟BAS完全相反——維護(hù)一個(gè)種群每個(gè)個(gè)體通過正弦和余弦函數(shù)的振蕩波形在搜索空間里來回?cái)[動(dòng)既能做大幅度的全局探索也能逐步收斂到最優(yōu)解附近。SCA的全局搜索能力比BAS強(qiáng)得多但它的更新方式依賴于“當(dāng)前個(gè)體與全局最優(yōu)之間的差值”到了后期種群會(huì)快速向最優(yōu)個(gè)體靠攏搜索步長逐漸收縮收斂精度其實(shí)一般。一個(gè)小技巧是先各自跑一遍然后觀察收斂曲線BAS前期下降極快后期幾乎不挪動(dòng)SCA前期探索充分但收斂慢后期精度提升也很有限。這時(shí)我意識到把BAS的局部感知能力和SCA的全局振蕩能力結(jié)合起來正好可以互補(bǔ)——用SCA保證大范圍找到靠譜區(qū)域用BAS在找到的區(qū)域里做精細(xì)打磨這才是這套方案真正的出發(fā)點(diǎn)。1.3 整體方案設(shè)計(jì)思路互補(bǔ)優(yōu)于單一BAS-SCA混合算法的設(shè)計(jì)邏輯并不復(fù)雜但融合方式需要仔細(xì)推敲。最樸素的做法是“串行”先用SCA跑一半迭代再用BAS接著精搜。但這樣會(huì)導(dǎo)致兩個(gè)算法各自為政切換時(shí)信息斷層前期SCA收斂到的位置未必是適合BAS繼續(xù)開發(fā)的位置。我最終采用的是“并行混合”策略每個(gè)個(gè)體在同一輪迭代中同時(shí)執(zhí)行SCA更新和BAS搜索通過一個(gè)隨迭代次數(shù)變化的融合權(quán)重 λ把兩種機(jī)制的貢獻(xiàn)動(dòng)態(tài)疊加起來。前期讓SCA的全局振蕩占主導(dǎo)后期讓BAS的局部精細(xì)搜索占主導(dǎo)。這樣既不會(huì)丟失全局探索能力又能保證收斂階段的精度是整個(gè)算法的關(guān)鍵所在。另外這套方案要作用的對象是ELM而不是一個(gè)抽象的優(yōu)化測試函數(shù)所以在設(shè)計(jì)時(shí)還必須考慮ELM本身的特性——權(quán)重和偏置的取值范圍、適應(yīng)度函數(shù)的計(jì)算成本、隱層節(jié)點(diǎn)數(shù)量對搜索維度的影響等。這些細(xì)節(jié)處理不好優(yōu)化算法的理論再好也落不了地。2. 三個(gè)基礎(chǔ)算法的核心機(jī)制先搞清楚再動(dòng)手2.1 天牛須算法BAS一只天牛怎么找食物天牛須算法的靈感來自天牛覓食時(shí)的行為天牛的兩根觸須可以感知食物氣味的濃度如果左側(cè)氣味濃它就往左走如果右側(cè)濃就往右走。這個(gè)過程抽象成數(shù)學(xué)模型后非常簡潔。假設(shè)當(dāng)前位置是 X天牛隨機(jī)生成一個(gè)歸一化的方向向量 dir左須位置和右須位置分別表示為XL X d * dir / 2 XR X - d * dir / 2其中 d 表示兩只觸須之間的距離。然后分別計(jì)算左右兩個(gè)位置對應(yīng)的適應(yīng)度 f(XL) 和 f(XR)如果左須位置的適應(yīng)度更好求最小值時(shí)更小天牛就朝左移動(dòng)否則朝右移動(dòng)。位置更新公式為X_new X - step * sign(f(XL) - f(XR)) * dir這里的 step 是天牛的搜索步長sign 是符號函數(shù)決定移動(dòng)方向。隨著迭代推進(jìn)step 和 d 都會(huì)按一定比例衰減模擬天牛越來越接近食物源時(shí)步子越邁越小的過程。BAS的優(yōu)點(diǎn)是單個(gè)體搜索每輪只算兩次適應(yīng)度開銷低、收斂快缺點(diǎn)是缺少種群信息一旦方向判斷出錯(cuò)就可能直接走進(jìn)死胡同。2.2 正余弦算法SCA用三角函數(shù)畫出來的搜索軌跡SCA是Mirjalili在2016年提出的群體智能優(yōu)化算法核心思想是用正弦和余弦函數(shù)的周期性震蕩來模擬個(gè)體在解空間中的波動(dòng)搜索。對種群中的每個(gè)個(gè)體位置更新公式如下當(dāng) r4 0.5 時(shí) X_new X r1 * sin(r2) * |r3 * P - X|當(dāng) r4 0.5 時(shí) X_new X r1 * cos(r2) * |r3 * P - X|這里的 P 是當(dāng)前全局最優(yōu)位置r2 是[0, 2π]內(nèi)的隨機(jī)數(shù)決定步進(jìn)方向r3 是[0, 2]內(nèi)的隨機(jī)數(shù)用來給最優(yōu)位置加一個(gè)隨機(jī)權(quán)重r4 是[0, 1]內(nèi)的隨機(jī)數(shù)用來在正弦和余弦兩種更新模式之間做選擇。r1 是一個(gè)從 a 線性遞減到 0 的控制參數(shù)a 通常取2它決定了搜索幅度前期 r1 大個(gè)體大范圍震蕩進(jìn)行全局探索后期 r1 小震蕩幅度收窄轉(zhuǎn)為局部開發(fā)。所以SCA本質(zhì)上是通過三角函數(shù)周期性和隨機(jī)參數(shù)配合在“探索”和“開發(fā)”之間做平衡的多個(gè)體搜索算法。2.3 極限學(xué)習(xí)機(jī)ELM隨機(jī)映射加一步解析求解ELM的結(jié)構(gòu)是一個(gè)單隱層前饋神經(jīng)網(wǎng)絡(luò)假設(shè)輸入樣本是 X隱層節(jié)點(diǎn)數(shù)是 L激活函數(shù)是 g。隱層輸出矩陣 H 通過下面的公式計(jì)算H g(X * W b)其中 W 是輸入層到隱層的權(quán)重矩陣b 是隱層偏置這兩個(gè)就是隨機(jī)生成的部分。ELM的訓(xùn)練核心在于輸出權(quán)重 β 的求解目標(biāo)是最小化 ||Hβ - T||2其中 T 是訓(xùn)練目標(biāo)。這是一個(gè)線性最小二乘問題可以直接用Moore-Penrose偽逆求解β pinv(H) * T整個(gè)訓(xùn)練過程一步到位沒有任何迭代式梯度更新所以訓(xùn)練速度極快。但正因?yàn)?W 和 b 是隨機(jī)生成的H 的好壞完全取決于運(yùn)氣。如果隨機(jī)生成的映射不能有效提取特征ELM的精度就會(huì)很差。所以用BAS-SCA去搜索最優(yōu)的 W 和 b本質(zhì)上是把ELM從“隨機(jī)映射”升級為“優(yōu)化映射”在保留快速訓(xùn)練優(yōu)勢的同時(shí)大幅提升模型性能的穩(wěn)定性和上限。3. 融合邏輯與混合改進(jìn)機(jī)制的核心設(shè)計(jì)3.1 第一個(gè)改進(jìn)把天牛須擾動(dòng)嵌進(jìn)SCA更新公式這是整套混合機(jī)制最核心的部分。我沒有把BAS和SCA當(dāng)作兩個(gè)獨(dú)立的流水線串聯(lián)使用而是把BAS產(chǎn)生的方向擾動(dòng)直接作為一項(xiàng)修正量注入SCA的更新公式中?;旌虾蟮奈恢酶率綖閄_new λ * X_sca (1 - λ) * X_bas其中 X_sca 是SCA生成的候選位置X_bas 是BAS生成的候選位置。X_sca 保證了當(dāng)前個(gè)體向全局最優(yōu)方向移動(dòng)的趨勢X_bas 則通過左右須的適應(yīng)度比較提供了局部的方向修正。融合權(quán)重 λ 控制兩種機(jī)制的貢獻(xiàn)比例。這樣做有一個(gè)很實(shí)際的好處如果某個(gè)個(gè)體位于一個(gè)局部最優(yōu)附近SCA的震蕩幅度又已經(jīng)很小單靠SCA幾乎不可能跳出去而BAS的左右須方向判斷可以提供繞開局部坑的微調(diào)路徑相當(dāng)于在SCA的搜索路徑上增加了一個(gè)局部勘探器。反過來BAS容易誤判方向的問題也能被SCA的全局最優(yōu)牽引所糾正不至于走偏太遠(yuǎn)。3.2 第二個(gè)改進(jìn)自適應(yīng)融合權(quán)重的動(dòng)態(tài)調(diào)節(jié)融合權(quán)重 λ 不是固定值而是隨迭代次數(shù)動(dòng)態(tài)調(diào)整的。我使用的公式是λ 0.8 - 0.6 * (t / T)其中 t 是當(dāng)前迭代次數(shù)T 是最大迭代次數(shù)。迭代初期 t0 時(shí) λ0.8SCA占絕對主導(dǎo)保證種群在全局范圍內(nèi)充分探索迭代結(jié)束時(shí) λ0.2BAS占主導(dǎo)對已經(jīng)找到的較優(yōu)區(qū)域做精細(xì)搜索。這個(gè)設(shè)計(jì)的思路很簡單全局探索階段需要大尺度的震蕩BAS的步長再大也有限不如讓SCA放開手腳跑到了后期種群已經(jīng)集中在某個(gè)區(qū)域了再用SCA大幅震蕩反而會(huì)破壞已找到的好解此時(shí)BAS的小步精細(xì)修正更有價(jià)值。在實(shí)際操作中有人也會(huì)用非線性衰減或余弦衰減來調(diào)整 λ比如 λ 0.5 0.3 * cos(π * t / T)效果大同小異。我建議不用糾結(jié)具體衰減函數(shù)關(guān)鍵是保證“前期探索、后期開發(fā)”這個(gè)趨勢不能變。3.3 第三個(gè)改進(jìn)邊界反射與精英保留策略優(yōu)化ELM的權(quán)重和偏置時(shí)搜索范圍通常被限制在[-1, 1]或[-2, 2]之間。如果某個(gè)個(gè)體的位置更新后超出了邊界最常見的處理是直接裁剪到邊界值但這樣會(huì)導(dǎo)致大量個(gè)體聚集在邊界上損失種群多樣性。我實(shí)際用的是反射邊界策略如果某一維度的值超過上界就根據(jù)超出部分按比例反彈回邊界內(nèi)。反射法能把個(gè)體留在邊界附近但又不全部疊在邊界點(diǎn)上對保持種群多樣性有明顯幫助。同時(shí)每一輪迭代結(jié)束后我會(huì)單獨(dú)記錄全局歷史最優(yōu)解下一輪不論個(gè)體如何更新全局最優(yōu)始終不會(huì)被覆蓋。這個(gè)精英保留策略幾乎是所有優(yōu)化算法落地時(shí)的標(biāo)配尤其當(dāng)適應(yīng)度函數(shù)本身有一定噪聲時(shí)比如數(shù)據(jù)分布不均勻沒有精英保留很容易把已經(jīng)找到的好解弄丟。3.4 改進(jìn)后的搜索行為分析從搜索行為上看改進(jìn)后的BAS-SCA兼具了“群體信息共享”和“單體方向感知”兩種能力。SCA負(fù)責(zé)在宏觀上把種群引向有希望的區(qū)域BAS負(fù)責(zé)在每個(gè)個(gè)體層面做微觀修正。融合權(quán)重 λ 又保證了兩者的主導(dǎo)地位隨時(shí)間平滑切換。相比原始BAS混合算法顯著降低陷入局部最優(yōu)的概率相比原始SCA混合算法在后期的收斂精度和收斂速度都有提升。我在測試函數(shù)Sphere、Rastrigin和Griewank上做過快速驗(yàn)證結(jié)論很直觀在Rastrigin這種多峰函數(shù)上原始BAS基本逃不出局部最優(yōu)原始SCA能到達(dá)不錯(cuò)的區(qū)域但后期收斂緩慢BAS-SCA不僅收斂到了更優(yōu)值而且連續(xù)運(yùn)行多次的方差明顯小于兩個(gè)單一算法。這個(gè)結(jié)果也讓我放心把它用到ELM參數(shù)尋優(yōu)上。4. 手把手實(shí)操BAS-SCA優(yōu)化ELM的完整實(shí)現(xiàn)4.1 個(gè)體編碼與適應(yīng)度函數(shù)用BAS-SCA優(yōu)化ELM第一步是把ELM的待優(yōu)化參數(shù)編碼成優(yōu)化算法中的個(gè)體向量。假設(shè)輸入特征維度是 n_input隱層節(jié)點(diǎn)數(shù)是 n_hidden那么需要優(yōu)化的參數(shù)包括輸入權(quán)重 W形狀為 n_input × n_hidden和隱層偏置 b形狀為 1 × n_hidden。把 W 展平后拼接上 b得到一個(gè)長度為 n_input * n_hidden n_hidden 的向量這就是一個(gè)個(gè)體。適應(yīng)度函數(shù)的設(shè)計(jì)直接影響最終效果。分類任務(wù)可以用錯(cuò)誤率或交叉熵作為適應(yīng)度回歸任務(wù)最常用的是均方根誤差RMSE或平均絕對誤差MAE。我習(xí)慣用驗(yàn)證集上的誤差來評估個(gè)體的好壞而不是用訓(xùn)練集因?yàn)閮?yōu)化算法很可能過擬合訓(xùn)練集導(dǎo)致最終選出的參數(shù)泛化性能差。如果數(shù)據(jù)集規(guī)模較小也可以采用K折交叉驗(yàn)證取平均誤差作為適應(yīng)度。4.2 核心代碼實(shí)現(xiàn)下面是我整理出的一個(gè)可以直接跑通的核心代碼框架依賴只有numpy。這段代碼用偽代碼風(fēng)格保留了主要邏輯幫助你理解每個(gè)步驟到底在干什么。import numpy as np def sigmoid(x): return 1.0 / (1.0 np.exp(-x)) def elm_predict(X, W, b, beta): H sigmoid(X W b) return H beta def compute_beta(X, y, W, b): H sigmoid(X W b) # 加入小量正則項(xiàng)防止偽逆計(jì)算不穩(wěn)定 return np.linalg.pinv(H.T H 1e-6 * np.eye(H.shape[1])) H.T y def fitness_function(individual, X_train, y_train, X_val, y_val, n_input, n_hidden): W individual[:n_input * n_hidden].reshape(n_input, n_hidden) b individual[n_input * n_hidden:].reshape(1, n_hidden) beta compute_beta(X_train, y_train, W, b) y_pred elm_predict(X_val, y_val, W, b, beta) return np.sqrt(np.mean((y_val - y_pred) ** 2)) # RMSE def bas_sca_elm(X_train, y_train, X_val, y_val, n_input, n_hidden, pop_size20, max_iter100, lb-1.0, ub1.0): dim n_input * n_hidden n_hidden # 初始化種群 pop np.random.uniform(lb, ub, (pop_size, dim)) fitness np.array([fitness_function(ind, X_train, y_train, X_val, y_val, n_input, n_hidden) for ind in pop]) gbest_idx np.argmin(fitness) gbest pop[gbest_idx].copy() gbest_fit fitness[gbest_idx] a 2.0 step0 (ub - lb) * 0.3 for t in range(max_iter): r1 a - t * (a / max_iter) for i in range(pop_size): # SCA更新 r2 2 * np.pi * np.random.rand() r3 2 * np.random.rand() r4 np.random.rand() if r4 0.5: X_sca pop[i] r1 * np.sin(r2) * np.abs(r3 * gbest - pop[i]) else: X_sca pop[i] r1 * np.cos(r2) * np.abs(r3 * gbest - pop[i]) # BAS更新方向感知 step step0 * (1 - t / max_iter) d step * 0.5 dir_vec np.random.randn(dim) dir_vec dir_vec / np.linalg.norm(dir_vec) XL pop[i] d * dir_vec / 2 XR pop[i] - d * dir_vec / 2 fL fitness_function(XL, X_train, y_train, X_val, y_val, n_input, n_hidden) fR fitness_function(XR, X_train, y_train, X_val, y_val, n_input, n_hidden) direction -1 if fL fR else 1 X_bas pop[i] - step * direction * dir_vec # 融合權(quán)重前期SCA主導(dǎo)后期BAS主導(dǎo) lam 0.8 - 0.6 * (t / max_iter) X_new lam * X_sca (1 - lam) * X_bas # 邊界反射 for j in range(dim): if X_new[j] ub: X_new[j] 2 * ub - X_new[j] if X_new[j] lb: X_new[j] 2 * lb - X_new[j] pop[i] X_new fitness[i] fitness_function(pop[i], X_train, y_train, X_val, y_val, n_input, n_hidden) gbest_idx np.argmin(fitness) if fitness[gbest_idx] gbest_fit: gbest pop[gbest_idx].copy() gbest_fit fitness[gbest_idx] W gbest[:n_input * n_hidden].reshape(n_input, n_hidden) b gbest[n_input * n_hidden:].reshape(1, n_hidden) beta compute_beta(X_train, y_train, W, b) return W, b, beta, gbest_fit代碼中需要特別留意的有兩點(diǎn)一是 compute_beta 中給 H.T H 加了一個(gè)小量正則項(xiàng)防止矩陣奇異導(dǎo)致偽逆計(jì)算報(bào)錯(cuò)二是邊界反射是逐維度處理的避免整體向量操作時(shí)邊界邏輯出錯(cuò)。這段代碼在中小規(guī)模數(shù)據(jù)集上運(yùn)行的速度是可以接受的適應(yīng)度函數(shù)的計(jì)算次數(shù)是 pop_size * (1 2) * max_iter也就是每輪每個(gè)個(gè)體除了自身適應(yīng)度外還要額外算兩次天牛須位置的適應(yīng)度計(jì)算量相比標(biāo)準(zhǔn)SCA有所增加但換來的是更穩(wěn)的收斂表現(xiàn)。4.3 參數(shù)配置建議把代碼跑起來之后參數(shù)配置就成了決定效果好壞的另一個(gè)關(guān)鍵因素。我不建議一上來就照搬默認(rèn)參數(shù)因?yàn)椴煌瑪?shù)據(jù)集的維度和樣本量差異很大。以下是我調(diào)參過程中的一些經(jīng)驗(yàn)值參數(shù)建議范圍說明種群規(guī)模 pop_size20~30太小容易早熟太大增加計(jì)算開銷最大迭代次數(shù) max_iter100~300視適應(yīng)度函數(shù)計(jì)算成本靈活調(diào)整邊界范圍 lb/ub±1 或 ±2權(quán)重和偏置在這個(gè)范圍通常夠用初始步長 step0邊界寬度的0.3倍過大導(dǎo)致震蕩劇烈過小收斂慢融合權(quán)重初值0.8保證前期SCA主導(dǎo)探索融合權(quán)重終值0.2保證后期BAS主導(dǎo)精細(xì)搜索4.4 效果對比怎么看驗(yàn)證混合算法的效果不能只看一次實(shí)驗(yàn)的結(jié)果。因?yàn)镋LM本身有隨機(jī)性優(yōu)化算法也有隨機(jī)性至少要跑10次以上對比平均值和標(biāo)準(zhǔn)差。我在實(shí)際項(xiàng)目中通常做這樣幾組對比原始ELM隨機(jī)初始化、BAS-ELM、SCA-ELM、BAS-SCA-ELM。觀察兩個(gè)維度一是平均預(yù)測誤差二是多次運(yùn)行的標(biāo)準(zhǔn)差。前者看精度上限后者看穩(wěn)定性。典型的實(shí)驗(yàn)趨勢是原始ELM的平均誤差最大且方差極大BAS-ELM精度提升明顯但方差依然不小說明BAS在某些初始點(diǎn)上會(huì)陷進(jìn)局部最優(yōu)SCA-ELM平均誤差優(yōu)于原始ELM但收斂需要的迭代次數(shù)更長BAS-SCA-ELM在平均誤差和方差兩個(gè)指標(biāo)上通常都是最優(yōu)的。如果你跑出來的結(jié)果違背了這個(gè)規(guī)律大概率是參數(shù)沒調(diào)對而不是算法有問題繼續(xù)往下面的排查思路去找原因。5. 我踩過的坑與排查經(jīng)驗(yàn)5.1 優(yōu)化后精度反而更差先查這四處第一處是隱層節(jié)點(diǎn)數(shù)太少。ELM本身能力不足時(shí)任何優(yōu)化算法都救不回來因?yàn)樗阉骺臻g本身就不存在足夠好的解。隱層節(jié)點(diǎn)數(shù)一般先按輸入特征的2到3倍起步再逐步增加觀察效果。第二處是適應(yīng)度函數(shù)用錯(cuò)了數(shù)據(jù)集——如果直接在訓(xùn)練集上優(yōu)化得到的結(jié)果在測試集上反而差大概率是過擬合了換成驗(yàn)證集評估或者加交叉驗(yàn)證能緩解。第三處是邊界范圍設(shè)置不合理。權(quán)重初始化為±1是ELM的常見做法但不同數(shù)據(jù)集的合適范圍差異很大有時(shí)候把邊界放到±2反而更好這個(gè)需要根據(jù)激活函數(shù)和數(shù)據(jù)分布去試。第四處是融合權(quán)重衰減速度太快導(dǎo)致后期完全切到BAS模式后全局?jǐn)_動(dòng)消失而BAS又正好陷在局部最優(yōu)里出不來把 λ 終值從0.2適當(dāng)上調(diào)到0.3或0.4保留一部分SCA擾動(dòng)經(jīng)常能解決問題。5.2 算法收斂到一半就僵住了怎么診斷“僵住”表現(xiàn)為適應(yīng)度曲線在迭代中段就長期持平幾乎不再下降。最直接的原因通常是種群多樣性喪失——所有個(gè)體都聚集到了同一個(gè)位置附近SCA的震蕩幅度又已經(jīng)被 r1 衰減得很小個(gè)體之間差異幾乎為零算法失去了繼續(xù)搜索的動(dòng)力。這時(shí)可以先檢查種群的分布情況如果所有個(gè)體的距離都很小說明多樣性出了問題。一個(gè)問題排查順序是先調(diào)大 r1 的初始值讓前期的震蕩幅度更大再檢查邊界反射實(shí)現(xiàn)是否有 bug如果實(shí)現(xiàn)正確個(gè)體應(yīng)該不會(huì)大量堆積在邊界上最后檢查是否不小心把全局最優(yōu)個(gè)體也覆蓋掉了沒有精英保留的話這種情況特別容易發(fā)生。我最初實(shí)現(xiàn)時(shí)就是因?yàn)槁┝司⒈A魧?dǎo)致每輪的最優(yōu)解在下一次迭代中被新的隨機(jī)更新沖掉曲線看起來就像一直原地踏步。5.3 面對不同數(shù)據(jù)集的調(diào)參路線如果做的是高維稀疏數(shù)據(jù)比如文本分類搜索維度會(huì)非常高個(gè)體長度動(dòng)輒幾千這時(shí)需要把種群規(guī)模降下來、迭代次數(shù)適當(dāng)增加因?yàn)槊看芜m應(yīng)度計(jì)算都涉及矩陣運(yùn)算種群太大會(huì)拖慢整體速度。如果面對的是小樣本數(shù)據(jù)集適應(yīng)度評估很容易受噪聲影響建議用交叉驗(yàn)證代替單次驗(yàn)證集評估同時(shí)把邊界范圍縮小防止優(yōu)化算法在噪聲中亂跑。如果隱層節(jié)點(diǎn)數(shù)較多超過50搜索維度就很大BAS天牛須的方向向量生成和歸一化會(huì)占不少計(jì)算時(shí)間。一種優(yōu)化做法是先把ELM的隱層特征中心初始化到一個(gè)合理范圍比如通過原始ELM跑幾次取平均權(quán)重再用BAS-SCA在這個(gè)范圍內(nèi)做局部精搜。這樣可以大幅縮短搜索空間但代價(jià)是可能錯(cuò)過真正的最優(yōu)解屬于精度和速度之間的權(quán)衡。5.4 這套方案最適用的場景我不建議在超大規(guī)模數(shù)據(jù)集上直接使用這套方案因?yàn)閮?yōu)化算法需要反復(fù)計(jì)算ELM的適應(yīng)度每一輪都要做矩陣偽逆運(yùn)算數(shù)據(jù)量大了之后整體耗時(shí)不可接受。它更契合的場景是中小規(guī)模數(shù)據(jù)、對模型穩(wěn)定性要求高的任務(wù)比如工業(yè)設(shè)備的故障診斷、小樣本回歸預(yù)測、金融風(fēng)控里的評分卡建模這些場景數(shù)據(jù)量可控但對每次訓(xùn)練的結(jié)果一致性要求很高很值得用BAS-SCA-ELM去替換原始ELM。如果數(shù)據(jù)集樣本量在幾千到幾萬級別、特征維度在幾十到幾百這個(gè)范圍BAS-SCA-ELM的尋優(yōu)時(shí)間通常在幾十秒到幾分鐘內(nèi)可以完成換來的穩(wěn)定性提升是實(shí)打?qū)嵉摹A硪粋€(gè)常見用途是作為集成學(xué)習(xí)里的基學(xué)習(xí)器——由于優(yōu)化后的ELM每次運(yùn)行結(jié)果更一致集成時(shí)不容易出現(xiàn)個(gè)別基學(xué)習(xí)器效果極差拉低整體表現(xiàn)的問題。最后再分享一個(gè)實(shí)際使用中的小技巧在跑BAS-SCA-ELM之前先用原始ELM快速跑幾輪記錄一下隨機(jī)初始化下的典型誤差水平然后把這個(gè)誤差水平作為BAS-SCA尋優(yōu)的“基線”。如果優(yōu)化后的結(jié)果連基線都打不過說明算法流程中一定有 bug而不是算法本身沒用。這個(gè)習(xí)慣幫我排查了很多初期實(shí)現(xiàn)問題也適合你在自己調(diào)試代碼時(shí)參考。