天天看點

進化政策入門:最優化問題的另一種視角

otoro.net的系列技術部落格之一

本文将通過一些可視化的案例向大家解釋進化政策是如何工作的。為了友善更多入門讀者了解本文,我将對相關公式做簡化處理。同時,我也為希望了解更多數學細節的讀者提供了相關數學公式的原始論文。這是本系列的第一篇文章,在本系列中,我會向大家介紹如何在諸如 MNIST、OpenAI Gym、Roboschool、PyBullet 等任務中應用這些算法。

引言

神經網絡模型是非常靈活的,有着強大的資料表示能力。如果我們能夠找到合适的模型參數,我們可以使用神經網絡解決許多困難的問題。深度學習的成功在很大程度上歸功于使用反向傳播算法,它可以高效地計算目标函數梯度的能力,而這個目标函數中包含着所有的模型參數。通過這些基于梯度的計算,我們能高效地在參數空間中尋找到有利于神經網絡完成任務的解。

然而,仍然有很多問題是反向傳播算法所不适用的。例如,在強化學習(reinforcement learning)問題中,我們同樣可以訓練一個神經網絡去做一系列的行動決策,進而在環境中完成某些任務。但是,根據目前訓練個體(agent)做出的操作去估計未來給予該訓練個體的獎勵信号的梯度是十分複雜的,尤其是在未來的許多時間步驟上都會獲得獎勵的情況下。更何況即使我們能夠計算出準确的梯度,我們仍然可能在訓練過程中陷入局部最優,這是普遍存在于很多強化學習任務中的現象。

進化政策入門:最優化問題的另一種視角

陷入局部最優

在強化學習研究中,有一個領域專門緻力于研究這個歸因配置設定問題,并且在近年來取得了很大的進展。然而,但獎勵信号十分稀疏時,歸因配置設定仍然是很困難的。在現實世界中,獎勵确實可能是很稀疏而且有噪聲的。有時,我們僅僅得到了一個簡單的獎勵,而不知道它是如何做出的。就像一張年終獎金的支票,它的金額取決于我們的雇主,想确切地弄清楚為什麼它如此之低可能是很困難的。對于這些問題,與其依賴于一個充斥着噪聲的、并且很可能毫無意義的對未來的我們的政策的梯度估計,我們不妨大膽地直接忽略掉所有的梯度資訊,嘗試使用黑盒的優化技術,例如遺傳算法(genetic algorithms)或進化政策(evolution strategies)。

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()

whileTrue:

# 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.

fori inrange(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()

ifbest_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)的解:

  1. 計算第 g 代中每一個解的适應程度
  2. 将第 g 代的最優的前 25% 的解挑選出來,如圖中紫色的點所示
  3. 僅僅使用這些最優的前 25% 的解和當代的均值 μg(如圖中綠色的點所示),來計算下一代的協方差矩陣C(g+1)
  4. 使用更新後的均值μ(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 算法庫也打包了進來。由此,我可以通過改變代碼中的一行進行切換,進而快速比較不同的進化政策算法:

importes

#solver = es.SimpleGA(...)

#solver = es.PEPG(...)

#solver = es.OpenES(...)

solver = es.CMAES(...)

whileTrue:

solutions = solver.ask()

fitness_list = np.zeros(solver.popsize)

fori inrange(solver.popsize):

fitness_list[i] = evaluate(solutions[i])

solver.tell(fitness_list)

result = solver.result()

ifresult[ 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 科技評論編譯。

繼續閱讀