CartPole 任务的最佳 objective 函数是什么?

What's the best objective function for the CartPole task?

我正在做策略梯度,我试图找出最适合该任务的 objective 函数。任务是开放的 ai CartPole-v0 环境,在该环境中,代理在其存活的每个时间步获得 1 的奖励,并在终止时获得 0 的奖励。我试图弄清楚哪种是对 objective 函数建模的最佳方式。我想出了 3 个可能的函数:

def total_reward_objective_function(self, episode_data) :
    return sum([timestep_data['reward'] for timestep_data in timestep_data])

def average_reward_objective_function(self, episode_data):
    return total_reward_objective_function(episode_data) / len(episode_data)

def sum_of_discounted_rewards_objective_function(self, episode_data, discount_rate=0.7)
    return sum([episode_data[timestep]['reward'] * pow(discount_rate, timestep) 
        for timestep in enumerate(episode_data)])

请注意,对于平均奖励 objective 函数将始终 return 1 除非我干预并将奖励函数修改为 return 终止时的负值。我之所以要问而不只是 运行 一些实验,是因为其他地方有错误。因此,如果有人可以指出我在这方面的良好实践,我可以专注于算法中更严重的错误。

你应该使用最后一个(折扣奖励的总和),因为 cart-pole 问题是一个无限范围的 MDP(你想尽可能地平衡杆子)。 The answer to this question 解释了为什么您应该在无限范围 MDP 中使用折扣因子。

相反,第一个只是奖励的未折扣总和,如果剧集具有固定长度(例如,在机器人执行 10 秒轨迹的情况下),则可以使用它。第二种一般用在finite horizo​​n MDPs中,不过我不是很熟悉

对于 cart-pole,折扣系数 0.9 应该有效(或者,根据使用的算法,您可以搜索科学论文并查看使用的折扣系数)。

最后一点。您描述的奖励函数(每个时间步长 +1)并不是文献中唯一使用的函数。一个常见的(我认为也是 "original" 一个)在每个时间步给出 0,如果杆落下则给出 -1。其他奖励函数与杆子和小车之间的角度有关。