机器学习中的逆向挑战:训练人形机器人后退行走

机器学习的领域中,训练模型执行特定任务是一项常见的任务。本文将探讨如何通过调整环境设置,让一个人形机器人学会后退行走,而不是向前行走。这是一个在机器学习科学文献中鲜有提及的挑战。实际上,让机器人能够执行这一动作本身就是一个不小的挑战。最初,以为只需要简单地设置一个不同的目标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小时。

从图表中可以看出,学习过程并不特别平滑,看起来如果训练时间更长,代理可能会继续改进。

沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485