Tối ưu hóa chính sách lân cận (PPO)

Deep Reinforcement Learning bằng Python

Timothée Carayol

Principal Machine Learning Engineer, Komment

A2C

  • Cập nhật chính sách A2C:
    • Dựa trên ước lượng biến động
    • Có thể lớn và thiếu ổn định
  • Có thể làm giảm hiệu năng

Một xe tự hành Sao Hỏa bị hỏng sau tai nạn trên địa hình gồ ghề

PPO

  • PPO giới hạn độ lớn mỗi lần cập nhật chính sách
  • Cải thiện ổn định

Một xe tự hành Sao Hỏa đang di chuyển suôn sẻ trên bề mặt sao Hỏa

Deep Reinforcement Learning bằng Python

Tỷ lệ xác suất

  • Đổi mới chính của PPO: hàm mục tiêu mới
  • Trọng tâm:

Tỷ lệ xác suất: tỷ lệ giữa xác suất của một hành động dưới chính sách mới và xác suất dưới chính sách cũ, ký hiệu r_t

  • Hành động $a_t$ với $\theta$ có khả năng hơn bao nhiêu so với $\theta_{old}$?

 

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

# Hoặc tương đương ratio = torch.exp(action_log_prob - old_action_log_prob.detach())
  • detach mẫu số để chặn lan truyền gradient
Deep Reinforcement Learning bằng Python

Cắt (clipping) tỷ lệ xác suất

 

  • Hàm cắt (clip):

Đồ thị clip(x, 0.8, 1.2) từ x=0.6 đến x=1.4; giá trị bằng .8 khi x<0.8; bằng x khi 0.8<=x<=1.2; bằng 1.2 khi x>1.2.

Tỷ lệ xác suất đã cắt là clip(r_t, 1-epsilon, 1+epsilon)

 

 

clipped_ratio = torch.clamp(ratio,
                            1-epsilon, 
                            1+epsilon)
Deep Reinforcement Learning bằng Python

Hàm 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)
Ví dụ với epsilon = .2:

Tỷ lệ: tensor(1.25)
Tỷ lệ đã cắt: tensor(1.20)
Deep Reinforcement Learning bằng Python

Hàm mục tiêu PPO

 

J surr = E_t(r_t * advantage)

surr1 = ratio * td_error.detach()

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

 

  • Hàm thay thế với tỷ lệ đã cắt:

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

  • Hàm mục tiêu PPO (clipped surrogate):

Hàm mục tiêu clipped surrogate: kỳ vọng của min giữa ratio * advantage và clipped ratio * advantage.

  • Ổn định hơn A2C
Deep Reinforcement Learning bằng Python

Tính loss của PPO

 

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

    # tính TD error (như 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 bằng Python

Vamos praticar!

Deep Reinforcement Learning bằng Python

Preparing Video For Download...