MindSpore強化學習:使用PPO配合環境HalfCheetah-v2進行訓練

华为云开发者联盟發表於2024-04-29

本文分享自華為雲社群《MindSpore強化學習:使用PPO配合環境HalfCheetah-v2進行訓練》,作者: irrational。

半獵豹(Half Cheetah)是一個基於MuJoCo的強化學習環境,由P. Wawrzyński在“A Cat-Like Robot Real-Time Learning to Run”中提出。這個環境中的半獵豹是一個由9個連結和8個關節組成的2D機器人(包括兩個爪子)。在這個環境中,目標是透過施加扭矩在關節上使獵豹儘可能快地向前(向右)奔跑,正向獎勵基於前進的距離,而向後移動則會得到負向獎勵。獵豹的軀幹和頭部是固定的,扭矩只能施加在前後大腿、小腿和腳上。

動作空間是一個Box(-1, 1, (6,), float32),其中每個動作代表連結之間的扭矩。觀察空間包含獵豹不同身體部位的位置值和速度值,其中所有位置值在前,所有速度值在後。預設情況下,觀察不包括獵豹質心x座標,可以透過在構建時傳遞exclude_current_positions_from_observation=False來包括它。如果包括,觀察空間將有18個維度,其中第一個維度代表獵豹質心的x座標。

獎勵分為兩部分:向前獎勵和控制成本。向前獎勵是根據動作前後x座標的變化計算的,控制成本是為了懲罰獵豹採取過大動作的成本。總獎勵是向前獎勵減去控制成本。

每個狀態的開始是在狀態(0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,)上新增噪聲以增加隨機性。前8個值是位置值,最後9個值是速度值。位置值新增均勻噪聲,而初始速度值(全為零)新增標準正態噪聲。

當一個劇集的長度超過1000時,該劇集將被截斷。

該環境的詳細資訊可以參考:https://www.gymlibrary.dev/environments/mujoco/half_cheetah/

image.png

這個比很多環境都要複雜。

不過沒關係,我們有ppo演算法,這個演算法可以跑強化學習,甚至大語言模型。

PPO(Proximal Policy Optimization)演算法是一種用於強化學習的策略最佳化方法,它旨在解決傳統策略梯度方法(如TRPO,Trust Region Policy Optimization)中的信任區域問題

PPO演算法透過引入clipping技巧和重要性取樣技巧來減少計算梯度時的方差,從而提高演算法的收斂速度和穩定性。

在PPO演算法中,有兩個關鍵概念:

  • 策略(Policy):策略是一個函式,它定義了在給定狀態s時採取動作a的機率分佈。
  • 價值函式(Value Function):價值函式估計了在給定策略下,從狀態s出發,到達某個特定狀態或終端時所能獲得的期望回報。

PPO演算法的主要步驟包括:

  • 取樣(Sampling):從當前策略中取樣資料,包括狀態、動作、獎勵和下一個狀態。
  • 計算目標(Calculating Targets):使用目標策略計算目標價值函式,並計算目標策略的KL散度。
  • 更新策略(Updating Policy):使用重要性取樣技巧和clipping技巧更新策略。
  • 更新價值函式(Updating Value Function):使用策略梯度方法更新價值函式。

PPO演算法的核心思想是交替更新策略和價值函式,以實現策略和價值的共同最佳化。這種方法可以有效減少計算梯度時的方差,提高演算法的收斂速度和穩定性。

以下是PPO演算法的一個簡化的Markdown公式:
# Proximal Policy Optimization (PPO) Algorithm
## 1. Sampling
取樣當前策略的資料,包括狀態 $ s $、動作 $ a $、獎勵 $ r $ 和下一個狀態 $ s' $。
## 2. Calculating Targets
使用目標策略計算目標價值函式,並計算目標策略的KL散度。
## 3. Updating Policy
使用重要性取樣技巧和clipping技巧更新策略。
## 4. Updating Value Function
使用策略梯度方法更新價值函式。
## 重複步驟1-4,實現策略和價值的共同最佳化。

這個公式是一個簡化的版本,實際上PPO演算法還包括了許多其他細節和技巧,如經驗回放、動態調整學習率等。

import argparse
import os

from mindspore import context
from mindspore import dtype as mstype
from mindspore.communication import get_rank, init

import mindspore_rl.distribution.distribution_policies as DP
from mindspore_rl.algorithm.ppo import config
from mindspore_rl.algorithm.ppo.ppo_session import PPOSession
from mindspore_rl.algorithm.ppo.ppo_trainer import PPOTrainer

parser = argparse.ArgumentParser(description="MindSpore Reinforcement PPO")
parser.add_argument("--episode", type=int, default=650, help="total episode numbers.")
parser.add_argument(
    "--device_target",
    type=str,
    default="Auto",
    choices=["Ascend", "CPU", "GPU", "Auto"],
    help="Choose a device to run the ppo example(Default: Auto).",
)
parser.add_argument(
    "--precision_mode",
    type=str,
    default="fp32",
    choices=["fp32", "fp16"],
    help="Precision mode",
)
parser.add_argument(
    "--env_yaml",
    type=str,
    default="../env_yaml/HalfCheetah-v2.yaml",
    help="Choose an environment yaml to update the ppo example(Default: HalfCheetah-v2.yaml).",
)
parser.add_argument(
    "--algo_yaml",
    type=str,
    default=None,
    help="Choose an algo yaml to update the ppo example(Default: None).",
)
parser.add_argument(
    "--enable_distribute",
    type=bool,
    default=False,
    help="Train in distribute mode (Default: False).",
)
parser.add_argument(
    "--worker_num", type=int, default=2, help="Worker num (Default: 2)."
)
parser.add_argument(
    "--graph_op_run", type=int, default=1, help="Run kernel by kernel (Default: 1)."
)
options, _ = parser.parse_known_args()`
wget https://www.roboti.us/download/mujoco200_linux.zip
mv mujoco200_linux ~/.mujoco/mujoco200
wget https://www.roboti.us/file/mjkey.txt
cp mjkey.txt /home/kewei/.mujoco/mjkey.txt
wget https://download-ib01.fedoraproject.org/pub/epel/7/x86_64/Packages/p/patchelf-0.12-1.el7.x86_64.rpm
yum localinstall patchelf-0.12-1.el7.x86_64.rpm
pip install 'mujoco_py==2.0.2.13'

第一次編譯mujoco會有一點久

image.png

在bashrc加入如下內容:

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:~/.mujoco/mujoco200/bin
export MUJOCO_KEY_PATH=~/.mujoco${MUJOCO_KEY_PATH}
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/kewei/.mujoco/mujoco210/bin
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/lib/nvidia

然後就可以開啟訓練了。使用上一節的with保留輸入。

# dqn_session.run(class_type=DQNTrainer, episode=episode)
with RealTimeCaptureAndDisplayOutput() as captured_new:
    ppo_session.run(class_type=PPOTrainer, episode=episode, duration=duration)

點選關注,第一時間瞭解華為雲新鮮技術~

相關文章