【問題記錄】強化學習DQN中神經網絡每次推理結果都相同
Contents
問題
最近使用DQN強化學習算法進行一些研究。將數據分為測試集和訓練集,然后分別編寫訓練的代碼和測試的代碼,我設置的是每訓練100個episode,就在測試集上邊測試一次。
當我編寫完測試代碼之后,發現一個問題:
隨着訓練的進行,模型參數應該是一直在更新,但是輸出的測試指標數據卻完全沒有變化,無論訓練多少個episode都不會變化。
理論上來說,模型參數是一直被更新優化的。那么對於相同的輸入,輸出值不可能一直都是不變化的。結果可能變好,可能變壞,但是沒變化,說明一定有bug。
排查思路
- 最開始懷疑的是模型沒有被訓練到,參數更新的
operation
沒有被執行。斷點調試后模型是被成功更新的,排除這個問題。 - 然后懷疑的是我在調用
tensorflow
的tf.train.Saver
的save()
和restore()
有問題,沒有成功的保存或者加載模型。- 通過Tensorflow 打印模型參數 - 簡書講到的方法1,方法2,分別打印出同一個
episode
的模型的save()保存的ckpt文件的參數,以及運行過程中restore()之后的參數。-
-
-
在命令行運行上述代碼,將輸出重定向到txt文件,使用PyCharm自帶的文本比較工具進行比較,可以發現保存的模型和加載的模型的參數完全是相同的,說明沒有問題。
-
- 通過Tensorflow 打印模型參數 - 簡書講到的方法1,方法2,分別打印出同一個
- 按照2同樣的方法,打印不同
episode
模型的所有參數,並進行比較,發現參數是不同的,說明訓練的參數更新也是成功的,完全排除了saver
和restore
的嫌疑。 - 然后嘗試修改DQN的一些超參數,以為是學習率太低,導致更新太慢。調高學習率,沒有解決。
- 更換訓練中使用到的
trace
數據,沒有解決。 - 最后把斷點設置在了測試腳本
rl_test_2
的choose_action()
語句處。找到了最終的問題所在。
解決
我之前寫測試腳本的時候,DQN的實例化的這行代碼是直接復制訓練腳本里邊的,然而訓練的代碼是設置了epsilon
貪婪系數從0開始遞增,以進行探索。
測試腳本里這么寫是不對的,測試腳本中,貪婪系數應該設置為1,選擇最好的action。
所以解決方法就是修改這里的貪婪系數。
修改后,重新運行,一切正常。
總結
這個bug從早上9點調到下午4點,花了四五個小時,搞得我頭暈眼花。
我在寫代碼的時候確實是沒有注意到需要這個貪婪系數初始化的問題。
不過bug是難免的,重要的是,遇到bug也不要怕,關鍵的是要學會通過一些方式排查問題,縮小范圍。寫一些簡單的測試小腳本來一步一步驗證自己的猜想,上邊這么啰嗦寫了一堆,也是想強調這一點,對於不是特別復雜的程序來說,按類似於這樣的思路,一定可以找到bug。