본문 바로가기

강화 학습

강화 학습 - A2C, Continuous A2C

 

 

파이썬과 케라스로 배우는 강화학습: 내 손으로 직접 구현하는 게임 인공지능

“강화학습을 쉽게 이해하고 코드로 구현하기” 강화학습의 기초부터 최근 알고리즘까지 친절하게 설명한다! ‘알파고’로부터 받은 신선한 충격으로 많은 사람들이 강화학습에 관심을 가지

wikibook.co.kr

해당 포스팅은 위의 책을 보고 정리한 내용이 주를 이룹니다.

또한, 이 포스팅에서 Neural Network(Deep Learning)에 대해서는 따로 설명하지 않겠습니다.

이번 포스팅은 명확하게 설명하지 못한 부분이 있습니다 ㅠ


2022.01.11 - [강화 학습] - 강화 학습 - 정책 기반(Policy-based) 강화 학습, REINFORCE 알고리즘

앞서 정책 기반 강화 학습과 그중 하나의 알고리즘인 REINFORCE 알고리즘을 포스팅 했었습니다(위의 링크). 이 알고리즘은 하나의 에피소드가 끝나야 그 반환 값을 이용하여 학습을 진행하였죠. 이는 에피소드가 길어지거나, 끝이 없으면 사용하기 어렵거나 학습이 어렵다는 단점을 가지고 있습니다. 이 단점을 극복하기 위해 매 타임스텝마다(TD 방식) 학습을 진행하도록 고안된 것이 오늘 포스팅할 Advantage Actor-Critic(이하 A2C)입니다. 

지금까지의 로드맵: 오늘 포스팅(빨간 화살표)는 정책 기반 강화학습의 갈래다.

책에는 간단한 설명만 할 뿐 자세한 내용은 리처드 서튼의 "Reinforcement Learning: Intro duction"을 참고하라고 합니다(이 포스팅도 마찬가지입니다).


 

  • A2C(Actor-Critic)

먼저 REINFORCE 알고리즘에서 한 에피소드가 끝나야 학습이 가능했던 이유는 반환 값 G_t를 계산해야 했기 때문입니다. 아래 수식 3번째 수식처럼 G_t를 통해 가치 함수 q를 근사했기 때문이죠. 따라서 이 부분을 TD방식으로 매 타임 스텝마다 알아낼 수 있는 방식이 있다면 에피소드 도중에도 학습이 가능할 것임을 유추할 수 있습니다.

REINFORCE 알고리즘의 Gradient를 통한 학습: 두 번째 줄은 샘플링으로의 근사, 세 번째 줄은 q_pi(s,a)를 G_t로의 근사를 나타냅니다.

따라서, A2C에서는 G_t를 통해 가치함수 q를 근사하는 것이 아니라 Nerual Network 기반의가치 신경망을 사용하여 q함수를 근사합니다. 이렇게 하면 에피소드가 끝나지 않아도 학습할 수 있게 되는 것이죠. q함수를 예측하는 가치 신경망의 파라미터를 w라고 했을 때, 아래 수식과 같이 표현이 가능합니다. 

가치신경망을 통한 Gradient를 통한 학습: 두 번째 줄은 샘플링으로의 근사, 세 번째 줄은 q_pi(s,a)를 Q_w(s,a)로의 추정를 나타냅니다.

하지만, 가치 신경망의 출력 Q_w (s,a)은 있는 그대로가 가치신경망의 오류 값이 아닙니다. Deep SARSA를 기준으로 보면 정답인 R_(t+1)+γQ_ (S_(t+1),A_(t+1))항과 예측인 Q(S_t,A_t)항의 차이를 제곱한 MSE오류 함수를 이용하죠. 다시 말하면 학습 과정에서 그 차이가 의미가 있는 거지 Q_w(s,a)값 자체는 풀려고 하는 문제에 유의미한 정보를 추출하기는 어려운 것이죠. G_t의 값을 대체하는 역할을 할 수 있기는 합니다. 하지만 이 값이 정책신경망과 같이 학습되면서 안정될 수 있다는 것이 문제죠.

 

여기서 문제는 정책 신경망에서 나온 출력을 이용한 log(𝜋_𝜃 (𝑎│𝑠))와 Q_w (s,a)을 곱한 것이 정책 신경망의 오류 함수로써 업데이트에 사용된다는 것입니다. 이렇게 되면, 큐 함수의 값에 따라 오류 함수의 값이 많이 변화하게(분산이 큼) 된다고 책에서 말합니다. 저는 학습이 불안정 해진다고 이해했습니다.

 

