开始使用免费开始使用

裁剪后的代理目标函数

为 PPO 实现 calculate_loss() 函数。这需要您编码 PPO 的关键创新——裁剪后的代理损失函数。它可以约束策略更新,防止每一步偏离旧策略过远。

裁剪代理目标的公式为:

您的环境中裁剪超参数 epsilon 设为 0.2。

本练习是课程的一部分

Python 中的深度强化学习

查看课程

练习说明

  • 计算 \pi_\theta\pi_{\theta_{old}} 之间的概率比率(未裁剪与已裁剪版本)。
  • 计算代理目标(未裁剪与已裁剪版本)。
  • 计算 PPO 的裁剪代理目标。
  • 计算 actor 的损失。

交互式实操练习

通过完成这段示例代码来试试这个练习。

def calculate_losses(critic_network, action_log_prob, action_log_prob_old,
                     reward, state, next_state, done):
    value = critic_network(state)
    next_value = critic_network(next_state)
    td_target = (reward + gamma * next_value * (1-done))
    td_error = td_target - value
    # Obtain the probability ratios
    ____, ____ = calculate_ratios(action_log_prob, action_log_prob_old, epsilon=.2)
    # Calculate the surrogate objectives
    surr1 = ratio * ____.____()
    surr2 = clipped_ratio * ____.____()    
    # Calculate the clipped surrogate objective
    objective = torch.min(____, ____)
    # Calculate the actor loss
    actor_loss = ____
    critic_loss = td_error ** 2
    return actor_loss, critic_loss
  
actor_loss, critic_loss = calculate_losses(critic_network, action_log_prob, action_log_prob_old,
                                           reward, state, next_state, done)
print(actor_loss, critic_loss)
编辑并运行代码