ฟังก์ชัน clipped surrogate objective
นำฟังก์ชัน calculate_loss() สำหรับ PPO ไปใช้งาน โดยต้องเขียนโค้ดส่วนสำคัญของ PPO ซึ่งก็คือ clipped surrogate loss function ฟังก์ชันนี้ช่วยจำกัดการอัปเดต policy ไม่ให้เปลี่ยนแปลงไปจาก policy เดิมมากเกินไปในแต่ละขั้นตอน
สูตรของ clipped surrogate objective คือ
ในสภาพแวดล้อมนี้ hyperparameter สำหรับการ clipping คือ epsilon ซึ่งกำหนดค่าไว้ที่ 0.2
แบบฝึกหัดนี้เป็นส่วนหนึ่งของหลักสูตร
Deep Reinforcement Learning ด้วย Python
คำแนะนำการฝึกหัด
- คำนวณอัตราส่วนความน่าจะเป็นระหว่าง
\pi_\thetaและ\pi_{\theta_{old}}(ทั้งแบบไม่คลิปและแบบคลิป) - คำนวณ surrogate objectives (ทั้งแบบไม่คลิปและแบบคลิป)
- คำนวณ PPO clipped surrogate objective
- คำนวณ actor loss
แบบฝึกหัดเชิงโต้ตอบแบบลงมือทำ
ลองทำแบบฝึกหัดนี้โดยเติมโค้ดตัวอย่างนี้ให้สมบูรณ์
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)