Proximal policy optimization

Deep Reinforcement Learning ด้วย Python

Timothée Carayol

Principal Machine Learning Engineer, Komment

A2C

  • การอัปเดต policy ใน A2C:
    • อิงจากการประมาณค่าที่ผันผวน
    • อาจมีขนาดใหญ่และไม่เสถียร
  • อาจส่งผลเสียต่อประสิทธิภาพ

ยานสำรวจดาวอังคารล้มเสียหายหลังเกิดอุบัติเหตุบนภูมิประเทศขรุขระ

PPO

  • PPO กำหนดขีดจำกัดขนาดของการอัปเดต policy แต่ละครั้ง
  • เพิ่มความเสถียร

ยานสำรวจดาวอังคารแล่นอย่างราบรื่นบนพื้นผิวดาวอังคาร

Deep Reinforcement Learning ด้วย Python

อัตราส่วนความน่าจะเป็น

  • นวัตกรรมหลักของ PPO: ฟังก์ชัน objective ใหม่
  • แกนหลัก:

อัตราส่วนความน่าจะเป็น: อัตราส่วนระหว่างความน่าจะเป็นของ action ภายใต้ policy ใหม่กับ policy เก่า แทนด้วย r_t

  • action $a_t$ มีโอกาสเกิดขึ้นกับ $\theta$ มากกว่า $\theta_{old}$ มากแค่ไหน?

 

  ratio = action_log_prob.exp() / 
          old_action_log_prob.exp().detach()

# Or equivalently ratio = torch.exp(action_log_prob - old_action_log_prob.detach())
  • ใช้ detach กับตัวส่วนเพื่อป้องกันการส่งผ่าน gradient
Deep Reinforcement Learning ด้วย Python

การ clip อัตราส่วนความน่าจะเป็น

 

  • ฟังก์ชัน clip:

กราฟของ clip(x, 0.8, 1.2) ระหว่าง x=0.6 ถึง x=1.4 ฟังก์ชันมีค่าเท่ากับ .8 เมื่อ x ต่ำกว่า 0.8; x ระหว่าง 0.8 ถึง 1.2; และ 1.2 เมื่อ x สูงกว่า 1.2

อัตราส่วนความน่าจะเป็นแบบ clipped คือ clip(r_t, 1-epsilon, 1+epsilon)

 

 

clipped_ratio = torch.clamp(ratio,
                            1-epsilon, 
                            1+epsilon)
Deep Reinforcement Learning ด้วย Python

ฟังก์ชัน calculate_ratios

 

def calculate_ratios(action_log_prob, action_log_prob_old, epsilon):

prob = action_log_prob.exp() prob_old = action_log_prob_old.exp() prob_old_detached = prob_old.detach() ratio = prob / prob_old_detached clipped_ratio = torch.clamp(ratio, 1-epsilon, 1+epsilon)
return (ratio, clipped_ratio)
Example with epsilon = .2:

Ratio: tensor(1.25)
Clipped ratio: tensor(1.20)
Deep Reinforcement Learning ด้วย Python

ฟังก์ชัน objective ของ PPO

 

J surr = E_t(r_t * advantage)

surr1 = ratio * td_error.detach()

surr2 = clipped_ratio * td_error.detach()
objective = torch.min(surr1, surr2)

 

  • Surrogate ที่ใช้ clipped ratio:

$$\mathrm{clip}(r_t(\theta),1-\varepsilon,1+\varepsilon)\hat{A}$$

  • ฟังก์ชัน clipped surrogate objective ของ PPO:

ฟังก์ชัน clipped surrogate objective: ค่าคาดหวังของค่าต่ำสุดระหว่าง ratio * advantage กับ clipped ratio * advantage

  • เสถียรกว่า A2C
Deep Reinforcement Learning ด้วย Python

การคำนวณ loss ของ PPO

 

def calculate_losses(critic_network, 
                     action_log_prob,                                        
                     action_log_prob_old,
                     reward, state, next_state,
                     done
                     ):

    # calculate TD error (same as A2C)
    value = critic_network(state)
    next_value = critic_network(next_state)
    td_target = (reward + 
                 gamma * next_value * (1-done))
    td_error = td_target - value
    ...

 

    ...
    ratio, clipped_ratio = 
            calculate_ratios(action_log_prob, 
                             action_log_prob_old,
                             epsilon)

surr1 = ratio * td_error.detach()
surr2 = clipped_ratio * td_error.detach()
objective = torch.min(surr1, surr2)
actor_loss = -objective
critic_loss = td_error ** 2 return actor_loss, critic_loss
Deep Reinforcement Learning ด้วย Python

มาฝึกกันเถอะ!

Deep Reinforcement Learning ด้วย Python

Preparing Video For Download...