強化學習(十六) 深度肯定性策略梯度(DDPG)

    在強化學習(十五) A3C中,咱們討論了使用多線程的方法來解決Actor-Critic難收斂的問題,今天咱們不使用多線程,而是使用和DDQN相似的方法:即經驗回放和雙網絡的方法來改進Actor-Critic難收斂的問題,這個算法就是是深度肯定性策略梯度(Deep Deterministic Policy Gradient,如下簡稱DDPG)。html

    本篇主要參考了DDPG的論文和ICML 2016的deep RL tutorialgit

1. 從隨機策略到肯定性策略

    從DDPG這個名字看,它是由D(Deep)+D(Deterministic )+ PG(Policy Gradient)組成。PG(Policy Gradient)咱們在強化學習(十三) 策略梯度(Policy Gradient)裏已經討論過。那什麼是肯定性策略梯度(Deterministic Policy Gradient,如下簡稱DPG)呢?github

    肯定性策略是和隨機策略相對而言的,對於某一些動做集合來講,它多是連續值,或者很是高維的離散值,這樣動做的空間維度極大。若是咱們使用隨機策略,即像DQN同樣研究它全部的可能動做的機率,並計算各個可能的動做的價值的話,那須要的樣本量是很是大才可行的。因而有人就想出使用肯定性策略來簡化這個問題。算法

    做爲隨機策略,在相同的策略,在同一個狀態處,採用的動做是基於一個機率分佈的,便是不肯定的。而肯定性策略則決定簡單點,雖然在同一個狀態處,採用的動做機率不一樣,可是最大機率只有一個,若是咱們只取最大機率的動做,去掉這個機率分佈,那麼就簡單多了。即做爲肯定性策略,相同的策略,在同一個狀態處,動做是惟一肯定的,即策略變成$$\pi_{\theta}(s) = a$$網絡

2. 從DPG到DDPG

    在看肯定性策略梯度DPG前,咱們看看基於Q值的隨機性策略梯度的梯度計算公式:$$\nabla_{\theta}J(\pi_{\theta}) = E_{s\sim\rho^{\pi}, a\sim\pi_{\theta}}[\nabla_{\theta}log \pi_{\theta}(s,a)Q_{\pi}(s,a)]$$多線程

    其中狀態的採樣空間爲$\rho^{\pi}$, $\nabla_{\theta}log \pi_{\theta}(s,a)$是分值函數,可見隨機性策略梯度須要在整個動做的空間$\pi_{\theta}$進行採樣。'dom

    而DPG基於Q值的肯定性策略梯度的梯度計算公式是:$$\nabla_{\theta}J(\pi_{\theta}) = E_{s\sim\rho^{\pi}}[\nabla_{\theta} \pi_{\theta}(s)\nabla_{a}Q_{\pi}(s,a)|_{a=\pi_{\theta}(s)}]$$函數

    跟隨機策略梯度的式子相比,少了對動做的積分,多了回報Q函數對動做的導數。post

    而從DPG到DDPG的過程,徹底能夠類比DQN到DDQN的過程。除了老生常談的經驗回放之外,咱們有了雙網絡,即當前網絡和目標網絡的概念。而因爲如今咱們原本就有Actor網絡和Critic兩個網絡,那麼雙網絡後就變成了4個網絡,分別是:Actor當前網絡,Actor目標網絡,Critic當前網絡,Critic目標網絡。2個Actor網絡的結構相同,2個Critic網絡的結構相同。那麼這4個網絡的功能各自是什麼呢?學習

