본문 바로가기

유니티 ML Agents/머신러닝과 강화학습 기초

5. 강화학습

강화학습이란


강화학습은 에이전트가 주어진 환경에서 누적 보상이 최대화 되도록 행동하게 하는 정책이 무엇이지 알아내는 머신 러닝의 분야이다. 강화학습에서 에이전트란 환경에서 행동하는 주체이다. 아기가 걸음마하는 문제를 풀어야 하는 환경에서는 아기가 에이전트가 된다.


보상(Reword)이란 에이전트가 좋은 행동을 했는지 나쁜 행동을 했는지 알려주는 정보이다. 강화학습에서 에이전트가 좋은 행동을 한다면 플러스 보상이 주어지고 나쁜 행동을 한다면 마이너스 보상이 주어진다. 좋은 행동이란 목표에 도달하는데 도움을 주는 행동이고 나쁜 행동이란 반대로 목표에 도달하는데 방해가 되는 행동이다.


강화학습에서 정책(Policy)이란 행동을 결정하는 기준이다. 좋은 정책을 만들어야 좋은 행동을 하고 보상을 많이 받을 수 있다.

강화학습에서 환경(Environment)은 에이전트가 인식하는 세계를 의미한다. 환경에서 에이전트는 활동하고 보상을 받는다.

상태(State)란 에이전트가 환경을 인식하는 방식을 말한다. 에이전트가 행동을 하면 상태가 변하고 어떤 상태로 변했느냐에 따라 보상이 주어진다.


강화학습 개념


강화학습에서 에이전트가 좋은 행동을 한다면 플러스 보상이 주어지고 나쁜 행동을 한다면 마이너스 보상이 주어진다. 좋은 행동이란 목표에 도달하는데 도움을 주는 행동이고 나쁜 행동이란 반대로 목표에 도달하는데 방해가 되는 행동이다. 강화학습에서 정책이란 행동을 결정하는 기준이다. 좋은 정책을 만들어야 좋은 행동을 하고 보상을 많이 받을 수 있다. 강화학습에서 환경은 에이전트가 인식하는 세계를 의미한다. 환경에서 에이전트는 활동하고 보상을 받는다.


(1) 에이전트가 활동하면 환경에서는 새로운 상태와 상태에 따른 보상 값을 에이전트에게 알려준다. (2) 에이전트는 상태와 보상을 정책에 입력해 새로운 행동을 하게 된다. 에이전트의 행동은 환경에서 이루어지며 이러한 행동은 환경에 영향을 미치고 (3) 환경은 새로운 상태와 보상을 에이전트에게 알려준다.


강화학습은 환경에서 알려주는 정보인 상태와 보상을 가지고 최적의 정책을 찾는 과정이다. 최적은 정책은 다음 단계에서 받을 보상을 최대로 하는 것이 아니라 지금의 행동이 먼 미래에 미칠 영향을 모두 고려(누적 보상)해 최상의 행동을 이끌어 내야 한다.


강화학습에서 해결하고자 하는 문제가 바로 최적의 정책을 찾는 것이다. 머신 러닝에서 문제를 해결하기 위해서는 반드시 문제를 수학적으로 정의해야 한다. 이때 사용하는 개념이 MDP(Markov Decision Process)이다. 강화학습에서는 누적 보상을 계산해서 최적의 정책을 찾아야 하기 때문에 MDP는 유한한 상태에서만 문제를 풀 수 있다는 한계를 가지고 있다. 유한한 상태라는 것은 뒤에서 살펴볼 그리드월드와 같이 에이전트의 상태의 수가 정해져 있는 것이다. 하지만 MDP는 모든 강화학습 알고리즘의 이론적 배경이 되기 때문에 반드시 알고 넘어가야 한다.


그리드 월드


