前言
2021年2月15日更新:
考慮到這篇文章寫作時(shí)間較早,這里統(tǒng)一更新算法選擇方面的建議:對(duì)于連續(xù)控制任務(wù),推薦SAC、TD3和PPO,三種算法都值得試一試并從中擇優(yōu);對(duì)于離散控制任務(wù),推薦SAC-Discrete(即離散版SAC)和PPO。至于TD3和SAC的詳細(xì)介紹,網(wǎng)上資料很多,暫時(shí)就不寫了,有機(jī)會(huì)再說。
雖然每年RL方向的paper滿天飛,但真正具有普遍實(shí)用價(jià)值的突破性工作實(shí)在不多,大多數(shù)還是在經(jīng)典框架基礎(chǔ)上的改進(jìn)和擴(kuò)展。DRL常規(guī)武器庫(kù)里的存貨主要還是老三樣:DQN,DDPG和A3C,它們是深度學(xué)習(xí)時(shí)代最成熟、最能體現(xiàn)智慧結(jié)晶的三個(gè)DRL框架,你可以在GitHub上找到無(wú)數(shù)相關(guān)代碼,有OpenAI,DeepMind和Nvidia這些大公司的,也有個(gè)人愛好者的。對(duì)于DRL初學(xué)者,它們是最佳的敲門磚;對(duì)于算法研究者,它們是最厚實(shí)的“巨人肩膀”;對(duì)于算法工程師,它們是最順手的試金石。你完全可以把三個(gè)框架都放到項(xiàng)目模擬器上跑一跑,看哪個(gè)效果好就用哪個(gè)。當(dāng)然,這三個(gè)算法框架都有各自的特點(diǎn)和適用domain,結(jié)合對(duì)項(xiàng)目的分析,是可以提前評(píng)估最合適的算法的。
強(qiáng)化學(xué)習(xí)——探索和利用的平衡游戲
總體來說,強(qiáng)化學(xué)習(xí)是一個(gè)探索(Exploration)和利用(Exploitation)的平衡游戲,前者使agent充分遍歷環(huán)境中的各種可能性,從而有機(jī)會(huì)找到最優(yōu)解;后者利用學(xué)到的經(jīng)驗(yàn)指導(dǎo)agent做出更合理的選擇。兩者之間可以說是相愛相殺的關(guān)系:
1. 充分的探索才能帶來有效的利用,從而使RL走在正確的道路上。對(duì)于那些難度特別高的任務(wù),改進(jìn)探索策略是性價(jià)比最高的手段,比如AlphaGo使用蒙特卡洛決策樹征服了圍棋,Go-Explore利用狀態(tài)回訪打爆了Montezuma's Revenge
2. 充分的利用才能探索到更好的狀態(tài),agent往往需要掌握基本技能,才能解鎖更高級(jí)的技能。就好像小孩先要學(xué)會(huì)站起來,才能學(xué)會(huì)走,然后才能學(xué)會(huì)跑。這種從易到難、循序漸進(jìn)的思想在RL中也很受用,著名的Curriculum Learning就是由此而來
3. 過量的探索阻礙及時(shí)的利用。如果隨機(jī)探索噪聲強(qiáng)度過高,已經(jīng)學(xué)到的知識(shí)會(huì)被噪聲淹沒,而無(wú)法指導(dǎo)agent解鎖更好的狀態(tài),導(dǎo)致RL模型的性能停滯不前
4. 機(jī)械的利用誤導(dǎo)探索的方向。如果剛剛學(xué)到一點(diǎn)知識(shí)就無(wú)條件利用,agent有可能被帶偏,從而陷入局部最優(yōu),在錯(cuò)誤道路上越走越遠(yuǎn),在訓(xùn)練早期就扼殺了最好的可能性
強(qiáng)化學(xué)習(xí)的訓(xùn)練過程其實(shí)就是從以探索為主到以利用為主的過渡過程,訓(xùn)練早期通過廣泛試錯(cuò)找準(zhǔn)一個(gè)方向,然后沿著該方向一路試探下去直到達(dá)到最優(yōu)。請(qǐng)牢牢記住這“兩點(diǎn)一線”,因?yàn)檫@是所有RL算法的主要內(nèi)容,任何RL算法都能以此為切入點(diǎn)進(jìn)行解構(gòu),有助于不斷加深對(duì)算法的理解。接下來我就結(jié)合實(shí)際經(jīng)驗(yàn),談?wù)剬?duì)三個(gè)主流DRL框架的一些淺見。
DQN

