官术网_书友最值得收藏!

8.2 N步DQN

我們將實現和評估的第一個改進是一個相當古老的辦法。它由Rchard Sutton首次在論文“Learning to Predict by the Methods of Temporal Differences”[2]中引入。為了弄清楚這個方法,再看一下Q-learning中用到的Bellman更新:

167-01

等式是遞歸的,意味著可以根據表達式自己來表示Q(st+1, at+1),結果如下:

167-02

ra,t+1意味著在t+1時刻執行動作a后的立即獎勵。然而,如果假設t+1時刻選擇的動作a是最優的或接近最優的,我們可以省去maxa操作,得到:

167-03

這個值可以一次又一次地展開。你可能已經猜到了,通過將1步狀態轉移替換成更長的n步狀態轉移序列,就可以將這種展開輕易地應用到DQN更新中。為了理解為什么這種展開會提升訓練速度,我們來考慮圖8.3展示的示例。圖中有一個簡單的4個狀態(s1, s2, s3, s4)的環境,并且除了終結狀態s4,每個狀態都只有一個可用的動作。

167-04

圖8.3 一個簡單環境的狀態轉移圖

所以在1步的情況下會發生什么?我們總共有三個可能的更新(不使用max,因為這里只有一個可用動作):

1)Q(s1, a)←r1+γQ(s2, a)。

2)Q(s2, a)←r2+γQ(s3, a)。

3)Q(s3, a)←r3。

想象一下,在訓練開始時,順序地完成前面的更新。前兩個更新是沒有用的,因為當前Q(s2, a)和Q(s2, a)是不對的,并且只包含初始的隨機值。唯一有用的更新是第3個更新,它將獎勵r3正確地賦給終結狀態前的狀態s3。

現在來完成一次又一次的更新。在第2次迭代,正確的值被賦給了Q(s2, a),但是Q(s1, a)的更新還是不對的。只有在第3次迭代時才能給所有的Q賦上正確的值。所以,即使在1步的情況下,它也需要3步才能將正確的值傳播給所有的狀態。

現在考慮一下2步的情況。這種情況下還是有3個更新:

1)Q(s1, a)←r1+γr2+γ2Q(s3, a)。

2)Q(s2, a)←r2+γr3

3)Q(s3, a)←r3。

在這種情況下,第一次更新迭代會將正確的值賦給Q(s2, a)和Q(s3, a)。第二次迭代,Q(s1, a)也會被正確地更新。所以多步可以提升值的傳播速度,也就是會加速收斂。你可能會想,“如果它這么有用,那就直接提前展開100步Bellman方程好了。它將使收斂速度提高100倍嗎?”很不幸的是,答案是不會。

和我們期望所不同的是,DQN將完全無法收斂。要理解為什么,我們再次回到展開過程,尤其是將maxa丟掉的地方。它正確嗎?嚴格來說,不是的。我們省略了中間步驟的max運算,并假設基于經驗(或者策略)選擇的動作是最優的,但它其實不是最優的,例如,在訓練一開始智能體的動作就是隨機的。在這種情況下,計算出來的Q(st, at)值可能比狀態的最優值要小一些(因為一些步驟會隨機選擇,而不是沿著由最大Q值計算出來的路徑前進的)。展開越多步的Bellman方程,更新可能會越不準確。

龐大的經驗回放緩沖區可能會讓情況變得更糟,因為它增加了從先前劣等策略(取決于之前不準確的Q近似)獲取狀態轉移的概率。這將導致當前Q近似的錯誤更新,所以它很輕易就破壞了訓練的進度。正如我們在第4章談及RL方法的分類時所提到的那樣,這個問題是RL方法的基本特征。

