Just Fighting
[강화학습] PPO 알고리즘 본문
어드밴티지 액터-크리틱 알고리즘의 단점
몬테카를로 업데이트 문제와 목적함수 그래디언트의 분산이 크다는 점은 개선 완료
but ! 여전히 온-폴리시(on-policy)
온-폴리시 방법은 정책을 업데이트하기 위해서
해당 정책을 실행시켜 발생한 샘플이 필요하기 때문에 효율성이 떨어진다.
두번째 단점은 정책 그리디언트를 이용한다는 것.
정책 파라미터 변화량이 작아도 정책 자체는 크게 변할 수 있다는 단점이 있다.
정책이 점진적으로 업데이트돼야만 안정적인 학습이 가능하기 때문!
이를 개선할 수 있는 대표적인 알고리즘이 PPO(proximal policy optimization, 근접 정책 최적화)이다.
PPO 알고리즘
A2C에서 사용된 목적함수 그래디언트는 다음과 같다.
\begin{align*}
\bigtriangledown_\theta J(\theta)
&= \sum_{t=0}^{T} \left ( E_{\tau_{x_t:u_t} \sim p_\theta(\tau_{x_t:u_t})} \left [ \gamma^t \bigtriangledown_\theta log \pi_\theta (u_t|x_t) A^{\pi_\theta}(x_t, u_t) \right ] \right ) \\
&= \sum_{t=0}^{T} \left ( E_{x_t \sim p_\theta(x_t), u_t \sim \pi_\theta (u_t|x_t)} \left [ \gamma^t \bigtriangledown_\theta log \pi_\theta (u_t|x_t) A^{\pi_\theta}(x_t, u_t) \right ] \right ) \\
\end{align*}
원래 하던 방식은 온-폴리시로,
정책을 한 단계 업데이트 하고, 이전 정책이 발생시킨 샘플은 폐기하고,
업데이트된 정책으로 샘플을 다시 발생시킨다.
이 방법은 오프-폴리시에 비해 효율성이 떨어진다.
오프-폴리시 방법은 다른 정책으로 발생시킨 샘플로도 해당 정잭을 업데이트할 수 있는 방법이다.
확률밀도함수 $p(x)$에 기반한 함수 $f(x)$의 기댓값을 다른 확률 밀도함수 $q(x)$에 기반해
다음과 같이 계산할 수 있다.
$$ E_{x \sim p(x)}[f(x)] = E_{x \sim q(x)}[\frac{p(x)}{q(x)}f(x)] $$
이 식을 위의 식에 적용하면 다음과 같다.
여기서 $p_{\theta_{OLD}}(\tau_{x_0:u_t})$는 $\theta_{OLD}$로 파라미터화된 확률밀도함수. $p_\theta(\tau_{x_0:u_t})$ 와 다름
\begin{align*}
\bigtriangledown_\theta J(\theta)
&= \sum_{t=0}^{T} \left ( E_{\tau_{x_t:u_t} \sim p_{\theta_{OLD}}(\tau_{x_t:u_t})} \left [ \frac{p_\theta(\tau_{x_0:u_t})}{p_{\theta_{OLD}}(\tau_{x_0:u_t})} \gamma^t \bigtriangledown_\theta log \pi_\theta (u_t|x_t) A^{\pi_\theta}(x_t, u_t) \right ] \right ) \\
\end{align*}
궤적 $\tau=(x_0, u_0, x_1, u_1, \cdots, x_T, u_T)$일 때 마르코프 가정하에 $p_\theta(\tau)$를 전개한 식을
위의 식에 적용해보자.
$$p_\theta(\tau) = p(x_0)\prod_{t=0}^{T}\pi_\theta(u_t|x_t)p(x_{t+1}|x_t, u_t)$$
\begin{align*}
\frac{p_\theta(\tau_{x_0:u_t})}{p_{\theta_{OLD}}(\tau_{x_0:u_t})} &= \frac{p(x_0)\prod_{k=0}^{t}\pi_\theta(u_k|x_k)p(x_{k+1}|x_k, u_k)}{p(x_0)\prod_{k=0}^{t}\pi_{\theta_{OLD}}(u_k|x_k)p(x_{k+1}|x_k, u_k)} \\
&= \prod_{k=0}^{t} \frac{\pi_\theta(u_k|x_k)}{\pi_{\theta_{OLD}}(u_k|x_k)}
\end{align*}
이 식을 위의 식에 대입하면 다음과 같다.
\begin{align*}
\bigtriangledown_\theta J(\theta)
&= \sum_{t=0}^{T} \left ( E_{\tau_{x_t:u_t} \sim p_{\theta_{OLD}}(\tau_{x_t:u_t})} \left [ (\prod_{k=0}^{t} \frac{\pi_\theta(u_k|x_k)}{\pi_{\theta_{OLD}}(u_k|x_k)})\gamma^t \bigtriangledown_\theta log \pi_\theta (u_t|x_t) A^{\pi_\theta}(x_t, u_t) \right ] \right ) \\
\end{align*}
여기서 $\pi_{\theta_{OLD}}$는 이전 정책이고, $\pi_\theta$는 현재 정책이다.
위 식에 의하면 $\pi_{\theta_{OLD}}$로 발생시킨 샘플 $\tau_{x_0:u_t}$를 이용해 기댓값을 계산할 수 있다!
여기서 문제점은 $\prod_{k=0}^{t} \frac{\pi_\theta(u_k|x_k)}{\pi_{\theta_{OLD}}(u_k|x_k)}$가 계속 곱해진다는 것이다.
현재 정책과 이전정책이 비슷해도 계속해서 곱셈이 되면 나중에 큰 차이를 만들어낼 수 있다.
그렇다는 건, 스케일이 아주 커지거나 작아지는 것이고, 스케일이 아주 작아지면 학습이 어려워지고, 아주 커지면 학습이 불안정해진다.
\begin{align*}
\bigtriangledown_\theta J(\theta)
&= \sum_{t=0}^{T} \left ( E_{x_t \sim p_\theta(x_t), u_t \sim \pi_\theta (u_t|x_t)} \left [ \gamma^t \bigtriangledown_\theta log \pi_\theta (u_t|x_t) A^{\pi_\theta}(x_t, u_t) \right ] \right ) \\
\end{align*}
위 식에서 새 정책 $\pi_\theta(u_k|x_k)$을 이전정책 $\pi_{\theta_{OLD}}(u_k|x_k)$로 바꿔보자.
\begin{align*}
\bigtriangledown_\theta J(\theta)
&= \sum_{t=0}^{T} \left ( E_{x_t \sim p_{\theta_{OLD}(x_t)}}\left [ \frac{p_\theta(X_t)}{p_{\theta_{OLD}}(X_t)} E_{u_t \sim \pi_{\theta_{OLD}}(u_t|x_t)} \left [ \gamma^t \frac{\pi_\theta(u_t|x_t)}{\pi_{\theta_{OLD}}(u_t|x_t)} \bigtriangledown_\theta log \pi_\theta (u_t|x_t) A^{\pi_\theta}(x_t, u_t) \right ] \right ] \right ) \\
\end{align*}
위 식에서 $\frac{p_\theta(X_t)}{p_{\theta_{OLD}}(X_t)} \approx 1$ 라면 아래 식이 된다.
\begin{align*}
\bigtriangledown_\theta J(\theta)
&= \sum_{t=0}^{T} \left ( E_{x_t \sim p_{\theta_{OLD}(x_t)}}\left [ E_{u_t \sim \pi_{\theta_{OLD}}(u_t|x_t)} \left [ \gamma^t \frac{\pi_\theta(u_t|x_t)}{\pi_{\theta_{OLD}}(u_t|x_t)} \bigtriangledown_\theta log \pi_\theta (u_t|x_t) A^{\pi_\theta}(x_t, u_t) \right ] \right ] \right ) \\
\end{align*}
위 식에 의하면 이전 정책으로 발생시킨 샘플을 이용해 현재 정책을 평가하고 업데이트 할 수 있다!
하지만 $\frac{p_\theta(X_t)}{p_{\theta_{OLD}}(X_t)} \approx 1$ 라는 가정하에서만 성립한다.
$\frac{p_\theta(X_t)}{p_{\theta_{OLD}}(X_t)} \approx 1$을 만족하는 조건을 알아야한다.!
[출처]
박성수, 「수학으로 풀어보는 강화학습 원리와 알고리즘」, 위키북스(2020)