DQN是借助AlphaGo最早成名的深度強(qiáng)化學(xué)習(xí)算法,其核心思想是利用Bellman公式的bootstrap特性,不斷迭代優(yōu)化一個(gè)Q(s,a)函數(shù),并據(jù)此在各種狀態(tài)下選擇action。其中Q(s,a)函數(shù)擬合的是一對(duì)狀態(tài)-動(dòng)作的長(zhǎng)期收益評(píng)估,該算法沒有顯式的policy。DQN探索和利用的平衡靠的是一種稱為ε-greedy的策略,針對(duì)最新的Q(s,a)函數(shù)和當(dāng)前的輸入狀態(tài)s,agent做決策時(shí)以概率ε隨機(jī)選擇action,而以1-ε的概率選擇使Q(s,a)最大的action,隨著ε從大到小變化,DQN也相應(yīng)地從“強(qiáng)探索弱利用”過渡到“弱探索強(qiáng)利用”。
DQN的原理使其天然地適合離散動(dòng)作空間,也就是action可以窮舉,比如走迷宮的agent只允許前后左右4個(gè)動(dòng)作,下圍棋的AlphaGo只允許19*19=361個(gè)落子位置(實(shí)際還要排除已經(jīng)落子的網(wǎng)格點(diǎn))。這是一個(gè)重要的特征,如果你手上是一個(gè)連續(xù)控制任務(wù),action在某區(qū)間內(nèi)有無(wú)數(shù)種可能,那就不適合用DQN了。當(dāng)然,你也可以選擇把區(qū)間離散化,這樣就可以應(yīng)用DQN了,也曾有paper報(bào)告這樣做在某些任務(wù)中可以比連續(xù)控制取得更好的性能。
DQN屬于off-policy方法,所謂off-policy是指用于計(jì)算梯度的數(shù)據(jù)不一定是用當(dāng)前policy采集的。DQN使用一個(gè)叫replay buffer的FIFO結(jié)構(gòu),用于存儲(chǔ)transition:(s,a,s',r),每次隨機(jī)從buffer中拿出一個(gè)batch用于梯度計(jì)算和參數(shù)更新。Replay buffer是穩(wěn)定DQN訓(xùn)練的重要措施,對(duì)歷史數(shù)據(jù)的重復(fù)使用也提高了其數(shù)據(jù)利用率,對(duì)于那些數(shù)據(jù)比較“貴”的任務(wù),比如Google的抓取應(yīng)用(見需求分析篇),這一點(diǎn)非常重要,事實(shí)上Google除了replay buffer,還專門搞了個(gè)數(shù)據(jù)庫(kù),把之前存儲(chǔ)的另一個(gè)抓取應(yīng)用采集的數(shù)據(jù)拿出來做預(yù)訓(xùn)練,精打細(xì)算到了極致,真是比你有錢,還比你節(jié)約~
DQN的缺點(diǎn)挺多,有些是RL的通病,比如對(duì)超參數(shù)敏感,我在訓(xùn)練篇會(huì)詳細(xì)介紹;另外利用Bellman公式的bootstrap特性更新Q值的方式自帶bias,外加計(jì)算目標(biāo)Q值時(shí)使用同一個(gè)網(wǎng)絡(luò)評(píng)估和選擇動(dòng)作(見下式),DQN容易被overestimation問題困擾,導(dǎo)致訓(xùn)練穩(wěn)定性較差,近些年學(xué)術(shù)界有不少工作是圍繞這一點(diǎn)做出改進(jìn)(比如Double DQN)。此外,DQN還有off-policy方法的通病,對(duì)歷史數(shù)據(jù)的重復(fù)利用雖然可以提高數(shù)據(jù)效率,但有個(gè)前提條件是環(huán)境model不能發(fā)生變化,single agent任務(wù)較易滿足這個(gè)條件,但multiagent場(chǎng)景就未必了,對(duì)任意agent而言,其他agent也是環(huán)境的一部分,而他們的學(xué)習(xí)進(jìn)化會(huì)改變這個(gè)環(huán)境,從而使歷史數(shù)據(jù)失效,這就是MARL領(lǐng)域著名的環(huán)境不穩(wěn)定問題,除非replay buffer內(nèi)的數(shù)據(jù)更新足夠快,否則off-policy方法的性能往往不如on-policy方法。

DDPG

針對(duì)DQN無(wú)法處理連續(xù)控制任務(wù)的缺點(diǎn),DDPG在DQN的基礎(chǔ)上做了改進(jìn),引入了一個(gè)輸出連續(xù)action的顯式policy,與Q函數(shù)組成Actor-Critic結(jié)構(gòu),更新policy網(wǎng)絡(luò)的梯度完全來自于Q網(wǎng)絡(luò),目標(biāo)是最大化當(dāng)前的Q函數(shù)。Q函數(shù)的更新與DQN類似,只是計(jì)算s'狀態(tài)下目標(biāo)值時(shí)放棄了max操作,而采用當(dāng)前policy網(wǎng)絡(luò)的輸出π(a|s')。DDPG名字里的第一個(gè)D是Deterministic的縮寫,意思是確定性的,這是有意與正宗Actor-Critic方法(如A2C/A3C等)區(qū)分開,后者policy輸出的是action的概率分布,而DDPG輸出的就是確定性的action。正因?yàn)槿绱?,DDPG采用了獨(dú)特的探索方式,即在action輸出直接加上一個(gè)noise,該noise的強(qiáng)弱決定了探索力度,本質(zhì)上相當(dāng)于以當(dāng)前action為中心形成了一個(gè)概率分布,每次更新都使policy向該分布中更好的方向演化,直到action達(dá)到了最優(yōu),此時(shí)對(duì)應(yīng)分布內(nèi)其他方向都是更差的方向,policy輸出也就穩(wěn)定在最優(yōu)action附近了,從而實(shí)現(xiàn)了探索和利用的平衡。

