Rainbow:整合DQN六種改進(jìn)的深度強(qiáng)化學(xué)習(xí)方法!

在2013年DQN首次被提出后,學(xué)者們對其進(jìn)行了多方面的改進(jìn),其中最主要的有六個,分別是:
Double-DQN:將動作選擇和價值估計分開,避免價值過高估計
Dueling-DQN:將Q值分解為狀態(tài)價值和優(yōu)勢函數(shù),得到更多有用信息
Prioritized Replay Buffer:將經(jīng)驗(yàn)池中的經(jīng)驗(yàn)按照優(yōu)先級進(jìn)行采樣
Multi-Step Learning:使得目標(biāo)價值估計更為準(zhǔn)確
Distributional DQN(Categorical DQN):得到價值分布
NoisyNet:增強(qiáng)模型的探索能力

而在最近,DeepMind在論文《Rainbow: Combining Improvements in Deep Reinforcement Learning》中,將這六種方法進(jìn)行了一個整合,提出了Rainbow模型。本文,我們一起來回顧一下DQN及其各種改進(jìn)模型。

本文將不再介紹模型的實(shí)現(xiàn),不過在我的github中已經(jīng)有rainbow的代碼,具體可參考:https://github.com/princewen/tensorflow_practice/tree/master/RL/Basic-Rainbow-Net

1、原始DQN

Q-learning是強(qiáng)化學(xué)習(xí)中一種十分重要的off-policy的學(xué)習(xí)方法,它使用Q-Table儲存每個狀態(tài)動作對的價值,而當(dāng)狀態(tài)和動作空間是高維或者連續(xù)時,使用Q-Table不現(xiàn)實(shí)。

因此,將Q-Table的更新問題變成一個函數(shù)擬合問題,使用神經(jīng)網(wǎng)絡(luò)來得到狀態(tài)動作的Q值,并通過更新參數(shù) θ 使Q函數(shù)逼近最優(yōu)Q值 ,這就是DQN的基本思想。

但是,將深度神經(jīng)網(wǎng)絡(luò)和強(qiáng)化學(xué)習(xí)思想進(jìn)行結(jié)合,難免會出現(xiàn)一定的問題,比如:
1、DL需要大量帶標(biāo)簽的樣本進(jìn)行監(jiān)督學(xué)習(xí);RL只有reward返回值;
2、DL的樣本獨(dú)立;RL前后state狀態(tài)相關(guān);
3、DL目標(biāo)分布固定;RL的分布一直變化,比如你玩一個游戲,一個關(guān)卡和下一個關(guān)卡的狀態(tài)分布是不同的,所以訓(xùn)練好了前一個關(guān)卡,下一個關(guān)卡又要重新訓(xùn)練;
4、過往的研究表明,使用非線性網(wǎng)絡(luò)表示值函數(shù)時出現(xiàn)不穩(wěn)定等問題。

為了解決問題1,我們就要用到貝爾曼方程:

上面的兩個式子,第一個是貝爾曼期望方程,第二個是貝爾曼最優(yōu)方程,在我們實(shí)際的問題中,對于一個狀態(tài),采取特定的動作,下一個狀態(tài)基本上是確定的,因此我們可以把最優(yōu)方程中的求和去掉。這樣我們就可以通過神經(jīng)網(wǎng)絡(luò)得到一個Q值的預(yù)估值,并通過貝爾曼最優(yōu)方程得到一個Q值的目標(biāo)值,并通過預(yù)估值和目標(biāo)值的差距來進(jìn)行有監(jiān)督的學(xué)習(xí)。

為了解決問題2和3,我們用到了經(jīng)驗(yàn)回放(Experience Replay)的方法,具體做法是把每個時間步agent與環(huán)境交互得到的轉(zhuǎn)移樣本 (st,at,rt,st+1,is_terminal) 儲存到經(jīng)驗(yàn)池中,要訓(xùn)練時就隨機(jī)拿出一些(minibatch)來訓(xùn)練。這樣就避免了相關(guān)性問題。

