dqn在训练过程中loss越来越大_DQN算法实现注意事项及排错方法
在學習強化學習過程中,自己實現DQN算法時,遇到了比較多的問題,花了好幾天的時間才得以解決。最后分析總結一下,避免再走彎路。
有可能開始實現出來的DQN算法,無論怎么訓練總是看不錯成果。需要注意的地方比較多,一步一步的來分析:
一、確定算法實現本身是否正確
算法學習的過程一般是:學習算法相關的資料,然后自己動手實現算法來進行訓練。當訓練總是失敗時,就去網上找別人對這個算法的實現,然后對比自己的實現和別人實現的差異來糾錯。
但這個時候比較容易遇到坑,因為別人的實現可能會有幾個問題:
所以,就需要注意下面幾個方面:
1、確定算法實現必須有哪些部分。
如果確定呢?比如看算法論文的原文,或者看大學的公開課等。
DQN算法的實現中應該包含目標網絡(target network)和經驗回放(Experience Replay)相關的代碼。因為這是算法論文中有提到的。
Playing Atari with Deep Reinforcement Learning?arxiv.org網絡上有很多DQN算法的實現,但是有不少的實現是沒有目標網絡(target network)的,搜到這種文章還是直接跳過吧。
2、留意算法實現的細節
在DQN算法中,done參數是需要使用。網絡上有不少DQN算法的實現是沒有使用done參數進行訓練的。
DQN算法經過實際的對比測試發現,DQN算法中不使用done參數有時甚至將導致算法不能收斂。完整的代碼和數據在這里。
DQN使用done參數與否(橙色使用done參數,藍色未使用done參數)3、區分算法本身和算法的變種
DQN算法有不少的變種,比如:Double-Q Learning,Dueling DQN等。如果你看的是權威算法的實現,可以肯定算法本身是不會錯的。但是實現細節又和學習到的算法原理不同,那么有可能你看到的不是原始算法的實現,而是其變種。
二、了解不同環境對訓練和算法收斂的影響
一般我們訓練時使用的環境是gym,在測試DQN算法時,常用的環境有兩個:
1、CartPole
Gym的CartPole環境立桿子游戲CartPole的特點是:如果算法模型越差,那么每一個游戲回合(episode)的時間就會越短,因為桿子倒下了游戲就馬上結束了。
2、MountainCar
Gym的MountainCar環境小車上山游戲MountainCar的特點是:如果算法模型越差,每一個游戲回合的時間就會越長,因為游戲結束的條件是要么小車上山,要么移動了200次。而開始訓練算法時,小車是很難上山的,基本上都是移動次數超過限制游戲結束的。
當實現完算法需要驗證算法的正確性時,結合上面兩種環境的特點,推薦使用第一種環境來驗證算法。原因如下:
第一種環境的特點是模型越差,游戲回合時間越短。當開始訓練算法時,訓練的速度就會比較快,如果算法正確收斂,那么會訓練的越來越慢,比較好觀察。
與之對比的是第二種環境,模型越差,游戲回合時間越長。訓練開始時,因為每個回合的時間都比較長,在不借助其他工具的情況下,難以觀察算法是否在收斂。所以就可能會出現算法本身是正確且收斂的,但是因為每回合時間太長,訓練太耗時,所以短時間內看不出趨勢就誤認為算法是錯誤的。
三、善用tensorboardX來記錄分析訓練過程
訓練過程中的數據對觀察算法是否收斂和對比算法或超參數有很大的幫助。
1、觀察算法是否收斂
最直觀的,訓練過程獎勵(reward)的變化過程直接表明了算法是否收斂。
在此基礎上,與環境相關的數據,比如游戲每回合的步數(step)也能反映算法是否收斂,CartPole環境每回合的步數應該慢慢增長,MountainCar環境每回合步數應該慢慢減少。
和算法相關數據,比如loss的值,在DQN算法中,loss的值應該慢慢減少,直到趨于平穩。
下圖是DQN算法訓練MountainCar-v0環境過程的tensorboardX截圖,完整的代碼和數據在這里。
DQN算法訓練MountainCar-v0環境過程2、對比算法或超參數
可以對比不同算法或同個算法不同超參數值對算法的收斂,有助于直觀的了解算法的性能和收斂的速度等。
下圖是Deep Q-Learing(橙色線條)算法和Double-Q Learning(藍色線條)訓練MountainCar-v0環境過程的對比圖,完整的代碼和數據在這里。
Deep Q-Learing(橙色線條)算法和Double-Q Learning(藍色線條)訓練MountainCar-v0環境過程的對比圖總結
以上是生活随笔為你收集整理的dqn在训练过程中loss越来越大_DQN算法实现注意事项及排错方法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mapreduce mysql_MapR
- 下一篇: string类型比较_redis存jso