能用于連續(xù)控制任務(wù)自然是招人喜歡的,畢竟實(shí)際控制任務(wù)的變量往往都是連續(xù)取值的,比如角度、位移、速度、加速度、電流、電壓等等。學(xué)者們把DDPG用在MuJoCo上,解決了很多連續(xù)domain的任務(wù),后來也有人把它用到真實(shí)的軟體章魚機(jī)器人上,用兩只觸角實(shí)現(xiàn)了向前運(yùn)動(dòng)。然而,在連續(xù)區(qū)間上找到最優(yōu)的確定性action輸出本身是一件非常困難的事,導(dǎo)致DDPG在action維度較高的復(fù)雜任務(wù)中表現(xiàn)不佳,比如KUKA iiwa機(jī)器人有7個(gè)自由度,使得探索空間一下大了很多,訓(xùn)練難度陡升。同時(shí)policy網(wǎng)絡(luò)的梯度完全來自于Q網(wǎng)絡(luò),Q函數(shù)的擬合誤差都直接傳導(dǎo)給了policy,致使DDPG的訓(xùn)練穩(wěn)定性也不足。在Google的抓取應(yīng)用中,干脆拋棄了獨(dú)立policy網(wǎng)絡(luò),做決策時(shí)隨機(jī)在區(qū)間里取16個(gè)點(diǎn)輸入Q網(wǎng)絡(luò),然后選擇Q值最大的那個(gè)作為action,實(shí)驗(yàn)結(jié)果表明如此粗糙的做法卻大大提升了訓(xùn)練穩(wěn)定性,且性能顯著優(yōu)于DDPG,有點(diǎn)尷尬……
總結(jié)一下,如果我們面對(duì)的問題是連續(xù)控制任務(wù),action維度又不高,可以嘗試用DDPG解決,但也不要忘了離散化動(dòng)作空間并用DQN訓(xùn)練得到更高性能的可能性。如果action維度很高,那還是別用DDPG的好。如果數(shù)據(jù)很“貴”不得不用off-policy方法的話,那就向Google學(xué)習(xí),拿掉policy網(wǎng)絡(luò),直接用Q網(wǎng)絡(luò)+啟發(fā)式搜索選擇action。如果數(shù)據(jù)廉價(jià)又追求高性能,我推薦使用PPO框架——個(gè)人比較偏愛的一種框架。
2021年2月15日更新:
上述建議已經(jīng)過時(shí)了,對(duì)于連續(xù)控制任務(wù),推薦優(yōu)先使用SAC,后者在訓(xùn)練穩(wěn)定性、收斂速度和性能方面都是目前的SOTA,作為off-policy算法數(shù)據(jù)效率也相對(duì)較高,SAC作者嘗試直接用實(shí)體機(jī)器人采樣并在幾個(gè)小時(shí)內(nèi)成功收斂。
A3C→A2C→PPO