這里我們重新解釋一下問題4,根據(jù)上面的思路,我們需要網(wǎng)絡(luò)來得到當(dāng)前狀態(tài)動作的Q預(yù)估值,還需要通過網(wǎng)絡(luò)得到下一個時刻狀態(tài)-最優(yōu)動作的Q預(yù)估值,進(jìn)而通過貝爾曼方程得到當(dāng)前狀態(tài)動作的Q目標(biāo)值,并根據(jù)Q目標(biāo)值和Q預(yù)估值對網(wǎng)絡(luò)參數(shù)進(jìn)行更新。這就像一場自導(dǎo)自演的電影,或者說一場既當(dāng)運(yùn)動員又當(dāng)裁判的比賽,使得網(wǎng)絡(luò)變的非常不穩(wěn)定。為了解決這個問題,我們提出了雙網(wǎng)絡(luò)結(jié)構(gòu)。這樣,Q預(yù)估值由eval-net得到,而Q目標(biāo)值根據(jù)當(dāng)前的即時獎勵r和target-net得到。

因此,在DQN中,最終的損失函數(shù)如下:

其中,θ表示eval-net的參數(shù),而θ橫表示target-net的參數(shù)。在實(shí)際應(yīng)用中,target-net的參數(shù)是每隔一段時間從eval-net復(fù)制過來的。

2、Double-DQN

在原始的DQN中,會出現(xiàn)Q值估計偏高的情形,因?yàn)檫@是一種off-policy的策略,我們每次在學(xué)習(xí)時,不是使用下一次交互使用的真實(shí)動作,而是使用當(dāng)前策略認(rèn)為的價值最大的動作,所以會出現(xiàn)對Q值的過高估計。而在DQN中,我們也會面臨同樣的問題,因?yàn)槲覀冞x擇下一時刻的動作以及計算下一時刻狀態(tài)-動作Q值時,使用的都是target-net。

為了將動作選擇和價值估計進(jìn)行解耦,我們有了Double-DQN方法。在Double-DQN中,在計算Q實(shí)際值時,動作選擇由eval-net得到,而價值估計由target-net得到。此時,損失函數(shù)變?yōu)椋?/p>

3、Prioritized Replay Buffer

在傳統(tǒng)DQN的經(jīng)驗(yàn)池中,選擇batch的數(shù)據(jù)進(jìn)行訓(xùn)練是隨機(jī)的,沒有考慮樣本的優(yōu)先級關(guān)系。但其實(shí)不同的樣本的價值是不同的,我們需要給每個樣本一個優(yōu)先級,并根據(jù)樣本的優(yōu)先級進(jìn)行采樣。

樣本的優(yōu)先級如何確定?我們可以用到 TD-error, 也就是 q-target - q-eval 來規(guī)定優(yōu)先學(xué)習(xí)的程度. 如果 TD-error 越大, 就代表我們的預(yù)測精度還有很多上升空間, 那么這個樣本就越需要被學(xué)習(xí), 也就是優(yōu)先級 p 越高。

有了 TD-error 就有了優(yōu)先級 p, 那我們?nèi)绾斡行У馗鶕?jù) p 來抽樣呢? 如果每次抽樣都需要針對 p 對所有樣本排序, 這將會是一件非常消耗計算能力的事. 文中提出了一種被稱作SumTree的方法。

SumTree 是一種樹形結(jié)構(gòu), 葉子結(jié)點(diǎn)存儲每個樣本的優(yōu)先級 p, 每個樹枝節(jié)點(diǎn)只有兩個分叉, 節(jié)點(diǎn)的值是兩個分叉的和, 所以 SumTree 的頂端就是所有 p 的和. 如下圖所示。最下面一層樹葉存儲樣本的 p, 葉子上一層最左邊的 13 = 3 + 10, 按這個規(guī)律相加, 頂層的 root 就是全部 p 的和了.

