開始使用免費開始

固定 Q 目標(Fixed Q-targets)

你即將使用固定 Q 目標來訓練 Lunar Lander。在開始之前,你需要分別建立線上網路(用來選擇動作)與目標網路(用於 TD 目標計算)。

你也需要實作一個 update_target_network 函式,之後可以在每個訓練步驟中使用。目標網路不透過梯度下降更新;相反地,update_target_network 會以一個很小的幅度,將它的權重往 Q 網路靠攏,確保它在時間上保持相當穩定。

注意:僅在此練習中,我們使用非常小的網路,方便列印並檢視其狀態字典。它只有 1 個大小為 2 的隱藏層;其動作空間與狀態空間的維度也都是 2。

環境中已提供 print_state_dict() 函式,可用於列印狀態字典。

本練習屬於課程

Python 的深度強化學習

檢視課程

練習說明

  • 取得目標網路與線上網路各自的 .state_dict()。
  • 使用 tau 作為線上網路的權重,將線上網路與目標網路的參數做加權平均,來更新目標網路的狀態字典。
  • 將更新後的狀態字典載回目標網路。

動手互動練習

試著完成這個範例程式碼,體驗一下這個練習。

def update_target_network(target_network, online_network, tau):
    # Obtain the state dicts for both networks
    target_net_state_dict = ____
    online_net_state_dict = ____
    for key in online_net_state_dict:
        # Calculate the updated state dict for the target network
        target_net_state_dict[key] = (online_net_state_dict[____] * ____ + target_net_state_dict[____] * ____)
        # Load the updated state dict into the target network
        target_network.____
    return None
  
print("online network weights:", print_state_dict(online_network))
print("target network weights (pre-update):", print_state_dict(target_network))
update_target_network(target_network, online_network, .001)
print("target network weights (post-update):", print_state_dict(target_network))
編輯並執行程式碼