超參數(shù))
預測不好做尤其是那種一眼看去有趨勢、有周期、還夾雜著噪聲的時間序列。我做過不少類似的項目從電力負荷到設備振動信號踩過很多坑之后最后發(fā)現(xiàn)一條相對省心的路子用灰狼優(yōu)化算法GWO去自動搜索雙向長短期記憶網(wǎng)絡BiLSTM的超參數(shù)。這個方向很適合那些想給時間序列預測模型提質(zhì)增效、但又不想在調(diào)參上耗費太多精力的開發(fā)者。這篇文章會從前因后果、數(shù)據(jù)處理、算法實現(xiàn)、模型訓練到常見坑位把整套方案講透希望能幫你少走幾周彎路。時間序列預測本身不新鮮但用對方法很重要。BiLSTM在序列建模上的優(yōu)勢GWO在參數(shù)尋優(yōu)上的優(yōu)勢組合起來就是一種很務實的技術(shù)方案。我接下來會先聊清楚為什么選這個組合再逐步拆開每部分的實現(xiàn)細節(jié)和實操經(jīng)驗。1. 方案選型為什么是GWO-BiLSTM1.1 BiLSTM的價值不只多了一個反向通道很多人覺得BiLSTM就是把普通的LSTM倒過來再跑一遍這種理解不能算錯但會忽略它的真正意義。普通的LSTM是單向的當前時刻的輸出只依賴過去的輸入這在很多場景下確實夠用比如逐點預測溫度、預測下一幀語音。但你一旦面對完整的時間序列窗口比如用過去48小時的數(shù)據(jù)預測未來12小時窗口中間某個時刻的上下文其實是既包含過去、也包含未來的。舉一個我常跟人舉的例子讀一句“小明拿著傘出門因為外面下著雨”你看到“傘”的時候能猜到后面有“下雨”但真正確認這個關(guān)系要等到句子末尾。BiLSTM就是在正向讀取的同時再從末尾反向讀取一遍把兩個方向的信息拼在一起這樣每個時間步都能同時看到前后文。在時間序列場景里很多規(guī)律不是嚴格單方向的比如天氣數(shù)據(jù)、空氣質(zhì)量數(shù)據(jù)、金融價格數(shù)據(jù)往往局部模式與前后都有相關(guān)性雙向結(jié)構(gòu)能把這種關(guān)聯(lián)抓得更完整。需要說明的是BiLSTM并不是所有場景都優(yōu)于單層LSTM。如果你的任務是典型的流式預測也就是只有過去沒有未來的時刻那就必須小心用BiLSTM時輸入窗口本身不能包含真實未來信息否則會直接導致數(shù)據(jù)泄漏。這也是后面我專門強調(diào)窗口切分的原因。在實際項目里BiLSTM更多用于“拿一段完整序列做編碼然后預測后半段”的場景而不是逐點滾動式預測。從我個人的經(jīng)驗看BiLSTM光結(jié)構(gòu)本身就比普通LSTM多出一倍參數(shù)量訓練時間也接近翻倍。如果你數(shù)據(jù)量很小比如只有幾千條BiLSTM可能反而不穩(wěn)定。這個組合適合數(shù)據(jù)量中等偏上、窗口信息相關(guān)性較強的預測問題。1.2 灰狼優(yōu)化到底解決了什么問題BiLSTM需要調(diào)的超參數(shù)不算少隱藏層神經(jīng)元數(shù)、層數(shù)、學習率、批次大小、Dropout比例、序列窗口長度。這些參數(shù)互相影響網(wǎng)格搜索的代價高得離譜。我曾經(jīng)試過對一批參數(shù)做網(wǎng)格搜索每個組合訓練一次要五分鐘幾百個組合下來幾天就沒影了。隨機搜索快一點但結(jié)果看臉經(jīng)常搜出一堆不穩(wěn)定的結(jié)果。GWO的優(yōu)勢在于它是一個結(jié)構(gòu)簡單但收斂性能很好的無梯度優(yōu)化算法。它是受灰狼群體捕獵行為啟發(fā)提出來的假設一匹狼的解代表一組候選超參數(shù)整個狼群按適應度分成頭狼、第二和第三剩下的狼跟著這三匹頭狼不斷調(diào)整位置。真正寫代碼時會發(fā)現(xiàn)GWO的核心就是一個位置更新公式比基因算法實現(xiàn)起來還要簡單調(diào)節(jié)參數(shù)少不太容易出現(xiàn)那種“一換數(shù)據(jù)效果就崩了”的情況。為什么在時間序列預測里GWO比一些復雜算法更合適因為超參數(shù)搜索空間往往是連續(xù)的、低維的而且目標函數(shù)的評估比較昂貴——每次評估都要真實訓練一次BiLSTM。GWO用很少的評估次數(shù)就能逼近較優(yōu)區(qū)域在性能和時間之間平衡得較好。相比之下像貝葉斯優(yōu)化雖然更“聰明”但它需要擬合代理模型參數(shù)一旦多起來收斂并不一定快實現(xiàn)復雜度也高。我在實踐中發(fā)現(xiàn)GWO最常見的坑是把優(yōu)化目標設成了訓練集誤差。訓練集誤差小不代表驗證集誤差小超參數(shù)很容易被帶偏成過擬合狀態(tài)。正確的做法是用驗證集上的損失或者評價指標作為適應度值這一點我下一節(jié)會詳細展開。2. 數(shù)據(jù)準備與預處理比算法本身更決定成敗2.1 清洗、窗口切分與樣本量推算做時間序列預測第一步不是建模而是搞懂手頭的數(shù)據(jù)。先把數(shù)據(jù)里的缺失值處理掉如果是長時間連續(xù)缺失不要用線性插值硬填那會引入人造趨勢最好用前后同周期均值替代比如同一時刻前幾天的平均值如果是零星缺失線性插值或者前向填充問題不大。接著是異常值檢測。我發(fā)現(xiàn)一個很實用的辦法對原始序列做一階差分然后用3倍標準差篩掉差分值異常跳變的點。比起直接看原始值的箱線圖這種做法對趨勢型數(shù)據(jù)更友好不至于把正常的上升階段誤判為異常。處理完以后做一次平滑比如移動平均能明顯減少模型對高頻抖動的過擬合。接下來是最容易被新手忽略的窗口切分。時間序列預測不能像圖像分類那樣隨機抽樣必須按時間順序構(gòu)造樣本。比如窗口長度為24預測步長為6那前24個點作為輸入第25到30個點作為輸出然后窗口往后滑動一個步長再取下一組?;暗拇笮≈苯佑绊懣捎脴颖玖?0000條數(shù)據(jù)窗口24預測步長6滑一步大約能生成9900多個樣本但如果窗口長96預測步長12滑一步就只有9800多個。窗口太長會導致樣本變少窗口太短又捕捉不到長周期規(guī)律這個平衡點需要多次試。我自己常用的估算方法是樣本數(shù)量大約等于總長 - 窗口 - 預測長度/ 滑步?;皆O成1最好但如果數(shù)據(jù)量特別大可以適當設為預測步長減少冗余樣本。注意滑步變大后樣本相關(guān)性下降模型方差可能變大所以也別太激進。構(gòu)造樣本時務必要防止窗口內(nèi)混入未來信息。你的輸入特征可以包含歷史同期的外部變量比如星期幾、節(jié)假日標記這些是允許的因為它們不依賴未來。但如果你引入了某個未來才知道的變量整條訓練管線就廢了。2.2 歸一化與時間順序劃分歸一化在每個項目中都會遇到但很多人沒想清楚一個重要問題統(tǒng)計量到底從哪里算。最忌諱的做法是先對全部數(shù)據(jù)做歸一化再劃分訓練集和測試集因為歸一化的時候已經(jīng)“偷看”了測試集的均值和方差。正確做法是只對訓練數(shù)據(jù)擬合歸一化器然后用同一組參數(shù)去變換驗證集和測試集。代碼上很簡單以sklearn的MinMaxScaler為例訓練集上用fit_transform驗證集和測試集上只用transform。這樣測試集的分布信息不會提前泄露到訓練階段。對時間序列來說這種區(qū)分不只是理論潔癖它是實打?qū)嵱绊戭A測精度的如果未來一段時間序列的整體均值發(fā)生了變化而你已經(jīng)用包含它的統(tǒng)計量做了歸一化那模型在真實部署時會對新數(shù)據(jù)分布措手不及。樣本劃分也必須按時間順序。常見比例是訓練集:驗證集:測試集 8:1:1或7:1.5:1.5具體看數(shù)據(jù)總量。關(guān)鍵是絕對不能采用隨機劃分或KFold交叉驗證因為時間序列有時間先后邏輯隨機打亂等于是把未來搬到了過去模型會學到根本不可能的規(guī)律。我在項目里常被問“為什么不能在時間序列上用隨機劃分”答案很簡單一旦模型在訓練時見過未來樣本它的驗證表現(xiàn)就毫無意義上線后必然翻車。如果你的數(shù)據(jù)呈現(xiàn)明顯的年度周期比如用電負荷、氣溫那劃分邊界最好落在季節(jié)邊界附近確保測試集包含至少一個完整周期。不要簡單截斷否則測試集可能只包含某一季度的數(shù)據(jù)評估結(jié)果會有偏差。3. GWO優(yōu)化BiLSTM的核心實現(xiàn)細節(jié)3.1 灰狼算法的數(shù)學邏輯和參數(shù)設定先把灰狼算法的核心邏輯捋一遍后面代碼就好寫了。GWO把狼群位置理解為解空間中的一個點也就是一組超參數(shù)。每匹狼的位置向量代表一組候選參數(shù)位置向量的每個維度就是一種超參數(shù)。狼群中適應度最好的三匹狼分別記為頭狼、次頭狼和三頭狼其他狼根據(jù)這三匹狼的位置來更新自己的位置。更新公式大致是先算當前狼與頭狼、次頭狼、三頭狼的距離再分別向三個方向移動一步最后取平均。移動步長由一個系數(shù)控制前期讓系數(shù)大于1狼群大步探索后期讓系數(shù)逐漸小于1狼群收縮到最優(yōu)解附近。還有一個隨機分量控制探索能力避免狼群太早抱團。這些數(shù)學描述對應到代碼里其實很克制核心函數(shù)不超過20行。關(guān)鍵參數(shù)就兩個狼群規(guī)模和迭代次數(shù)。狼群規(guī)模建議在20到40之間太少探索不充分太多訓練次數(shù)成倍增加。迭代次數(shù)看目標函數(shù)的耗時如果訓練一個BiLSTM要一分鐘20次迭代配20匹狼就要6個多小時所以需要在時間預算內(nèi)設定。我在項目里通常先讓GWO跑15到20次迭代把候選狼群規(guī)??刂圃?5到20左右然后觀察適應度曲線的收斂速度。如果曲線還明顯在下降說明迭代太早結(jié)束如果已經(jīng)平了說明再搜也不會更好可以提前收工。至于狼群位置向量的上下界就是每種超參數(shù)的搜索范圍這個范圍必須符合實際比如學習率設成1e-4到1e-2隱藏層神經(jīng)元設成32到256Dropout設成0到0.5。這里有一個很容易踩的坑GWO的坐標更新天然會產(chǎn)生小數(shù)但隱藏層神經(jīng)元數(shù)和批次大小必須是正整數(shù)。解決辦法是編碼時保存連續(xù)值在傳給模型前做四舍五入取整。學習率這類參數(shù)則最好取對數(shù)尺度因為學習率在0.001和0.002之間的差別遠大于0.01和0.011之間用原始尺度會讓小數(shù)值幾乎搜不到。實際編碼時可以對學習率做log10變換讓搜索空間從 -4 到 -2取回來再算出真實值。3.2 目標函數(shù)設計用驗證集誤差做適應度GWO的適應度函數(shù)是整套流程的地基。我踩過最大的坑就是最開始用訓練集的均方誤差當適應度跑出來的超參數(shù)在測試集上表現(xiàn)很差后來才明白是過擬合問題。正確目標函數(shù)應當評估一組超參數(shù)在驗證集上的表現(xiàn)具體步驟是對每個候選超參數(shù)組合實例化一個BiLSTM模型在訓練集上訓練一定輪數(shù)然后計算驗證集上的誤差將其作為適應度值返回給GWO。但這里有個現(xiàn)實問題每匹狼都要訓練一輪模型如果每次都訓練到完全收斂時間開銷太大。我自己的做法是限制訓練輪數(shù)比如固定最多訓練30輪并用早停機制在驗證損失連續(xù)5輪不下降時提前終止。這樣既保證了適應度值的可比性又節(jié)約了時間。你也不用擔心訓練輪數(shù)太少導致結(jié)果不公平因為所有候選解都接受同樣的預算GWO要比較的是“在同等計算資源下誰表現(xiàn)更好”這個前提是公平的。適應度指標我推薦用驗證集上的平均絕對百分比誤差或均方根誤差。MAPE在數(shù)據(jù)沒有接近0的值時比較直觀但一旦真實值接近0百分比誤差會被放大得很離譜。RMSE對大的偏差更敏感適合誤差集中在少數(shù)點的場景。你也可以兩個都算出來存一個字典形式的適應度值方便后續(xù)分析。目標函數(shù)里還應該把異常場景兜住。比如某組超參數(shù)下模型發(fā)散NaN遍地那這匹狼的適應度就要設成極大值讓它被淘汰。我一般這樣判斷驗證集上第一次出現(xiàn)NaN或Inf直接把損失賦值為一個特別大的常數(shù)比如1e6GWO會自然遠離這個區(qū)域。給個簡單框架方便參考import numpy as np def fitness_function(params, train_loader, val_loader): lr 10 ** params[0] # 對數(shù)尺度還原 hidden int(round(params[1])) # 取整 dropout float(params[2]) model build_bilstm(hidden_sizehidden, dropoutdropout) optimizer torch.optim.Adam(model.parameters(), lrlr) early_stop_cnt 0 best_val_loss float(inf) for epoch in range(max_epochs): train_one_epoch(model, train_loader, optimizer) val_loss evaluate(model, val_loader) if np.isnan(val_loss) or np.isinf(val_loss): return 1e6 if val_loss best_val_loss: best_val_loss val_loss early_stop_cnt 0 else: early_stop_cnt 1 if early_stop_cnt 5: return best_val_loss return best_val_loss整體流程就是初始化狼群位置解碼超參訓練模型返回誤差更新狼群位置重復迭代。這個閉環(huán)搭建完成之后剩下的事情就是等結(jié)果。4. BiLSTM模型的搭建與訓練細節(jié)4.1 網(wǎng)絡結(jié)構(gòu)設計和參數(shù)選擇BiLSTM的網(wǎng)絡結(jié)構(gòu)其實不復雜核心是利用雙向循環(huán)層替代單向循環(huán)層。在PyTorch里LSTM層加上bidirectionalTrue輸出維度會自動變成隱藏層神經(jīng)元數(shù)的兩倍。后續(xù)接全連接層時要注意維度的匹配。我一般設計成三到四層輸入層接BiLSTM后面接全連接層輸出層。BiLSTM層數(shù)在數(shù)據(jù)量不大時設1層就可以設2層以上參數(shù)量容易爆炸。每一層的輸出如果想保留全部時間步信息可以取最后一個時間步的輸出也可以對不同時間步做加權(quán)匯總。在時間序列預測里面最常用的是取最后一個時間步的隱狀態(tài)然后經(jīng)過幾個非線性變換層層壓縮到預測維度。有一個容易忽略的細節(jié)BiLSTM的隱藏層輸出不是直接拼接有些框架默認會按時間步累加兩個方向的輸出有些是拼接。拼接保留的信息更完整但維度更高后續(xù)參數(shù)也更多。如果你不是為了刻意減少參數(shù)量建議用拼接而不是相加。相加在信息量上是有損失的你等于假設正反向信息可以線性疊加到同一個語義空間這個假設并不總是成立。Dropout放在循環(huán)層之間比放在輸出層效果更明顯。PyTorch的LSTM自帶dropout參數(shù)但它只對多層循環(huán)層的非最后一層生效單層LSTM即使設置了Dropout也等于沒設。要真正做正則化得在BiLSTM層和全連接層之間手動插入Dropout層。這個細節(jié)很多人會忽視導致設了參數(shù)卻沒效果。網(wǎng)絡搭建示例import torch import torch.nn as nn class BiLSTMPredictor(nn.Module): def __init__(self, input_size, hidden_size, num_layers, dropout, output_size): super().__init__() self.lstm nn.LSTM( input_size, hidden_size, num_layers, batch_firstTrue, bidirectionalTrue, dropoutdropout if num_layers 1 else 0.0 ) self.dropout nn.Dropout(dropout) self.fc1 nn.Linear(hidden_size * 2, hidden_size) self.fc2 nn.Linear(hidden_size, output_size) def forward(self, x): out, _ self.lstm(x) # (batch, seq_len, hidden*2) out out[:, -1, :] # 取最后一個時間步 out self.dropout(torch.relu(out)) out self.fc2(self.fc1(out)) return out這種結(jié)構(gòu)適合多步預測時把輸出維度設成預測步長一次性輸出多步。需要提醒的是多步預測有兩種思路一種是一次性輸出未來多個步長另一種是滾動預測——每次只預測一步再把它拼回輸入繼續(xù)預測。滾動預測會累積誤差訓練時可以用教師強制緩解但推理階段誤差仍會逐漸放大所以一次性輸出往往更穩(wěn)。4.2 訓練過程管理學習率調(diào)度與早停BiLSTM訓練過程中學習率怎么調(diào)度很關(guān)鍵。我的默認設置是Adam優(yōu)化器加初始學習率0.001配合ReduceLROnPlateau調(diào)度器驗證集損失連續(xù)5個epoch不下降就把學習率減半。這種做法的好處是前期大步走、后期小步磨能有效避免在損失曲面陡峭區(qū)域來回震蕩。早停幾乎是必須的。我在GWO目標函數(shù)里已經(jīng)用了早停其實正式訓練階段同樣需要用。注意早停要保存驗證集損失最低時候的模型參數(shù)而不是訓練過程最后一個epoch的參數(shù)。很多框架自帶checkpoint機制這里只需要比較驗證損失碰到更低就保存一次。批次大小對訓練穩(wěn)定性和目標函數(shù)評估都有影響。64到128在大多數(shù)數(shù)據(jù)集上表現(xiàn)均衡太小比如16或8會讓訓練不穩(wěn)定且耗時太大又可能讓模型收斂不徹底。在GWO搜索里批次大小如果也作為超參搜索建議用離散值集合比如[32, 64, 128]而不是連續(xù)搜索。因為連續(xù)搜索很難對離散參數(shù)保持穩(wěn)定還容易搜出非整數(shù)。還需要留意損失函數(shù)的選擇。時間序列回歸預測一般是MSE損失。但MSE對大誤差非常敏感如果序列里有尖峰模型會花很大精力擬合尖峰反而忽視整體趨勢。我習慣在MSE基礎(chǔ)上加一點MAE加權(quán)也就是Huber損失閾值設為1.0兼顧魯棒性和梯度穩(wěn)定性。如果你在意峰值預測精度那MSE可能更合適如果更在意整體走勢Huber損失會更穩(wěn)。訓練日志也應該認真記。我每次跑實驗都會把模型結(jié)構(gòu)參數(shù)、超參數(shù)、隨機種子、每個epoch的訓練損失和驗證損失記錄下來。這不是形式主義而是等結(jié)果不好的時候能快速定位到底是數(shù)據(jù)問題、超參問題還是模型結(jié)構(gòu)問題。我見過太多人跑完一組實驗連用的什么批次大小都忘了。5. 實驗對比、結(jié)果分析與踩坑記錄5.1 評價指標與對比方案設計評估時間序列預測模型不能只靠一張預測曲線“看著像”。三個指標基本夠用RMSE、MAE和MAPE。RMSE懲罰大誤差MAE反映平均誤差水平MAPE則給出百分比的直觀感受。前兩者有量綱具體數(shù)值受數(shù)據(jù)尺度影響很大所以同比比較才有意義MAPE相對直觀但真實值接近0的時候會失真要不要用需根據(jù)數(shù)據(jù)分布判斷。對比方案建議這樣安排固定同一份數(shù)據(jù)、同樣的滑窗大小和預測步長依次跑普通LSTM、BiLSTM、以及GWO優(yōu)化后的GWO-BiLSTM。普通LSTM和BiLSTM也要留出調(diào)參空間不能讓它們裸奔就得出“GWO更強”的結(jié)論因為公平性對結(jié)論的可信度影響很大。我用固定超參數(shù)訓練普通LSTM再用GWO搜索同一組參數(shù)空間最后對比。從經(jīng)驗來看在對周期和趨勢混合的數(shù)據(jù)上GWO-BiLSTM的性能通常優(yōu)于普通LSTM提升幅度大概在5%到15%之間但這個數(shù)字僅供參考如果你的數(shù)據(jù)本身就非常平穩(wěn)、線性深度模型的提升空間可能很小。除了數(shù)值指標最好還看兩件事一是訓練好的模型在多步預測時的誤差累積曲線看它預測到第幾步開始發(fā)散二是對異常區(qū)間的局部預測效果比如高峰時段、突變時段。只算平均指標容易掩蓋局部失效尤其是時間序列里常常有重要的異常事件。另外GWO搜索結(jié)果不只是拿來用最好的那組還可以做敏感性分析看看最終狼群中適應度排名前幾的解都落在哪些區(qū)域。如果前幾名的學習率都偏小說明學習率這個維度對結(jié)果影響大如果它們的Dropout分布很散說明Dropout不是當前的主要瓶頸。這種分析能幫你判斷下一步優(yōu)化的重點。5.2 常見問題排查表與避坑經(jīng)驗下面是我在實際項目中反復遇到并總結(jié)下來的一些問題和對應處理方式直接看表就能省不少時間現(xiàn)象可能的根因處理辦法GWO迭代很久但適應度下降緩慢搜索范圍設得太大根據(jù)經(jīng)驗縮小范圍比如學習率限定在0.0001到0.01驗證損失在某個解上為NaN學習率過大或模型發(fā)散在目標函數(shù)里返回極大值讓GWO直接淘汰該解GWO-BiLSTM比普通LSTM還差數(shù)據(jù)量太小或序列太長導致有效樣本太少檢查樣本量考慮縮小窗口或改用單向LSTM預測曲線整體滯后一拍數(shù)據(jù)有強自相關(guān)且模型欠擬合增加隱藏層神經(jīng)元或嘗試多步輸出而非滾動預測訓練和驗證差距極大過擬合增大Dropout減小模型容量增加早停測試集表現(xiàn)和驗證集差距大數(shù)據(jù)分布漂移或劃分邊界不合理重新檢查劃分保證測試集覆蓋完整周期數(shù)據(jù)泄漏是時間序列預測里最隱蔽的坑。我單獨強調(diào)一次歸一化必須先對訓練集fit再對驗證集和測試集transform構(gòu)造特征時禁止使用窗口之外的未來信息劃分數(shù)據(jù)集時禁止隨機打亂這些都是在代碼里很容易無意識犯下的錯。一次項目中我就因為圖省事先歸一化整份數(shù)據(jù)導致驗證集分數(shù)好看了換數(shù)據(jù)上線就露餡白白浪費了一周時間。還有一個常見問題是GWO的隨機性導致結(jié)果不穩(wěn)定。同樣配置跑兩次一次效果很好一次很差。解決方案是設置固定隨機種子從NumPy到PyTorch都固定住跑多個隨機種子取平均也可以把GWO初始種群固定下來確保實驗可復現(xiàn)。關(guān)于樣本量不足時的取舍我也給一點個人經(jīng)驗如果數(shù)據(jù)量低于一萬條BiLSTM的優(yōu)勢很難發(fā)揮出來GWO調(diào)參反而是浪費計算資源建議先跑普通LSTM或結(jié)構(gòu)化模型數(shù)據(jù)量在兩萬條以上、序列帶明顯周期依賴時GWO-BiLSTM的性價比才真正體現(xiàn)出來。如果窗口長度超過數(shù)據(jù)量的十分之一就要警惕樣本數(shù)過少可以先適當縮小窗口再考慮增加數(shù)據(jù)采集頻率。最后再說一個問題多步預測的誤差累積。很多優(yōu)化目標只看一步預測誤差結(jié)果模型在滾動預測中后期誤差大得嚇人。GWO的適應度函數(shù)如果能包含多步預測誤差搜索出來的超參數(shù)會更貼合實際使用場景。我通常用三步或六步預測的累積誤差作為適應度雖然訓練更耗時但換來的是更好的在線表現(xiàn)。結(jié)尾這套方案我從初版摸索到現(xiàn)在最大的體會是GWO-BiLSTM不是一個萬能模板而是時間和數(shù)據(jù)規(guī)模到了一定程度之后自然值得嘗試的一條技術(shù)路線。實際操作里我通常會先用一個小樣本量把整套流程跑通確認沒有泄漏、沒有NaN、日志輸出正常再放全量數(shù)據(jù)讓GWO慢慢搜。如果時間緊張也可以把狼群規(guī)模和迭代次數(shù)調(diào)小先粗搜一輪摸出好參數(shù)的大致范圍再在這個范圍里細搜第二輪效果會比一次大范圍搜索更好。這套流程你搭起來之后會發(fā)現(xiàn)真正花時間的不是GWO那兩行更新公式而是前面說的數(shù)據(jù)預處理和實驗評估——但這些工夫都是值得的。