裁剪后的代理目标函数
为 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)