3. DDPG的原理

    DDPG有4個網絡,在瞭解這4個網絡的功能以前,咱們先複習DDQN的兩個網絡:當前Q網絡和目標Q網絡的做用。能夠複習強化學習(十)Double DQN (DDQN)

    DDQN的當前Q網絡負責對當前狀態$S$使用$\epsilon-$貪婪法選擇動做$A$,執行動做$A$,得到新狀態$S'$和獎勵$R$,將樣本放入經驗回放池,對經驗回放池中採樣的下一狀態$S’$使用貪婪法選擇動做$A'$,供目標Q網絡計算目標Q值,當目標Q網絡計算出目標Q值後,當前Q網絡會進行網絡參數的更新,並按期把最新網絡參數複製到目標Q網絡。

    DDQN的目標Q網絡則負責基於經驗回放池計算目標Q值,提供給當前Q網絡用,目標Q網絡會按期從當前Q網絡複製最新網絡參數。

    

    如今咱們回到DDPG,做爲DDPG,Critic當前網絡,Critic目標網絡和DDQN的當前Q網絡,目標Q網絡的功能定位基本相似,可是咱們有本身的Actor策略網絡,所以不須要$\epsilon-$貪婪法這樣的選擇方法,這部分DDQN的功能到了DDPG能夠在Actor當前網絡完成。而對經驗回放池中採樣的下一狀態$S'$使用貪婪法選擇動做$A'$,這部分工做因爲用來估計目標Q值,所以能夠放到Actor目標網絡完成。

    基於經驗回放池和目標Actor網絡提供的$S',A'$計算目標Q值的一部分,這部分因爲是評估,所以仍是放到Critic目標網絡完成。而Critic目標網絡計算出目標Q值一部分後,Critic當前網絡會計算目標Q值,並進行網絡參數的更新,並按期將網絡參數複製到Critic目標網絡。

    此外,Actor當前網絡也會基於Critic目標網絡計算出的目標Q值,進行網絡參數的更新,並按期將網絡參數複製到Actor目標網絡。

 

    有了上面的思路,咱們總結下DDPG 4個網絡的功能定位:

    1. Actor當前網絡:負責策略網絡參數$\theta$的迭代更新,負責根據當前狀態$S$選擇當前動做$A$,用於和環境交互生成$S',R$。

    2. Actor目標網絡:負責根據經驗回放池中採樣的下一狀態$S'$選擇最優下一動做$A'$。網絡參數$\theta '$按期從$\theta$複製。

    3. Critic當前網絡:負責價值網絡參數$w$的迭代更新,負責計算負責計算當前Q值$Q(S,A,w)$。目標Q值$y_i = R+\gamma Q'(S',A',w')$

    4. Critic目標網絡:負責計算目標Q值中的$Q'(S',A',w')$部分。網絡參數$w'$按期從$w$複製。

    DDPG除了這4個網絡結構,還用到了經驗回放,這部分用於計算目標Q值,和DQN沒有什麼區別,這裏就不展開了。

    此外,DDPG從當前網絡到目標網絡的複製和咱們以前講到了DQN不同。回想DQN,咱們是直接把將當前Q網絡的參數複製到目標Q網絡,即$w'=w$, DDPG這裏沒有使用這種硬更新,而是使用了軟更新,即每次參數只更新一點點,即:$$w' \gets \tau w+ (1-\tau)w'$$$$\theta' \gets \tau \theta+ (1-\tau)\theta'$$

    其中$\tau$是更新系數,通常取的比較小,好比0.1或者0.01這樣的值。

    同時,爲了學習過程能夠增長一些隨機性,增長學習的覆蓋,DDPG對選擇出來的動做$A$會增長必定的噪聲$\mathcal{N}$,即最終和環境交互的動做$A$的表達式是:$$A = \pi_{\theta}(S) + \mathcal{N}$$

    最後,咱們來看看DDPG的損失函數。對於Critic當前網絡,其損失函數和DQN是相似的,都是均方偏差,即:$$J(w) =\frac{1}{m}\sum\limits_{j=1}^m(y_j-Q(\phi(S_j),A_j,w))^2$$

    而對於 Actor當前網絡,其損失函數就和以前講的PG,A3C不一樣了,這裏因爲是肯定性策略,原論文定義的損失梯度是:$$\nabla_J(\theta) = \frac{1}{m}\sum\limits_{j=1}^m[\nabla_{a}Q_(s_i,a_i,w)|_{s=s_i,a=\pi_{\theta}(s)}\nabla_{\theta} \pi_{\theta(s)}|_{s=s_i}]$$

    這個能夠對應上咱們第二節的肯定性策略梯度,看起來比較麻煩,可是其實理解起來很簡單。假如對同一個狀態,咱們輸出了兩個不一樣的動做$a_1$和$a_2$,從Critic當前網絡獲得了兩個反饋的Q值,分別是$Q_1,Q_2$,假設$Q_1>Q_2$,即採起動做1能夠獲得更多的獎勵,那麼策略梯度的思想是什麼呢,就是增長$a_1$的機率,下降$a_2$的機率,也就是說,Actor想要儘量的獲得更大的Q值。因此咱們的Actor的損失能夠簡單的理解爲獲得的反饋Q值越大損失越小,獲得的反饋Q值越小損失越大,所以只要對狀態估計網絡返回的Q值取個負號便可,即:$$J(\theta) =  -\frac{1}{m}\sum\limits_{j=1}^m Q_(s_i,a_i,w)$$

