深度強化學習課程文件
深度Q學習演算法
並獲得增強的文件體驗
開始使用
深度Q學習演算法
我們瞭解到,深度Q學習透過使用深度神經網路來近似某個狀態下每個可能動作的Q值(值函式估計)。
不同之處在於,在訓練階段,我們不是像Q學習那樣直接更新狀態-動作對的Q值
在深度Q學習中,我們建立一個損失函式,該函式比較我們的Q值預測和Q目標,並使用梯度下降來更新深度Q網路的權重,以更好地近似我們的Q值。
深度Q學習訓練演算法有兩個階段
- 取樣:我們執行動作並將觀察到的經驗元組儲存在重放記憶中。
- 訓練:隨機選擇一小批元組,並使用梯度下降更新步驟從該批次中學習。
這與Q學習不同。深度Q學習訓練可能會遇到不穩定性,這主要是由於結合了非線性Q值函式(神經網路)和自舉(當我們用現有估計而不是實際完整回報來更新目標時)。
為了幫助我們穩定訓練,我們實施了三種不同的解決方案
- 經驗回放 以便更有效地利用經驗。
- 固定Q目標 以穩定訓練。
- 雙深度Q學習,以處理Q值高估的問題。
讓我們逐一瞭解它們!
經驗回放以更有效地利用經驗
我們為什麼要建立重放記憶?
深度Q學習中的經驗回放有兩個作用
- 更有效地利用訓練期間的經驗。通常,在線上強化學習中,智慧體與環境互動,獲取經驗(狀態、動作、獎勵和下一狀態),從中學習(更新神經網路),然後丟棄它們。這效率不高。
經驗回放透過更有效地利用訓練經驗來提供幫助。我們使用一個重放緩衝區來儲存經驗樣本,這些樣本可以在訓練期間重複使用。
⇒ 這允許智慧體多次從相同的經驗中學習。
- 避免忘記以前的經驗(也稱為災難性干擾或災難性遺忘)並減少經驗之間的相關性.
- 災難性遺忘:如果我們給神經網路連續的經驗樣本,就會出現這個問題,它會傾向於隨著獲得新的經驗而忘記以前的經驗。例如,如果智慧體在第一級,然後在第二級,這與第一級不同,它可能會忘記如何在第一級行為和玩耍。
解決方案是建立一個重放緩衝區,在與環境互動時儲存經驗元組,然後取樣一小批元組。這可以防止網路只學習它之前立即做過的事情。
經驗回放還有其他好處。透過隨機取樣經驗,我們消除了觀測序列中的相關性,並避免了動作值發生劇烈波動或發散。
在深度Q學習虛擬碼中,我們初始化一個容量為N的重放記憶緩衝區D(N是您可以定義的超引數)。然後我們將經驗儲存在記憶體中,並採樣一批經驗在訓練階段饋送給深度Q網路。
固定Q目標以穩定訓練
當我們想計算TD誤差(即損失)時,我們計算TD目標(Q目標)與當前Q值(Q的估計)之間的差值。
但是我們不知道真正的TD目標。我們需要估計它。使用貝爾曼方程,我們看到TD目標只是在該狀態下采取該動作的獎勵加上下一狀態的折現最高Q值。
然而,問題在於我們使用相同的引數(權重)來估計TD目標和Q值。因此,TD目標與我們正在更改的引數之間存在顯著的相關性。
因此,在訓練的每一步,我們的Q值和目標值都會發生變化。我們正在接近我們的目標,但目標也在移動。這就像追逐一個移動的目標!這可能導致訓練中的劇烈振盪。
這就像你是一個牛仔(Q估計),你想抓一頭奶牛(Q目標)。你的目標是靠近(減少誤差)。
在每個時間步,你都試圖接近奶牛,而奶牛在每個時間步也都在移動(因為你使用相同的引數)。
這導致了一條奇怪的追逐路徑(訓練中出現劇烈振盪)。 
相反,我們在虛擬碼中看到的是,我們
- 使用一個具有固定引數的獨立網路來估計TD目標
- 每C步從我們的深度Q網路複製引數以更新目標網路。
雙DQN
雙DQN,或雙深度Q學習神經網路,由Hado van Hasselt提出。該方法處理Q值高估的問題。
為了理解這個問題,請記住我們如何計算TD目標
我們在計算TD目標時面臨一個簡單的問題:我們如何確定下一狀態的最佳動作是具有最高Q值的動作?
我們知道Q值的準確性取決於我們嘗試的動作和我們探索的相鄰狀態。
因此,在訓練開始時,我們沒有足夠的資訊來判斷要採取的最佳動作。因此,將最大Q值(有噪聲)作為要採取的最佳動作可能導致假陽性。如果非最優動作經常被賦予高於最優最佳動作的Q值,學習將變得複雜。
解決方案是:當我們計算Q目標時,我們使用兩個網路來解耦動作選擇和目標Q值生成。我們
- 使用我們的DQN網路選擇下一狀態要採取的最佳動作(具有最高Q值的動作)。
- 使用我們的目標網路計算在下一狀態採取該動作的目標Q值。
因此,雙DQN幫助我們減少Q值的高估,從而幫助我們更快、更穩定地訓練。
自從深度Q學習的這三項改進以來,又增加了許多其他改進,例如優先經驗回放和對偶深度Q學習。這些超出了本課程的範圍,但如果您感興趣,請檢視我們在閱讀列表中列出的連結。
< > 在 GitHub 上更新