A2C(Advantage Actor-Critic) 알고리즘

chchch·2022년 4월 11일
0

RL

목록 보기
3/3
post-thumbnail

아래의 내용은 세종대학교 박성수 교수님께서 쓰신 수학으로 풀어보는 강화학습 원리와 알고리즘 책의 4장의 내용을 표기법만 달리해서 정리한 내용입니다. 책의 전개와 설명이 좋아서 강화학습에 관심있는 분들은 꼭 구입하셔서 읽어보길 바랍니다.

  • 강화학습의 목표: 누적 보상을 최대화하는 최적 정책(optimal policy)를 구하는 것
  • 누적보상: JJ
  • tt시점에서의 상태(ss)와 행동(aa): st,ats_t, a_t
  • tt시점에서의 상태와 행동으로 인한 보상: r(st,at)r(s_t, a_t)
  • 정책: π(atst)\pi(a_t | s_t)
  • 감가율: γ\gamma

A2C 배경

θJ(θ)=Eτpθ(τ)[k=0T(γtθlogπθ(atst))(k=tTγktr(st,at))]\nabla_\theta J(\theta) = \mathbb{E}_{\tau \sim p_\theta(\tau)} \left[\sum_{k=0}^T (\gamma^t \nabla_\theta \log \pi_\theta(a_t|s_t)) \left(\sum_{k=t}^T \gamma^{k-t} r(s_t, a_t) \right) \right]

기존 REINFORCE 알고리즘은 2개의 단점이 존재한다.

  • 에피소드가 끝나야 정책 π\pi를 업데이트할 수 있다. Why? GtG_t를 계산해야하므로.
  • 그래디언트의 분산이 크다.

위의 두 문제점을 해결하고자 A2C 알고리즘이 제안되었다.

그래디언트 개선

A2C 알고리즘이 기존의 그래디언트를 어떻게 개선했는지 알아보자. 먼저, 궤적을 다음과 같이 분해하자.

τ=(s0,a0,s1,a1,,sT,aT)=(s0,a0,,st,at)(st+1,at+1,,sT,aT)=τs0:atτst+1:aT\begin{aligned} \tau &= (s_0, a_0, s_1, a_1, \dots, s_T, a_T) = (s_0, a_0, \dots, s_t, a_t) \cup (s_{t+1}, a_{t+1}, \dots, s_T, a_T) \\ &= \tau_{s_0:a_t} \cup \tau_{s_{t+1}:a_T} \end{aligned}

그래디언트를 위의 분해한 궤적을 기반으로 다시 적어보자.

θJ(θ)=Eτpθ(τ)[k=0T(γtθlogπθ(atst))(k=tTγktr(st,at))]=t=0Tτs0:atτst+1:aT(γtθlogπθ(atst)(k=tTγktr(st,at)))pθ(τs0:at,τst+1:aT)dτst+1:aTdτs0:at=t=0Tτs0:atτst+1:aT(γtθlogπθ(atst)(k=tTγktr(st,at)))pθ(τst+1:aTτs0:at)pθ(τs0:at)dτst+1:aTdτs0:at=t=0Tτs0:atγtθlogπθ(atst)[τst+1:aT(k=tTγktr(st,at))pθ(τst+1:aTτs0:at)dτst+1:aT]pθ(τs0:at)dτs0:at\begin{aligned} \nabla_\theta J(\theta) &= \mathbb{E}_{\tau \sim p_\theta(\tau)} \left[\sum_{k=0}^T (\gamma^t \nabla_\theta \log \pi_\theta(a_t|s_t)) \left(\sum_{k=t}^T \gamma^{k-t} r(s_t, a_t) \right) \right] \\ &= \sum_{t=0}^T \int_{ \tau_{s_0:a_t}} \int_{\tau_{s_{t+1}:a_T}} \left(\gamma^t \nabla_\theta \log \pi_\theta(a_t|s_t) \left(\sum_{k=t}^T \gamma^{k-t} r(s_t, a_t) \right) \right) p_\theta (\tau_{s_0:a_t}, \tau_{s_{t+1}:a_T}) d\tau_{s_{t+1}:a_T} d\tau_{s_0:a_t} \\ &= \sum_{t=0}^T \int_{ \tau_{s_0:a_t}} \int_{\tau_{s_{t+1}:a_T}} \left(\gamma^t \nabla_\theta \log \pi_\theta(a_t|s_t) \left(\sum_{k=t}^T \gamma^{k-t} r(s_t, a_t) \right) \right) p_\theta (\tau_{s_{t+1}:a_T} |\tau_{s_0:a_t} )p_\theta (\tau_{s_0:a_t} ) d\tau_{s_{t+1}:a_T} d\tau_{s_0:a_t}\\ &= \sum_{t=0}^T \int_{ \tau_{s_0:a_t}} \gamma^t \nabla_\theta \log \pi_\theta(a_t|s_t) \left [\int_{\tau_{s_{t+1}:a_T}} \left(\sum_{k=t}^T \gamma^{k-t} r(s_t, a_t) \right) p_\theta (\tau_{s_{t+1}:a_T} |\tau_{s_0:a_t})d\tau_{s_{t+1}:a_T} \right] p_\theta (\tau_{s_0:a_t} ) d\tau_{s_0:a_t} \end{aligned}