때문에 A2C는 예측한 Q의 값의 변화를 줄여주기 위해 베이스라인이라는 것을 사용합니다. A2C에서는 베이스라인을 가치 함수로 사용합니다. 아래 수식처럼 예측한 Q값에 가치함수 V를 빼줍니다. 이것을 어드밴티지 함수라고 하고 그 수식은 아래와 같습니다. 가치 함수는 상태마다 값이 다르지만 행동마다 다르지는 않기 때문에 Q함수의 분산을 줄일 수 있다고 말합니다(이 부분이 사실 명확하게 와닿지는 않습니다. 나누거나 해야 하는 게 아닌가도 싶고요). 

어드밴티지 함수의 정의 1

이때, 가치 함수 V 또한 또 다른 (상태) 가치 신경망의 파라미터 v로 예측해야 하죠. 이렇게 또 하나의 학습해야 할 네트워크가 늘어나는 것은 전체적인 학습 측면에서 좋은 것은 아닐 겁니다. 그렇기 때문에 상태 가치 신경망으로 Q_w (s,a)로 나타내진 항을 대체해서 나타냅니다. 그 수식은 아래와 같습니다. 위의 수식에 Q_w (S_t,A_t)를 아래 수식에 R_(t+1)+γV_v (S_(t+1))로 나타냈죠. 책에서는 Q함수를 가치 함수를 사용해서 표현했다고 나와있습니다만, 제가 봤을 때는 Q_w(S_t,A_t)R(t+1)+γV_v (S_(t+1))가 가능한 표현인지 잘 모르겠습니다..

어드밴티지 함수의 정의 2

따라서 A2C에서는 최종적으로 어드밴티지 함수를 위의 수식같이 정의하여 사용합니다. 이렇게 되면 상태 가치를 추정하는 신경망만 학습시키면 되죠. 여기서 흥미로운 점은 위와 같은 수식으로 나타내면 TD방식에서 가치함수를 업데이트하는 식과 같아진다는 점입니다. 그리고 행동가치가 아닌 상태가치를 학습하는 신경망이므로 아래와 같은 MSE 오류 함수를 통해 가치 신경망은 학습을 진행합니다. 또 이게 가능한 이유는 정책 신경망이 있기 때문인 거 같습니다. 왜냐하면 상태 가치만 가지고는 다음 행동을 결정할 수 없는데(어떤 행동이 가치 있는지는 보여주지 않습니다.) 정책이 어떤 행동을 할지 결정하기 때문이죠 -> 이전에 상태 가치를 예측하는 신경망을 사용하지 않는 이유로도 볼 수 있습니다.

A2C의 가치신경망 Loss Function

이렇게 되면 A2C에서 사용하는 업데이트 식은 아래와 같이 표현될 수 있죠. 

A2C의 정책신경망 업데이트 식

이렇게 정리한 수식들로 A2C의 학습을 진행할 수 있습니다. 아래 A2C의 전체 학습도를 보시면 이해가 되실 거 같습니다.

A2C 전체 학습도

책에서는 이 매커니즘으로 코드를 구현한 다음 학습 경향에 대해 말합니다.

이 부분만 언급하고 다음 주제인 Continuous A2C로 넘어가겠습니다.

  • ReLU가 아닌 tanh activation 함수를 사용했을 때, 그 성능이 더 좋아졌음.
  • 또한 학습 안정성을 위해 그레디언트 클리핑(Gradient Clipping)을 사용.
  • On-Policy 방법이기 때문에 현제 에이전트가 경험하고 있는 샘플(에피소드)에 초점이 맞춰짐. 따라서 학습이 불안정(DQN이 더 안정적).

 

  • Continuous A2C

이 부분을 이해하기 위해서는 확률과 정규분포에 대한 선행 지식이 있어야 합니다.

다음으로는 Continuous A2C입니다. 아래 카트 폴을 예시로 들어 설명하겠습니다. 카트 폴은 움직이는 블록이 그 위에 긴 막대기가 쓰러지지 않게 중심을 잡는 것이 목표입니다. 이때, 카트에 일정한 크기의 힘을 가해 움직일 수 있는데, 이 힘의 크기는 정해져 있습니다. 목표는 막대(폴)를 5초 동안 넘어지지 않게 세우는 것입니다. 따라서 폴이 일정 각도 이상 떨어지지 않도록 그리고 화면 밖으로 벗어나지 않도록 학습해야 할 것입니다.

카트폴(Cartpole)