강화학습을 설명하기 위해 많이 사용하는 그리드 월드를 살펴보자. 게임의 목적은 에이전트를 목표로 이동하는 것이다. 장애물을 만나면 즉각 감점을 받게 된다. 에이전트는 장애물을 피해 목표로 도달하는 최적 경로를 찾아야 한다. 크기가 작은 그리드월드에서는 사람이 눈으로 최적 경로를 찾는 것이 더 빠를 수 있다. 컴퓨터가 최적 경로를 찾기 위해서는 모든 경우의 수를 고려해야 한다. MDP를 통해 컴퓨터가 어떤 방식으로 최적 경로를 찾아가는지 알아보자.

 

MDP


MDP(Markov Decision Process 마르코프 의사 결정과정)는 용어 그대로 의사 결정 과정을 수학적으로 모델링한 것이다. MDP 1950년대에 처음 고안되었으며 로봇 공학, 경제학 등 다양한 분야에서 활발하게 사용되고 있다.


위키피디아에서는 MDP를 이산 시간 확률 제어 프로세스(discrete time stochastic control process)라 정의하고 있다. 이산시간에서는 입출력 신호가 모두 일정한 시간에서 정의된다. 반면 연속시간에서는 입출력 신호가 연속된 시간에서 표현된다. 디지털 시계가 이산시간이라면 시계 바늘이 이동하는 아날로그 시계는 연속시간이다. 우리가 일상에서 마주치는 대부분의 사물은 연속시간에서 표현된다. 이산시간에서는 제어 공간이 한정되어 있고 쉽게 제어 가능하다. 우리가 강화학습으로 해결해야하는 대부분의 문제는 연속 시간 공간에 있기 때문에 MDP를 그대로 적용할 수 없다. 하지만 강화학습이 지금까지 발전해 오기까지 MDP가 이론적 토대를 제공했기 때문에 MDP를 이해하는 것은 강화학습을 이해하는데 핵심이라 할 수 있다.


상태 집합과 행동 집합


앞으로 나오는 대문자를 집합을 의미하고 소문자는 집합의 원소를 의미한다. 예를 들어 S라 표현하면 상태 집합 S에 속하는 모든 원소 {s1, s2, s3, .., st}를 의미한다특정 상태를 나타내기 위해서는 소문자 st를 사용한다.


MDP


MDP(Markov Decision Process 마르코프 의사 결정과정)는 용어 그대로 의사 결정 과정을 수학적으로 모델링한 것이다. MDP 1950년대에 처음 고안되었으며 로봇 공학, 경제학 등 다양한 분야에서 활발하게 사용되고 있다


MDP 정책


이제 MDP 구성요소를 가지고 강화학습에 필요한 개념들을 하나씩 정리해 보자. 강화학습의 목적이 누적 보상을 최대로 하는 정책(최적 정책)을 찾는 것이라고 했다. 먼저 최적 정책을 수학적으로 정의해 보자. 다시 한번 말하지만 프로그램으로 문제를 풀기위해서는 수학적으로 정의하는 것이 선행되어야 한다.


정책을 수학적으로 정의하면 위 그림과 같다.


정책의 수학적 정의를 이해하기 위해서는 먼저 조건부 확률을 알아야 한다. 조건부 확률이란 용어 때문에 어렵게 느껴질 수 있지만 알고 보면 별거 아니다. | 기호 뒤에 오는 것이 조건이다. 앞에 오는 것이 조건에 따른 상태이다. 이것들을 괄호로 묶고 앞에 확률 기호 P를 붙여줬다. 따라서 조건부 확률이 의미하는 것은 특정 조건에서 특정 상태로 갈 확률을 의미한다.


다시 정책으로 돌아와 보자. 시간 t에서 시간 t+1 이동하는 상황이다. 시간 t에서의 상태는 st이고, 취하는 행동은 at이다. 이것이 바로 조건이다. 이러한 조건에서 시간 t+1에 상태가 s 로 바뀐다는 것이다. 그리고 이것을 확률적으로 말하면 정책이 된다.