抽樣時, 我們會將 p 的總和 除以 batch size, 分成 batch size 那么多區(qū)間, (n=sum(p)/batch_size). 如果將所有 node 的 priority 加起來是42的話, 我們?nèi)绻?個樣本, 這時的區(qū)間擁有的 priority 可能是這樣.

[0-7], [7-14], [14-21], [21-28], [28-35], [35-42]

然后在每個區(qū)間里隨機(jī)選取一個數(shù). 比如在第區(qū)間 [21-28] 里選到了24, 就按照這個 24 從最頂上的42開始向下搜索.。首先看到最頂上 42 下面有兩個子節(jié)點(diǎn),拿著手中的24對比左子節(jié)點(diǎn), 因?yàn)?9>24, 那我們就走左邊這條路;接著再對比29的左子節(jié)點(diǎn)13,因?yàn)?4>13, 那我們就走右邊的路, 并且將手中的值根據(jù) 13 修改一下, 變成 24-13 = 11。 接著拿著 11 和 13的左子節(jié)點(diǎn)12 比, 結(jié)果 12 比 11 大, 那我們就選擇 12 對應(yīng)的數(shù)據(jù)作為該區(qū)間采樣的結(jié)果。

4、Dueling-DQN

什么是Dueling DQN呢?看下面的圖片

上面是我們傳統(tǒng)的DQN,下面是我們的Dueling DQN。在原始的DQN中,神經(jīng)網(wǎng)絡(luò)直接輸出的是每種動作的 Q值, 而 Dueling DQN 每個動作的Q值,是由狀態(tài)價值V優(yōu)勢函數(shù)A確定的,即Q = V + A。

什么是優(yōu)勢函數(shù)?我們可以簡單理解為,對于一個特定的狀態(tài),采取一個動作所能得到的價值與這個狀態(tài)能得到的平均價值的區(qū)別。如果采取的動作得到的價值比平均價值大,那么優(yōu)勢函數(shù)為正,反之為負(fù)。

簡單的使用Q = V + A可以么?當(dāng)然不行,因?yàn)閷τ谝粋€確定的Q,有無數(shù)種V和A的組合可以得到Q。因此我們需要對A進(jìn)行一定的限定,通常將同一狀態(tài)下的優(yōu)勢函數(shù)A的均值限制為0。所以,我們的Q值計算公式如下:

5、Multi-Step Learning

原始的DQN使用的是當(dāng)前的即時獎勵r和下一時刻的價值估計作為目標(biāo)價值,這種方法在前期策略差即網(wǎng)絡(luò)參數(shù)偏差較大的情況下,得到的目標(biāo)價值偏差也較大,因此學(xué)習(xí)速度可能相對較慢。因此我們可以通過Multi-Step Learning來解決這個問題,這樣在訓(xùn)練前期目標(biāo)價值可以得到更準(zhǔn)確的估計(因?yàn)榧磿r獎勵是我們可以通過與環(huán)境的交互準(zhǔn)確得到的),從而加快訓(xùn)練速度。

在Multi-Step Learning中,我們的損失函數(shù)變?yōu)椋?/p>

6、Distributional DQN

在DQN中,網(wǎng)絡(luò)輸出的都是狀態(tài)-動作價值Q的期望預(yù)估值。這個期望值其實(shí)忽略很多信息。比如同一狀態(tài)下的兩個動作,能夠獲得的價值期望是相同的,比如都是20,第一個動作在90%的情況下價值是10,在10%的情況下是110,另一個動作在50%的情況下是15,在50%的情況下是25。那么雖然期望一樣,但如果我們想要減小風(fēng)險,我們應(yīng)該選擇后一種動作。而只有期望值的話,我們是無法看到動作背后所蘊(yùn)含的風(fēng)險的。

所以從理論上來說,從分布視角(distributional perspective)來建模我們的深度強(qiáng)化學(xué)習(xí)模型,可以獲得更多有用的信息,從而得到更好、更穩(wěn)定的結(jié)果。

