이들은 학습이 별로 효율적이지 못했다. 이들은 on-policy, 즉 현재의 policy와 target의 policy가 $\pi_{now}$로 동일해야 했기 때문이다. TRPO와 PPO도 대표적인 on-policy algorithm이긴 하다.
왜 과거의 policy로부터 얻어진 transition을, 현재의 policy network를 update하는 데 함부로 사용하지 못했을까?
만약 과거의 transition을 얻은 policy가 현재의 policy network와 비슷하다면, 대체로 학습이 잘 될 것이다. 하지만 두 policy가 서로 너무 다르다면, gradient update 시에 현재의 network와 완전히 동떨어진 gradient가 학습되어, 오히려 network를 망가뜨릴 것이다.
결국 현재의 policy로 얻어진 transition만으로 현재의 policy network를 update할 수밖에 없었고, 따라서 transition을 한 번 학습하면 재사용이 안 되므로 데이터 낭비가 심하다는 단점이 있었다.
(이걸 해결하기 위해 value based에서는 replay buffer를, actor critic에서는 A3C에서 병렬로 학습시킨 뒤 gradient만 가져오는 방법을 쓰기도 했다.)
기존에는 이를 다룰 명확한 방법이 없었다면,
TRPO는 과거의 policy와 현재의 policy의 유사도(KL Divergence)를 기반으로, 과거의 policy를 현재의 policy network에 update할 때 constraint를 걸어 성능을 유지할 수 있다는 수학적 증명을 해냈고,
PPO는 여기에 간단한 아이디어를 더 추가한 뒤, 알고리즘으로 정립했다?.
1. TRPO (Trust Region Policy Optimization)
"현재와 과거 policy의 차이가 충분히 작아서 Trust Region범위 안에 있을 때만 policy를 update함으로써 network를 optimization하겠다."
TRPO 논문의 핵심 문제정의는 policy network를 update할 때 policy를 너무 크게 바꿔서 성능이 갑자기 무너지는 문제 였다.
그리고 결과적으로, TRPO는 policy network를 update할 때 성능이 떨어지지 않도록 ($J(\theta_{now}) \geq J(\theta_{old}) $) 만들었다.
1.1. Objective Function $J(\theta)$ 바꾸기
과거의 $\pi_{\theta_{old}}$로부터 얻어진 data로 $\pi_{\theta_{new}}$를 평가할 수 있도록 식을 바꾼다.
왜 이렇게 바꿨냐면, 기존에 현재로부터 sampling된 Expectation $\mathbb{E}_{\pi_{\theta_{new}}}$ 대신에, 과거로부터 sampling한 data를 활용하기 위해 Expectation $\mathbb{E}_{\pi_{\theta_{old}}}$ 으로 바꾼 것이다.
자세히 설명해 보자면 일종의 통계적 trick이다. 그 아이디어를 설명해 보자면,
현재의 policy로부터 sampling되는 확률분포를 P, 과거의 policy로부터 sampling되는 확률분포를 Q 라고 하자. 기댓값(E[])은 확률 × 값 으로 구성된다. 분모와 분자에 똑같이 Q를 곱하면, P였던 기댓값의 확률을 Q로 만들 수 있게 되고, 결과적으로 P 대신에 Q 분포에서 sampling해서 P 분포의 기댓값을 구할 수 있게 된다.
이를 적용해서 기존의 Objective Function을 변형한 것이다.
증명은 생략.
그런데 위에서 Approximation이 성립하려면, $\frac{\pi_{\theta_{now}}}{ \pi_{\theta_{old}} } \approx 1$이 성립해야 한다. 다시 말해, 두 policy가 가능한 한 비슷해야 한다.
1.2. KL Divergence로 Trust Region 설정.
두 policy가 최대한 비슷한 상태를 보장하기 위해, 두 policy의 차이가 충분히 작을 때만 gradient를 구해서 update하도록 constraint를 걸어준다. 이를 통해 policy의 변화량을 제한할 수 있다.
여기서 차이인 $D$가 충분히 작을 때를 Trust Region두 policy의 차이가 신뢰할 만하다이라 하고, 차이가 크다면 Untrust Region이라 한다.
하지만 위에서 C를 구할 때, 만약 γ가 1에 근사하면, C가 아주 커져 gradient explosion이 발생할 우려가 있다.
2. PPO (Proximal Policy Optimization
위에서 봤듯이, TRPO는 너무 계산이 복잡하다. Fisher Matrix F를 계산하려면 2차 미분을 계산해야 하는 등..
PPO는 TRPO의 아이디어를 그대로 유지하면서, 식의 구조를 훨씬 간단하게 바꿨다.
TRPO의 아이디어 $\mathbb{E}\left[\frac{\pi_{\theta_{now}}}{ \pi_{\theta_{old}} }A_{\theta_{old}}(s, a)\right]$ $A>0$이면(해당 state의 value들의 평균보다 좋으면), 그 policy를 '더' 높이고, $A<0$이면, 그 policy를 '더' 줄이겠다. 단, policy가 너무 급격하게 바뀌면, 다른 state에 대한 policy도 망가져 버릴 수 있으므로, 제한한다.
PPO는 $r(\theta) = \frac{\pi_{\theta_{now}}}{ \pi_{\theta_{old}} }$ 로 둔다.
그리고 $r(\theta)$가 너무 커지거나 작아지지 않도록 clipping한다. 이러면 위의 TRPO처럼 constraint를 걸어줄 필요가 없다.
$clip(r(\theta), 1-\epsilon, 1+\epsilon)$
이제 $r(\theta)$는 최소 1-ε, 최대 1+ε의 값만을 가진다.
이때 실험적으로 $\epsilon = 0.2$에서 가장 높은 성능을 얻었다.
하지만 이렇게만 해서는, $J(\theta)$ 자체가 너무 급격한 값을 가지는 것까지는 막지 못한다.
따라서 $clip(r(\theta), 1-\epsilon, 1+\epsilon)A_{\theta_{old}}$와 $r(\theta)A_{\theta_{old}}$ 간에 더 작은 값을 고를 필요가 있다.