在成熟版SAC出現(xiàn)以前,PPO曾帶給我最多的成功經(jīng)驗(yàn)。PPO從A3C的同步版本A2C的基礎(chǔ)上演化而來。
A3C作為Actor-Critic算法,核心是REINFORCE梯度策略方法。其policy輸出的不是action,而是關(guān)于action的概率分布,因此梯度無(wú)法直接從Critic(又稱為V網(wǎng)絡(luò))流到policy網(wǎng)絡(luò),只能用在線樣本統(tǒng)計(jì)出一個(gè)近似梯度。原始REINFORCE梯度形式如▽V(s) logπ(a|s),直觀解釋就是使?fàn)顟B(tài)s下返回高V值的action出現(xiàn)概率更大。缺點(diǎn)是V值絕對(duì)值不可控(與reward等因素有關(guān)),variance很大,造成訓(xùn)練不穩(wěn)定。A3C將梯度改成▽A(s,a) logπ(a|s),A(s,a)是在線episode計(jì)算出的一對(duì)s,a的Value值與當(dāng)前V網(wǎng)絡(luò)估計(jì)值之差,并經(jīng)過normalization操作,簡(jiǎn)單理解就是把log前的部分做了一個(gè)居中+歸一化,variance降低,訓(xùn)練穩(wěn)定性顯著提升,這里的A(s,a)稱為a在s下的advantage,是A3C名字里的第二個(gè)'A'。既然policy輸出的是action概率分布,那么探索就很容易實(shí)現(xiàn)——按照這個(gè)分布采樣即可,訓(xùn)練初期分布variance比較大,探索力度強(qiáng),隨著policy不斷改善,分布variance越來越小,代表policy對(duì)所選action越來越自信,這就實(shí)現(xiàn)了對(duì)經(jīng)驗(yàn)的利用。
A3C能夠充分利用多核資源,在不同CPU上并行運(yùn)行不同的環(huán)境種子,顯著提升了訓(xùn)練穩(wěn)定性、收斂速度以及最終性能。A3C支持多種action概率分布,如果action空間是DQN那樣的離散集合,可以用Categorical分布;如果是像DDPG那樣的多維連續(xù)分布,可以用Multivariate Gaussian分布,此外A3C還支持伯努利分布,如果action的每一維都是非此即彼的二值選項(xiàng),或者one-hot向量太長(zhǎng)想改用二進(jìn)制表示,那就是它了??梢?,A3C在通用性上是顯著優(yōu)于DQN和DDPG的,幾乎所有任務(wù)都能拿A3C跑一跑。此外,A3C作為on-policy方法,每次更新policy的梯度都由當(dāng)前policy采集的樣本計(jì)算,這使得A3C在MARL任務(wù)里對(duì)環(huán)境不穩(wěn)定性的抵抗能力比DQN和DDPG更強(qiáng)。
A3C將多核環(huán)境中計(jì)算的梯度進(jìn)行異步(Asynchronous)聚合,然后統(tǒng)一更新主網(wǎng)絡(luò)并將新參數(shù)分發(fā)到各環(huán)境。這種方式的運(yùn)行效率較高,但計(jì)算的梯度可能與當(dāng)前主網(wǎng)絡(luò)參數(shù)在時(shí)間上“錯(cuò)位”,有可能損害算法性能。因此,學(xué)術(shù)界更多地沿用了A3C的同步梯度聚合版本A2C。PPO就是在A2C的基礎(chǔ)上利用clip操作進(jìn)一步限制了每次梯度更新的幅度,從而顯著提升了訓(xùn)練穩(wěn)定性。和很多paper的實(shí)驗(yàn)結(jié)果一致,我在實(shí)際應(yīng)用中發(fā)現(xiàn)PPO在連續(xù)控制任務(wù)里性能顯著優(yōu)于DDPG,對(duì)超參數(shù)的敏感度也比DDPG低,因此訓(xùn)練起來更加得心應(yīng)手。因此,我推薦大家在解決連續(xù)任務(wù)時(shí)首選PPO,DDPG的優(yōu)先級(jí)往后放就是了。對(duì)于具有離散動(dòng)作空間的任務(wù)也值得用A3C跑一下,跟DQN比一比。
2021年2月15日更新:考慮到這篇文章寫作時(shí)間較早,這里統(tǒng)一更新算法選擇方面的建議:對(duì)于連續(xù)控制任務(wù),推薦SAC、TD3和PPO,三種算法都值得試一試并從中擇優(yōu);對(duì)于離散控制任務(wù),推薦SAC-Discrete(即離散版SAC)和PPO。至于TD3和SAC的詳細(xì)介紹,網(wǎng)上資料很多,暫時(shí)就不寫了,有機(jī)會(huì)再說。
其他算法
以上三個(gè)DRL框架是基礎(chǔ),大多數(shù)情況下都至少能得到一個(gè)“能用”的policy。然而,也不應(yīng)奢望它們能解決一切問題。DRL領(lǐng)域是個(gè)大坑,里邊有太多需要解決的問題和值得挖掘的方向,比如:高難度探索,稀疏reward,數(shù)據(jù)效率,訓(xùn)練穩(wěn)定性,快速適應(yīng)新環(huán)境等等,類似MARL這樣的子領(lǐng)域還有自己特有的問題,如環(huán)境不穩(wěn)定性,scalability等等。算法工作者一定要保持開放的態(tài)度,及時(shí)跟蹤學(xué)術(shù)界的新趨勢(shì)新方法。
每當(dāng)算法性能遇到瓶頸,首先要沉下心來分析關(guān)鍵制約因素在哪里,如果是上述這些普遍意義上的問題造成,那就去相關(guān)方向最新paper中尋找靈感。比如探索不夠充分時(shí),可以用count-based exploration或者parameter noise來加強(qiáng)探索;DQN訓(xùn)練不穩(wěn)定時(shí),可以嘗試Double-DQN,或者孿生網(wǎng)絡(luò),每次選擇較小Q值計(jì)算目標(biāo)值,從而抑制overestimation;DQN或DDPG數(shù)據(jù)效率不夠時(shí),可以用prioritized replay buffer;MARL里為了改善環(huán)境不穩(wěn)定問題,可以嘗試DIMAPG,……。問題無(wú)常勢(shì),算法無(wú)常形,群眾智慧是無(wú)窮的,博采眾長(zhǎng)才能攻無(wú)不克。
關(guān)于算法選擇就先寫到這里,不同算法在訓(xùn)練時(shí)還有各種各樣的trick和注意事項(xiàng),我在訓(xùn)練篇里再詳細(xì)介紹。