乾貨 | 進化策略入門:最優化問題的另一種視角
AI 科技評論按:這是 otoro.net 的系列技術部落格之一,以通俗視覺化的方法講解了進化策略(Evolution Strategies)中的諸多概念。AI 科技評論全文編譯如下。
本文將通過一些視覺化的案例向大家解釋進化策略是如何工作的。為了方便更多入門讀者理解本文,我將對相關公式做簡化處理。同時,我也為希望理解更多數學細節的讀者提供了相關數學公式的原始論文。這是本系列的第一篇文章,在本系列中,我會向大家介紹如何在諸如 MNIST、OpenAI Gym、Roboschool、PyBullet 等任務中應用這些演算法。
引言
神經網路模型是非常靈活的,有著強大的資料表示能力。如果我們能夠找到合適的模型引數,我們可以使用神經網路解決許多困難的問題。深度學習的成功在很大程度上歸功於使用反向傳播演算法,它可以高效地計算目標函式梯度的能力,而這個目標函式中包含著所有的模型引數。通過這些基於梯度的計算,我們能高效地在引數空間中尋找到有利於神經網路完成任務的解。
然而,仍然有很多問題是反向傳播演算法所不適用的。例如,在強化學習(reinforcement learning)問題中,我們同樣可以訓練一個神經網路去做一系列的行動決策,從而在環境中完成某些任務。但是,根據當前訓練個體(agent)做出的操作去估計未來給予該訓練個體的獎勵訊號的梯度是十分複雜的,尤其是在未來的許多時間步驟上都會獲得獎勵的情況下。更何況即使我們能夠計算出準確的梯度,我們仍然可能在訓練過程中陷入區域性最優,這是普遍存在於很多強化學習任務中的現象。
陷入區域性最優
在強化學習研究中,有一個領域專門致力於研究這個歸因分配問題,並且在近年來取得了很大的進展。然而,但獎勵訊號十分稀疏時,歸因分配仍然是很困難的。在現實世界中,獎勵確實可能是很稀疏而且有噪聲的。有時,我們僅僅得到了一個簡單的獎勵,而不知道它是如何做出的。就像一張年終獎金的支票,它的金額取決於我們的僱主,想確切地弄清楚為什麼它如此之低可能是很困難的。
OpenAI 就曾發表一篇名為《Evolution Strategies as a Scalable Alternative to Reinforcement Learning 》 (https://blog.openai.com/evolution-strategies/ ) 的博文。在這篇文章中,他們認為,儘管進化策略比強化學習利用資料的效率較低一些,它仍然有許多的優勢。進化策略摒棄了對於梯度的計算,這使得對於進化策略的估計將更加高效。與此同時,進化策略的計算任務能夠被很容易地部署到由上千臺機器組成的分散式環境中進行平行計算。實際上,在OpenAI從頭開始多次運行了這個演算法後,他們發現:使用進化策略演算法發現的策略相對於使用強化學習發現的策略,種類更多!
在這裡,我要指出,即便是對於確定一個機器學習模型的問題,例如設計一個神經網路架構,我們也是不能直接計算梯度的。儘管強化學習、進化策略、遺傳演算法這樣的方法都能被用於在解空間中搜索能夠達到任務要求的模型引數,在本文中,我將僅僅著眼於將這些演算法應用到為一個預定義的模型搜尋引數的問題中。
進化策略為何物?
二維 Rastrigin 函式有許多區域性最優點
下圖為轉換後的二維的 Schaffer 函式和 Rastrigin 函式的俯檢視,這兩種函式常常被用作測試連續的黑盒優化演算法的用例。在圖片中,更亮的區域代表 F(x, y) 有更大的函式值。如你所見,這個函式有許多的區域性最優點。我們要做的就是找到一系列的模型引數 (x, y),從而使 F(x, y) 儘可能地接近全域性最大值。
儘管人們對於進化策略的定義版本不一。在這裡,我們將其定義為:一個為使用者提供一系列用於評估一個問題的候選解決方案的演算法。這裡的評估方法是基於一個給定了解決方案的目標函式,並且會返回單個適應度。根據當前的解決方案的適應度結果,進化策略接著會生成下一代的候選解決方案,新的方案會更有可能得到更好的結果。一旦提出的最佳方案令使用者滿意,迭代的程序就會被終止。
我們可以通過類似下面這樣的偽碼實現一個叫做 EvolutionStrategy 的進化策略演算法:
solver = EvolutionStrategy()
while
True:
# ask the ES to give us a set of candidate solutions
solutions = solver.ask()
# create an array to hold the fitness results.
fitness_list = np.zeros(solver.popsize)
# evaluate the fitness for each given solution.
for i in range(solver.popsize):
fitness_list[i] = evaluate(solutions[i])
# give list of fitness results back to ES
solver.tell(fitness_list)
# get best parameter, fitness from ES
best_solution, best_fitness = solver.result()
if best_fitness > MY_REQUIRED_FITNESS:
break
儘管我們通常在每一代的迭代程序中將種群的規模設定為一個常量,但是實際上本可以不必這樣做。進化策略可以根據我們的要求生成相應數目的候選方案,這是因為進化策略給出的解決方案是從一個概率分佈中抽樣而來的,這些分佈函式的引數會在每一次的迭代中被進化策略所更新。我將通過一個簡單的進化策略來解釋這個抽樣過程。
簡單的進化策略
我們可以想象到的最簡單的進化策略,可能是直接從一個均值為 μ、標準差為 σ 的正態分佈中抽樣得到一系列的解。在我們二維的問題中,μ=(μx,μy)並且 σ=(σx,σy)。一開始,μ 被設定在原點。在適應結果被評估之後,我們將 μ 設定為這一次迭代中在種群中最優解,並且在這個新的均值周圍進行抽樣得到下一代的解決方案。下圖為這個簡單的進化策略在之前提到的兩個問題中進行20次迭代之後的表現:
在上面的視覺化示例中,綠色的點代表每一代分佈函式的均值,藍色的點是被抽樣到的解,紅色的點是目前我們的演算法找到的最優解。
這個簡單的演算法通常只適用於簡單的問題。由於這個演算法本身是一個貪婪演算法,它會拋棄當前的最優解之外的所有解。因此,在更加複雜的問題中,這個演算法可能更易於陷入區域性最優點。(因為複雜問題解空間更大,全域性最優解可能被隱藏在這種簡單演算法拋棄掉的空間裡)如果能夠從代表更多的解決方法的概率分佈中對下一次迭代進行抽樣,而並非僅僅從當前這一代的最優解附近抽樣,可能更為有利。
簡單的遺傳演算法
遺傳演算法是最經典的黑盒優化演算法之一。對於遺傳演算法來說,它有許多不同程度複雜的變種,在這裡,我只為大家介紹最簡單的版本。
遺傳演算法的思路是十分簡單的:僅僅將目前這一代最好的前 10% 的解保留下來,讓種群中其他的解被淘汰掉(類似於自然界中的優勝劣汰)。在下一代中,我們隨機選擇上一代倖存下來的兩個解作為父親和母親,將他們的引數進行重組,從而得到新的解。這個較差重組的過程使用投擲硬幣(隨機化)的方法來決定從上一代的父親母親中的哪一方來繼承當前位置上的引數。在我們使用的這兩個簡單的二維測試函式中,我們新的解可能以百分十50的概率從雙親其中的一方繼承 x 或 y。在這個交叉重組的過程結束後,帶固定標準差的高斯噪聲也會被加入到新的解中。(作為正則項)
上圖向大家展示了這個簡單的遺傳演算法是如何工作的。綠色的點代表棕群眾上一代被保留下來的「精英」(即用於當代交叉重組的雙親),藍色的點代表用於產生候選解的後代,紅色的點代表最優解。
遺傳演算法通過與多種候選解保持聯絡(交叉重組)保證了生成的解的多樣性。然而,實際上,種群中大多數倖存下來的「精英」會漸漸地易於收斂到區域性最優點。此外,遺傳演算法還有很多複雜的變形,例如 CoSyNe、ESP 以及 NEAT,它們希望通過將種群中相似的解聚類到不同的物種子集中,從而保證生成解的多樣性。
協方差矩陣自適應進化策略(CMA-ES)
簡單的進化策略和遺傳演算法有一個共同的缺點,即我們噪聲的標準差引數是固定的。有時,我們會希望在更大的解空間中探索更好的解,因此我們需要增加我們搜尋空間的標準差。此外,我們有時十分確信我們已經探索到最優解附近了,那麼我們只想對當前的解進行微調。我們主要希望我們的搜尋過程能夠有下圖這樣的表現:
多麼神奇啊!上圖所示的搜尋過程是通過協方差矩陣自適應進化策略(Covariance-Matrix Adaptation Evolution Strategy , CMA-ES)得到的。CMA-ES 演算法可以得到每一次迭代的結果,並且自適應地在下一代的搜尋中增大或者減小搜尋空間。他不僅僅會自適應地調整引數 μ 和 σ,同時還會計算整個引數空間的協方差矩陣。在每一次迭代中,CMA-ES 會提供一個多元正態分佈的引數,並從這個多元正態分佈中抽樣得到新的解。那麼,這個演算法如何知道該增大還是減小搜尋空間呢?
在我們討論該演算法做到自適應的方法之前,我將先帶大家複習一下如何對協方差矩陣做估計。這對於我們之後理解 CMA-ES 演算法所使用的自適應方法十分重要。如果我們想要對一個我們整個抽樣得到的大小為 N 的協方差矩陣進行引數估計,我們可以使用下面列出的公式去計算協方差矩陣C的最大似然估計。我們首先計算我們的種群中 xi 和 yi 的均值:
2*2的協方差矩陣中的元素可以表示為:
當然,這樣得出的 μx 和μy 的均值估計,以及協方差項 σx、σy 和 σxy 僅僅是實際的原始抽樣協方差矩陣的引數估計,對我們來說並不是特別有用。
CMA-ES 巧妙地修正了上面的協方差計算公式,從而使得它能夠適用於最優化問題。我會詳細說明它是如何做到這一點的。首先,它的主要任務是找出當前這一代最優秀的 N 個解 Nbest 。為了方便起見,我們規定 Nbest 為最優秀的前 25% 的解。在根據適應情況將得出的解排序後,我們將僅僅通過當代(g)最優秀的前25%的解去計算下一代(g+1)的均值 μ(g+1),換句話說,我們的計算過程可以被表示為下面的公式:
接下來,我們僅僅使用最優的前 25% 的解去估計下一代的協方差矩陣 C(g+1)。在這裡,我們想到了一個聰明的計算方法:使用當代的均值 μg,而不是我們剛剛更新的 μ(g+1)。具體的計算公式如下:
在我們得到了下一代(g+1)的 μx、μy、σx、σy、σxy 等引數後,我們現在可以抽樣得到下一代的候選解。
這一連串圖片形象地解釋了這個演算法如何根據當代(g)的計算結果去構造下一代(g+1)的解:
- 計算第 g 代中每一個解的適應程度
- 將第 g 代的最優的前 25% 的解挑選出來,如圖中紫色的點所示
- 僅僅使用這些最優的前 25% 的解和當代的均值 μg(如圖中綠色的點所示),來計算下一代的協方差矩陣C(g+1)
- 使用更新後的均值μ(g+1)和協方差矩陣C(g+1)得到的分佈函式,抽樣得出新的候選解集。
下面,讓我們再一次將在兩個問題中的整個搜尋過程視覺化地呈現在大家面前:
由於 CMA-ES 演算法可以利用最優解的資訊調整其均值和協方差矩陣,它可以在還距離最優解很遠時對較大的空間進行搜尋,在距離最優解較近時對較小的搜尋空間進行探索。為了便於理解,我這裡通過一個簡單的 2 維問題對 CMA-ES 的介紹是高度簡化的。如果想了解更多的細節,我建議你去閱讀 CMA-ES 的作者為大家準備的教程 CMA-ES Tutorial (https://arxiv.org/abs/1604.00772)。
CMA-ES 演算法是如今最流行的無需梯度計算的優化演算法之一,並且已經被許多研究者和實際工程人員選用。它真正的唯一的缺點是:當模型中的引數過多時候,演算法的效能如何。通過計算,我們發現計算協方差的時間複雜度是 O(N2),儘管最近人們已經將時間複雜度降到了近似於 O(N)。對我來說,當搜尋空間內的引數少於 1000 時,我往往會選擇 CMA-ES 演算法。如果我足夠有耐心,我發現在高達 10000 個引數的搜尋空間中使用該演算法也是同樣可行的。
自然進化策略
假設你已經構建了一個人工生命模擬器,並且你想從中抽取出一個神經網路去控制一群中每個螞蟻的行為。而如果我們使用簡單的進化策略,這種優化方式會讓螞蟻的特性和行為朝著使每個螞蟻個體各自受益的方向演變。這樣一來,我們的種群中會充滿只顧自己死活的自私的螞蟻。
在這裡我們不再使用讓最適應環境的螞蟻生存下來的準則。如果我們改變策略,使用整個種群中所有個體適應程度的總和作為度量標準,並且轉而優化這個總和使得整個種群的康樂指數最大,結果會如何呢?哈哈,你最終將會創造一個馬克思主義的螞蟻烏托邦!
對於上述的這些資訊演算法,人們已經意識到它們都有一個缺點:它們會拋棄掉大多數的解而僅僅保留最優解。然而,那些較差的解往往包含「不要做」什麼的資訊,這種資訊對於更好的計算出下一代的引數估計是十分有價值的。
許多研究強化學習的研究者對於這篇名為 REINFORCE 的論文(http://www-anw.cs.umass.edu/~barto/courses/cs687/williams92simple.pdf )十分熟悉。在這篇1992年發表的論文中,Williams 概述了一個用於估計關提出了於策略神經網路模型的引數的期望獎勵的方法。在這篇論文的第 6 章中,作者也提出了使用強化學習作為一種進化策略的方式。這個強化學習和進化策略相結合的特例在 Parameter-Exploring Policy Gradients (PEPG, 2009) and Natural Evolution Strategies (NES, 2014)這兩篇文章中得到了進一步的討論和擴充套件。
在這個計算方法中,我們希望利用種群中所有個體的資訊,無論是好是壞。這麼做是為了估計出能夠使整個種群在下一代朝著更好的方向發展的梯度訊號。由於我們在這裡需要對梯度進行估計,我們同樣可以使用被廣泛應用於深度學習的標準的隨機梯度下降(SGD)法則來更新梯度。如果需要,我們甚至可以使用動量隨機梯度下降法(Momentum SGD)、均方根傳播法(RMSProp)以及自適應動量估計演算法(Adam)來求解模型引數。
在這裡,我們的思路是最大化抽取出的解的適應程度到的期望值。如果期望的結果足夠好,那麼抽樣得到的種群中表現最好的個體甚至會更好,因此對期望進行優化是一個很合乎情理的方案。最大化抽樣得到的解的期望適應程度,可以近似地被看作最大化整個種群的適應程度。
假設z是從概率分佈函式 π(z,θ)中抽樣得到的解向量,我們可以將目標函式F的期望值定義為
其中,θ是概率分佈函式的引數。例如,假設 π 是一個正態分佈,那麼相應地,θ 就是 μ 和 σ。對於我們簡單的二維問題而言,每一個 z 都是一個二維向量(x,y)的整體。
論文 Natural Evolution Strategies (NES, 2014) 很詳細地說明了 J(θ)關於 θ 的梯度是如何計算得來的。我們可以使用和 REINFORCE 演算法相同的對數似然方法計算 J(θ)的梯度,具體公式如下:
在一個規模為 N 的種群中,我們將解表示為 z1、z2...zn,我們可以通過下面的和式估計梯度:
在得到了梯度之後,我們可以使用引數 α(例如 0.01)來表示學習率,並且開始優化概率分佈函式 π 的引數 θ,從而使得我們抽樣得到的解能夠更有可能在目標函式 F 上取得更高的適應度。使用隨機梯度下降法(或者 Adam 演算法),我們可以按照如下的方式更新下一代的引數θ:
之後,我們從這個更新後的概率分佈函式中抽樣得到新的候選解集。我們會迴圈迭代以上的操作,直到我們找到了一個令人滿意的解。
在論文 REINFORCE 的第六章中,Williams 推匯出了梯度
的通用解法的公式,他考慮了 π(z,θ)是分解後的多元正態分佈的特例(換而言之,引數的相關係數為 0)。在這個特例中,θ是 μ 和 σ 向量。因此,解的每一個元素可以從單元正態分佈中抽樣得到:
對於每一個解 i 的 θ 向量中每一個獨立元素,通用的梯度公式
可以按照如下的方式進行推導:
為了更清楚地向大家說明,我使用角標 j 在引數空間中進行計數,而我們使用上標 i 來對總種群抽樣得到的個體進行計數,這二者不會被混淆。在我們的二維問題中,z1=x, z2 = y, μ1=μx, μ2=μy, σ1=σx, σ2=σy。
上面這兩個公式可以被帶回到梯度近似公式中,並且推匯出明確的對 μ 和 σ 進行更新。本文之前提到的論文都推匯出了更明確的更新規則,包含了一個用於比較的基線,並且可以引入其他的類似於 PEPG 中對偶抽樣的蒙特卡羅技巧,這也是我們賴以執行演算法的基礎。舉例而言,論文 Natural Evolution Strategies (NES, 2014) 提出了將 Fisher 資訊矩陣的逆矩陣引入梯度更新規則的方法。然而,這個思想與其他的進化策略演算法是相同的,它們都在每一代中更新了多元正態分佈的均值和標準差,並且從更新後的概率分佈中進行抽樣得到新的解集。下圖是這兩個公式執行動作的視覺化圖解:
如圖所示,這種演算法能夠按需動態地改變 σ,用以探索或者微調解的空間。與 CMA-ES 不同,本演算法的實現並不涉及相關性結構(如協方差)的計算。因此在這裡,我們並沒有得到對角型的橢圓樣本,僅僅得到了垂直或者水平的樣本。當然,如果需要的話,我們也可以在以機選效率為代價的情況下,引入整個協方差矩陣,從而推匯出新的更新規則。
另外一個我喜歡這個演算法的原因是,它能像 CMA-ES 那樣,動態調整標準差,以致於我們可以逐漸增大或減小我們的搜尋空間。因為在這個演算法中,我們沒有使用刻畫相關性的引數,所以這個演算法的時間複雜度為 O(N),那麼當搜尋空間較大,以致於 CMA-ES 效能比較差的時候,我會選擇使用 PEPG。通常,當模型引數超過幾千時,我會選擇 PEPG。
OpenAI 的進化策略
在 OpenAI 的論文中,他們實現的演算法是之前提到的強化學習和進化策略相結合的那個特例。特別地,σ被固定為一個常量,只有引數 μ 會在每一代中被更新。下圖所示為將σ固定為常量後這個進化策略工作的過程示例:
除了對這個原始演算法進行簡化,本文也提出了一個新的更新規則的修正,使其能夠在不同的工作站機器組成的叢集中進行平行計算。在這個更新規則中,大量的基於固定種子的隨機數被事先與計算了出來。由此,每個工作站可以複製其他機器的引數,並且它只需要與其他機器進行一個數字的通訊,即最終的適應度結果。如果我們想將進化策略擴充套件到數以千計、甚至數以百萬計的不同的計算節點中去,這個修正的更新規則就顯得十分重要了。因為,在每一次迭代的更新中每次都將整個解向量傳輸百萬次是不切實際的。但如果每次值傳輸最終的適應度結果就應該是可行的了。在這篇論文中,他們展示了:使用亞馬遜 EC2 平臺上的 1440 個工作站可以在大約十分鐘內解決 Mujoco 人形機器人行走的問題。
我認為,理論上來說,這個並行更新規則應該也對那些同樣能夠調整標準差 σ 的演算法奏效。然而,實際的情況是,他們只是為了大規模的平行計算,希望將需要傳輸的部分降到最少。這篇頗具啟發意義的文章同時也討論了許多其他的將進化策略部署到強化學習領域的任務中的實踐工作。我強烈推薦你們仔細研讀這篇文章,進行深入探究。
構造適應度
上面提到的大部分演算法通常都會與構造適應度的方法結合起來,例如接下來我要討論「基於排序的適應度構造方法」。對適應度的構造可以讓我們避免之前提到的種群中的離群點對於近似梯度計算的控制。具體的公式如下:
如果一個特殊的點 F(zm)比種群中其它的點 F(zi)都大得多,那麼梯度可能被這個離群點控制,並且增加演算法陷入區域性最優的概率。為了緩解這個問題,我們可以使用適應度的排序轉換。我們在這裡不使用適應度函式的真實值,轉而使用一個與解在種群中的排序成正比的增強適應度函式對結果進行排序。下圖是分別使用原始的適應度和基於排序的適應度函式的效果對比圖:
如圖所示,假如我們有一個包含 101 個樣本的種群,我們會估計種群中每個個體的真實適應度函式值,並且根據他們的適應度將解排序。在這裡,我們將會給表現最差的個體賦予一個值為 -0.50 的強化適應度函式值,給倒數第二的解賦予 -0.49,...,賦予0.49 給表現第二好的解,賦予0.50給最好的解。這個強化適應度的集合會被用來計算梯度的更新。從某種程度上來說,這類似於在深度學習中直接使用批量歸一化(batch-normalization)處理結果,但我們這種方式更為直接。還有一些其它的構造適應度的方法,但是他們最終基本上都會給出一個相似的結果。
我發現,當策略網路的目標函式是非確定性函式時,適應度構造在強化學習任務中是十分有用的。而由於隨機生成的對映關係和各種各樣的隨機策略,這種情況是十分常見的。對於那些確定性的、效能良好的函式而言,使用適應度構造方法的用處不大,而且有時還會使找到最優解的速度變慢。
MNIST 上的測試結果
儘管相較於基於梯度的演算法,進化策略可能是一種能夠找到更多有奇效的解的方法。它仍然在很多能夠計算出高質量的梯度的問題上,比基於梯度的演算法效果差。就好比,用遺傳演算法做影象分類是十分荒謬的事情!但是,有時候,還真有人這麼做,而且竟然有時這種嘗試還挺有效!
由於目前幾乎所有的機器學習演算法都會在 MNIST 資料集上進行測試,我在這裡也試著去將這些各種各樣的進化策略演算法應用到一個簡單的、兩層的用於對 MNIST 手寫數字進行分類的卷積網路中。我只想看看我們的演算法與隨機梯度下降(SGD)相比,效能如何。由於這個卷積網路只有大約 11000 個引數,所以我們可以使用較為慢一點的 CMA-ES 演算法。相關的程式碼和實驗資訊可以在下面的連結中找到。(https://github.com/hardmaru/pytorch_notebooks/tree/master/mnist_es)
以下是使用不同的進化策略得到的結果,我們使用了一個包含 101 個個體的種群,迭代計算了 300 次。我們持續記錄了每一代結束時表現最好的模型的引數,並且在 300 次迭代後評估了這個模型。有趣的是,這個模型有時在測試集上的準確率大大高於那些得分較低的訓練集的模型。
我們應該批判地看的這個實驗結果,這是因為我們只運行了一次程式碼,而不是取 5-10 次執行結果的平均值。這個基於一次實驗的結果似乎說明了,CMA-ES 模型在 MNIST 手寫數字任務中是表現最好的,但是PEPG 演算法也並沒有差太遠。這兩個演算法都達到了大約 98% 的測試準確率,比用作對比的基線 SGD 和Adam 低大約 1%。也許,能夠動態地在每一次迭代中調整協方差矩陣和標準差引數的能力使得它能夠微調權重,這比 OpenAI 提出的更簡單的進化策略的變體要更好。
自己實現一個進化策略演算法吧!
我們之前在文章中提到的所有這些演算法都可能有開源的實現。CMA-ES的作者 Nikolaus Hansen 已經維護了一個基於 numpy 庫的帶有許多附加功能的 CMA-ES 的實現。他的 CMA-ES 的 python 實現版本使我在之前接觸到了迴圈訓練藉口。因為這個介面十分易於使用,我也使用這個介面實現了一些其他的演算法,例如簡單的遺傳演算法、PEPG 以及 OpenAI 的進化策略演算法。我將這些實現放在了一個小的名為 es.py 的 python 檔案中,並且將原始的 CMA-ES 演算法庫也打包了進來。由此,我可以通過改變程式碼中的一行進行切換,從而快速比較不同的進化策略演算法:
import es
#solver = es.SimpleGA(...)
#solver = es.PEPG(...)
#solver = es.OpenES(...)
solver = es.CMAES(...)
while True:
solutions = solver.ask()
fitness_list = np.zeros(solver.popsize)
for i in range(solver.popsize):
fitness_list[i] = evaluate(solutions[i])
solver.tell(fitness_list)
result = solver.result()
if result[1] > MY_REQUIRED_FITNESS:
break
你可以在 Github 和 Ipython notebook 上看到使用不同進化策略的 es.py 檔案:https://github.com/hardmaru/estool/blob/master/simple_es_example.ipynb
在這個包含 es.py檔案的 Ipython notebook ( https://github.com/hardmaru/estool/blob/master/simple_es_example.ipynb ) 中,展示了在 es.py 中使用進化策略去解決解決具有更多區域性最優的一百維 Rastrigin 函式優化問題。這個一百維的版本比上述用與生成視覺化圖解的二維版本更加具有挑戰性。下圖是我們之前討論過的那些演算法在這個問題上的效能對比圖:
在這個 100 維的 Rastrigin 函式優化問題中,沒還有一個優化演算法達到了全域性最優解,其中使用 CMA-ES 演算法得到的結果是最接近全域性最優的,比其他演算法都好多得多。PEPG 演算法的效能排在第二位,OpenAI 的進化策略演算法和遺傳演算法的效能則相對較差一些。這讓我不得不用一個模擬退火方法去漸漸減小標準差 σ,讓它在這個任務中表現得好一些。
使用 CMA-ES 演算法在 100 維的 Ras 函式優化問題中最終得到的解,全域性最優解應該是一個 100 維的元素的值為 10 的向量
via otoro,AI 科技評論編譯。