4. DDPG算法流程

    這裏咱們總結下DDPG的算法流程

    輸入:Actor當前網絡,Actor目標網絡,Critic當前網絡,Critic目標網絡,參數分別爲$\theta, \theta',w,w'$,衰減因子$\gamma$,  軟更新系數$\tau$,批量梯度降低的樣本數$m$,目標Q網絡參數更新頻率$C$。最大迭代次數$T$。隨機噪音函數\mathcal{N}

    輸出:最優Actor當前網絡參數$ \theta$,Critic當前網絡參數$w$

    1. 隨機初始化$\theta,w$, $w' = w$,$\theta' = \theta$。清空經驗回放的集合$D$

    2. for i from 1 to T,進行迭代。

      a) 初始化$S$爲當前狀態序列的第一個狀態, 拿到其特徵向量$\phi(S)$

      b) 在Actor當前網絡基於狀態$S$獲得動做$A =\pi_{\theta}(\phi(S)) + \mathcal{N} $

      c) 執行動做$A$,獲得新狀態$S'$,獎勵$R$,是否終止狀態%is\_end$

      d) 將$\{\phi(S),A,R,\phi(S'),is\_end\}$這個五元組存入經驗回放集合$D$

      e) S=S'

      f) 從經驗回放集合$D$中採樣$m$個樣本$\{\phi(S_j),A_j,R_j,\phi(S'_j),is\_end_j\}, j=1,2.,,,m$,計算當前目標Q值$y_j$:$$y_j= \begin{cases} R_j& {is\_end_j\; is \;true}\\ R_j + \gamma Q'(\phi(S'_j),\pi_{ \theta'}(\phi(S'_j)),w')& {is\_end_j\; is \;false} \end{cases}$$

      g)  使用均方差損失函數$\frac{1}{m}\sum\limits_{j=1}^m(y_j-Q(\phi(S_j),A_j,w))^2$,經過神經網絡的梯度反向傳播來更新Critic當前網絡的全部參數$w$

      h)  使用$J(\theta) =  -\frac{1}{m}\sum\limits_{j=1}^m Q_(s_i,a_i,w)$,,經過神經網絡的梯度反向傳播來更新Actor當前網絡的全部參數$\theta$

      i) 若是T%C=1,則更新Critic目標網絡和Actor目標網絡參數:$$w' \gets \tau w+ (1-\tau)w'$$$$\theta' \gets \tau \theta+ (1-\tau)\theta'$$

      j) 若是$S'$是終止狀態,當前輪迭代完畢,不然轉到步驟b)

      以上就是DDPG算法的主流程,要注意的是上面2.f中的$\pi_{ \theta'}(\phi(S'_j))$是經過Actor目標網絡獲得,而$Q'(\phi(S'_j),\pi_{ \theta'}(\phi(S'_j)),w')$則是經過Critic目標網絡獲得的。

