근접 정책 최적화 (PPO)

Python으로 배우는 Deep Reinforcement Learning

Timothée Carayol

Principal Machine Learning Engineer, Komment

A2C

  • A2C 정책 업데이트:
    • 추정치 변동성이 큼
    • 크고 불안정할 수 있음
  • 성능을 해칠 수 있음

험한 지형에서 사고를 겪고 고장 난 화성 탐사로버

PPO

  • 각 정책 업데이트 크기에 제한을 둠
  • 안정성 향상

화성 표면을 순조롭게 주행하는 로버

Python으로 배우는 Deep Reinforcement Learning

확률 비율

  • PPO의 핵심 혁신: 새로운 목적함수
  • 핵심 아이디어:

확률 비율: 새 정책에서의 행동 확률을 기존 정책에서의 확률로 나눈 값, r_t로 표기

  • 파라미터 $\theta$에서 행동 $a_t$가 $\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하여 그래디언트 전파 방지
Python으로 배우는 Deep Reinforcement Learning

확률 비율 클리핑

 

  • 클립 함수:

clip(x, 0.8, 1.2)의 그래프: x=0.6~1.4 구간, x<0.8이면 0.8, 0.8~1.2는 x, x>1.2면 1.2

클립된 확률 비율은 clip(r_t, 1-epsilon, 1+epsilon)

 

 

clipped_ratio = torch.clamp(ratio,
                            1-epsilon, 
                            1+epsilon)
Python으로 배우는 Deep Reinforcement Learning

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)
epsilon = .2 예시:

비율: tensor(1.25)
클립된 비율: tensor(1.20)
Python으로 배우는 Deep Reinforcement Learning

PPO 목적함수

 

J surr = E_t(r_t * advantage)

surr1 = ratio * td_error.detach()

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

 

  • 클립된 비율로 만든 대리함수:

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

  • PPO 클립드 서로게이트 목적함수:

클립드 서로게이트 목적함수: ratio * advantage와 clipped ratio * advantage의 최소값의 기댓값.

  • A2C보다 더 안정적
Python으로 배우는 Deep Reinforcement Learning

PPO 손실 계산

 

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

    # TD 오차 계산(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
Python으로 배우는 Deep Reinforcement Learning

Passons à la pratique !

Python으로 배우는 Deep Reinforcement Learning

Preparing Video For Download...