DDPG 算法(深入理解DDPG)
大家好,又見面了,我是你們的朋友風(fēng)君子。
DDPG 算法
1 離散動作 vs. 連續(xù)動作
離散動作與連續(xù)動作是相對的概念,一個(gè)是可數(shù)的,一個(gè)是不可數(shù)的。
- 在 CartPole 環(huán)境中,可以有向左推小車、向右推小車兩個(gè)動作。在 Frozen Lake 環(huán)境中,小烏龜可以有上下左右四個(gè)動作。在 Atari 的 Pong 游戲中,游戲有 6 個(gè)按鍵的動作可以輸出。
- 但在實(shí)際情況中,經(jīng)常會遇到連續(xù)動作空間的情況,也就是輸出的動作是不可數(shù)的。比如說推小車力的大小、 選擇下一時(shí)刻方向盤的轉(zhuǎn)動角度或者四軸飛行器的四個(gè)螺旋槳給的電壓的大小等等。
對于這些連續(xù)的動作控制空間,Q-learning、DQN 等算法是沒有辦法處理的。那我們怎么輸出連續(xù)的動作呢,這個(gè)時(shí)候,萬能的神經(jīng)網(wǎng)絡(luò)又出現(xiàn)了。在上面這個(gè)離散動作的場景下,比如說我輸出上下或是停止這幾個(gè)動作。有幾個(gè)動作,神經(jīng)網(wǎng)絡(luò)就輸出幾個(gè)概率值,我們用
來表示這個(gè)隨機(jī)性的策略。在連續(xù)的動作場景下,比如說我要輸出這個(gè)機(jī)器人手臂彎曲的角度,這樣子的一個(gè)動作,我們就輸出一個(gè)具體的浮點(diǎn)數(shù)。我們用
來代表這個(gè)確定性的策略。
我們再解釋一下隨機(jī)性策略跟確定性策略。
- 對隨機(jī)性的策略來說,輸入某一個(gè)狀態(tài) s,采取某一個(gè) action 的可能性并不是百分之百,而是有一個(gè)概率 P 的,就好像抽獎一樣,根據(jù)概率隨機(jī)抽取一個(gè)動作。
- 而對于確定性的策略來說,它沒有概率的影響。當(dāng)神經(jīng)網(wǎng)絡(luò)的參數(shù)固定下來了之后,輸入同樣的 state,必然輸出同樣的 action,這就是確定性的策略。
- 要輸出離散動作的話,我們就是加一層 softmax 層來確保說所有的輸出是動作概率,而且所有的動作概率加和為 1。
- 要輸出連續(xù)動作的話,一般可以在輸出層這里加一層 tanh。tanh 的圖像的像右邊這樣子,它的作用就是可以把輸出限制到 [-1,1] 之間。我們拿到這個(gè)輸出后,就可以根據(jù)實(shí)際動作的一個(gè)范圍再做一下縮放,然后再輸出給環(huán)境。比如神經(jīng)網(wǎng)絡(luò)輸出一個(gè)浮點(diǎn)數(shù)是 2.8,然后經(jīng)過 tanh 之后,它就可以被限制在 [-1,1] 之間,它輸出 0.99。然后假設(shè)說小車的一個(gè)速度的那個(gè)動作范圍是 [-2,2] 之間,那我們就按比例從 [-1,1] 擴(kuò)放到 [-2,2],0.99 乘 2,最終輸出的就是 1.98,作為小車的速度或者說推小車的力輸出給環(huán)境。
2 DDPG(Deep Deterministic Policy Gradient)
在連續(xù)控制領(lǐng)域,比較經(jīng)典的強(qiáng)化學(xué)習(xí)算法就是 DDPG(Deep Deterministic Policy Gradient)。DDPG 的特點(diǎn)可以從它的名字當(dāng)中拆解出來,拆解成 Deep、Deterministic 和 Policy Gradient。
- Deep 是因?yàn)橛昧松窠?jīng)網(wǎng)絡(luò);
- Deterministic 表示 DDPG 輸出的是一個(gè)確定性的動作,可以用于連續(xù)動作的一個(gè)環(huán)境;
- Policy Gradient 代表的是它用到的是策略網(wǎng)絡(luò)。REINFORCE 算法每隔一個(gè) episode 就更新一次,但 DDPG 網(wǎng)絡(luò)是每個(gè) step 都會更新一次 policy 網(wǎng)絡(luò),也就是說它是一個(gè)單步更新的 policy 網(wǎng)絡(luò)。
DDPG 是 DQN 的一個(gè)擴(kuò)展的版本。在 DDPG 的訓(xùn)練中,它借鑒了 DQN 的技巧:目標(biāo)網(wǎng)絡(luò)和經(jīng)驗(yàn)回放。經(jīng)驗(yàn)回放這一塊跟 DQN 是一樣的,但 target network 這一塊的更新跟 DQN 有點(diǎn)不一樣。
提出 DDPG 是為了讓 DQN 可以擴(kuò)展到連續(xù)的動作空間,就是我們剛才提到的小車速度、角度和電壓的電流量這樣的連續(xù)值。所以 DDPG 直接在 DQN 基礎(chǔ)上加了一個(gè)策略網(wǎng)絡(luò),就是藍(lán)色的這個(gè),用來直接輸出動作值。所以 DDPG 需要一邊學(xué)習(xí) Q 網(wǎng)絡(luò),一邊學(xué)習(xí)策略網(wǎng)絡(luò)。Q 網(wǎng)絡(luò)的參數(shù)用 w 來表示。策略網(wǎng)絡(luò)的參數(shù)用 \theta 來表示。我們稱這樣的結(jié)構(gòu)為 Actor-Critic 的結(jié)構(gòu)。
通俗地解釋一下 Actor-Critic 的結(jié)構(gòu),
- 策略網(wǎng)絡(luò)扮演的就是 actor 的角色,它負(fù)責(zé)對外展示輸出,輸出舞蹈動作。Q 網(wǎng)絡(luò)就是評論家(critic),它會在每一個(gè) step 都對 actor 輸出的動作做一個(gè)評估,打一個(gè)分,估計(jì)一下它做一次的 action 未來能有多少收益,也就是去估計(jì)這個(gè) actor 輸出的這個(gè) action 的 Q 值大概是多少,即 Q_w(s,a)。 Actor 就需要根據(jù)舞臺目前的狀態(tài)來做出一個(gè) action。
- 評論家就是評委,它需要根據(jù)舞臺現(xiàn)在的狀態(tài)和演員輸出的 action 這兩個(gè)值對 actor 剛剛的表現(xiàn)去打一個(gè)分?jǐn)?shù) Q_w(s,a)。所以 actor 就是要根據(jù)評委的打分來調(diào)整自己的策略。也就是更新 actor 的神經(jīng)網(wǎng)絡(luò)參數(shù) \theta, 爭取下次可以做得更好。而 critic 就是要根據(jù)觀眾的反饋,也就是環(huán)境的反饋 reward 來調(diào)整自己的打分策略,也就是要更新 critic 的神經(jīng)網(wǎng)絡(luò)的參數(shù) w ,它的目標(biāo)是要讓每一場表演都獲得觀眾盡可能多的歡呼聲跟掌聲,也就是要最大化未來的總收益。
- 最開始訓(xùn)練的時(shí)候,這兩個(gè)神經(jīng)網(wǎng)絡(luò)參數(shù)是隨機(jī)的。所以 critic 最開始是隨機(jī)打分的,然后 actor 也跟著亂來,就隨機(jī)表演,隨機(jī)輸出動作。但是由于我們有環(huán)境反饋的 reward 存在,所以 critic 的評分會越來越準(zhǔn)確,也會評判的那個(gè) actor 的表現(xiàn)會越來越好。既然 actor 是一個(gè)神經(jīng)網(wǎng)絡(luò),是我們希望訓(xùn)練好的這個(gè)策略網(wǎng)絡(luò),那我們就需要計(jì)算梯度來去更新優(yōu)化它里面的參數(shù) \theta 。簡單的說,我們希望調(diào)整 actor 的網(wǎng)絡(luò)參數(shù),使得評委打分盡可能得高。注意,這里的 actor 是不管觀眾的,它只關(guān)注評委,它就是迎合評委的打分,打的這個(gè) Q_w(s,a) 而已。
接下來就是類似 DQN。DQN 的最佳策略是想要學(xué)出一個(gè)很好的 Q 網(wǎng)絡(luò)。 學(xué)好這個(gè)網(wǎng)絡(luò)之后,我們希望選取的那個(gè)動作使你的 Q 值最大。DDPG 的目的也是為了求解讓 Q 值最大的那個(gè) action。Actor 只是為了迎合評委的打分而已,所以用來優(yōu)化策略網(wǎng)絡(luò)的梯度就是要最大化這個(gè) Q 值,所以構(gòu)造的 loss 函數(shù)就是讓 Q 取一個(gè)負(fù)號。我們寫代碼的時(shí)候要做的就是把這個(gè) loss 函數(shù)扔到優(yōu)化器里面,它就會自動最小化 loss,也就是最大化這個(gè) Q。然后這里注意,除了策略網(wǎng)絡(luò)要做優(yōu)化,DDPG 還有一個(gè) Q 網(wǎng)絡(luò)也要優(yōu)化。評委一開始也不知道怎么評分,它也是在一步一步的學(xué)習(xí)當(dāng)中,慢慢地去給出準(zhǔn)確的打分。那我們優(yōu)化 Q 網(wǎng)絡(luò)的方法其實(shí)跟 DQN 優(yōu)化 Q 網(wǎng)絡(luò)的方法是一模一樣的,我們用真實(shí)的 reward r 和下一步的 Q 即 Q’ 來去擬合未來的收益也就是 Q_target。
然后讓 Q 網(wǎng)絡(luò)的輸出去逼近這個(gè) Q_target。所以構(gòu)造的 loss function 就是直接求這兩個(gè)值的均方差。構(gòu)造好 loss 后,之后我們就扔進(jìn)去那個(gè)優(yōu)化器,讓它自動去最小化 loss 就好了。
那我們把兩個(gè)網(wǎng)絡(luò)的 loss function 就可以構(gòu)造出來。我們可以看到策略網(wǎng)絡(luò)的 loss function 是一個(gè)復(fù)合函數(shù)。我們把那個(gè)
代進(jìn)去,最終策略網(wǎng)絡(luò)要優(yōu)化的是策略網(wǎng)絡(luò)的參數(shù) \theta 。
Q 網(wǎng)絡(luò)要優(yōu)化的是那個(gè) Q 的輸出 Q_w(s,a) 和那個(gè) Q_target 之間的一個(gè)均方差。但是 Q網(wǎng)絡(luò)的優(yōu)化存在一個(gè)和 DQN 一模一樣的問題就是它后面的這個(gè) Q_target 是不穩(wěn)定的。這個(gè)在之前的 DQN 有講過。后面的
也是不穩(wěn)定的。因?yàn)?
也是一個(gè)預(yù)估的值。為了穩(wěn)定這個(gè) Q_target。DDPG 分別給 Q 網(wǎng)絡(luò)和策略網(wǎng)絡(luò)都搭建了 target network,專門就是為了用來穩(wěn)定這個(gè) Q_target。
target_Q 網(wǎng)絡(luò)就為了來計(jì)算 Q_target 里面的
。然后
里面的需要的 next action a’ 就是通過 target_P 網(wǎng)絡(luò)來去輸出,即
為了區(qū)分前面的 Q 網(wǎng)絡(luò)和策略網(wǎng)絡(luò)以及后面的 target_Q 網(wǎng)絡(luò)和 target_P 策略網(wǎng)絡(luò)。前面的網(wǎng)絡(luò)的參數(shù)是 w,后面的網(wǎng)絡(luò)的參數(shù)是
。這就是為什么我們?nèi)タ匆恍?DDPG 的文章,會發(fā)現(xiàn) DDPG 會有四個(gè)網(wǎng)絡(luò)。策略網(wǎng)絡(luò)的 target 網(wǎng)絡(luò) 和 Q 網(wǎng)絡(luò)的 target 網(wǎng)絡(luò)就是顏色比較深的這兩個(gè),它只是為了讓計(jì)算 Q_target 的時(shí)候能夠更穩(wěn)定一點(diǎn)而已。因?yàn)檫@兩個(gè)網(wǎng)絡(luò)也是固定一段時(shí)間的參數(shù)之后再跟評估網(wǎng)絡(luò)同步一下最新的參數(shù)。
這里面訓(xùn)練需要用到的數(shù)據(jù)就是 s,a,r,s’。我們只需要用到這四個(gè)數(shù)據(jù),我們就用 Replay Memory 把這些數(shù)據(jù)存起來,然后再 sample 進(jìn)來訓(xùn)練就好了。這個(gè)經(jīng)驗(yàn)回放的技巧跟 DQN 是一模一樣的。注意,因?yàn)?DDPG 使用了經(jīng)驗(yàn)回放這個(gè)技巧,所以 DDPG 是一個(gè) off-policy 的算法。
3 Exploration vs. Exploitation
DDPG 通過 off-policy 的方式來訓(xùn)練一個(gè)確定性策略。因?yàn)椴呗允谴_定的,如果 agent 使用同策略來探索,在一開始的時(shí)候,它會很可能不會嘗試足夠多的 action 來找到有用的學(xué)習(xí)信號。為了讓 DDPG 的策略更好地探索,我們在訓(xùn)練的時(shí)候給它們的 action 加了噪音。DDPG 的原作者推薦使用時(shí)間相關(guān)的 OU noise,但最近的結(jié)果表明不相關(guān)的、均值為 0 的 Gaussian noise 的效果非常好。由于后者更簡單,因此我們更喜歡使用它。為了便于獲得更高質(zhì)量的訓(xùn)練數(shù)據(jù),你可以在訓(xùn)練過程中把噪聲變小。
在測試的時(shí)候,為了查看策略利用它學(xué)到的東西的表現(xiàn),我們不會在 action 中加噪音。
- 百度強(qiáng)化學(xué)習(xí)課
- OpenAI Spinning Up
總結(jié)
以上是生活随笔為你收集整理的DDPG 算法(深入理解DDPG)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux dmaengine编程
- 下一篇: 学习笔记76—重复测量和配对检验,随机区