여기서 마지막 줄 대괄호에 쓰인 식을 자세히 살펴보자.

τst+1:aT(k=tTγktr(st,at))pθ(τst+1:aTτs0:at)dτst+1:aT=τst+1:aT(k=tTγktr(st,at))pθ(τst+1:aTst,at)dτst+1:aT  (Markov property)=Qπθ(st,at)\begin{aligned} & \int_{\tau_{s_{t+1}:a_T}} \left(\sum_{k=t}^T \gamma^{k-t} r(s_t, a_t) \right) p_\theta (\tau_{s_{t+1}:a_T} |\tau_{s_0:a_t}) d\tau_{s_{t+1}:a_T} \\ &= \int_{\tau_{s_{t+1}:a_T}} \left(\sum_{k=t}^T \gamma^{k-t} r(s_t, a_t) \right) p_\theta (\tau_{s_{t+1}:a_T} | s_t, a_t) d\tau_{s_{t+1}:a_T} ~~ (\because \text{Markov property})\\ &= Q^{\pi_\theta}(s_t, a_t) \end{aligned}

따라서, 위의 식을 이용하여 최종적으로 그래디언트를 표현하면 다음과 같다.

θJ(θ)=t=0Tτs0:atγtθlogπθ(atst)Qπθ(st,at)pθ(τs0:at)dτs0:at=t=0T((st,at)γtθlogπθ(atst)Qπθ(st,at)pθ(st,at)dstdat)  (maginalization)=t=0T((st,at)γtθlogπθ(atst)Qπθ(st,at)πθ(atst)pθ(st)dstdat)=t=0TEstpθ(st),atπθ(atst)[γtθlogπθ(atst)Qπθ(st,at)]\begin{aligned} \nabla_\theta J(\theta) &= \sum_{t=0}^T \int_{ \tau_{s_0:a_t}} \gamma^t \nabla_\theta \log \pi_\theta(a_t|s_t) Q^{\pi_\theta}(s_t, a_t) p_\theta (\tau_{s_0:a_t} ) d\tau_{s_0:a_t} \\ &= \sum_{t=0}^T \left (\int_{(s_t, a_t)} \gamma^t \nabla_\theta \log \pi_\theta(a_t|s_t) Q^{\pi_\theta}(s_t, a_t) p_\theta (s_t, a_t ) ds_t da_t \right) ~~ (\because \text{maginalization}) \\ &= \sum_{t=0}^T \left (\int_{(s_t, a_t)} \gamma^t \nabla_\theta \log \pi_\theta(a_t|s_t) Q^{\pi_\theta}(s_t, a_t) \pi_\theta (a_t |s_t)p_\theta(s_t) ds_t da_t \right) \\ &= \sum_{t=0}^T \mathbb{E}_{s_t \sim p_\theta(s_t), a_t \sim \pi_{\theta}(a_t|s_t)} \left [\gamma^t \nabla_\theta \log \pi_\theta(a_t|s_t) Q^{\pi_\theta}(s_t, a_t) \right] \end{aligned}

앞에서 소개한 비슷한 이슈로 γt\gamma^t는 제거한다.

θJ(θ)=t=0TEstpθ(st),atπθ(atst)[θlogπθ(atst)Qπθ(st,at)]\nabla_\theta J(\theta) = \sum_{t=0}^T \mathbb{E}_{s_t \sim p_\theta(s_t), a_t \sim \pi_{\theta}(a_t|s_t)} \left [\nabla_\theta \log \pi_\theta(a_t|s_t) Q^{\pi_\theta}(s_t, a_t) \right]

Advantage

