使用Panda-Gym的機器臂模擬進行Deep Q-learning強化學習
強化學習(RL)是一種機器學習方法,它允許代理通過試錯來學習如何在環境中表現。行為主體因采取行動導致預期結果而獲得獎勵,因采取行動導致預期結果而受到懲罰。隨著時間的推移,代理學會采取行動,使其預期回報最大化。
RL代理通常使用馬爾可夫決策過程(MDP)進行訓練,馬爾可夫決策過程是為順序決策問題建模的數學框架。MDP由四個部分組成:
- 狀態:環境的可能狀態的集合。
- 動作:代理可以采取的一組動作。
- 轉換函數:在給定當前狀態和動作的情況下,預測轉換到新狀態的概率的函數。
- 獎勵函數:為每次轉換分配獎勵給代理的函數。
代理的目標是學習策略函數,將狀態映射到動作。通過策略函數來最大化代理隨著時間的預期回報。
Deep Q-learning是一種使用深度神經網絡學習策略函數的強化學習算法。深度神經網絡將當前狀態作為輸入,并輸出一個值向量,每個值代表一個可能的動作。然后代理采取具有最高值的操作。
Deep Q-learning是一種基于值的強化學習算法,這意味著它學習每個狀態-動作對的值。狀態-動作對的值是agent在該狀態下采取該動作所獲得的預期獎勵。
Actor-Critic是一種結合了基于值和基于策略的RL算法。有兩個組成部分:
- Actor:參與者負責選擇操作。
- Critic:負責評價Actor的行為。
Actor和Critic同時接受訓練。Actor被訓練去最大化預期獎勵,Critic被訓練去準確地預測每個狀態-動作對的預期獎勵。
Actor-Critic算法與其他RL算法相比有幾個優點。首先它更穩定,這意味著在訓練過程中不太可能出現偏差。其次它更有效率,這意味著它可以更快地學習。第三它更具可擴展性,這意味著它可以應用于具有大型狀態和操作空間的問題。
下面的表格總結了Deep Q-learning和Actor-Critic之間的主要區別:
Actor-Critic (A2C)的優勢
Actor-Critic是一種流行的強化學習架構,它結合了基于策略和基于價值的方法。它有幾個優點,使其成為解決各種強化學習任務的強大選擇:
1、低方差
與傳統的策略梯度方法相比,A2C 在訓練期間通常具有更低的方差。這是因為 A2C 同時使用了策略梯度和值函數,通過值函數來減小梯度的方差。低方差意味著訓練過程更加穩定,能夠更快地收斂到較好的策略。
2、更快的學習速度
由于低方差的特性,A2C 通常能夠以更快的速度學習到一個良好的策略。這對于那些需要進行大量模擬的任務來說尤為重要,因為較快的學習速度可以節省寶貴的時間和計算資源。
3、結合策略和值函數
A2C 的一個顯著特點是它同時學習策略和值函數。這種結合使得代理能夠更好地理解環境和動作的關聯,從而更好地指導策略改進。值函數的存在還有助于減小策略優化中的誤差,提高訓練的效率。
4、支持連續和離散動作空間
A2C 可以輕松適應不同類型的動作空間,包括連續和離散動作。這種通用性使得 A2C 成為一個廣泛適用的強化學習算法,可以應用于各種任務,從機器人控制到游戲玩法優化。
5、并行訓練
A2C 可以輕松地并行化,充分利用多核處理器和分布式計算資源。這意味著可以在更短的時間內收集更多的經驗數據,從而提高訓練效率。
雖然Actor-Critic方法提供了一些優勢,但它們也有自己的挑戰,例如超參數調優和訓練中的潛在不穩定性。但是通過適當的調整和經驗回放和目標網絡等技術,這些挑戰可以在很大程度上得到緩解,使Actor-Critic成為強化學習中有價值的方法。
panda-gym
panda-gym 基于 PyBullet 引擎開發,圍繞 panda 機械臂封裝了 reach、push、slide、pick&place、stack、flip 等 6 個任務,主要也是受 OpenAI Fetch 啟發。
我們下面的代碼將使用panda-gym作為示例:
1、安裝庫
代碼首先初始化強化學習環境:
!apt-get install -y \
libgl1-mesa-dev \
libgl1-mesa-glx \
libglew-dev \
xvfb \
libosmesa6-dev \
software-properties-common \
patchelf
!pip install \
free-mujoco-py \
pytorch-lightning \
optuna \
pyvirtualdisplay \
PyOpenGL \
PyOpenGL-accelerate\
stable-baselines3[extra] \
gymnasium \
huggingface_sb3 \
huggingface_hub \
panda_gym
2、導入庫
import os
import gymnasium as gym
import panda_gym
from huggingface_sb3 import load_from_hub, package_to_hub
from stable_baselines3 import A2C
from stable_baselines3.common.evaluation import evaluate_policy
from stable_baselines3.common.vec_env import DummyVecEnv, VecNormalize
from stable_baselines3.common.env_util import make_vec_env
3、創建運行環境
env_id = "PandaReachDense-v3"
# Create the env
env = gym.make(env_id)
# Get the state space and action space
s_size = env.observation_space.shape
a_size = env.action_space
print("\n _____ACTION SPACE_____ \n")
print("The Action Space is: ", a_size)
print("Action Space Sample", env.action_space.sample()) # Take a random action
4、觀察和獎勵的規范化
強化學習優化的一個好方法是對輸入特征進行歸一化。我們通過包裝器計算輸入特征的運行平均值和標準偏差。同時還通過添加norm_reward = True來規范化獎勵
env = make_vec_env(env_id, n_envs=4)
env = VecNormalize(env, norm_obs=True, norm_reward=True, clip_obs=10.)
5、創建A2C模型
我們使用Stable-Baselines3團隊訓練過的官方代理
model = A2C(policy = "MultiInputPolicy",
env = env,
verbose=1)
6、訓練A2C
model.learn(1_000_000)
# Save the model and VecNormalize statistics when saving the agent
model.save("a2c-PandaReachDense-v3")
env.save("vec_normalize.pkl")
7、評估代理
from stable_baselines3.common.vec_env import DummyVecEnv, VecNormalize
# Load the saved statistics
eval_env = DummyVecEnv([lambda: gym.make("PandaReachDense-v3")])
eval_env = VecNormalize.load("vec_normalize.pkl", eval_env)
# We need to override the render_mode
eval_env.render_mode = "rgb_array"
# do not update them at test time
eval_env.training = False
# reward normalization is not needed at test time
eval_env.norm_reward = False
# Load the agent
model = A2C.load("a2c-PandaReachDense-v3")
mean_reward, std_reward = evaluate_policy(model, eval_env)
print(f"Mean reward = {mean_reward:.2f} +/- {std_reward:.2f}")
總結
在“panda-gym”將Panda機械臂和GYM環境有效的結合使得我們可以輕松的在本地進行機械臂的強化學習,Actor-Critic架構中代理會學會在每個時間步驟中進行漸進式改進,這與稀疏的獎勵函數形成對比(在稀疏的獎勵函數中結果是二元的),這使得Actor-Critic方法特別適合于此類任務。
通過將策略學習和值估計無縫結合,代理能夠熟練地操縱機械臂末端執行器到達指定的目標位置。這不僅為機器人控制等任務提供了實用的解決方案,而且還具有改變各種需要敏捷和明智決策的領域的潛力。