我們選擇直方圖來表示對于價值分布的估計,并將價值限定在[Vmin,Vmax]之間。在[Vmin,Vmax]選擇N個等距的價值采樣點(diǎn)。網(wǎng)絡(luò)的輸出便是這N個價值采樣點(diǎn)的概率。

還是延續(xù)DQN中的雙網(wǎng)絡(luò)結(jié)構(gòu),我們會得到估計的價值分布和目標(biāo)的價值分布(目標(biāo)價值分布需要進(jìn)行裁剪和投影),并使用交叉熵?fù)p失函數(shù)來計算兩個分布之間的差距,并通過梯度下降法進(jìn)行參數(shù)的更新。

7、NoisyNet

增加Agent的探索能力是強(qiáng)化學(xué)習(xí)中經(jīng)常遇到的問題,一種常用的方法是采用e-greedy的策略,即以e的概率采取隨機(jī)的動作,以1-e的概率采取當(dāng)前獲得價值最大的動作。而另一種常用的方法是NoisyNet,該方法通過對參數(shù)增加噪聲來增加模型的探索能力。

我們的噪聲通常添加在全連接層,考慮我們?nèi)B接層的前向計算公式:

假設(shè)兩層的神經(jīng)元個數(shù)分別為p個和q個,那么w是q*p的,x是p維的,y和b都是q維的。

此時我們在參數(shù)上增加噪聲,文章中假設(shè)每一個參數(shù)b和w分別服從于均值為μ,方差為σ的正態(tài)分布,同時存在一定的隨機(jī)噪聲ε,我們可以假設(shè)噪聲是服從標(biāo)準(zhǔn)正態(tài)分布N(0,1)的。那么前向計算公式變?yōu)椋?/p>

這樣,我們模型的變量從原來的p*q + q個,變?yōu)榱? * p * q + q個,你可能會問,變量不是3 * p * q + q個么?因?yàn)檫@里,我們的噪聲ε在每一輪中,都是隨機(jī)產(chǎn)生的常量,試想如果噪聲ε也是變量的話,就跟原有的wx+b沒有什么區(qū)別了。

接下來就是這個噪聲如何產(chǎn)生的問題了。文中提到了兩種方法:

Independent Gaussian noise:這也是我們最容易想到的方法,就是直接從標(biāo)準(zhǔn)正態(tài)分布中,隨機(jī)產(chǎn)生p*q+q個常量。這也就是說,對于每一個全連接層來說,為每一個w和b都產(chǎn)生獨(dú)立的噪聲,這無疑對于模型的計算帶來了不小的負(fù)擔(dān)。

Factorised Gaussian noise:該方法有效地減少了噪聲的個數(shù),我們只需要p + q個噪聲即可,w和b的噪聲計算方式如下:

而上式中的f所代表的函數(shù)如下:

了解了如何給參數(shù)增加噪聲,我們就可以把這種方法應(yīng)用于DQN等方法中。

8、模型試驗(yàn)

文章對比了使用Rainbow和其他的DQN的在57種Atari游戲上的實(shí)驗(yàn)效果:

參考文獻(xiàn)

1、2013DQN:https://pdfs.semanticscholar.org/667f/b84bfca10bec165f9e2cca3e21f5e4829ca7.pdf
2、2015DQN:http://www.nature.com/nature/journal/v518/n7540/abs/nature14236.html
3、Double-DQNhttps://arxiv.org/pdf/1509.06461v3.pdf
4、Deuling-DQN:https://arxiv.org/pdf/1511.06581.pdf
5、Prioritized Replay Buffer:https://arxiv.org/pdf/1511.05952.pdf
6、NoisyNet:https://arxiv.org/abs/1706.10295v1
7、distributional DQN:https://arxiv.org/abs/1707.06887
8、Rainbow:https://arxiv.org/abs/1710.02298

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容