bt=Qπθ(st,at)b_t = Q^{\pi_\theta}(s_t, a_t) 치환해서 임의의 함수처럼 생각해보자.

θJ(θ)=t=0T((st,at)θlogπθ(atst)btπθ(atst)pθ(st)dstdat)=t=0T((st,at)θπθ(atst)btpθ(st)dstdat)=t=0T(st[atθπθ(atst)btdat]pθ(st)dst)\begin{aligned} \nabla_\theta J(\theta) &= \sum_{t=0}^T \left (\int_{(s_t, a_t)} \nabla_\theta \log \pi_\theta(a_t|s_t) \cdot b_t \cdot \pi_\theta (a_t |s_t)p_\theta(s_t) ds_t da_t \right) \\ &= \sum_{t=0}^T \left (\int_{(s_t, a_t)} \nabla_\theta \pi_\theta(a_t|s_t) \cdot b_t \cdot p_\theta(s_t) ds_t da_t \right) \\ &= \sum_{t=0}^T \left (\int_{s_t} \left[\int_{a_t} \nabla_\theta \pi_\theta(a_t|s_t) b_t da_t \right] p_\theta(s_t) ds_t \right) \end{aligned}

만약, btb_tata_t에 의존하지 않은 함수라고 해보자. 그리고 미분과 적분의 이동이 자유롭다고 가정하자.

atθπθ(atst)btdat=btatθπθ(atst)dat=btθatπθ(atst)dat=btθ1=0\int_{a_t} \nabla_\theta \pi_\theta(a_t|s_t) b_t da_t = b_t \int_{a_t} \nabla_\theta \pi_\theta(a_t|s_t) da_t = b_t \nabla_\theta \int_{a_t} \pi_\theta(a_t|s_t) da_t =b_t \nabla_\theta 1 = 0

위의 결과를 이용하면 다음을 알 수 있다.

θJ(θ)=t=0T((st,at)θlogπθ(atst)btπθ(atst)pθ(st)dstdat)=0\nabla_\theta J(\theta) = \sum_{t=0}^T \left (\int_{(s_t, a_t)} \nabla_\theta \log \pi_\theta(a_t|s_t) \cdot b_t \cdot \pi_\theta (a_t |s_t)p_\theta(s_t) ds_t da_t \right) = 0

따라서, ata_t에 의존하지 않은 적절한 btb_t를 이용하면 기존 그래디언트의 값은 변화시키지 않으면서 분산을 줄일 수 있다. 적절한 btb_t를 무엇일까? 앞에서 소개한 함수 중 ata_t에 의존하지 않는 것이 있다. 바로 Vπθ(st)V^{\pi_\theta} (s_t)이다. 일반적으로 bt=Vπθ(st)b_t = V^{\pi_\theta} (s_t)를 사용하면 그래디언트의 분산이 줄어든다고 알려져있다.

θJ(θ)=t=0TEstpθ(st),atπθ(atst)[θlogπθ(atst){Qπθ(st,at)Vπθ(st)}]=t=0TEstpθ(st),atπθ(atst)[θlogπθ(atst)Aπθ(st,at)]\begin{aligned} \nabla_\theta J(\theta) &= \sum_{t=0}^T \mathbb{E}_{s_t \sim p_\theta(s_t), a_t \sim \pi_{\theta}(a_t|s_t)} \left [\nabla_\theta \log \pi_\theta(a_t|s_t)\{Q^{\pi_\theta}(s_t, a_t) - V^{\pi_{\theta}}(s_t) \} \right] \\ &= \sum_{t=0}^T \mathbb{E}_{s_t \sim p_\theta(s_t), a_t \sim \pi_{\theta}(a_t|s_t)} \left [\nabla_\theta \log \pi_\theta(a_t|s_t)A^{\pi_\theta}(s_t, a_t)\right] \end{aligned}

Aπθ(st,at)=Qπθ(st,at)Vπθ(st)=Qπθ(st,at)Eatπθ(atst)[Qπθ(st,at)]A^{\pi_\theta}(s_t, a_t) = Q^{\pi_\theta}(s_t, a_t) - V^{\pi_{\theta}}(s_t) = Q^{\pi_\theta}(s_t, a_t) - \mathbb{E}_{a_t \sim \pi_{\theta}(a_t|s_t)}[Q^{\pi_\theta}(s_t, a_t)]를 advantage라고 정의한다. 식의 의미를 해석하면 sts_t 상태에서 ata_t 행동을 했을 때, 가치함수값이 기댓값보다 얼마나 좋은지를 나타내며 advantage와 의미가 통한다.

