65.9K
CodeProject 正在变化。 阅读更多。
Home

使用软 Actor-Critic (SAC) 训练人形 AI 机器人行走

starIconstarIconstarIconstarIconstarIcon

5.00/5 (2投票s)

2020年9月30日

CPOL

3分钟阅读

viewsIcon

8111

在本文中,我们将调整代码,使用不同的算法来训练人形环境:Soft Actor-Critic (SAC)。

什么是 SAC?

Soft Actor-Critic (SAC) 算法由 Haarnoja 等人在论文 "Soft Actor-Critic: Off-Policy Maximum Entropy Deep Reinforcement Learning with a Stochastic Actor" 中提出。

请记住,上一篇文章中的 Proximal Policy Optimisation (PPO) 是一种 on-policy 算法,这意味着它只能从当前策略的状态、动作和奖励中学习。相比之下,SAC 是一种 off-policy 算法:它像 PPO 一样优化随机策略,但使用存储的经验缓冲区来完成此操作。

SAC 使用所谓的熵正则化,这意味着它试图在生成大的期望回报和保持策略中的一定程度的随机性之间取得平衡。或者,正如论文中所述,“在尽可能随机行动的同时成功完成任务。” 这增加了发生的探索量,这可能特别有利于复杂环境。

在接下来的系列文章中,我们将专门使用 SAC 算法。虽然它似乎学得很好,但 PPO(或某些其他算法)可能会做得更好。如果您有时间和资源,您可能想尝试一些不同的算法来完成所有后续内容,并看看它们与我使用 SAC 作为基线所获得的结果相比如何。

代码

这是我用于使用 SAC 学习人形环境的代码。

具体的学习参数基于 这个 GitHub 仓库 中的参数。

以下是我们已覆盖的各种学习参数的含义

  • actor_learning_rate – 用于学习策略的学习率。
  • critic_learning_rate – 用于学习评估策略的价值函数的学习率。
  • entropy_learning_rate – 用于最大化随机 actor 熵的学习率。
  • train_batch_size – 从经验缓冲区中抽样进行训练的记录数。
  • target_network_update_freq – 应该更新目标网络的训练步骤数。
  • learning_starts – 在尝试学习任何东西之前,模型要抽样的步数。防止对早期经验的过度拟合。
  • buffer_size – 要维护的经验缓冲区的大小。
  • observation_filter – 与上一篇文章中的 PPO 一样,我们应用 MeanStdFilter,它根据它看到的状态对观察值进行归一化。
import pyvirtualdisplay

_display = pyvirtualdisplay.Display(visible=False, size=(1400, 900))
_ = _display.start()

import gym
import ray
from ray import tune
from ray.rllib.agents.sac import SACTrainer
from ray.tune.registry import register_env

ray.shutdown()
ray.init(include_webui=False, ignore_reinit_error=True)


ENV = 'HumanoidBulletEnv-v0'
def make_env(env_config):
    import pybullet_envs
    env = gym.make(ENV)
    return env
register_env(ENV, make_env)


TARGET_REWARD = 6000
TRAINER = SACTrainer


tune.run(
    TRAINER,
    stop={"episode_reward_mean": TARGET_REWARD},
    config={
        "env": ENV,
        "num_workers": 11,
        "num_gpus": 1,
        "monitor": True,
        "evaluation_num_episodes": 50,
        "optimization": {
            "actor_learning_rate": 1e-3,
            "critic_learning_rate": 1e-3,
            "entropy_learning_rate": 3e-4,
        },
        "train_batch_size": 128,
        "target_network_update_freq": 1,
        "learning_starts": 1000,
        "buffer_size": 1_000_000,
        "observation_filter": "MeanStdFilter",
    }
)

训练进度看起来是这样的(在 12 个 CPU 核心上运行了 46 小时)

您可能会发现,只需将目标结果设置为 1200,您就可以在不到一半的时间内获得同样好的结果。

视频

这是训练有素的 agent 蹒跚而行的视频(使用最大的视频文件而不是最新的训练迭代,以尝试捕捉 agent 的最佳状态)

该策略似乎选择根本不使用膝关节,这赋予了 agent 机器人外观,就像很久以前在遥远的银河系中可能看到的那样!

下次

下一篇文章中,我们将尝试颠覆人形环境,以不打算的方式对其进行训练。具体来说,我们将尝试训练我们的 agent 向后跑而不是向前跑。

© . All rights reserved.