REINFORCE 알고리즘

고영민·2023년 7월 20일
0

강화학습

목록 보기
2/4

이번 포스트에서는 REINFORCE 알고리즘을 학습한다. REINFORCE은 목적함수를 따라 정책 경사를 계산하여 정책을 결정하는 파라미터를 최적화하는 방법으로 먼저 목적함수는 다음과 같이 궤적에 대한 이득의 기댓값으로 정의한다.

J(πθ)=Eτπθ[R(τ)]=Eτπθ[t=0Tγtrt]J(\pi_\theta) = E_{\tau\sim\pi_\theta}[R(\tau)] = E_{\tau\sim\pi_\theta}\left[ \sum^T_{t=0}\gamma^t r_t \right]

여기서 πθ\pi_\thetaθ\theta라는 파라미터로 표현되는 정책을 의미하며, 심층신경망을 사용하여 정책망을 구현할 경우 심층신경망의 학습가능한 파라미터들이 θ\theta가 된다.

정책 경사 알고리즘은 이렇게 파라미터 θ\theta로 표현되는 목표함수를 θ\theta에 대해 미분하고, 그 결과를 바탕으로 경사기반 최적화를 수행하여 최적의 파라미터를 찾는 알고리즘을 의미한다. 알고리즘의 목표는 목표함수를 최대화하는 것으로 다음과 같이 쓸 수 있다.

maxθJ(πθ)=Eτπθ[R(τ)]\max_\theta J(\pi_\theta) = E_{\tau \sim \pi_\theta}[R(\tau)]

이를 위해 목표함수 JJ를 미분하여 다음과 같이 파라미터를 업데이트 할 수 있다.

θθ+αθJ(πθ)\theta \leftarrow \theta + \alpha \nabla_\theta J(\pi_\theta)

