深度強化學習課程文件
實戰
並獲得增強的文件體驗
開始使用
實戰
既然你已經學習了深度 Q-學習的理論,你已經準備好訓練你的深度 Q-學習智慧體來玩雅達利遊戲了。我們將從《太空侵略者》開始,但你可以使用任何你想要的雅達利遊戲 🔥
我們使用的是 RL-Baselines-3 Zoo 整合,這是一個 Deep Q-Learning 的原始版本,沒有像 Double-DQN、Dueling-DQN 或優先經驗回放等擴充套件。
此外,如果你想在此實戰後自己學習如何實現深度 Q-學習,你絕對應該看看 CleanRL 的實現:https://github.com/vwxyzjn/cleanrl/blob/master/cleanrl/dqn_atari.py
為了驗證本次實戰並獲得認證,你需要將訓練好的模型上傳到 Hub,並獲得 >= 200 的結果。
要查詢你的結果,請前往排行榜並找到你的模型,結果 = 平均獎勵 - 獎勵標準差
如果你沒有找到你的模型,請滾動到頁面底部並點選重新整理按鈕。
有關認證過程的更多資訊,請檢視此部分 👉 https://huggingface.co/deep-rl-course/en/unit0/introduction#certification-process
你可以在這裡檢視你的進度 👉 https://huggingface.co/spaces/ThomasSimonini/Check-my-progress-Deep-RL-Course
要開始動手實踐,請點選“在 Colab 中開啟”按鈕 👇
單元 3:使用 RL Baselines3 Zoo 在雅達利遊戲中進行深度 Q-學習 👾
在本次實戰中,你將**訓練一個深度 Q-學習智慧體**來玩《太空侵略者》,使用 RL Baselines3 Zoo,這是一個基於 Stable-Baselines3 的訓練框架,提供用於訓練、評估智慧體、調整超引數、繪製結果和錄製影片的指令碼。
我們使用的是 RL-Baselines-3 Zoo 整合,這是一個原始版本的深度 Q-學習,沒有 Double-DQN、Dueling-DQN 和優先經驗回放等擴充套件。
🎮 環境:
你可以在這裡看到《太空侵略者》不同版本之間的區別 👉 https://gymnasium.llms.tw/environments/atari/space_invaders/#variants
📚 RL 庫:
本次實戰的目標 🏆
在本次實戰結束時,你將:
- 能夠更深入地理解 RL Baselines3 Zoo 的工作原理。
- 能夠將你訓練好的智慧體和程式碼上傳到 Hub,並附帶精彩的影片回放和評估分數 🔥。
先決條件 🏗️
在深入實踐之前,你需要
🔲 📚 透過閱讀單元 3 學習深度 Q-學習 🤗
我們一直在努力改進我們的教程,因此,如果你在此實戰中發現任何問題,請在 Github Repo 上提交問題。
讓我們訓練一個玩雅達利《太空侵略者》的深度 Q-學習智慧體 👾 並將其上傳到 Hub。
我們強烈建議學生使用 Google Colab 進行實踐練習,而不是在個人電腦上執行。
透過使用 Google Colab,你可以專注於學習和實驗,而無需擔心環境設定的技術方面。
為了驗證本次實戰並獲得認證,你需要將訓練好的模型上傳到 Hub,並獲得 >= 200 的結果。
要查詢你的結果,請前往排行榜並找到你的模型,結果 = 平均獎勵 - 獎勵標準差
有關認證過程的更多資訊,請檢視此部分 👉 https://huggingface.co/deep-rl-course/en/unit0/introduction#certification-process
設定 GPU 💪
- 為了加速智慧體的訓練,我們將使用 GPU。為此,請轉到
Runtime > Change Runtime type
硬體加速器 > GPU
安裝 RL-Baselines3 Zoo 及其依賴項 📚
如果你看到 ERROR: pip's dependency resolver does not currently take into account all the packages that are installed. 這是正常的,它不是一個嚴重錯誤,只是版本衝突。但是我們需要的包已經安裝好了。
# For now we install this update of RL-Baselines3 Zoo
pip install git+https://github.com/DLR-RM/rl-baselines3-zooapt-get install swig cmake ffmpeg
為了能夠在 Gymnasium 中使用 Atari 遊戲,我們需要安裝 atari 包。並接受 rom-license 以下載 rom 檔案(遊戲檔案)。
!pip install gymnasium[atari] !pip install gymnasium[accept-rom-license]
建立虛擬顯示器 🔽
在實戰過程中,我們需要生成一個回放影片。為此,如果你在無頭機器上訓練它,我們需要一個虛擬螢幕才能渲染環境(從而錄製幀)。
因此,以下單元格將安裝庫並建立並執行一個虛擬螢幕 🖥
apt install python-opengl apt install ffmpeg apt install xvfb pip3 install pyvirtualdisplay
# Virtual display
from pyvirtualdisplay import Display
virtual_display = Display(visible=0, size=(1400, 900))
virtual_display.start()訓練我們的深度 Q-學習智慧體來玩《太空侵略者》👾
要使用 RL-Baselines3-Zoo 訓練智慧體,我們只需要做兩件事
- 建立一個名為
dqn.yml的超引數配置檔案,其中包含我們的訓練超引數。
這是一個模板示例
SpaceInvadersNoFrameskip-v4:
env_wrapper:
- stable_baselines3.common.atari_wrappers.AtariWrapper
frame_stack: 4
policy: 'CnnPolicy'
n_timesteps: !!float 1e7
buffer_size: 100000
learning_rate: !!float 1e-4
batch_size: 32
learning_starts: 100000
target_update_interval: 1000
train_freq: 4
gradient_steps: 1
exploration_fraction: 0.1
exploration_final_eps: 0.01
# If True, you need to deactivate handle_timeout_termination
# in the replay_buffer_kwargs
optimize_memory_usage: False我們在這裡看到
- 我們使用
Atari Wrapper,它對輸入進行預處理(幀縮減、灰度、堆疊 4 幀) - 我們使用
CnnPolicy,因為我們使用卷積層來處理幀 - 我們訓練它 1000 萬個
n_timesteps - 記憶(經驗回放)大小為 100000,即你儲存的用於再次訓練智慧體的經驗步數。
💡 我的建議是將訓練時間步數減少到 1M,這在 P100 上大約需要 90 分鐘。!nvidia-smi 將告訴你正在使用哪個 GPU。在 1000 萬步時,這將需要大約 9 小時。我建議在本地計算機(或其他地方)執行此操作。只需點選:檔案 > 下載。
在超引數最佳化方面,我的建議是關注這三個超引數:
學習率緩衝區大小(經驗記憶大小)批處理大小
作為一項好的實踐,你需要查閱文件以瞭解每個超引數的作用:https://stable-baselines3.readthedocs.io/en/master/modules/dqn.html#parameters
- 我們開始訓練並將模型儲存到
logs資料夾 📁
- 在
--algo後定義演算法,在-f後定義模型儲存位置,在-c後定義超引數配置。
python -m rl_zoo3.train --algo ________ --env SpaceInvadersNoFrameskip-v4 -f _________ -c _________解決方案
python -m rl_zoo3.train --algo dqn --env SpaceInvadersNoFrameskip-v4 -f logs/ -c dqn.yml讓我們評估我們的智慧體 👀
- RL-Baselines3-Zoo 提供了
enjoy.py,這是一個用於評估我們智慧體的 python 指令碼。在大多數 RL 庫中,我們將評估指令碼稱為enjoy.py。 - 讓我們評估它 5000 個時間步 🔥
python -m rl_zoo3.enjoy --algo dqn --env SpaceInvadersNoFrameskip-v4 --no-render --n-timesteps _________ --folder logs/解決方案
python -m rl_zoo3.enjoy --algo dqn --env SpaceInvadersNoFrameskip-v4 --no-render --n-timesteps 5000 --folder logs/在 Hub 上釋出我們訓練好的模型 🚀
既然我們已經看到訓練後取得了良好的結果,我們可以用一行程式碼將我們訓練好的模型釋出到 hub 🤗。
透過使用 rl_zoo3.push_to_hub,你可以評估、錄製回放、生成你的智慧體的模型卡並將其推送到 hub。
透過這種方式
- 你可以展示我們的工作 🔥
- 你可以視覺化你的智慧體在玩遊戲 👀
- 你可以與社群分享一個其他人可以使用的智慧體 💾
- 你可以訪問排行榜🏆,檢視你的智慧體與同學們的表現如何 👉 https://huggingface.co/spaces/huggingface-projects/Deep-Reinforcement-Learning-Leaderboard
為了能夠與社群分享你的模型,還需要完成三個步驟
1️⃣ (如果尚未完成)建立 HF 帳戶 ➡ https://huggingface.co/join
2️⃣ 登入後,你需要從 Hugging Face 網站儲存你的身份驗證令牌。
- 建立一個新令牌(https://huggingface.co/settings/tokens),並賦予寫入許可權
- 複製令牌
- 執行下面的單元格並貼上令牌
from huggingface_hub import notebook_login # To log to our Hugging Face account to be able to upload models to the Hub.
notebook_login()
!git config --global credential.helper store如果你不想使用 Google Colab 或 Jupyter Notebook,你需要改用此命令:huggingface-cli login
3️⃣ 現在我們準備好將訓練好的智慧體推送到 🤗 Hub 🔥
讓我們執行 push_to_hub.py 檔案,將我們訓練好的智慧體上傳到 Hub。
--repo-name:倉庫名稱
-orga:你的 Hugging Face 使用者名稱
-f:訓練好的模型資料夾的位置(在本例中為 logs)
python -m rl_zoo3.push_to_hub --algo dqn --env SpaceInvadersNoFrameskip-v4 --repo-name _____________________ -orga _____________________ -f logs/解決方案
python -m rl_zoo3.push_to_hub --algo dqn --env SpaceInvadersNoFrameskip-v4 --repo-name dqn-SpaceInvadersNoFrameskip-v4 -orga ThomasSimonini -f logs/###.
恭喜 🥳 你剛剛使用 RL-Baselines-3 Zoo 訓練並上傳了你的第一個深度 Q-學習智慧體。上面的指令碼應該顯示了一個指向模型倉庫的連結,例如 https://huggingface.co/ThomasSimonini/dqn-SpaceInvadersNoFrameskip-v4。當你訪問此連結時,你可以
- 在右側檢視您的智慧體影片預覽。
- 點選“檔案和版本”以檢視儲存庫中的所有檔案。
- 點選“在 stable-baselines3 中使用”以獲取載入模型的程式碼片段。
- 一個模型卡(
README.md檔案),它提供了模型的描述和你使用的超引數。
在底層,Hub 使用基於 Git 的倉庫(如果你不瞭解 Git,別擔心),這意味著你可以在實驗並改進智慧體時使用新版本更新模型。
使用排行榜🏆比較你的智慧體和同學們的成績
載入一個強大的預訓練模型 🔥
- Stable-Baselines3 團隊已經在 Hub 上上傳了超過 150 個訓練好的深度強化學習智慧體。
你可以在這裡找到它們:👉 https://huggingface.co/sb3
一些例子
- 小行星:https://huggingface.co/sb3/dqn-AsteroidsNoFrameskip-v4
- 光束騎手:https://huggingface.co/sb3/dqn-BeamRiderNoFrameskip-v4
- 打磚塊:https://huggingface.co/sb3/dqn-BreakoutNoFrameskip-v4
- 跑路者:https://huggingface.co/sb3/dqn-RoadRunnerNoFrameskip-v4
讓我們載入一個玩 Beam Rider 的智慧體:https://huggingface.co/sb3/dqn-BeamRiderNoFrameskip-v4
- 我們使用
rl_zoo3.load_from_hub下載模型,並將其放入一個我們可以命名為rl_trained的新資料夾中
# Download model and save it into the logs/ folder
python -m rl_zoo3.load_from_hub --algo dqn --env BeamRiderNoFrameskip-v4 -orga sb3 -f rl_trained/- 讓我們評估它 5000 個時間步
python -m rl_zoo3.enjoy --algo dqn --env BeamRiderNoFrameskip-v4 -n 5000 -f rl_trained/ --no-render為什麼不嘗試訓練你自己的玩 BeamRiderNoFrameskip-v4 的深度 Q-學習智慧體? 🏆
如果你想嘗試,請檢視https://huggingface.co/sb3/dqn-BeamRiderNoFrameskip-v4#hyperparameters,在模型卡中,你可以找到已訓練智慧體的超引數。
但是尋找超引數可能是一項艱鉅的任務。幸運的是,我們將在下一單元中看到如何使用 Optuna 最佳化超引數 🔥。
一些額外的挑戰 🏆
學習的最好方式就是自己動手嘗試!
在排行榜中你會找到你的智慧體。你能名列前茅嗎?
以下是一些可以嘗試訓練智慧體的環境列表
- 光束騎手無跳幀-v4
- 打磚塊無跳幀-v4
- 耐力賽無跳幀-v4
- 乒乓球無跳幀-v4
此外,如果你想自己學習如何實現深度 Q-學習,你絕對應該看看 CleanRL 的實現:https://github.com/vwxyzjn/cleanrl/blob/master/cleanrl/dqn_atari.py
恭喜你完成了本章!
如果你仍然對所有這些元素感到困惑……這完全正常!我和所有學習強化學習的人都經歷過同樣的情況。
花時間真正掌握材料,然後再繼續並嘗試額外的挑戰。掌握這些元素並打下堅實的基礎非常重要。
在下一單元,我們將學習 Optuna。在深度強化學習中,找到一組好的訓練超引數是最關鍵的任務之一。而 Optuna 是一個幫助你自動化搜尋過程的庫。
這是一個與你一起構建的課程 👷🏿♀️
最後,我們希望根據您的反饋迭代改進和更新課程。如果您有任何反饋,請填寫此表格 👉 https://forms.gle/3HgA7bEHwAmmLfwh9
我們一直在努力改進我們的教程,因此,如果你在此筆記本中發現任何問題,請在 Github Repo 上提交問題。
附加單元 2 再見!🔥