除錯 RL 時應考慮的事項¶
一般¶
您是否已在幾個小型、玩具問題(具有已知的最佳回報,例如網格世界、登山車)上驗證您的演算法實作?¶
原因:這將揭示您實作中的任何極端錯誤。
您是否已視覺化您的代理?¶
原因:這將揭示學習曲線不會告訴您的事情(即,電玩遊戲中的錯誤或漏洞)。
請非常小心任何資料擴增。¶
原因:資料擴增無法以與 CV 相同的方式應用於 RL,因為代理需要根據觀察採取行動。 例如,翻轉圖像可能會相應地「翻轉」適當的動作。
策略¶
您的策略的熵是否收斂太快、太慢或發生劇烈變化?¶
原因:這可能取決於演算法,但策略的熵大致與動作的預期值成反比。
處方:調整熵獎勵的係數(即 PPO 中的 beta)可以幫助熵收斂太快/太慢。 或者,如果收斂太快/太慢,降低/增加獎勵的幅度也可能有所幫助。 熵曲線發生劇烈階躍變化通常是問題表述(即,觀察或動作空間)、學習率、梯度範數或實作中的錯誤所導致的下游問題。
獎勵(超出「上升」)¶
代理是否偏愛獎勵函數的單個組成部分(即速度與 L2 動作幅度)?¶
原因:可能是獎勵函數的其中一個組成部分更容易優化,因此代理會將該行為視為局部最佳解。
處方:除了調整獎勵組成部分的係數外,使用組成部分的乘積代替總和也可能是有意義的。 追蹤關於每個獎勵組成部分的統計數據也可能會產生洞察力。 或者,如果某些組成部分被認為是「輔助」的,則隨時間衰減權重可能會有所幫助。
任務的時間範圍是否極長?¶
原因:信用分配(即將未來/有價值的獎勵歸因於過去的狀態/動作)會隨著動作和相應獎勵之間的時間增加而變得更加困難。在稀疏獎勵的環境中,這可能成為訓練效率低下的根源,需要與環境進行大量互動。
建議:為最終目標有幫助的行為增加中間獎勵可以大大提高訓練速度(例如,在足球環境中,踢球的中間獎勵將增加智能體發現進球是有獎勵的可能性)。然而,這可能會產生不希望出現的最佳解,因為利用中間獎勵可能無意中比真正的獎勵更有價值,或導致不希望出現的特殊行為。可以使用基於步驟或獎勵的課程來將此中間獎勵的價值衰減至零。或者,如果有很多子任務,可以使用分層或基於選項的框架,為不同的子任務(例如,踢球、傳球、跑步)學習個別策略,然後由更高等級的智能體從這些低等級策略中選擇作為其動作空間。請注意,這個問題也可能屬於「探索」部分,需要明確的探索機制,例如內在好奇心模組。
您的獎勵是否已正規化/標準化?¶
原因:數量級較大的獎勵會主導較小的獎勵。此外,如果每個時間步的獎勵變得非常大,價值函數的目標也會變得巨大,因為它們是每個時間步獎勵的總和。
建議:通常,將獎勵保持在[-1,1]之間是一個好的做法。或者,您可以使用 running mean/std 實例正規化(例如,TorchRL 的 implementation 或 Gym 的 implementation)。
探索¶
價值損失是否在訓練初期上升?¶
原因:通常,在初始化時,價值估計值約為 0.0。在訓練初期,智能體可能會遇到新的、未見過的外在獎勵,因為它在探索,所以價值估計值會是錯誤的,損失會上升。
建議:通過內在獎勵或熵獎勵增加探索。或者,通過添加中間獎勵使獎勵函數更密集。
動作是否在訓練初期(大致)均勻/常態隨機?¶
原因:如果沒有使用先驗知識,則新初始化的網路應該接近隨機。這對於智能體實現適當的探索非常重要。
建議:檢查策略網路是否已適當初始化,以及策略熵是否沒有快速下降。
在單例任務中,內在獎勵是否隨著學習進度的進行而衰減?¶
原因:內在獎勵旨在鼓勵探索,通常通過某種新穎性度量。隨著智能體的探索,額外探索(或重新訪問先前探索過的狀態動作)的價值會隨著新穎性降低而降低。理想情況下,隨著內在獎勵開始下降,外在獎勵應該開始增加。
建議:內在獎勵應該正規化。如果內在獎勵已降至 0 但智能體沒有學到任何東西,則可以嘗試減慢內在模組的動態(即,降低隨機網路蒸餾的學習率或添加雜訊)。
在情節式任務中,情節式內在獎勵是否保持不變或隨著學習進度的進行而增加?¶
原因:內在獎勵旨在鼓勵探索,通常通過某種新穎性度量。在情節式任務中,由於新穎性可能不會降低,並且探索行為實際上可能會改善,因此內在獎勵應保持不變或增加。
建議:外在獎勵當然也應該增加。如果情況並非如此,則可能意味著兩個目標未對齊,並且兩者之間存在權衡。如果這種權衡是不可避免的,那麼外在獎勵需要優先於情節式獎勵。實現此目的的一些方法是在情節式獎勵上使用衰減排程,具有單獨的探索(僅帶情節式獎勵)和利用(僅帶外在獎勵)策略,並使用探索策略為利用策略生成更多樣化的起始狀態,或使用行為克隆來引導訓練。此外,內在獎勵應正規化。
環境動態¶
您可以訓練低熵的前向動態和/或獎勵模型(也適用於離線 RL)嗎?¶
原因:下一個狀態和獎勵用於在 RL 算法中生成價值學習的目標。如果這些目標非常嘈雜,那麼目標也會很嘈雜,學習可能會很慢或不穩定。環境可能本質上是隨機的(即,敵人的隨機生成),obs 空間的公式可能缺少變數(即,POMDP),或者對先前狀態的依賴性可能非常鬆散甚至不存在。
建議:根據雜訊的來源,重新審視觀察公式可能很有用,以確保它包含所有必要信息,網路架構可以處理先前狀態的序列而不僅僅是最後一個狀態(即,LSTM、Transformer),甚至可以使用分佈式 RL 算法來明確地模擬價值的分配(而不僅僅是預期價值)。
觀察空間¶
您的觀察是否已正規化/標準化?¶
原因:具有相同相對比例的輸入和輸出目標往往更穩定,因為網路權重不需要變得非常大/小來補償。出於同樣的原因,學習往往更快,因為網路權重被初始化為適當的比例,並且不需要通過梯度下降到達那裡。此外,如果觀察特徵之間存在極大的比例差異(例如,[-1,+1] vs. [-1000, 1000]),則較大的特徵可能會在權重可以補償之前主導較小的特徵。
建議:如果您知道這些值的最小值/最大值範圍,則可以手動正規化到 [0,1] 的範圍。或者,您可以使用 running mean/std 實例正規化(例如,TorchRL 的 implementation 或 Gym 的 implementation)。平均值和標準差將在訓練開始時發生根本性的變化,但隨著更多數據的收集,它們會緩慢收斂。 如果穩定性存在問題,可以在進行任何更新之前收集一個大的緩衝區來計算起始平均值和標準差。
動作空間¶
在一個 episode 期間,動作的效果是否發生顯著變化?¶
原因:如果一個動作在訓練初期導致失敗,agent 可能會學到永遠不要執行它,這可能會阻止它完全解決任務(例如,「提交你的工作」這個動作)。
建議:問題可能應該以分層方式構建(例如,一個學習「提交工作」的 agent)。此外,充分的探索在這種情況下變得非常重要。
動作空間的維度是否太高?¶
原因:如果動作空間非常大(例如,推薦系統),則可能無法充分探索整個動作空間。
建議:為了減輕這種情況,可以手動修剪動作空間,或者開發依賴於狀態的啟發法來遮罩/過濾 agent 可用的動作(例如,在某些 Atari 遊戲中遮罩“fire”動作,或者在國際象棋中遮罩非法移動),或者組合動作/動作序列(例如,操作任務中的抓取和釋放動作可以是同一個動作,也可以是基本動作序列)。如果這不可行,則存在替代方法,例如 top-p 採樣,其中您僅從累積機率為 p 的頂部動作中進行採樣。
你的動作是否已正規化/標準化?¶
原因:具有相同相對尺度的輸入和輸出目標往往更穩定,因為網路權重不需要變得非常大/非常小來進行補償。出於同樣的原因,學習往往更快,因為網路權重被初始化到適當的尺度,並且不需要通過梯度下降到達那裡。在某些演算法中,動作可以作為 Q 函數的輸入,而在其他演算法中,梯度可以直接通過動作輸出流入策略(例如,Soft Actor-Critic 中的重新參數化),因此合理縮放的動作非常重要。
建議:通常會clip 將策略的動作輸出限制在合理的範圍內。請注意,這個被 clip 的動作不應該(與原始動作相反)用於訓練,因為 clip 操作不是計算圖的一部分,並且梯度將不正確。這應該被認為是環境的一部分,因此策略將學習到有界區域中的動作會帶來更高的獎勵。也可以使用擠壓函數,例如 tanh。這可以是計算圖的一部分,為了有效地做到這一點,應該修正對數機率,例如 這裡所做的那樣。如果已正規化,請記住在環境端將動作重新映射到原始動作空間。