그리드월드에서 정책을 알아보자. 상태(5)에서 취할 수 있는 행동은 모두 4개이다. 앞에서 정책은 확률이라 언급했다. 따라서 정책은 상태(5)에서 4개 행동 각각에 대한 확률로 나타낸 수 있다. 초기에는 (a1, a2, a3, a4) = (0.25, 0.25, 0.25, 0.25)로 있다가 학습이 점점 진행되면서 최적의 정책을 찾아 (a1, a2, a3, a4) = (0.1, 0.1, 0.85, 0.05)와 같은 방식으로 변할 수 있다. 이와 같은 정책에서 상태(5)에서 에이전트는 확률이 가능 큰 a3 행동을 취하게 된다


누적보상


강화학습에서 계산하는 누적 보상에 대해 알아보자. 상태 st에서의 보상은 미래에 받을 것으로 예상되는 모든 보상을 고려해야 하며 미래의 보상은 현재 가치로 환산하기 위해 감가율을 곱해줘야 한다

.

현재 시점에서의 보상이란 현재 시점(t)에서부터 미래 시점(k=)까지 모든 상태에 대한 보상을 합산한다. 먼 미래에 받을 보상은 현재에 받는 보상보다 중요성이 떨어지기 때문에 감가율을 곱해 현재 가치로 환산한다. 감가율은 0보다 크고 1보다 작은 

값이므로 감가율이 많이 곱해질 수록 값이 작아진다.


보상은 특정 상태에서 어떤 행동을 취했는지에 따라 달라진다. 그리드월드에서 취할 수 있는 행동은 모두 4(, , , )이다. 만일 장애물이 있는 상태로 이동할 경우 마이너스의 보상을 받기 때문에 전체 보상은 작아지게 된다.

다시 말하면 강화학습의 목적은 Rt를 최대로 하는 정책을 찾는 것이다.


MDP 가치 함수


가치는 현재 시점에서 미래에 받을 수 있는 모든 보상의 합에 대한 기대 값이다 .기대 값이란 정해진 것이 아니라 확률적이란 의미이다. 가치에 대한 정의를 수식으로 나타내면 (1)과 같다.


(2) 상태 s에서 t 시점의 가치를 풀어서 설명하면 시간 별로 받을 보상에 감가율을 곱해 모두 더한 것과 같다.


(3) 위 식을 좀 더 간략하게 하자면 t+2 시간 이후에 받을 보상은 st 다음 상태인 st+1 상태에서 받을 보상으로 대치할 수 있다.


(4) 이제 가치 함수를 프로그램화 하기 위해 필요한 과정은 기대 값을 계산할 수 있는 형태로 만드는 것이다. 상태 s에서 상태 s’로 이동할 때 여러 경우의 수가 있다. 그리드 월드에서는 전///우 모두 4가지 상태가 있다. 이에 대한 모든 가치를 따로 계산해야 한다. 여기에서 기대 값은 상태 전이 확률(P)로 변경되어 다음 상태에서 얻을 수 있는 가치에 곱해진다.

가치 함수는 누적 보상에 상태 전이 확률의 개념을 더한 것과 같다. 누적 보상을 구할 때는 상태에 대한 개념을 생각하지 않고 보상만을 고려했다. 누적 보상을 좀 더 현실과 가깝게 만들기 위해서는 시간의 변화뿐 아니라 상태에 대한 변경 또한 고려해야 한다. MDP에서 하나의 상태에서 다른 상태로 이동하는 것을 확률적으로 표현했고 이것을 상태 전이 확률(P)이란 개념을 사용했다.


그리드월드에서 v(s)를 계산하기 위해서는 변할 수 있는 모든 상태(4)에 대한 가치를 계산하고 거기에 상태 전이 확률과 감가율을 곱해준다


MDP 상태 가치 함수


누적 보상에 상태 변화를 함께 고려한 것이 가치 함수였다면 이번에는 정책까지 고려해보자. 이것을 상태 가치 함수라고 한다. 강화 학습의 목적이 누적 보상을 최대로 하는 정책을 구하는 것이 목적이다. 따라서 우리는 지금 누적 보상, 상태 변화 그리고 정책을 함께 살펴보고 있기 때문에 우리가 찾는 강화학습의 목적에 좀 더 가까이 가고 있음을 알 수 있다.


