強化學習演算法筆記之【DDPG演算法】

这可就有点麻烦了發表於2024-10-19

強化學習筆記之【DDPG演算法】

目錄
  • 強化學習筆記之【DDPG演算法】
      • 前言:
      • 原論文虛擬碼
      • DDPG 中的四個網路
      • 程式碼核心更新公式


前言:

本文為強化學習筆記第二篇,第一篇講的是Q-learning和DQN

就是因為DDPG引入了Actor-Critic模型,所以比DQN多了兩個網路,網路名字功能變了一下,其它的就是軟更新之類的小改動而已

本文初編輯於2024.10.6

CSDN主頁:https://blog.csdn.net/rvdgdsva

部落格園主頁:https://www.cnblogs.com/hassle

部落格園本文連結:

強化學習演算法筆記之【DDPG演算法】

真 · 圖文無關


原論文虛擬碼

強化學習演算法筆記之【DDPG演算法】
  • 上述程式碼為DDPG原論文中的虛擬碼

需要先看:

Deep Reinforcement Learning (DRL) 演算法在 PyTorch 中的實現與應用【DDPG部分】【沒有在選擇一個新的動作的時候,給policy函式返回的動作值增加一個噪音】【critic網路與下面不同】

深度強化學習筆記——DDPG原理及實現(pytorch)【DDPG虛擬碼部分】【這個跟上面的一樣沒有加噪音】【critic網路與上面不同】

【深度強化學習】(4) Actor-Critic 模型解析,附Pytorch完整程式碼【選看】【Actor-Critic理論部分】


如果需要給policy函式返回的動作值增加一個噪音,實現如下

強化學習演算法筆記之【DDPG演算法】
def select_action(self, state, noise_std=0.1):
    state = torch.FloatTensor(state.reshape(1, -1))
    action = self.actor(state).cpu().data.numpy().flatten()
    
    # 新增噪音,上面兩個文件的程式碼都沒有這個步驟
    noise = np.random.normal(0, noise_std, size=action.shape)
    action = action + noise
    
    return action


DDPG 中的四個網路

強化學習演算法筆記之【DDPG演算法】

注意!!!這個圖只展示了Critic網路的更新,沒有展示Actor網路的更新

  • Actor 網路(策略網路)
    • 作用:決定給定狀態 ss 時,應該採取的動作 a=π(s)a=π(s),目標是找到最大化未來回報的策略。
    • 更新:基於 Critic 網路提供的 Q 值更新,以最大化 Critic 估計的 Q 值。
  • Target Actor 網路(目標策略網路)
    • 作用:為 Critic 網路提供更新目標,目的是讓目標 Q 值的更新更為穩定。
    • 更新:使用軟更新,緩慢向 Actor 網路靠近。
  • Critic 網路(Q 網路)
    • 作用:估計當前狀態 ss 和動作 aa 的 Q 值,即 Q(s,a)Q(s,a),為 Actor 提供最佳化目標。
    • 更新:透過最小化與目標 Q 值的均方誤差進行更新。
  • Target Critic 網路(目標 Q 網路)
    • 作用:生成 Q 值更新的目標,使得 Q 值更新更為穩定,減少振盪。
    • 更新:使用軟更新,緩慢向 Critic 網路靠近。

大白話解釋:

​ 1、DDPG例項化為actor,輸入state輸出action
​ 2、DDPG例項化為actor_target
​ 3、DDPG例項化為critic_target,輸入next_state和actor_target(next_state)經DQN計算輸出target_Q
​ 4、DDPG例項化為critic,輸入state和action輸出current_Q,輸入state和actor(state)【這個引數需要注意,不是action】經負均值計算輸出actor_loss

​ 5、current_Q 和target_Q進行critic的引數更新
​ 6、actor_loss進行actor的引數更新

action實際上是batch_action,state實際上是batch_state,而batch_action != actor(batch_state)

因為actor是頻繁更新的,而取樣是隨機取樣,不是所有batch_action都能隨著actor的更新而同步更新

Critic網路的更新是一發而動全身的,相比於Actor網路的更新要複雜要重要許多


程式碼核心更新公式

\[target\underline{~}Q = critic\underline{~}target(next\underline{~}state, actor\underline{~}target(next\underline{~}state)) \\target\underline{~}Q = reward + (1 - done) \times gamma \times target\underline{~}Q.detach() \]

強化學習演算法筆記之【DDPG演算法】
  • 上述程式碼與虛擬碼對應,意為計算預測Q值

\[critic\underline{~}loss = MSELoss(critic(state, action), target\underline{~}Q) \\critic\underline{~}optimizer.zero\underline{~}grad() \\critic\underline{~}loss.backward() \\critic\underline{~}optimizer.step() \]

強化學習演算法筆記之【DDPG演算法】
  • 上述程式碼與虛擬碼對應,意為使用均方誤差損失函式更新Critic

\[actor\underline{~}loss = -critic(state,actor(state)).mean() \\actor\underline{~}optimizer.zero\underline{~}grad() \\ actor\underline{~}loss.backward() \\ actor\underline{~}optimizer.step() \]

強化學習演算法筆記之【DDPG演算法】
強化學習演算法筆記之【DDPG演算法】
  • 上述程式碼與虛擬碼對應,意為使用確定性策略梯度更新Actor

\[critic\underline{~}target.parameters().data=(tau \times critic.parameters().data + (1 - tau) \times critic\underline{~}target.parameters().data) \\ actor\underline{~}target.parameters().data=(tau \times actor.parameters().data + (1 - tau) \times actor\underline{~}target.parameters().data) \]

強化學習演算法筆記之【DDPG演算法】
  • 上述程式碼與虛擬碼對應,意為使用策略梯度更新目標網路

Actor和Critic的角色

  • Actor:負責選擇動作。它根據當前的狀態輸出一個確定性動作。
  • Critic:評估Actor的動作。它透過計算狀態-動作值函式(Q值)來評估給定狀態和動作的價值。

更新邏輯

  • Critic的更新
    1. 使用經驗回放緩衝區(Experience Replay)從中取樣一批經驗(狀態、動作、獎勵、下一個狀態)。
    2. 計算目標Q值:使用目標網路(critic_target)來估計下一個狀態的Q值(target_Q),並結合當前的獎勵。
    3. 使用均方誤差損失函式(MSELoss)來更新Critic的引數,使得預測的Q值(target_Q)與當前Q值(current_Q)儘量接近。
  • Actor的更新
    1. 根據當前的狀態(state)從Critic得到Q值的梯度(即對Q值相對於動作的偏導數)。
    2. 使用確定性策略梯度(DPG)的方法來更新Actor的引數,目標是最大化Critic評估的Q值。

個人理解:

DQN演算法是將q_network中的引數每n輪一次複製到target_network裡面

DDPG使用係數\(\tau\)來更新引數,將學習到的引數更加soft地複製給目標網路

DDPG採用了actor-critic網路,所以比DQN多了兩個網路

相關文章