Actor-Critic

위에서 advantage를 알아보았다. 하지만 근본적인 문제는 advantage를 계산할 수 없다는 것이다. 왜냐면 Vπθ(st),Qπθ(st,at)V^{\pi_\theta}(s_t), Q^{\pi_\theta}(s_t, a_t)를 모르기 때문이다. 따라서 두 가치함수를 추정해야한다. 먼저 두 가치함수의 관계를 살펴보자.

Qπ(st,at)=r(st,at)+Est+1p(st+1st,at)[γVπ(st+1)]Q^{\pi}(s_t, a_t) = r(s_t, a_t) + \mathbb{E}_{s_{t+1} \sim p(s_{t+1}|s_t, a_t)}[\gamma V^{\pi}(s_{t+1})]

Advantage를 위의 식을 사용하여 다음과 같이 근사하자.

Aπθ(st,at)=Qπθ(st,at)Vπθ(st)r(st,at)+γVπθ(st+1)Vπθ(st)\begin{aligned} A^{\pi_\theta}(s_t, a_t) &= Q^{\pi_\theta}(s_t, a_t) - V^{\pi_{\theta}}(s_t) \\ &\approx r(s_t, a_t) + \gamma V^{\pi_\theta}(s_{t+1}) - V^{\pi_{\theta}}(s_t) \end{aligned}

Advantage를 계산하기 위해서는 상태가치함수(VV)만을 잘 추정하면 되겠다. 추정은 신경망(neural network) 모델을 통해 수행한다. 정책 역시 신경망을 통해 모델링한다. 정책을 모델링한 정책 신경망은 파라미터 θ\theta를 갖고 있으며 행동을 알려주기에 actor라고 부르며 상태가치함수를 추정하는 가치 신경망은 파라미터 ϕ\phi를 갖고 있으며 가치를 평가하기에 critic이라고 부른다.

두 신경망은 목적이 다르기에 각기 다른 손실함수(혹은 누적보상)를 최소(혹은 최대)화하는 파라미터를 학습해야한다. 먼저 가치 신경망의 손실함수를 정의하기 위해서 벨만방정식을 생각하자.

Vπ(st)=Eatπ(atst)[r(st,at)+Est+1p(st+1st,at)[γVπ(st+1)]]V^{\pi}(s_t) = \mathbb{E}_{a_t \sim \pi(a_t | s_t)} [r(s_t, a_t) + \mathbb{E}_{s_{t+1} \sim p(s_{t+1} | s_t, a_t)}[\gamma V^{\pi}(s_{t+1})]]

위에서 했던 방식과 비슷하게 상태가치함수를 근사하자.

Vϕ(st)r(st,at)+γVϕ(st+1)V_{\phi}(s_t) \approx r(s_t, a_t) +\gamma V_{\phi}(s_{t+1})

따라서 가치 신경망, critic의 손실함수는 다음과 같다.

Lcritic(ϕ)=12ir(si,ai)+γVϕ(si+1)Vϕ(si)22\mathcal{L}_{critic}(\phi) = \frac{1}{2} \sum_{i}\| r(s_i, a_i) +\gamma V_{\phi}(s_{i+1}) - V_{\phi}(s_i) \|_2^2

가치 신경망을 통해 추정한 가치함수를 가지고 advantage도 근사할 수 있다.

Aϕ(si,ai)r(si,ai)+γVϕ(si+1)Vϕ(si)A_\phi(s_i, a_i) \approx r(s_i, a_i) + \gamma V_{\phi}(s_{i+1}) - V_{\phi}(s_i)

따라서 정책 신경망, actor의 손실함수는 다음과 같다.

Lactor(θ)i(logπθ(aisi)Aϕ(si,ai))\mathcal{L}_{actor}(\theta) \approx - \sum_{i}(\log \pi_\theta (a_i | s_i) A_\phi (s_i, a_i))

최종적으로 두 손실함수를 번갈아가면서 그래디언트를 구하고 ϕ\phiθ\theta를 업데이트해서 학습을 수행한다. 자세한 알고리즘과 코드는 세종대학교 박성수 교수님께서 쓰신 수학으로 풀어보는 강화학습 원리와 알고리즘 책을 참고하면 좋다.

profile
머신러닝과 통계학을 공부하는 사람

0개의 댓글