상태 가치 함수는 가치 함수에 파이를 곱해준 것과 같다. 따라서 앞에서 살펴본 상태 가치 함수 식 앞에 를 곱해줬다. 그리드 월드 예를 살펴보면 하나의 상태가 가질 수 있는 정책은 모두 4개이며 확률로 표현된다. 즉 하나의 상태에서 4가지 행동을 할 수 있는데 각각의 행동을 취할 수 있는 확률을 가지고 있는 것이다. 따라서 모든 정책을 고려해야만 함으로 는 모든 정책(행동에 대한 확률)을 곱해서 합산 한다는 의미이다.


수식(1)은 개념적 설명에 적합하고 수식(2)는 수학적 계산에 적합하다. 수식(1)을 통해 의미를 이해하고 수식(2)를 통해 코드로 직접 구현할 수 있다. 우리의 최종 목적은 강화학습을 코드화하는 것이기 때문에 복잡하지만 계산 가능한 식을 구해보는 것이다.



큐 러닝과 DQN


큐 함수


정책과 행동을 동시에 고려한 가치를 계산해 보자. 이것을 행동 가치 함수라 하며 다른 말로 큐 함수라 부른다. 정책과 상태변화를 동시에 고려하는 상태 가치 함수는 모든 행동에 대해 가치를 계산한다. 프로그래밍 관점에서 이 것을 생각해 보면 코드로 구현하기가 굉장히 어렵다고 할 수 있다. 큐 함수가 등장한 배경은 코드 구현을 좀 더 쉽게 하기 위한 목적이 있다. 큐 함수는 정책과 상태변화를 고려하지만 특정 행동만을 생각한다. 수식을 하나씩 살펴보면서 큐 함수에 대해 좀 더 자세히 알아보도록 하자.


(1) 상태 가치 함수가 모든 정책에 대해 가치를 계산했다면 큐 함수는 특정 행동(a)을 취했을 때 가치를 계산한다.


(2) 상태 가치 함수를 큐 함수를 통해 나타내 보면 큐 함수는 특정 행동 a에 대한 가치만을 계산했기 때문에 상태 가치 함수로 변환하기 위해서는 모든 정책에 대한 가치를 다시 계산해야 한다.


(3) 다시 큐 함수를 상태 가치 함수로 나타내고자 한다면 상태 가치 함수에서 특정 행동(a)를 취할 수 있는 상태전이 확률을 곱해주면 된다.


(4) 마지막으로 큐 함수를 계산 가능한 재귀적 형태로 나타내 보면 (3)번 식에서 상태 가치 함수를 (2)번 식에 있는 큐 함수로 대체해주면 된다.


큐 함수를 재귀적 형태로 표현한 것을 벨만 방정식이라 한다. 벨만 방정식은 현재 상태와 다음 상태와의 관계를 표현하며 이렇게 나타내는 방식을 재귀적이라 한다.


함수가 재귀적으로 표현되면 수학적으로 계산이 가능하다. 앞서 설명한 상태 가치 함수의 마지막 수식도 재귀적으로 표현된 벨만 방정식이다.


하지만 상태 가치 함수는 모든 행동을 동시에 고려해야 해서 계산이 복잡하다. 따라서 각각의 행동에 대해 별도의 값을 구할 수 있는 큐 함수를 새로 도출했다.


최적 큐 함수


큐 함수는 특정 행동을 선택했을 때 가치를 계산한다. 따라서 정확한 큐 함수를 구할 수 있다면 어떤 행동을 해야할 지 결정할 수 있다. 큐 함수의 값은 내부적으로 상태와 정책에 영향을 받기 때문에 정확한 최적 큐 함수를 구할 수 있다면 특정 상황에서 최적의 행동을 결정할 수 있는 정책을 찾을 수 있다는 얘기와 같다.


이제 문제는 어떻게 최적 큐 함수를 구하느냐 이다. 여기에는 다양한 방법론이 있지만 큐 러닝을 통해 해결 방법을 찾아보도록 하자.


