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