지금까지의 강화 학습 포스팅에서 행동 a는 정해진(이산적인) 행동만 할 수 있었습니다. 즉 카트를 왼쪽으로 [0.1, 0.2 0.3, 0.4...] 오른쪽으로 [0.1, 0.2 0.3, 0.4 ...] 이렇게 정해진 값으로만 움직일 수 있었죠. 여기서 왼쪽으로 0.14, 0.15, 0.16 같은 값만큼 움직인다는 것은 불가능합니다.

 

하지만 연속적인 행동은 위와 같은 값으로 표현된 행동을 할 수 있죠. 운전으로 말하자면 아래와 그림에서 차량의 핸들을 이산적으로 꺾을 수 있다면 왼쪽 그림과 같이 행동하는 것이죠. 그럼 행동을 [... 0.14, 0.15, 0.16..]같이 더 잘게 쪼개면 되는 거 아니냐고 생각하실 수 있는데, 이에 책에서는 모델 입장에서는 행동하는 값에 큰 차이가 없어도 모델 입장에서는 서로 완전히 다른 행동으로 생각한다고 말합니다. 

이산적인 행동에서의 운전(왼쪽)과 연속적인 행동에서의 운동(오른쪽)

연속적인 행동이 좋다는 것은 이해하셨으리라 믿습니다. 그럼 에이전트가 연속적인 행동을 하게 하는 방법은 뭘까요? 바로 정책을 이산적 분포(정해진 경우의 수에 대한 확률)가 아닌 연속적인 분포로 만드는 것입니다. 가장 많이 사용되는 것은 μ(평균), σ(표준편차)로 표현되는 정규분포입니다. 이런 정책을 표현하기 위해서는 정책이 별개로 있어야 하므로 정책 네트워크를 사용하는 A2C를 사용하게 되는 것입니다. 

A2C와 Continuous A2C 정책신경망의 차이

이제 위의 그림처럼, A2C의 정책 신경망의 출력을 S_t에서 이산적으로 정해진 각 행동을 할 확률이 아닌 S_t 에 대한 행동 분포를 나타내는 μ, σ로 바꾸면 Continuous A2C에 맞는 정책을 구현할 수 있습니다. 에이전트는 이 분포에서 샘플링된 행동을 수행하고 그 행동에 대한 해당 분포에서의 확률 값으로 진행하게 되는 것이죠. 아래 그림을 예시로 들면, 빨간색 분포는 특정 상황 s_t에서의 행동 분포입니다. 여기서 샘플링되어 에어전트가 실제 한 행동은 a_t이고요. 이때 행동은 주로 평균 μ에 가깝게 샘플링될 것입니다. 말 그대로 이 상황에서는 μ 값에 가깝게 행동하는 것이 평균적인 행동이라는 의미죠. 추가로 σ는 탐험하는 정도를 나타낼 수 있습니다. (사실 이 부분은 코드를 봐야지 좀 더 이해가 가실 거 같습니다. 참고로 코드는 오픈돼있습니다.)

 

특정 상황에서 μ, σ로 표현된 행동 분포와 그 분포에서 샘플링 된 a_t

이때 학습은 상황 s와 실제 행동한 a에 대해 이루어지기 때문에 아래 수식같이 표현될 수 있습니다. A2C와 기호는 같지만 의미하는 바가 다르다는 점을 알아두시면 좋을 거 같습니다.

Continuous A2C의 정책 신경망 업데이트


여기까지 연속적인 행동을 표현하고, 학습할 수 있다는 것을 확인했습니다.

그럼 마지막으로 책에 나온 학습 경향을 언급하고 글 마무리하겠습니다.

  • Continuous A2C가 A2C보다 학습 과정에서 더 불안정함(하지만, 학습하는 데 걸리는 시간은 비슷)
  • 카트 폴에서 균형을 유지하면서 화면의 한쪽으로 움직임, 이는 에이전트가 미세한 힘을 카트에 줄 수 있기 때문(이렇게 천천히 움직이면서 성공함).

이번 포스팅에서 A2C과 Continuous A2C를 알아보았습니다. 두 방식 모두 On-Policy 방식을 사용하기 때문에 DQN에서 나온 리플레이 메모리의 사용 같은 Off-Policy의 장점을 사용할 수 없습니다. 그렇기 때문에 더 복잡한 문제에 대해서는 충분히 탐험하지 못하여 학습 성능이 떨어진다고 책에서는 설명합니다. (DQN에서 언급한 샘플 간 Correlation 문제도 있는 듯합니다) 이 단점을 극복한 것이 다음 포스팅에 나올 A3C(Asynchronous Advantage Actor-Critic)입니다.

 

감사합니다.