原文:https://www.cnblogs.com/Twobox/p/16836104.html
背景動機
大多數搜索算法專注於在搜索空間中尋找一個或一小組高質量的解決方案。用戶指定了解決方案應該追求的一個或幾個目標。例如,用戶可能需要高性能和低成本的解決方案。傳統的搜索算法包括爬山、模擬退火、進化算法、梯度上升/下降、貝葉斯優化和多目標優化算法等。
1、多樣性問題
黑盒優化中的一大挑戰就是局部最優,特別是在高度欺騙性的問題。因爲在這些問題中,必須跨越低性能的山谷來找到全局最優。
而一個重要的解決方案就是保持種羣的多樣性,來獲得最終更高的性能。但仍然傾向於在早期收斂到一個或幾個好的解決方案。
2、另一種搜索需求
搜索一組解,在追求高性能的同時,解之間的特徵保持多樣性。例如在強化學習中我想訓練一組高性能策略,但是這些策略需要有不同的傾向,例如有些激進有些保守,有些注重通關時間,有些注重積分獲得。
如下圖,我要在最求高性能的同時,在Feature_1和Feature_2上各異的一堆解。看這座山中的每一個點。
提出算法
準備過程:
1、首先確定性能度量 \(f(x)\),例如是某種策略的最終獎勵,就是優化中的目標函數
2、其次選擇N個關注的特徵,例如策略的速度、激進程度等
3、特徵一般是連續的,在考慮計算資源的情況下,需要進行離散化。
算法流程:
初始化:首先隨機生成一定數量個體,並確定每個個體的性能值和特徵值。並將這些個體放在特徵空間中所屬的格子中(如果多個映射到同一個格子,那麼性能表現最高的一個將被保留)。
然後重複以下步驟,直到達到終止標準:
1、在map中隨機選擇一個個體,通過交叉或變異生產一個後代。
2、確定該後代的性能和特徵,並找到對應的特徵方格
3、如果格子爲空,則直接放入。如果非空,則保留更優秀的。
終止條件:
終止條件可以是多方面:例如 時間結束、消耗完固定數量的計算資源、或者性能達到某種水平等。
兩點改進:
1、離散化的粒度可以手動指定或自動調整到可用的資源,包括從粗粒度開始,然後在時間和計算允許的情況下減小粒度。
2、很適合並行化,並行生成與評估節點。
算法性能評價
1、Global Performance:該算法的最優個體的性能值 除以 現所有算法能達到的最高性能值
2、Global reliability:該算法,每個格子的最大性能 除以 現所有算法該格子的最大性能。之後求和取平均
3、Precision(opt-in reliability):與Global reliability類似,只不過只有該算法填充過的格子才參與計算。所以分數會比第二個高。例如先所有算法最優情況能夠填充100個格子,該算法填充了90個格子,那麼只有這90個格子參與計算。而評價2則是100個格子參與計算。
4、 Coverage:該算法覆蓋格子數,除以 所有算法最大覆蓋格子數
實驗效果
做了三個實驗,分別是:
neural networks, simulated soft robot morphologies, and a real, soft robotic arm
1、神經網絡
2、模擬軟機器人
3、真實軟機械臂
前兩個搜索空間(神經網絡和模擬軟機器人)是非常高維的,這展示了該算法從高維搜索空間中創建低維特徵地圖的能力。
結果:
上面四幅圖,展示的是分別在上述四個指標下的情況。我們看到該算法對該問題的效果都是最優的。
值得注意的是,即使該算法只關注整體上的優化,但最優結果也優於傳統的EA。這可能是因爲測試問題具有欺騙性,而傳統的進化算法對多樣性壓力不夠,而進一步的多樣性有助於消除欺騙。
下面四幅圖。x、y軸分別是定義的2個特徵偏好,熱圖顏色表示標準化性能。這些地圖顯示,該算法照亮了更多的特徵空間,揭示了每個區域的適應度潛力。
進一步分析:
左圖:每一個箭頭,表示新精英個體產生情況。值得注意的是,許多高性能精英來自其他高性能精英,但通常不是來自直接的相鄰個體。
這些數據表明,在許多不同的地點收集高績效的精英有助於在新的地點發現高績效的精英,這可能就是爲什麼地圖精英能夠找到這麼多不同的、高性能的解決方案的原因。即他不只是在局部優化打轉,而是能夠發散開來。
右圖:跟蹤了四條精英的產生路線,對應四種不同顏色的軌跡(綠色、橙色、藍色、紫色),他們起點都是紅點的那個初始精英。我們會發現,它經常穿過地圖的許多不同區域。例如紅色的那條就比較明顯。
優勢總結
- 允許用戶在他們所選擇的變化維度中創建多樣性。
- 闡明整個特徵空間的適應度潛力,而不僅僅是高性能區域,揭示感興趣的維度和性能之間的關係。
- 改進優化性能;在複雜的搜索空間中,它探索了更多的特徵空間,進一步避免局部優化,從而找到不同的,通常更好的適應度峯值。
- 在任何單個屬性組合中搜尋新的解決方案,都有助於同時在其他屬性組合中尋找解決方案。
- 最終結果返回大量不同的、高性能的個體,有助於用來創建新類型的算法或提高現有算法的性能