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





5.00/5 (3投票s)
在本文中,我们将尝试训练我们的智能体倒退跑,而不是前进跑。
在这一系列文章的早期文章中,我们研究了 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 的模型,然后训练结果。