強化學習 9 —— DQN 改進算法DDQN、Dueling DQN tensorflow 2.0 實現


上篇文章強化學習——詳解 DQN 算法我們介紹了 DQN 算法,但是 DQN 還存在一些問題,本篇文章介紹針對 DQN 的問題的改進算法

一、Double DQN 算法

1、算法介紹

DQN的問題有:目標 Q 值(Q Target )計算是否准確?全部通過 \(max\;Q\) 來計算有沒有問題?很顯然,是有問題的,這是因為Q-Learning 本身固有的缺陷---過估計

過估計是指估計得值函數比真實值函數要大,其根源主要在於Q-Learning中的最大化操作,對於 TD Target:

\[r + \gamma\;max_{a'}\; \hat{Q}(s', a', w) \]

其中的 \(max\) 操作使得估計的值函數比值函數的真實值大,因為DQN是一種off-policy的方法,每次學習時,不是使用下一次交互的真實動作,而是使用當前認為價值最大的動作來更新目標值函數,(注:對於真實的策略來說並在給定的狀態下並不是每次都選擇使得Q值最大的動作,所以在這里目標值直接選擇動作最大的Q值往往會導致目標值要高於真實值)。Double DQN 的改進方法是將動作的選擇和動作的評估分別用不同的值函數來實現,而在Nature DQN中正好我們提出了兩個Q網絡。所以計算 TD Target 的步驟可以分為下面兩步:

  • 1)通過當前Q估計網絡(Q Estimation 網絡)獲得最大值函數的動作 \(a\):

\[a_{max}(s',w) = arg\;max_{a'}Q_{estim}(s', a, w) \]

  • 2)然后利用這個選擇出來的動作 \(a_{max}(s',w)\) 在目標網絡 (Q Target) 里面去計算目 Target Q值:

\[r + \gamma\;max_{a'}\; Q_{target}(s', a_{max}(s',w), w) \]

綜合起來 在Double DQN 中的 TD Target 計算為:

\[r + \gamma\;max_{a'}\; Q_{target}(s',arg\;max_{a'}Q_{estim}(s', a, w), w) \]

除了計算 Target Q 值以外,DDQN 和 DQN 其余流程完全相同。

2、代碼展示

由上面可知,Double DQN 和 DQN 唯一不同的地方在於Q值的估計,其余流程一樣。這里附上代碼:

target = self.target_model(states).numpy()
# next_q_values [batch_size, action_diim]
next_target = self.target_model(next_states).numpy()
# next_q_value [batch_size, 1]
next_q_value = next_target[
    range(args.batch_size), np.argmax(self.model(next_states), axis=1)
]
# next_q_value = tf.reduce_max(next_q_value, axis=1)
target[range(args.batch_size), actions] = rewards + (1 - done) * args.gamma * next_q_value

完整代碼強化學習——Double DQN 代碼地址 ,勞煩點個 star 可好?在此謝謝了

二、Dueling DQN 算法

1、算法簡介

在DQN算法中,神經網絡輸出的 Q 值代表動作價值,那么單純的動作價值評估會不會不准確?我們知道,\(Q(s, a)\) 的值既和 State 有關,又和 action 有關,但是這兩種 “有關” 的程度不一樣,或者說影響力不一樣,而我們希望能反映出兩個方面的差異。

Dueling-DQN 算法從網絡結構上改進了DQN,神經網絡輸出的動作價值函數可以分為狀態價值函數和優勢函數,即:

\[Q_\pi(s,a) = V_\pi(s) + A_\pi(s,a) \]

然后這兩個函數利用神經網絡來逼近。

先來回顧一下,在前面 MDP 那節介紹過了狀態價值函數 \(V(s)\) 的定義:

\[v_\pi(s) = \sum_{a\in A} \pi(a|s)\cdot q_\pi(a, s) \]

狀態價值函數就等於在該狀態下所有可能動作所對應的動作值乘以采取該動作的概率的和。更通俗的講,值函數 \(V(s)\) 是該狀態下所有動作值函數關於動作概率的平均值;而動作價值函數 \(q(s,a)\) 表示在狀態 s 下選取 動作 a 所能獲得的價值。

那么什么是 優勢函數?優勢函數 \(A_\pi(s,a) = Q_\pi(s,a) - V_\pi(s)\) 。意思是當前動作價值相對於平均價值的大小。所以,這里的優勢指的是動作價值相比於當前狀態的值的優勢。如果優勢大於零,則說明該動作比平均動作好,如果優勢小於零,則說明當前動作還不如平均動作好。這樣那些比平均動作好的動作將會有更大的輸出,從而加速網絡收斂過程。

2、代碼展示

同樣的,Dueling DQN 與DQN 的不同之處在與網絡結構,其余流程完全一樣。這里不再過多解釋,下面附上創建模型相關代碼 :

def create_model(input_state_shape):
    input_layer = tl.layers.Input(input_state_shape)
    layer_1 = tl.layers.Dense(n_units=32, act=tf.nn.relu)(input_layer)
    layer_2 = tl.layers.Dense(n_units=16, act=tf.nn.relu)(layer_1)
    # state value
    state_value = tl.layers.Dense(n_units=1)(layer_2)
    # advantage value
    q_value = tl.layers.Dense(n_units=self.action_dim)(layer_2)
    mean = tl.layers.Lambda(lambda x: tf.reduce_mean(x, axis=1, keepdims=True))(q_value)
    advantage = tl.layers.ElementwiseLambda(lambda x, y: x-y)([q_value, mean])
    # output
    output_layer = tl.layers.ElementwiseLambda(lambda x, y: x+y)([state_value, advantage])
    return tl.models.Model(inputs=input_layer, outputs=output_layer)

完整代碼強化學習——Dueling DQN 代碼地址 ,勞煩點個 star 可好?在此謝謝了


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM