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

训练人形 AI 机器人向后行走

starIconstarIconstarIconstarIconstarIcon

5.00/5 (3投票s)

2020年10月1日

CPOL

2分钟阅读

viewsIcon

7182

在本文中,我们将尝试训练我们的智能体倒退跑,而不是前进跑。

在这一系列文章的早期文章中,我们研究了 Humanoid Bullet 环境,其目标是教会人形模型在不跌倒的情况下向前行走。

这次我们将研究如何调整环境,使智能体学习一个略有不同的挑战:倒退行走而不是前进行走。

在机器学习的科学文献中,你几乎找不到关于这方面的资料。事实上,让它能够工作本身就有点困难!我天真地认为我只需要在环境中设置一个不同的目标 x 坐标,就完成了。然而,当我尝试这样做时,最终得到的智能体会简单地从起跑线向后抛掷自己,然后回合结束。观看这很有趣,但这并不是我想要实现的目标。

相反,我发现我需要覆盖环境和机器人在目标 x 坐标,并将起点从原点位置 (0, 0, 0) 移开。让它工作起来需要大量的试验和错误!我从未找到代码中强制结束回合的位置,当 x 坐标变为负数时——如果你弄清楚了,请告诉我。PyBullet 代码并非考虑到这种可扩展性而设计的。

代码

这是我使用的代码。有趣的部分在于自定义环境的重置函数,它设置新的目标位置和起始位置

import pyvirtualdisplay

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

import ray
from ray import tune
from ray.rllib.agents.sac import SACTrainer
from pybullet_envs.gym_locomotion_envs import HumanoidBulletEnv

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

from ray.tune.registry import register_env

class RunBackwardsEnv(HumanoidBulletEnv):
    def reset(self):
        state = super().reset()

        self.walk_target_x = -1e3

        self.robot.walk_target_x = -1e3
        self.robot.start_pos_x = 500
        self.robot.body_xyz = [500, 0, 0]

        return state

def make_env(env_config):
    env = RunBackwardsEnv()
    return env

ENV = 'HumanoidBulletEnvReverseReward-v0'
register_env(ENV, make_env)

TARGET_REWARD = 6000
TRAINER = SACTrainer

tune.run(
    TRAINER,
    stop={"episode_reward_mean": TARGET_REWARD},
    config={
        "env": ENV,
        "num_workers": 15,
        "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",
    }
)

默认情况下,环境的目标 x 位置是 1000。我将其设置为 -1000,但我不知道它是否能到达那里。我怀疑当它通过零时,回合会被强制终止。

这是训练过程中平均奖励随时间变化的图表,历时 46.8 小时。

正如你所看到的,学习过程并不特别顺利,而且如果我让它运行更长时间,智能体可能会继续改进。

视频

这是训练后的智能体看起来的样子。也许它不是一个优雅的步态,但考虑到我做了多少失败的实验,这些实验因为无法在环境中向后越过原点而受阻,我终于看到它工作起来了,我感到非常兴奋。

下次

下一篇也是本系列的最后一篇文章中,我们将研究更深入的自定义:编辑基于 XML 的模型,然后训练结果。

© . All rights reserved.