强化学习(十)Double DQN (DDQN)
在強化學習(九)Deep Q-Learning進階之Nature DQN中,我們討論了Nature DQN的算法流程,它通過使用兩個相同的神經網絡,以解決數據樣本和網絡訓練之前的相關性。但是還是有其他值得優化的點,文本就關注于Nature DQN的一個改進版本: Double DQN算法(以下簡稱DDQN)。
本章內容主要參考了ICML 2016的deep RL tutorial和DDQN的論文<Deep Reinforcement Learning with Double Q-learning>。
1. DQN的目標Q值計算問題
在DDQN之前,基本上所有的目標Q值都是通過貪婪法直接得到的,無論是Q-Learning, DQN(NIPS 2013)還是 Nature DQN,都是如此。比如對于Nature DQN,雖然用了兩個Q網絡并使用目標Q網絡計算Q值,其第j個樣本的目標Q值的計算還是貪婪法得到的,計算入下式:
yj={RjRj+γmaxa′Q′(?(S′j),A′j,w′)is_endjistrueis_endjisfalseyj={Rjis_endjistrueRj+γmaxa′Q′(?(Sj′),Aj′,w′)is_endjisfalse
使用max雖然可以快速讓Q值向可能的優化目標靠攏,但是很容易過猶不及,導致過度估計(Over Estimation),所謂過度估計就是最終我們得到的算法模型有很大的偏差(bias)。為了解決這個問題, DDQN通過解耦目標Q值動作的選擇和目標Q值的計算這兩步,來達到消除過度估計的問題。
2. DDQN的算法建模
DDQN和Nature DQN一樣,也有一樣的兩個Q網絡結構。在Nature DQN的基礎上,通過解耦目標Q值動作的選擇和目標Q值的計算這兩步,來消除過度估計的問題。
在上一節里,Nature DQN對于非終止狀態,其目標Q值的計算式子是:
yj=Rj+γmaxa′Q′(?(S′j),A′j,w′)yj=Rj+γmaxa′Q′(?(Sj′),Aj′,w′)
在DDQN這里,不再是直接在目標Q網絡里面找各個動作中最大Q值,而是先在當前Q網絡中先找出最大Q值對應的動作,即
amax(S′j,w)=argmaxa′Q(?(S′j),a,w)amax(Sj′,w)=arg?maxa′Q(?(Sj′),a,w)
然后利用這個選擇出來的動作amax(S′j,w)amax(Sj′,w)在目標網絡里面去計算目標Q值。即:
yj=Rj+γQ′(?(S′j),amax(S′j,w),w′)yj=Rj+γQ′(?(Sj′),amax(Sj′,w),w′)
綜合起來寫就是:
yj=Rj+γQ′(?(S′j),argmaxa′Q(?(S′j),a,w),w′)yj=Rj+γQ′(?(Sj′),arg?maxa′Q(?(Sj′),a,w),w′)
除了目標Q值的計算方式以外,DDQN算法和Nature DQN的算法流程完全相同。
?3. DDQN算法流程
這里我們總結下DDQN的算法流程,和Nature DQN的區別僅僅在步驟2.f中目標Q值的計算。
算法輸入:迭代輪數TT,狀態特征維度nn, 動作集AA, 步長αα,衰減因子γγ, 探索率??, 當前Q網絡QQ,目標Q網絡Q′Q′, 批量梯度下降的樣本數mm,目標Q網絡參數更新頻率CC。
輸出:Q網絡參數
1.?隨機初始化所有的狀態和動作對應的價值QQ.? 隨機初始化當前Q網絡的所有參數ww,初始化目標Q網絡Q′Q′的參數w′=ww′=w。清空經驗回放的集合DD。
2. for i from 1 to T,進行迭代。
a) 初始化S為當前狀態序列的第一個狀態, 拿到其特征向量?(S)?(S)
b) 在Q網絡中使用?(S)?(S)作為輸入,得到Q網絡的所有動作對應的Q值輸出。用????貪婪法在當前Q值輸出中選擇對應的動作AA
c)?在狀態SS執行當前動作AA,得到新狀態S′S′對應的特征向量?(S′)和獎勵?(S′)和獎勵R$,是否終止狀態is_end
d) 將{?(S),A,R,?(S′),is_end}{?(S),A,R,?(S′),is_end}這個五元組存入經驗回放集合DD
e)?S=S′S=S′
f)? 從經驗回放集合DD中采樣mm個樣本{?(Sj),Aj,Rj,?(S′j),is_endj},j=1,2.,,,m{?(Sj),Aj,Rj,?(Sj′),is_endj},j=1,2.,,,m,計算當前目標Q值yjyj:
yj={RjRj+γQ′(?(S′j),argmaxa′Q(?(S′j),a,w),w′)is_endjistrueis_endjisfalseyj={Rjis_endjistrueRj+γQ′(?(Sj′),arg?maxa′Q(?(Sj′),a,w),w′)is_endjisfalse
g)? 使用均方差損失函數1m∑j=1m(yj?Q(?(Sj),Aj,w))21m∑j=1m(yj?Q(?(Sj),Aj,w))2,通過神經網絡的梯度反向傳播來更新Q網絡的所有參數ww
h) 如果T%C=1,則更新目標Q網絡參數w′=ww′=w
i) 如果S′S′是終止狀態,當前輪迭代完畢,否則轉到步驟b)
注意,上述第二步的f步和g步的Q值計算也都需要通過Q網絡計算得到。另外,實際應用中,為了算法較好的收斂,探索率??需要隨著迭代的進行而變小。
4. DDQN算法實例
下面我們用一個具體的例子來演示DQN的應用。仍然使用了OpenAI Gym中的CartPole-v0游戲來作為我們算法應用。CartPole-v0游戲的介紹參見這里。它比較簡單,基本要求就是控制下面的cart移動使連接在上面的pole保持垂直不倒。這個任務只有兩個離散動作,要么向左用力,要么向右用力。而state狀態就是這個cart的位置和速度, pole的角度和角速度,4維的特征。堅持到200分的獎勵則為過關。
完整的代碼參見我的github:?https://github.com/ljpzzz/machinelearning/blob/master/reinforcement-learning/ddqn.py
這里我們重點關注DDQN和上一節的Nature DQN的代碼的不同之處。代碼只有一個地方不一樣,就是計算目標Q值的時候,如下:
# Step 2: calculate yy_batch = []current_Q_batch = self.Q_value.eval(feed_dict={self.state_input: next_state_batch})max_action_next = np.argmax(current_Q_batch, axis=1)target_Q_batch = self.target_Q_value.eval(feed_dict={self.state_input: next_state_batch})for i in range(0,BATCH_SIZE):done = minibatch[i][4]if done:y_batch.append(reward_batch[i])else :target_Q_value = target_Q_batch[i, max_action_next[i]]y_batch.append(reward_batch[i] + GAMMA * target_Q_value)而之前的Nature? DQN這里的目標Q值計算是如下這樣的:
# Step 2: calculate yy_batch = []Q_value_batch = self.target_Q_value.eval(feed_dict={self.state_input:next_state_batch})for i in range(0,BATCH_SIZE):done = minibatch[i][4]if done:y_batch.append(reward_batch[i])else :y_batch.append(reward_batch[i] + GAMMA * np.max(Q_value_batch[i]))除了上面這部分的區別,兩個算法的代碼完全相同。
5. DDQN小結
DDQN算法出來以后,取得了比較好的效果,因此得到了比較廣泛的應用。不過我們的DQN仍然有其他可以優化的點,如上一篇最后講到的:?隨機采樣的方法好嗎?按道理經驗回放里不同樣本的重要性是不一樣的,TD誤差大的樣本重要程度應該高。針對這個問題,我們在下一節的Prioritised Replay DQN中討論。
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
以上是生活随笔為你收集整理的强化学习(十)Double DQN (DDQN)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 强化学习(九)Deep Q-Learni
- 下一篇: 强化学习(十二) Dueling DQN