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