목표함수 JJ의 미분과정은 θJ(πθ)=θEτπθ[R(τ)]\nabla_\theta J(\pi_\theta) = \nabla_\theta E_{\tau \sim \pi_\theta}[R(\tau)]를 수행해야하는데, 이 때, 이득 RRθ\theta의 식이 아니라서 직접 미분할 수 없다는 문제가 발생한다. 파라미터 θ\theta는 정책을 결정하며, 해당 파라미터에 대한 미분을 수행하기 위해 다음과 같이 식을 수정한다
(Leibniz integral rule, https://freshrimpsushi.github.io/posts/leibniz-integral-rule/).

θExp(xθ)[f(x)]=θdxf(x)p(xθ)                      (기대값의  정의)=dxθ(f(x)p(xθ))                      (Leibniz  integral  rule)=dx(f(x)θp(xθ)+θf(x)p(xθ))=dxf(x)θp(xθ)=dxf(x)p(xθ)θp(xθ)p(xθ)=dxf(x)p(xθ)θlogp(xθ)=Ex[f(x)θlogp(xθ)]                      (기대값의  정의)\begin{aligned} \nabla_\theta E_{x \sim p(x|\theta)}[f(x)] & = \nabla_\theta \int dx f(x)p(x|\theta) \;\;\;\;\;\;\;\;\;\;\; (기대값의\;정의) \\ & = \int dx \nabla_\theta (f(x)p(x|\theta)) \;\;\;\;\;\;\;\;\;\;\; (Leibniz\;integral\;rule) \\ & = \int dx (f(x) \nabla_\theta p(x|\theta) + \nabla_\theta f(x) p(x|\theta)) \\ & = \int dx f(x) \nabla_\theta p(x|\theta) \\ & = \int dx f(x) p(x|\theta) \frac{\nabla_\theta p(x|\theta)}{p(x|\theta)} \\ & = \int dx f(x) p(x|\theta) \nabla_\theta \log p(x|\theta) \\ & = E_x [f(x) \nabla_\theta \log p(x|\theta)]\;\;\;\;\;\;\;\;\;\;\; (기대값의\;정의) \end{aligned}

위의 식에서 x=τ,f(x)=R(τ),p(xθ)=p(τθ)x=\tau, f(x)=R(\tau), p(x|\theta)=p(\tau|\theta)를 대입하면 다음과 같다.

θJ(πθ)=Eτπθ[R(τ)θlogp(τθ)]\nabla_\theta J(\pi_\theta) = E_{\tau \sim \pi_\theta}[R(\tau) \nabla_\theta \log p(\tau|\theta)]

여기서 p(τθ)p(\tau|\theta)를 좀 더 계산하기 용이한 형태로 바꿀 수 있다.

p(τθ)=t0p(st+1st,at)πθ(atst)logp(τθ)=logt0p(st+1st,at)πθ(atst)logp(τθ)=t0(logp(st+1st,at)+logπθ(atst))θlogp(τθ)=θt0(logp(st+1st,at)+logπθ(atst))θlogp(τθ)=θt0logπθ(atst)\begin{aligned} p(\tau|\theta) & = \prod_{t \ge 0}p(s_{t+1}|s_t,a_t)\pi_\theta(a_t|s_t) \\ \log p(\tau|\theta) & = \log \prod_{t \ge 0}p(s_{t+1}|s_t,a_t)\pi_\theta(a_t|s_t) \\ \log p(\tau|\theta) & = \sum_{t \ge 0}(\log p(s_{t+1}|s_t,a_t)+\log \pi_\theta(a_t|s_t)) \\ \nabla_\theta \log p(\tau|\theta) & = \nabla_\theta \sum_{t \ge 0}(\log p(s_{t+1}|s_t,a_t)+\log \pi_\theta(a_t|s_t)) \\ \nabla_\theta \log p(\tau|\theta) & = \nabla_\theta \sum_{t \ge 0} \log \pi_\theta(a_t|s_t) \end{aligned}

이렇게 계산된 식을 대입하면 다음과 같다.

θJ(πθ)=Eτπθ[t0TR(τ)θlogπθ(atst)]\nabla_\theta J(\pi_\theta) = E_{\tau \sim \pi_\theta}[\sum^T_{t \ge 0}R(\tau) \nabla_\theta \log \pi_\theta(a_t|s_t)]

다만 위의 식을 그대로 학습에 사용할 경우 R(τ)R(\tau)에서 전체 궤적에 대한 보상을 모두 고려하기 때문에 큰 분산을 갖는다. 이러한 문제는 시각 t에서의 보상 만을 고려하여 해결할 수 있으며, 다음과 같이 쓸 수 있다.

R(τ)=R0(τ)=t=0Tγtrtt=0Tγt1rt=Rt(τ)R(\tau) = R_0(\tau) = \sum^T_{t'=0}\gamma^{t'}r_{t'} \rightarrow \sum^T_{t'=0}\gamma^{t'-1}r_{t'}=R_t(\tau)

이를 적용하면 다음과 같이 최종적인 식을 작성할 수 있다.

θJ(πθ)=Eτπθ[t0TRt(τ)θlogπθ(atst)]\nabla_\theta J(\pi_\theta) = E_{\tau \sim \pi_\theta}[\sum^T_{t \ge 0}R_t(\tau) \nabla_\theta \log \pi_\theta(a_t|s_t)]

여기서 기대값은 몬테카를로 방법을 통해 계산할 수 있으며, 여러 에피소드를 수행하여 데이터를 수집하고 그에 대한 평균을 낸다.

또한 추가적으로 행동에 영향을 받지 않는 기준값을 다음과 같이 이득에서 뺴어 조절함으로써 분산을 줄어 학습을 도울 수도 있다. 여기서 사용할 수 있는 기준값으로는 가치함수나 궤적에 대한 평균 이득 등이 될 수 있다. 평균 이득을 사용할 경우 state에 대해서 변화하지 않아 분산은 줄지 않을 수 있지만 분포가 0을 중심으로 형성되게 하여 학습을 도울 수 있다.

θJ(πθ)t=0T(Rt(τ)b(st))θlogπθ(atst)\nabla_\theta J(\pi_\theta) \approx \sum^T_{t=0}(R_t(\tau)-b(s_t))\nabla_\theta \log \pi_\theta(a_t|s_t)


그림 1. REINFORCE 알고리즘


그림 2. 손실함수 계산

1개의 댓글

comment-user-thumbnail
2023년 7월 20일

글 잘 봤습니다, 감사합니다.

답글 달기
Powered by GraphCDN, the GraphQL CDN