큐 러닝과 DQN


앞에서 말했듯이 큐 함수의 목적은 수식 (1)을 계산했을 때 최적 큐 함수를 얻는 것이다. 큐 함수의 벨만 방정식을 보면 알 수 있듯이 계산이 쉽지 않다.


특히 재귀적으로 계산하는 부분은 단계별로 무한 반복해야 하는 문제가 있다. 유한 상태인 경우는 가능하겠지만 상태가 무한하다면 상당히 복잡해 진다.


문제를 보다 쉽게 해결하기 위해 큐 함수에서 (1)번 부분을 모델화(함수화)해야 한다. 목표는 최적의 큐 함수를 도출하는 모델을 만드는 것이다.


그리드 월드와 같이 상태가 몇 개 안되는(유한 상태) 경우에는 프로그램으로 쉽게 모델을 구현할 수 있다. 하지만 카트폴 같이 상태가 연속형 변수인(무한상태) 경우에는 모델을 프로그램화 할 수 없다.


이때 사용하는 것이 딥러닝이다. (2)번과 같이 모델을 인공신경망으로 설계하고 학습을 통해 변수를 알아내는 방식을 사용하는 것이다. 다시 말하면 (1)번 수식을 코드로 구현하기가 힘드니까 (2)와 같은 인경신경망으로 대체하는 것이다. 모델을 직접 구현하는 것이 아니라 모델을 딥러닝 네트워크로 구성한 다음에 목표로 하는 모델과 가장 가까운 모델을 딥러닝으로 학습하는 것이다.


인공신경망에서 사용하는 손실함수는 수식(3)과 같으며 수식 (4)를 계산한 결과와 목표 값인 수식(5)의 차이가 최소화 되는 방향으로 학습하면 된다. 여기서 는 학습 속도를 조절하는 하이퍼 파라미터이다.


큐 러닝 입실론 탐욕 정책


강화학습에서 많이 거론되는 문제가 탐험과 탐욕(Exploration and Exploitation)의 문제이다. 강화학습은 누적 보상이 최대가 되는 방향으로 행동을 결정하는데 이런 결정방식을 탐욕 정책이라 한다. 학습 초기에 정책을 탐욕적으로 결정하게 되면 에이전트가 다양한 방식으로 학습하지 못하는 결과를 초래한다. 학습 초기에 설정된 정책은 미성숙하기 때문이다. 그리드 월드에서 에이전트가 한쪽 구석에 몰려서 나오지 못하는 경우도 발생할 수 있다.


이런 문제를 해결하기 위해 등장한 것인 입실론(epsilon) 탐욕정책이다. 입실론 값(0 < < 1)을 정해서(학습자가 정함) 랜덤으로 뽑은 숫자가 입실론 보다 크면 탐욕 정책으로 행동을 결정하고 입실로 보다 작으면 랜덤하게 행동을 결정한다. 입실론 탐욕정책을 사용하면 에이전트가 다양한 상태를 탐험하면서 학습을 성능을 올릴 수 있다.


학습이 진행될 수록 정책의 정확도가 향상되기 때문에 입실론 값은 줄어들어야(decay) 한다. 그래야만 에이전트가 정책에 따라 행동할 확률이 올라가기 때문이다. 얼마의 비율로 입실론 값이 줄어 들 지는 학습자가 결정하게 된다.


DQN 리플레이 메모리


강화학습에서 학습 데이터가 시간적인 상관관계를 가지고 있다면 학습에 문제가 발생할 수 있다. 최근에 수집한 데이터를 학습에 계속 사용한다면 에이전트가 좋지 않은 환경에 들어가면 계속 좋지 않은 데이터를 학습할 수 있다. 따라서 시간이 좀 지났지만 학습이 잘 됐던 데이터를 다시 사용하는 것이 학습에 도움이 될 수 있다.


