Just Fighting

[강화학습] PPO 알고리즘 본문

카테고리 없음

[강화학습] PPO 알고리즘

yennle 2023. 9. 5. 19:02
728x90

어드밴티지 액터-크리틱 알고리즘의 단점

 

몬테카를로 업데이트 문제와 목적함수 그래디언트의 분산이 크다는 점은 개선 완료

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)

 

 

728x90
Comments