使用Panda-Gym的機(jī)器臂模擬進(jìn)行Deep Q-learning強(qiáng)化學(xué)習(xí)
強(qiáng)化學(xué)習(xí)(RL)是一種機(jī)器學(xué)習(xí)方法,它允許代理通過試錯(cuò)來學(xué)習(xí)如何在環(huán)境中表現(xiàn)。行為主體因采取行動導(dǎo)致預(yù)期結(jié)果而獲得獎(jiǎng)勵(lì),因采取行動導(dǎo)致預(yù)期結(jié)果而受到懲罰。隨著時(shí)間的推移,代理學(xué)會采取行動,使其預(yù)期回報(bào)最大化。
RL代理通常使用馬爾可夫決策過程(MDP)進(jìn)行訓(xùn)練,馬爾可夫決策過程是為順序決策問題建模的數(shù)學(xué)框架。MDP由四個(gè)部分組成:
- 狀態(tài):環(huán)境的可能狀態(tài)的集合。
- 動作:代理可以采取的一組動作。
- 轉(zhuǎn)換函數(shù):在給定當(dāng)前狀態(tài)和動作的情況下,預(yù)測轉(zhuǎn)換到新狀態(tài)的概率的函數(shù)。
- 獎(jiǎng)勵(lì)函數(shù):為每次轉(zhuǎn)換分配獎(jiǎng)勵(lì)給代理的函數(shù)。
代理的目標(biāo)是學(xué)習(xí)策略函數(shù),將狀態(tài)映射到動作。通過策略函數(shù)來最大化代理隨著時(shí)間的預(yù)期回報(bào)。
Deep Q-learning是一種使用深度神經(jīng)網(wǎng)絡(luò)學(xué)習(xí)策略函數(shù)的強(qiáng)化學(xué)習(xí)算法。深度神經(jīng)網(wǎng)絡(luò)將當(dāng)前狀態(tài)作為輸入,并輸出一個(gè)值向量,每個(gè)值代表一個(gè)可能的動作。然后代理采取具有最高值的操作。
Deep Q-learning是一種基于值的強(qiáng)化學(xué)習(xí)算法,這意味著它學(xué)習(xí)每個(gè)狀態(tài)-動作對的值。狀態(tài)-動作對的值是agent在該狀態(tài)下采取該動作所獲得的預(yù)期獎(jiǎng)勵(lì)。
Actor-Critic是一種結(jié)合了基于值和基于策略的RL算法。有兩個(gè)組成部分:
- Actor:參與者負(fù)責(zé)選擇操作。
- Critic:負(fù)責(zé)評價(jià)Actor的行為。
Actor和Critic同時(shí)接受訓(xùn)練。Actor被訓(xùn)練去最大化預(yù)期獎(jiǎng)勵(lì),Critic被訓(xùn)練去準(zhǔn)確地預(yù)測每個(gè)狀態(tài)-動作對的預(yù)期獎(jiǎng)勵(lì)。
Actor-Critic算法與其他RL算法相比有幾個(gè)優(yōu)點(diǎn)。首先它更穩(wěn)定,這意味著在訓(xùn)練過程中不太可能出現(xiàn)偏差。其次它更有效率,這意味著它可以更快地學(xué)習(xí)。第三它更具可擴(kuò)展性,這意味著它可以應(yīng)用于具有大型狀態(tài)和操作空間的問題。
下面的表格總結(jié)了Deep Q-learning和Actor-Critic之間的主要區(qū)別:
Actor-Critic (A2C)的優(yōu)勢
Actor-Critic是一種流行的強(qiáng)化學(xué)習(xí)架構(gòu),它結(jié)合了基于策略和基于價(jià)值的方法。它有幾個(gè)優(yōu)點(diǎn),使其成為解決各種強(qiáng)化學(xué)習(xí)任務(wù)的強(qiáng)大選擇:
1、低方差
與傳統(tǒng)的策略梯度方法相比,A2C 在訓(xùn)練期間通常具有更低的方差。這是因?yàn)?A2C 同時(shí)使用了策略梯度和值函數(shù),通過值函數(shù)來減小梯度的方差。低方差意味著訓(xùn)練過程更加穩(wěn)定,能夠更快地收斂到較好的策略。
2、更快的學(xué)習(xí)速度
由于低方差的特性,A2C 通常能夠以更快的速度學(xué)習(xí)到一個(gè)良好的策略。這對于那些需要進(jìn)行大量模擬的任務(wù)來說尤為重要,因?yàn)檩^快的學(xué)習(xí)速度可以節(jié)省寶貴的時(shí)間和計(jì)算資源。
3、結(jié)合策略和值函數(shù)
A2C 的一個(gè)顯著特點(diǎn)是它同時(shí)學(xué)習(xí)策略和值函數(shù)。這種結(jié)合使得代理能夠更好地理解環(huán)境和動作的關(guān)聯(lián),從而更好地指導(dǎo)策略改進(jìn)。值函數(shù)的存在還有助于減小策略優(yōu)化中的誤差,提高訓(xùn)練的效率。
4、支持連續(xù)和離散動作空間
A2C 可以輕松適應(yīng)不同類型的動作空間,包括連續(xù)和離散動作。這種通用性使得 A2C 成為一個(gè)廣泛適用的強(qiáng)化學(xué)習(xí)算法,可以應(yīng)用于各種任務(wù),從機(jī)器人控制到游戲玩法優(yōu)化。
5、并行訓(xùn)練
A2C 可以輕松地并行化,充分利用多核處理器和分布式計(jì)算資源。這意味著可以在更短的時(shí)間內(nèi)收集更多的經(jīng)驗(yàn)數(shù)據(jù),從而提高訓(xùn)練效率。
雖然Actor-Critic方法提供了一些優(yōu)勢,但它們也有自己的挑戰(zhàn),例如超參數(shù)調(diào)優(yōu)和訓(xùn)練中的潛在不穩(wěn)定性。但是通過適當(dāng)?shù)恼{(diào)整和經(jīng)驗(yàn)回放和目標(biāo)網(wǎng)絡(luò)等技術(shù),這些挑戰(zhàn)可以在很大程度上得到緩解,使Actor-Critic成為強(qiáng)化學(xué)習(xí)中有價(jià)值的方法。
panda-gym
panda-gym 基于 PyBullet 引擎開發(fā),圍繞 panda 機(jī)械臂封裝了 reach、push、slide、pick&place、stack、flip 等 6 個(gè)任務(wù),主要也是受 OpenAI Fetch 啟發(fā)。
我們下面的代碼將使用panda-gym作為示例:
1、安裝庫
代碼首先初始化強(qiáng)化學(xué)習(xí)環(huán)境:
!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、導(dǎo)入庫
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、創(chuàng)建運(yùn)行環(huán)境
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、觀察和獎(jiǎng)勵(lì)的規(guī)范化
強(qiáng)化學(xué)習(xí)優(yōu)化的一個(gè)好方法是對輸入特征進(jìn)行歸一化。我們通過包裝器計(jì)算輸入特征的運(yùn)行平均值和標(biāo)準(zhǔn)偏差。同時(shí)還通過添加norm_reward = True來規(guī)范化獎(jiǎng)勵(lì)
env = make_vec_env(env_id, n_envs=4)
env = VecNormalize(env, norm_obs=True, norm_reward=True, clip_obs=10.)
5、創(chuàng)建A2C模型
我們使用Stable-Baselines3團(tuán)隊(duì)訓(xùn)練過的官方代理
model = A2C(policy = "MultiInputPolicy",
env = env,
verbose=1)
6、訓(xùn)練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}")
總結(jié)
在“panda-gym”將Panda機(jī)械臂和GYM環(huán)境有效的結(jié)合使得我們可以輕松的在本地進(jìn)行機(jī)械臂的強(qiáng)化學(xué)習(xí),Actor-Critic架構(gòu)中代理會學(xué)會在每個(gè)時(shí)間步驟中進(jìn)行漸進(jìn)式改進(jìn),這與稀疏的獎(jiǎng)勵(lì)函數(shù)形成對比(在稀疏的獎(jiǎng)勵(lì)函數(shù)中結(jié)果是二元的),這使得Actor-Critic方法特別適合于此類任務(wù)。
通過將策略學(xué)習(xí)和值估計(jì)無縫結(jié)合,代理能夠熟練地操縱機(jī)械臂末端執(zhí)行器到達(dá)指定的目標(biāo)位置。這不僅為機(jī)器人控制等任務(wù)提供了實(shí)用的解決方案,而且還具有改變各種需要敏捷和明智決策的領(lǐng)域的潛力。