이러한 문제를 해결하기 위해 등장한 것인 리플레이 메모리(Replay Memory) 기술이다. 학습 단계를 두 단계로 분리한다. 하나는 리플레이 메모리 생성 과정이고 다른 하나는 재현 메모리를 활용한 학습 과정이다. 리플레이 메모리 생성 단계에서는 모델을 학습하지 않고 에이전트를 실행하면서 데이터만 수집한다. 이 데이터를 리플레이 메모리에 저장한다. 리플레이 메모리의 크기는 정해져 있기 때문에 수집한 데이터가 리플레이 메모리 크기 보다 많아지면 리플레이 메모리에 가장 오래전에 저장된 데이터를 삭제한다.


리플레이 메모리 생성 과정이 끝나면 리플레이 메모리에서 데이터를 무작위로 추출해 모델을 학습하게 된다. 이 과정에서 학습 데이터의 시간적 연관성이 사라지게 된다. 


카트폴 DQN


카트폴 예제를 살펴보자. OpenAI(https://gym.openai.com/docs) 에서는 강화학습을 위한 다양한 예제를 제공하고 있다. 그 중 카트폴을 살펴보고 다음 장에서 DQN으로 직접 구현해 보도록 하자. 카트폴은 막대()가 달린 수레(카트)를 좌우로 움직이면서 막대가 바닥으로 쓰러지지 않도록 중심을 잡는 게임이다. 막대는 수레에 고정되어 있지 않고 좌우로 움직일 수 있다. 예전 손바닥에 막대를 세워 놓고 이리저리 움직이면서 막대가 바닦으로 떨어지지 않도록 했던 놀이와 비슷하다. 다만 차이점은 손바닦이 아니라 수레를 움직인다는 차이가 있다.


강화학습에서 상태는 에이전트가 인식하는 환경을 말한다. 그리드월드에서 상태는 그리드 하나하나가 상태가 된다. 앞선 예제에서는 모두 9개의 그리드가 있으므로 9개의 상태를 가지고 있다. 하지만 그리드 월드에서 에이전트가 인식하는 환경은 좀 다르다. 에이전트는 수레의 위치, 수레의 속도, 막대의 각속도, 막대의 각도를 인식한다. 4개의 숫자가 에이전트가 동작하는데 필요한 모든 숫자이기 때문이다.


그리드 월드와 카트폴이 가지고 있는 상태의 차이점의 종류만이 아니다 상태가 가질 수 있는 값에서도 차이가 있다. 그리드월드의 상태는 0부터 8까지 숫자로 모두 표현될 수 있다. 따라서 그리드월드를 강화학습으로 구현할 때 에이전트가 가지는 상태는 배열로 표현한다. 하지만 카트폴에서의 상태는 정수가 아닌 실수의 형태를 가진다. 수레의 속도는 0.00001이 될 수도 있고 10이 될 수도 있다. 이와 같은 카트폴의 상태를 배열로 표시할 수 있는 방법은 없다.


그리드월드에서는 상태와 상태에 따른 큐 값을 이중 배열로 저장했다. 이것은 에이전트가 환경으로부터 받아들이는 값(상태)과 그 값에 따라 어떤 행동을 취할 것인지(정책)에 대한 모든 정보를 배열로 저장한다는 의미이다. 하지만 카트폴에서는 배열을 사용할 수 없기 때문에 근사 함수를 만들어서 사용한다. 에이전트의 상태에 따른 행동을 결정해주는 근사 함수를 만들어 사용한다.

여기에 딥러닝 이론을 접목해 보면 근사 함수를 인공신경망으로 대체할 수 있다. 강화학습의 문제를 인공신경망을 통해 좀 더 효율적으로 해결할 수 있는 것이다.


'유니티 ML Agents > 머신러닝과 강화학습 기초' 카테고리의 다른 글

5. 강화학습  (0) 2019.02.26
4. 딥러닝  (0) 2019.02.26
3. 분류(Classification) 분석  (0) 2019.02.26
2. 선형 회귀(Linear Regression) 분석  (0) 2019.02.26
1. 머신러닝  (0) 2019.02.26