5. DDPG實例

    這裏咱們給出DDPG第一個算法實例,代碼主要參考自莫煩的Github代碼。增長了測試模型效果的部分,優化了少許參數。代碼詳見:https://github.com/ljpzzz/machinelearning/blob/master/reinforcement-learning/ddpg.py

    這裏咱們沒有用以前的CartPole遊戲,由於它不是連續動做。咱們使用了Pendulum-v0這個遊戲。目的是用最小的力矩使棒子豎起來,這個遊戲的詳細介紹參見這裏。輸入狀態是角度的sin,cos值,以及角速度。一共三個值。動做是一個連續的力矩值。

    兩個Actor網絡和兩個Critic網絡的定義參見:

    def _build_a(self, s, scope, trainable):
        with tf.variable_scope(scope):
            net = tf.layers.dense(s, 30, activation=tf.nn.relu, name='l1', trainable=trainable)
            a = tf.layers.dense(net, self.a_dim, activation=tf.nn.tanh, name='a', trainable=trainable)
            return tf.multiply(a, self.a_bound, name='scaled_a')

    def _build_c(self, s, a, scope, trainable):
        with tf.variable_scope(scope):
            n_l1 = 30
            w1_s = tf.get_variable('w1_s', [self.s_dim, n_l1], trainable=trainable)
            w1_a = tf.get_variable('w1_a', [self.a_dim, n_l1], trainable=trainable)
            b1 = tf.get_variable('b1', [1, n_l1], trainable=trainable)
            net = tf.nn.relu(tf.matmul(s, w1_s) + tf.matmul(a, w1_a) + b1)
            return tf.layers.dense(net, 1, trainable=trainable)  # Q(s,a)

    Actor當前網絡和Critic當前網絡損失函數的定義參見:

        td_error = tf.losses.mean_squared_error(labels=q_target, predictions=q)
        self.ctrain = tf.train.AdamOptimizer(LR_C).minimize(td_error, var_list=self.ce_params)

        a_loss = - tf.reduce_mean(q)    # maximize the q
        self.atrain = tf.train.AdamOptimizer(LR_A).minimize(a_loss, var_list=self.ae_params)

    Actor目標網絡和Critic目標網絡參數軟更新,Actor當前網絡和Critic當前網絡反向傳播更新部分的代碼以下:

    def learn(self):
        # soft target replacement
        self.sess.run(self.soft_replace)

        indices = np.random.choice(MEMORY_CAPACITY, size=BATCH_SIZE)
        bt = self.memory[indices, :]
        bs = bt[:, :self.s_dim]
        ba = bt[:, self.s_dim: self.s_dim + self.a_dim]
        br = bt[:, -self.s_dim - 1: -self.s_dim]
        bs_ = bt[:, -self.s_dim:]

        self.sess.run(self.atrain, {self.S: bs})
        self.sess.run(self.ctrain, {self.S: bs, self.a: ba, self.R: br, self.S_: bs_})

    其他的能夠對照算法和代碼一塊兒學習,應該比較容易理解。

6. DDPG總結

    DDPG參考了DDQN的算法思想嗎,經過雙網絡和經驗回放,加一些其餘的優化,比較好的解決了Actor-Critic難收斂的問題。所以在實際產品中尤爲是自動化相關的產品中用的比較多,是一個比較成熟的Actor-Critic算法。

    到此,咱們的Policy Based RL系列也討論完了,而在更早咱們討論了Value Based RL系列,至此,咱們還剩下Model Based RL沒有討論。後續咱們討論Model Based RL的相關算法。

 

(歡迎轉載,轉載請註明出處。歡迎溝通交流: liujianping-ok@163.com)

相關文章
相關標籤/搜索