我們有兩個大類方法:離線策略在線策略方法。第一類離線策略方法不依賴于“數據的更新”。例如,簡單DQN是離線策略的,意味著我們可以使用好幾百萬步之前從環境中采樣得到的很舊的數據,用這些數據來訓練還是會很有效。這是因為我們使用立即獎勵加上帶折扣的當前近似最優動作值來更新動作的QQ(st, at)。即使at是隨機采樣的也沒有關系,因為于狀態st而言,對于特定動作at的更新是正確的。這就是為什么使用離線策略方法,我們可以使用非常大的經驗緩沖區來讓數據更符合獨立同分布(i.i.d.)。

在線策略方法在很大程度上取決于正在更新的當前策略要采樣的訓練數據。這是因為在線策略方法試圖間接(比如之前的N步DQN)或直接(本書的第三部分全部在討論這些方法)地改善當前的策略。

那么哪種方法更好?這要分情況。離線策略方法允許你基于之前的大量歷史數據,甚至是人類的構造數據來訓練,但它們通常收斂得比較慢。在線策略方法通常更快,但是需要從環境采樣更多新鮮的數據,這可能很費力。想象一下使用在線策略方法的無人駕駛汽車。在此系統學會墻和樹是它應該繞開的東西之前,它將撞毀大量的汽車。

你可能有一個問題:如果“n步”會變成一種在線策略方法,那為什么還要談論N步DQN,這將使我們豐富的回放緩沖區毫無用處?實際上,這通常不是非黑即白的。你仍然可以使用N步DQN,因為它有助于加速DQN的訓練,但是需要謹慎地選擇步長n。較小的2或3步通常效果很好,因為經驗緩沖區的軌跡和1步轉移時的區別不大。在這種情況下,收斂速度通常會成比例地提升,但是較大的n值可能會破壞訓練過程。所以步長n是需要調優的,收斂速度的提升讓這樣的調優是值得的。

8.2.1 實現

因為ExperienceSourceFirstLast類已經支持多步Bellman展開了,所以N步DQN很簡單。針對基礎DQN做兩個改動就可以將其變成n步的版本:

  • 在創建ExperienceSourceFirstLast時為steps_count參數傳入想要展開的步數。
  • calc_loss_dqn函數傳入一個正確的γ。這個改動很容易被忽視,不改的話可能會不利于收斂。由于Bellman方程現在是n步的,經驗鏈最后一個狀態的折扣因子不再是γ而是γn。

你可以在Chapter08/02_dqn_n_steps.py找到完整的示例代碼,這里只給出改動的代碼:

169-01

args.n的值是傳入的命令行參數中的步數,默認使用4步。另一個修改之處是傳給calc_loss_dqn函數的gamma

169-02

8.2.2 結果

訓練模塊Chapter08/02_dqn_n_steps.py可以和之前一樣啟動,使用一個額外的命令行選項-n,它用來指定Bellman方程展開的步數。

圖8.4是基線和N步DQN的獎勵和片段步數圖,其中n等于2和3。如你所見,Bellman展開極大地提升了收斂速度。

169-03

圖8.4 基礎(單步)DQN(對應基線)和N步DQN的獎勵和片段步數

可以看到,3步DQN的收斂速度是普通DQN的兩倍,這是一個很不錯的改進。那么,對于更大的n結果會怎樣呢?圖8.5展示了n等于3、4、5和6時的獎勵動態。

170-01

圖8.5 多步DQN之間的比較

如你所見,從3步到4步確實有一點提升,但是比之前提升得少很多。n=5基本和n=4差不多,n=6則表現得更差,所以,在本例中,n=4看起來是最優的。

主站蜘蛛池模板: 通许县| 蓬安县| 阳江市| 昭苏县| 泾阳县| 嘉峪关市| 濮阳市| 霍林郭勒市| 腾冲县| 黔东| 太原市| 巴林右旗| 龙川县| 阳信县| 乐山市| 项城市| 临高县| 白银市| 北票市| 武强县| 广河县| 油尖旺区| 宜宾市| 德惠市| 沐川县| 建宁县| 景泰县| 平和县| 南溪县| 千阳县| 任丘市| 邛崃市| 荃湾区| 石景山区| 广水市| 瓮安县| 麻阳| 邯郸市| 张家川| 多伦县| 曲周县|