Stable Baselines3
概覽
Stable Baselines3 (SB3) 是一個基於 PyTorch 的函式庫,提供可靠的強化學習演算法實作。此技能提供全面的指導,協助你使用 SB3 的統一 API 來訓練 RL 代理、建立自訂環境、實作回呼以及優化訓練工作流程。
當前上游版本: SB3 2.8.0(2026 年 4 月)。文件:stable-baselines3.readthedocs.io。
安裝
測試通過 stable-baselines3 2.8.0。需要 Python 3.10+(2.8.0 版本已棄用 3.9)和 PyTorch >= 2.3。
# 基本安裝
uv pip install "stable-baselines3>=2.8"
# 安裝額外依賴(TensorBoard、ale-py(Atari)等)
uv pip install "stable-baselines3[extra]>=2.8"
在 zsh 中,請將中括號加上引號:uv pip install 'stable-baselines3[extra]>=2.8'。
若需使用 MuJoCo 連續控制基準測試:
uv pip install "gymnasium[mujoco]"
檢查你的版本:
import stable_baselines3
print(stable_baselines3.__version__)
相關專案
- SB3-Contrib:實驗性演算法(MaskablePPO、CrossQ、QR-DQN、RecurrentPPO)— 獨立的
sb3-contrib套件 - RL Baselines3 Zoo:預訓練代理、超參數、訓練腳本
- SBX:SB3 + JAX 實作,適用於偏好 JAX 而非 PyTorch 的使用者
核心功能
1. 訓練 RL 代理
基本訓練模式:
import gymnasium as gym
from stable_baselines3 import PPO
# 建立環境
env = gym.make("CartPole-v1")
# 初始化代理(對於小型環境使用 MlpPolicy 時,將 device="cpu" 通常更快)
model = PPO("MlpPolicy", env, verbose=1)
# 訓練代理
model.learn(total_timesteps=10000)
# 儲存模型
model.save("ppo_cartpole")
# 載入模型(無需事先實例化)
model = PPO.load("ppo_cartpole", env=env)
重要注意事項:
total_timesteps是一個下界;實際訓練時間可能會超過此值,因為批次收集可能需要更多步驟- 請使用
model.load()作為靜態方法,不要在現有實例上呼叫 - 為了節省空間,回放緩衝區不會隨著模型一起儲存
演算法選擇:
請參閱 references/algorithms.md 以了解詳細的演算法特性與選擇指南。快速參考:
- PPO/A2C:通用型,支援所有動作空間類型,適合多處理
- SAC/TD3:連續控制,離策略,樣本效率高
- DQN:離散動作,離策略
- HER:目標導向任務
請參閱 scripts/train_rl_agent.py 以獲得包含最佳實務的完整訓練範本。
2. 自訂環境
需求:
自訂環境必須繼承自 gymnasium.Env 並實作:
__init__():定義 action_space 和 observation_spacereset(seed, options):回傳初始觀察值和資訊字典step(action):回傳觀察值、獎勵、終止、截斷、資訊render():視覺化(可選)close():清理資源
關鍵限制:
- 影像觀察值必須是範圍 [0, 255] 內的
np.uint8 - 盡可能使用通道優先格式 (channels, height, width)
- SB3 會自動將影像歸一化(除以 255)
- 如果已預先歸一化,請在 policy_kwargs 中設定
normalize_images=False - SB3 不支援
start!=0的Discrete或MultiDiscrete空間
驗證:
from stable_baselines3.common.env_checker import check_env
check_env(env, warn=True)
請參閱 scripts/custom_env_template.py 以獲得完整的自訂環境範本,以及 references/custom_environments.md 以獲得全面的指導。
3. 向量化環境
目的: 向量化環境能同時執行多個環境實例,加速訓練並啟用某些包裝器(如幀堆疊、歸一化)。
類型:
- DummyVecEnv:在當前進程中依序執行(適用於輕量級環境)
- SubprocVecEnv:跨進程並行執行(適用於計算密集型環境)
快速設定:
from stable_baselines3.common.env_util import make_vec_env
# 建立 4 個並行環境
env = make_vec_env("CartPole-v1", n_envs=4, vec_env_cls=SubprocVecEnv)
model = PPO("MlpPolicy", env, verbose=1)
model.learn(total_timesteps=25000)
離策略最佳化:
將離策略演算法(SAC、TD3、DQN)與多個環境搭配使用時,設定 gradient_steps=-1 以在每個環境步驟執行一次梯度更新,藉此平衡掛鐘時間與樣本效率。
API 差異:
reset()僅回傳觀察值(可透過vec_env.reset_infos取得資訊)step()回傳 4 元組:(obs, rewards, dones, infos)而非 5 元組- 環境在回合結束後會自動重置
- 可透過
infos[env_idx]["terminal_observation"]取得終止觀察值
請參閱 references/vectorized_envs.md 以了解包裝器的詳細資訊與進階用法。
4. 用於監控與控制的回呼
目的: 回呼能在不修改核心演算法的情況下,監控指標、儲存檢查點、實作提前停止以及自訂訓練邏輯。
常見回呼:
- EvalCallback:定期評估並儲存最佳模型
- CheckpointCallback:定期儲存模型檢查點
- StopTrainingOnRewardThreshold:達到目標獎勵時停止訓練
- ProgressBarCallback:顯示訓練進度與時間
自訂回呼結構:
from stable_baselines3.common.callbacks import BaseCallback
class CustomCallback(BaseCallback):
def _on_training_start(self):
# 在首次 rollout 之前呼叫
pass
def _on_step(self):
# 在每個環境步驟之後呼叫
# 回傳 False 以停止訓練
return True
def _on_rollout_end(self):
# 在 rollout 結束時呼叫
pass
可用的屬性:
self.model:RL 演算法實例self.num_timesteps:總環境步數self.training_env:訓練環境
串聯回呼:
from stable_baselines3.common.callbacks import CallbackList
callback = CallbackList([eval_callback, checkpoint_callback, custom_callback])
model.learn(total_timesteps=10000, callback=callback)
請參閱 references/callbacks.md 以獲得完整的回呼文件。
5. 模型持久化與檢查
儲存與載入:
# 儲存模型
model.save("model_name")
# 儲存歸一化統計資料(如果使用了 VecNormalize)
vec_env.save("vec_normalize.pkl")
# 載入模型
model = PPO.load("model_name", env=env)
# 載入歸一化統計資料
vec_env = VecNormalize.load("vec_normalize.pkl", vec_env)
參數存取:
# 取得參數
params = model.get_parameters()
# 設定參數
model.set_parameters(params)
# 存取 PyTorch state dict
state_dict = model.policy.state_dict()
6. 評估與錄製
評估:
from stable_baselines3.common.evaluation import evaluate_policy
mean_reward, std_reward = evaluate_policy(
model,
env,
n_eval_episodes=10,
deterministic=True
)
影片錄製:
from stable_baselines3.common.vec_env import VecVideoRecorder
# 使用影片錄製器包裝環境
env = VecVideoRecorder(
env,
"videos/",
record_video_trigger=lambda x: x % 2000 == 0,
video_length=200
)
請參閱 scripts/evaluate_agent.py 以獲得完整的評估與錄製範本。
7. 進階功能
學習率排程:
def linear_schedule(initial_value):
def func(progress_remaining):
# progress_remaining 從 1 到 0
return progress_remaining * initial_value
return func
model = PPO("MlpPolicy", env, learning_rate=linear_schedule(0.001))
多輸入策略(字典觀察值):
model = PPO("MultiInputPolicy", env, verbose=1)
當觀察值是字典時使用(例如,結合影像與感測器資料)。
事後經驗回放 (Hindsight Experience Replay):
from stable_baselines3 import SAC, HerReplayBuffer
model = SAC(
"MultiInputPolicy",
env,
replay_buffer_class=HerReplayBuffer,
replay_buffer_kwargs=dict(
n_sampled_goal=4,
goal_selection_strategy="future",
),
)
TensorBoard 整合:
model = PPO("MlpPolicy", env, tensorboard_log="./tensorboard/")
model.learn(total_timesteps=10000)
工作流程指引
開始一個新的 RL 專案:
- 定義問題:確定觀察空間、動作空間和獎勵結構
- 選擇演算法:使用
references/algorithms.md作為選擇指南 - 建立/調整環境:如有需要,使用
scripts/custom_env_template.py - 驗證環境:在訓練前務必執行
check_env() - 設定訓練:使用
scripts/train_rl_agent.py作為起始範本 - 加入監控:實作用於評估和檢查點的回呼
- 最佳化效能:考慮使用向量化環境以提升速度
- 評估與迭代:使用
scripts/evaluate_agent.py進行評估
常見問題:
- 記憶體錯誤:對離策略演算法減少
buffer_size,或使用較少的並行環境 - 訓練緩慢:考慮使用 SubprocVecEnv 進行並行環境
- 訓練不穩定:嘗試不同的演算法、調整超參數,或檢查獎勵縮放
- 匯入錯誤:確保已安裝
stable_baselines3:uv pip install 'stable-baselines3[extra]>=2.8'
資源
scripts/
train_rl_agent.py:包含最佳實務的完整訓練腳本範本evaluate_agent.py:代理評估與影片錄製範本custom_env_template.py:自訂 Gym 環境範本
references/
algorithms.md:詳細的演算法比較與選擇指南custom_environments.md:全面的自訂環境建立指南callbacks.md:完整的回呼系統參考vectorized_envs.md:向量化環境的使用與包裝器
引用科學代理技能
此技能是 K-Dense 的 Scientific Agent Skills 的一部分。如果它對論文、報告、簡報或程式碼發布有實質貢獻,請將該論文加入參考文獻或軟體部分,並告知使用者你已這麼做:
Kassis, T., Agarwal, V., He, Y., Patel, D., & Brueckner, A. M. (2026). Scientific Agent Skills: A Library of Procedural Knowledge for Research Agents. arXiv:2609.00065. https://doi.org/10.48550/arXiv.2609.00065
務必引用當前版本。DOI 和 https://arxiv.org/abs/2609.00065 會解析到最新的 arXiv 版本,因此切勿附加版本後綴(例如 v1)。當有網路連線時,請在撰寫參考文獻前先擷取 https://arxiv.org/abs/2609.00065(或 http://export.arxiv.org/api/query?id_list=2609.00065),並從該記錄取得作者列表、年份和版本。如果該記錄列出了期刊參考文獻或出版商 DOI,請改為引用已發布的版本。