OpenAI詳解進化策略方法:可替代強化學(xué)習(xí)
進化策略(ES:evolution strategy)是一種已存在了數(shù)十年的優(yōu)化技術(shù),其在現(xiàn)代強化學(xué)習(xí)基準(如 Atari/MuJoCo)上的表現(xiàn)可以比肩標準的強化學(xué)習(xí)技術(shù),同時還能克服強化學(xué)習(xí)的許多不便。
特別的幾點包括:進化策略的實現(xiàn)更加簡單(不需要反向傳播),更容易在分布式環(huán)境中擴展,不會受到獎勵稀疏的影響,有更少的超參數(shù)。這個結(jié)果令人吃驚,因為進化策略就好像是在一個高維空間中簡單地爬山,每一步都沿著一些隨機的方向?qū)崿F(xiàn)一些有限的差異。
我們的發(fā)現(xiàn)是這種已有數(shù)十年之久思想強大結(jié)果的現(xiàn)代延續(xù)。比如說,在 2012 年,AlexNet 論文表明可以如何設(shè)計、擴展和訓(xùn)練卷積神經(jīng)網(wǎng)絡(luò)(CNN)以在圖像識別任務(wù)上實現(xiàn)極其優(yōu)秀的結(jié)果,而那時候大多數(shù)研究者還認為 CNN 并不是一種有希望的計算機視覺技術(shù)。類似地,在 2013 年,深度 Q 學(xué)習(xí)(Deep Q-Learning)論文表明可以將 Q 學(xué)習(xí)與 CNN 結(jié)合起來以成功地解決 Atari 游戲,從而使強化學(xué)習(xí)(RL)發(fā)展成為了一個有激動人心的實驗結(jié)果的研究領(lǐng)域,而不再只是理論構(gòu)想了。同樣,我們的研究也表明進化策略可以在強化學(xué)習(xí)基準上實現(xiàn)優(yōu)秀的表現(xiàn),從而消除了人們之前普遍認為的進化策略方法不能用于高維問題的觀點。
進化策略易于實現(xiàn)和擴展。我們的實現(xiàn)運行在一個包含了 80 臺機器和 1440 個 CPU 內(nèi)核的計算集群上,其可以僅在 10 分鐘內(nèi)就訓(xùn)練出一個 3D MuJoCo 人形步行者(在 32 核上,A3C 需要大約 10 小時)。使用 720 核,我們也能在 Atari 上實現(xiàn)可與 A3C 媲美的表現(xiàn),同時還能將訓(xùn)練時間從 1 天降低至 1 小時。
下面,我們將首次簡要描述傳統(tǒng)的強化學(xué)習(xí)方法與我們的進化策略方法的對比,還會討論進化策略和強化學(xué)習(xí)之間的權(quán)衡,最后還會突出介紹我們的一些實驗。
一、強化學(xué)習(xí)
首先讓我們簡單看看強化學(xué)習(xí)的工作方式。假設(shè)我們有一些環(huán)境(比如游戲),我們想要在其中訓(xùn)練一個代理。為了描述該代理的行為,我們要定義一個策略函數(shù)(policy function),這是該代理的大腦,用于計算該代理如何在一個給定的情形中采取行動。在實踐中,這個策略通常是一個神經(jīng)網(wǎng)絡(luò),其輸入是該游戲的當前狀態(tài),然后計算可用的所有允許動作的概率。一個典型的策略函數(shù)可能有大約 1,000,000 個參數(shù),所以我們的任務(wù)就是找到這些參數(shù)的確切配置,以使得該策略能夠?qū)崿F(xiàn)良好的表現(xiàn)(即在很多游戲中獲勝)。
上圖:在 Pong 游戲中,策略根據(jù)輸入的屏幕像素來計算移動玩家拍子的概率(右邊綠色的拍子):上、下或不動。
該策略的訓(xùn)練過程如下所示。首先是一個隨機初始化,我們讓該代理與環(huán)境進行一陣交互,然后收集交互的「劇情(episode)」(比如,每個 episode 就是一局 Pong 游戲)。由此我們就能得到情況的完整記錄:遇到了什么樣的狀態(tài)序列、在每個狀態(tài)采取了什么動作、每一步的獎勵如何。下圖給出了一個例子,這三個 episode 每個都表示在一個假想環(huán)境中的 10 個時間步驟。其中每個矩形都是一個狀態(tài),如果獎勵是正面的(比如把球擊回給了對方),那么矩形就是綠色;如果獎勵是負面的(比如沒有接到球),那么矩形則為紅色:
這幅圖給出了改善策略的一個方法;導(dǎo)致綠色狀態(tài)的行為是好的行為,導(dǎo)致紅色的行為則很糟糕。然后我們可以使用反向傳播來計算該網(wǎng)絡(luò)參數(shù)的一次小的更新,該更新將使得未來的狀態(tài)更有可能是綠色、更少可能是紅色。我們預(yù)計更新后的策略會更好一點。然后我們迭代這一過程:收集另一批 episode,進行另一次更新……
通過在這些動作中注入噪聲來進行探索。我們在強化學(xué)習(xí)中通常使用的策略是隨機的,它們僅計算采取任何動作的概率。通過這種方法,代理可能會在訓(xùn)練過程中發(fā)現(xiàn)自己在不同時間處在同一個特定狀態(tài),而且由于采樣的情況,它也將在不同的時間采取不同的動作。這能提供學(xué)習(xí)所需的信號:這些動作中有一些會導(dǎo)致好的結(jié)果,這些動作就會得到鼓勵;另一些則不會奏效,就會被抑制。因此我們可以說,我們通過向代理的動作注入噪聲而為其學(xué)習(xí)過程引入了探索(exploration)——我們可以通過在每個時間步驟從動作分布中采樣來做到這一點。這與進化策略不同。
二、進化策略
關(guān)于「進化(Evolution)」。在我們探討進化策略(ES)之前,有必要強調(diào)一下盡管這種方法名字中有「進化」這個詞,但進化策略和生物進化關(guān)系不大。也許這項技術(shù)的早期版本從生物進化上獲得了一些啟發(fā)——在一定的抽象程度上,這種方法可被視為這樣一個過程:從個體構(gòu)成的群體中采樣并讓其中成功的個體引導(dǎo)未來后代的分布。但是,其數(shù)學(xué)細節(jié)在生物進化方法的基礎(chǔ)上實現(xiàn)了很大的抽象,我們最好將進化策略看作是一類黑箱的隨機優(yōu)化技術(shù)。
黑箱優(yōu)化。在進化策略中,讓我們完全忘記代理、環(huán)境、涉及的神經(jīng)網(wǎng)絡(luò)和其中的交互吧。進化策略的整個設(shè)置就是一大堆數(shù)字輸入(假設(shè)和前面提到的策略網(wǎng)絡(luò)的參數(shù)數(shù)量一樣,有 1,000,000 個數(shù)字),然后輸出 1 個數(shù)字(對應(yīng)總獎勵),我們需要找到這 1,000,000 個數(shù)字的最好配置。在數(shù)學(xué)上,我們可以說是根據(jù)輸入向量 w(該網(wǎng)絡(luò)的參數(shù)/權(quán)重)來優(yōu)化一個函數(shù) f(w),但我們不對 f 的結(jié)構(gòu)做出任何假設(shè),我們只能對其進行評估(因此被稱為「黑箱」)。
進化策略算法。直觀上來講,這種優(yōu)化就是一種「猜測然后檢測」的過程,即我們從一些隨機參數(shù)開始,然后重復(fù)執(zhí)行以下過程:1)隨機對該猜測進行一點調(diào)整,2)讓我們的猜測向效果更好的方向移動一點。具體而言,就是在每個步驟輸入一個參數(shù)向量 w,然后通過高斯噪聲對 w 進行抖動來生成一群(比如 100 個)有稍微改變的參數(shù)向量 w1, w2……w100。然后我們在環(huán)境中分別運行這 100 個候選項所對應(yīng)的策略網(wǎng)絡(luò),從而獨立地對這 100 候選項分別進行評估,然后將每個案例中的獎勵加起來。然后其更新后的參數(shù)就變成了這 100 個向量的加權(quán)和,其中每個權(quán)重都正比于其總獎勵。(即,我們想讓更成功的候選項有更高的權(quán)重。)在數(shù)學(xué)上,你也會注意到這就相當于使用有限差分法(finite difference)來估計參數(shù)空間中預(yù)期獎勵的梯度,只是我們是沿著 100 個隨機方向來做的。
我們要看的另一種方法是仍然使用強化學(xué)習(xí)(策略梯度,具體來說是 REINFORCE),其中的代理的動作是使用高斯策略得出整個參數(shù)向量。
上圖:進化策略優(yōu)化過程,這個環(huán)境中只有兩個參數(shù)和一個獎勵函數(shù)(紅色=高、藍色=低)。在每次迭代,我們都會展示當前參數(shù)值(白色)、一群經(jīng)過抖動的樣本(黑色)和估計的梯度(白色箭頭)。我們不斷將該參數(shù)移動到該箭頭的頂點,直到我們收斂到了一個局部最優(yōu)值。你可以使用本文的代碼重現(xiàn)這些圖。
代碼示例。為了得到具體的核心算法并突出其簡潔性,這里給出了一段使用進化策略優(yōu)化二次函數(shù)的短代碼實例(更長的版本見文末鏈接)。
- # simple example: minimize a quadratic around some solution point
- import numpy as np
- solution = np.array([0.5, 0.1, -0.3])
- def f(w): return -np.sum((w - solution)**2)
- npop = 50 # population size
- sigma = 0.1 # noise standard deviation
- alpha = 0.001 # learning rate
- w = np.random.randn(3) # initial guess
- for i in range(300):
- N = np.random.randn(npop, 3)
- R = np.zeros(npop)
- for j in range(npop):
- ww_try = w + sigma*N[j]
- R[j] = f(w_try)
- A = (R - np.mean(R)) / np.std(R)
- ww = w + alpha/(npop*sigma) * np.dot(N.T, A)
向參數(shù)中注入噪聲。注意這里的目標與強化學(xué)習(xí)優(yōu)化的目標是一樣的:預(yù)期的獎勵。但是,強化學(xué)習(xí)是將噪聲注入動作空間并使用反向傳播來計算參數(shù)更新,而進化策略則是直接向參數(shù)空間注入噪聲。換個說話,強化學(xué)習(xí)是在「猜測然后檢驗」動作,而進化策略則是在「猜測然后檢驗」參數(shù)。因為我們是在向參數(shù)注入噪聲,所以就有可能使用確定性的策略(而且我們在實驗中也確實是這么做的)。也有可能同時將噪聲注入到動作和參數(shù)中,這樣就有可能實現(xiàn)兩種方法的結(jié)合。
三、進化策略和強化學(xué)習(xí)間的權(quán)衡
相比于強化學(xué)習(xí)算法,進化策略有多個優(yōu)勢(一些優(yōu)勢有些技術(shù)性):
1. 不需要反向傳播。進化策略只需要策略的前向通過,不需要反向傳播(或價值函數(shù)評估),這使得代碼更短、在實踐中速度快了 2-3 倍。在內(nèi)存有限的系統(tǒng)中,也不需要保留 episode 的記錄從而進行后續(xù)的更新。我們也不需要擔(dān)心 RNN 中的梯度爆炸問題。最后,我們能夠探索更大類別的策略函數(shù),包括不可微分的網(wǎng)絡(luò)(比如二值網(wǎng)絡(luò)),或者包括復(fù)雜模塊的網(wǎng)絡(luò)(例如包括 pathfinding 或多種優(yōu)化層)。
2. 高度可并行。進化策略只需要工作器彼此之間進行少量純數(shù)量的通信,然而在強化學(xué)習(xí)中需要同步整個參數(shù)向量(可能會是百萬數(shù)值的)。直觀來看,這是因為我們在每個工作器(worker)上控制隨機 seeds,所以每個工作器能夠本地重建其他工作器的微擾(perturbations)。結(jié)果是,在實驗中我們觀察到,隨著我們以千為單位增加 CPU 進行優(yōu)化時,有線性的加速。
3. 高度穩(wěn)健。在強化學(xué)習(xí)實現(xiàn)中難以設(shè)置的數(shù)個超參數(shù)在進化策略中被回避掉了。例如,強化學(xué)習(xí)不是「無標度(scale-free)的」,所以在 Atari 游戲中設(shè)置不同的跳幀(frame-skip)超參數(shù)會得到非常不同的學(xué)習(xí)輸出。就像我們所展現(xiàn)的,進化策略在任何跳幀上有同樣的結(jié)果。
4. 架構(gòu)探索。一些強化學(xué)習(xí)算法(特別是策略梯度)用隨機策略進行初始化,這總是表現(xiàn)為在一個位置有長時間的隨機跳躍。這種影響在 Q 學(xué)習(xí)方法中因為 epsilon-greedy 策略而有所緩和,其中的 max 運算能造成代理暫時表現(xiàn)出一些一致的動作(例如,維持一個向左的箭頭)。如果代理在原地跳動,在游戲中做一些事情是更有可能的,就像策略梯度的例子一樣。類似于 Q 學(xué)習(xí),進化策略也不會受這些問題的影響,因為我們可以使用確定性策略來實現(xiàn)一致的探索。通過研究進化策略和強化學(xué)習(xí)梯度評估器,我們能看到進化策略是一個有吸引力的選擇,特別是在 episode 中的時間步驟量很長的時候,也就是動作會有長時間的影響?;蛘呤窃跊]有好的價值函數(shù)評估的時候進化策略也是好的選擇。
對應(yīng)地,在實踐中我們也發(fā)現(xiàn)了應(yīng)用進化策略的一些挑戰(zhàn)。一個核心問題是為了讓進化策略工作,在參數(shù)中加入噪聲必然會導(dǎo)致不同的輸出,從而獲得一些梯度信號。就像我們在論文中詳細說明的,我們發(fā)現(xiàn)使用虛擬 batchnorm 能幫助緩和這一問題,但在有效地參數(shù)化神經(jīng)網(wǎng)絡(luò)上還有進一步的工作要做,從而有不同的行為作為噪聲的功能。還有一個相關(guān)的困難,我們發(fā)現(xiàn)在 Montezuma’s Revenge 游戲中,用隨機網(wǎng)絡(luò)很難在一級的時候得到鑰匙,然而用隨機動作能偶爾獲得鑰匙。
四、進化策略可媲美于強化學(xué)習(xí)
在兩個強化學(xué)習(xí)基準上我們對比了進化策略和強化學(xué)習(xí)的表現(xiàn):MuJoCo 控制任務(wù)和 Atari 游戲。每個 MuJoCo 任務(wù)(看以下示例)包含一個模擬身體的鉸接式人物,策略網(wǎng)絡(luò)獲得所有關(guān)節(jié)的位置信息,需要輸出每個關(guān)節(jié)的力矩(torques)從而前行。以下是在三個 MuJoCo 控制任務(wù)上訓(xùn)練的代理示例,任務(wù)目標是前行。
我們通常觀察學(xué)習(xí)數(shù)據(jù)的效率來對比算法的表現(xiàn)。作為我們觀察到的多少狀態(tài)的函數(shù),什么是我們的平均獎勵?以下是我們獲得的學(xué)習(xí)曲線,與強化學(xué)習(xí)進行了對比(在此案例中用的是 TRPO 強化學(xué)習(xí)算法,參考 https://arxiv.org/abs/1502.05477):
數(shù)據(jù)學(xué)習(xí)效率對比。以上對比表明進化策略(橘黃)有著與 TRPO 算法(藍色)相媲美的表現(xiàn),盡管在所有情況下它不完全匹配或超越 TRPO 算法。此外,通過水平掃描我們可看到進化策略效率略低,但不低于 1/10(注意橫坐標是指數(shù)標度)。
時間對比。取代觀察看到的狀態(tài)原數(shù)量,我們可以認為要觀察的最重要的標準是時間:解決一個問題需要多久(以秒為計)?這一數(shù)值最終指示了一個研究人員可完成的迭代速度。因為進化策略算法需要的工作器(worker)之間的通信幾乎可以忽略,我們能夠使用 80 臺機器上的 1440 個 CPU,10 分鐘就解決最難的 MuJoCo 任務(wù)(3D 人形)。作為對比,在典型的一臺機器上 32 個 A3C 工作器配置中,解決該任務(wù)需要 10 小時左右。用算法與工程上的努力,當然也能改進強化學(xué)習(xí)的表現(xiàn),但我們發(fā)現(xiàn)在標準的云 CPU 環(huán)境中單純延展 A3C 非常難,因為需要高通信帶寬。
以下是用進化策略訓(xùn)練的 3D 人形任務(wù)行走的動圖。就像我們所看到的,根據(jù)優(yōu)化最終收斂到的局部最優(yōu)值,結(jié)果挺多樣的。
在 Atari 游戲中,用 1 小時在 720 核上訓(xùn)練進化策略取得了的表現(xiàn)可媲美于在 32 核上訓(xùn)練一天的 A3C。下面是在 Pong、Seaquest 和 Beamrider 游戲中的結(jié)果片段。這些片段顯示了預(yù)處理的畫面,也就是代理在玩游戲時所看到的:
特別要注意 Seaquest 游戲中的潛水艇在氧氣值低的時候?qū)W習(xí)準確率會上升。
五、相關(guān)研究
進化策略是源自神經(jīng)進化系的算法。神經(jīng)進化在人工智能中有著很長的歷史,完整文獻原因超出本文所覆蓋的范圍。我們鼓勵感興趣的讀者查閱 Wikipedia、Scholarpedia 的相關(guān)文獻,以及 Jurgen Schmidhuber 的回顧文章(Section 6.6)。最影響我們研究的一項工作是 Wierstra 等人在 2014 年作出的自然進化策略(Natural Evolution Strategies)。相比于該工作以及它所啟發(fā)出的其他工作,我們專注于將這些算法延展到大規(guī)模的、分布式環(huán)境中,尋找讓這些算法能與深度神經(jīng)網(wǎng)絡(luò)很好結(jié)合的組件,并在現(xiàn)在的強化學(xué)習(xí)基準上評估這些算法。
還值得注意的是神經(jīng)進化相關(guān)的方法最近在機器學(xué)習(xí)研究中有所復(fù)蘇(resurgence),例如 HyperNetworks、Large-Scale Evolution of Image Classifiers 和 Convolution by Evolution。HyperNetworks,「Large-Scale Evolution of Image Classifiers」和「Convolution by Evolution」.
六、結(jié)論
我們的研究表明神經(jīng)進化方法在現(xiàn)在的代理-環(huán)境基準上,可與強化學(xué)習(xí)的方法相媲美,同時在代碼復(fù)雜性上也有重大收益、易于延展到大規(guī)模分布式環(huán)境。我們也期望通過重新回顧這條線上的其他觀點從而作出更多激動人心的工作,比如間接編碼方法,或者除了參數(shù)以外用其他方法進化網(wǎng)絡(luò)架構(gòu)。
注意監(jiān)督學(xué)習(xí):要注意的一點是監(jiān)督學(xué)習(xí)問題(例如圖像分類、語音識別或者產(chǎn)業(yè)中的大部分其他任務(wù))并不受這些成果的直接影響。監(jiān)督學(xué)習(xí)可以用反向傳播方法直接計算損失函數(shù)的確切梯度。例如,在初步試驗中我們使用進化策略在 MNIST 數(shù)字識別任務(wù)上評估梯度,發(fā)現(xiàn)它要比使用反向傳播的方法慢 1000 倍。只有在強化學(xué)習(xí)環(huán)境中,也就是必須要用采樣評估預(yù)期獎勵(expected reward)的梯度,進化策略才具有可比性。
代碼發(fā)布:最后,如果你想要嘗試運行下進化策略,你可以閱讀以下論文,或了解 GitHub repo 的詳細細節(jié)。
論文:
https://arxiv.org/abs/1703.03864
Github:
https://github.com/openai/evolution-strategies-starter
【本文是51CTO專欄機構(gòu)機器之心的原創(chuàng)譯文,微信公眾號“機器之心( id: almosthuman2014)”】