티스토리 뷰

Study/AI

[RL] CS285 - Supervised Learning of Behaviors (1)

생각많은 소심남 2018. 10. 17. 22:58

< 해당 포스트는 UC Berkeley 에서 진행된 Deep Reinforcement Learning의 가을 강좌를 요약한 내용입니다.>

 우선 강화학습을 하기전에 notation에 대한 정의가 필요해서 정리해본다. 강의에서는 강화학습을 바로 다루기보다는 조금 익숙한 Supervised Learning에 맞춰서 필요한 구문들을 설명해놨다. 그래서 제일 처음 다룬 내용은 다음과 같았다.

 사실 위의 그림을 기존에 우리가 supervised learning이라고 알고 있던 문제를 강화학습 notation으로 변경해서 표현한 예시이다. 일반적인 Supervised learning의 process는 위와 같이 진행된다. 먼저 다들 아는 내용이겠지만 supervised learning은 정답지가 있는 상태에서 학습을 시켜, 미지의 문제가 왔을 때도 이에 대한 반을 보이게 해주는 머신러닝 기법 중 하나인데, 위와 같이 이미지가 들어온 경우, 해당 데이터를 학습된 신경망을 거쳐서 어떠한 출력을 내보내게 된다. 이 출력을 바탕으로 어떤 값을 예측할 수도 있고, 혹은 어떤 class인지도 분류할 수 있다. 그래서 보통 입력으로 들어오는 값을 O(Observation), 이에 대한 출력을 a(Action)이라고 표현하고 있다. 위의 같은 예시에서 a는 categorical variable을 내보내는 역할을 한다고 보면 좋을거 같다. 

 사실 위의 process에서 핵심은 가운데 부분인데, 강화학습에서는 해당 부분을 Policy(π)라고 표현한다. 이 Policy는결과물로 해당 출력이 나올 확률에 대한 분포를 나타낸다. 즉, 어떠한 observation이 있을 때 해당 action이 취할 확률에 대한 분포를 보여준다고 보면 될거 같다. 결국 위의 예제에서는 처음 호랑이 이미지가 들어왔을 때, 중간 layer를 거쳐서 나온 각 출력별 label이 나올 확률 분포를 softmax 같은 기법을 통해 원하는 label을 선별하는 것이 된다. 참고로 Policy 밑에도 첨자로 theta(θ) 가 나오는데, 일반적인 머신러닝/딥러닝에서도 다루는 notation과 동일하게 내부 policy의 weight이라고 보면 된다.

 그럼 위의 예제를 sequential decision making problem으로 바꿔서 생각하면 어떻게 될까? 위의 예제는 전체 process를 근사해서 표현한 케이스 인것이고, 여기에 시간적인 개념이 추가된 것이기에 notation이 살짝 바뀌게 된다.

잘 보면 알겠지만, 이제 각 notation 밑에 첨자로 t가 붙은 것을 알 수 있다. 이 말은 앞에서 봤던 전체의 상태를 놓고 학습시키는 것이 아닌, 뭔가의 sequential process내 각 time step를 학습시키겠다는 것을 의미한다. 다시 말해 t step시점에서 관찰한 결과(O_t)를 바탕으로 a를 취하는데(a_t), 이때 사용되는 Policy 역시 각각의 관찰 결과와 액션을 활용하게 된다. 그런데 보통 이런 sequential decision making을 하는데는 action을 결정하는데, 이전의 정보를 활용하는 부분이 필요한데, 이를 위해서 action에 대한 결과가 다음 관찰 결과에 영향을 주는 과정으로 되어 있다. 이게 앞에서 다뤘던 supervised learning과 다른 부분이다. (강의에서는 supervised learning과 같은 문제를 IID(Independent and identically distributed random variable)이라고 언급하고 있다.)

 이제 sequential decision making이 가능하니까, 굳이 위 예제와 같이 라벨링에만 쓸 수 있는 것이 아니라 어떤 사물이 action을 선택하는데도 활용할 수 있다. 예를 들어 위와 같은 호랑이라는 것이 입력이 들어오면, 그에 대한 action으로는 도망칠수도 있고, 무시할 수도 있고, 뭔가 행동을 할 수 있는 여지를 부여할 수 있게 된 것이다. 이와 같이 1번 행동, 2번 행동과 같은 discrete action만 가능한 것도 아니고, continuous action도 출력으로 내볼 수 있다.

  그럼 위에서 정의한 notation을 정리해보면 다음과 같다.

$$ s_{t} - state $$
$$ o_{t} - observation $$
$$ a_{t} - action $$
$$ \pi_{\theta}(a_{t} | o_{t}) - policy $$

그런데 강화학습에 대해서 조금이라도 아는 사람 입장에서 보면 \(s_{t}\)와 \(o_{t}\) 간에 무슨 차이가 있냐고 궁금증을 가질 수 있다. 사실 차이는 해당 시스템이 전체적인 상태를 이해했느냐의 여부에 따라 다른 개념이다.

만약 치타가 가젤을 쫓고 있다고 가정해보자. 딱 맨 위의 이미지만 보면, 가젤이 치타한테 쫓기는 상황만 알 수 있지, 치타와 가젤의 거리는 어느 정도 되고, 가젤과 치타는 어떤 속도로 달리고 있는지 모르는 상황이다. 이때는 단순히 시스템 입장에서는 이미지만 가지고 입력을 받게 되는 것이고, 이때 학습이 되는 결과는 이미지를 구성하는 픽셀이 될 것이다. 그런데 만약 시스템이 전체 상태에서 알고 있다면, 어떻게 될까? 다시 말해 위와 같은 이미지가 여러개가 쌓여서 전체를 이루게 된다면, 그때는 치타와 가젤의 위치, 속도를 알 수 있게 될 것이다. 보통 이런 경우를 전체 관찰(Fully Observed)한 상태로 표현하고, 이때는 policy가 아래와 같이 조금 바뀌게 된다.

$$ \pi_{\theta}(a_{t} | s_{t}) - policy $$

 다시 state와 observation에 대해서 정의를 하면, observation을 통해서 얻을 수 있는 environment의 실제 구성이 state가 되는 것이라고 할 수 있겠다. 이와 같은 관계를 그래프로 그려보면 아래와 같다.

 어떻게 보면 action은 state에서 바로 파생되어 나오느 것으로 보일 수도 있는데, 위 그래프를 보면 state에서 파생되는 observation에서 action이 나온다. 이때 위에 표시되어 있는 \(\pi_{\theta}\)는 state가 아닌 observation을 기반으로 나온 것이기 때문에 Partially Observed 라는 표현을 쓴다. 밑에 있는 조건부 확률인 $$ p(s_{t+1} | s_{t}, a_{t}) $$ 는 현재 state와 다음 state간의 관계를 표현한 것인데, 해석을 하면 주어진 \( s_{t} \)와 \(a_{t}\)가 있을 경우 \(s_{t+1}\)이 나올 확률을 의미한다.

 그런데 여기서 유심히 봐야 할 것은 \(s_{2}\) 상태에서 \(s_{3}\) 가 나올 확률을 구할 때 이전 state인 \(s_{1}\)는 계산에 관여하지 않는다는 것이다. 다시 말해 미래의 state가 나올 확률을 구하는데, 이전 state의 정보는 필요하지 않다는 것이다. 보통 이런 것을 markov property라고 이야기한다. 위키피디아에도 정의가 나와있는데, 어떤 확률적인 과정 중 memoryless 한 특성, 즉 미래 state에 대한 정보는 현재 state와 연관 있을 뿐, 이전 과정과는 상관이 없다는 것이 markov property에 대한 설명이다.( 참고로 markov property를 띄는 process를 markov process라고 부른다.)

 어떤 사람은 언제부터 state(\(s_{t}\))와 action(\(a_{t}\))을 썼을까 궁금해할 수 있다. 또 논문을 찾아보면 어디서는 State와 Action을 각각 \(x_{t}\), \(u_{t}\)라고 쓰는데도 있을 것이다. 사실 전자의 개념은 인공지능을 배워본 사람이라면 다 들어봤을 Richard Bellman의 Dynamic Programming에서 나온 개념이고, 후자는 Russia 과학자인 Lev Pontryagin의 Optimal Control Theory에서 나왔다. 그래서 아마 강화학습과 관련된 논문에서는 전자가 많이 쓰이고, 로봇과 관련된 논문은 후자의 개념이 많이 쓰이는 것 같다. 추후에 나올 notation은 \(s_{t}\)와 \(a_{t}\)를 사용할 예정이다.

 자 다시 기존에 다루던 내용으로 돌아가, 어떻게 하면 주어진 observation과 action에 대한 분포를 바탕으로 policy를 학습시킬 수 있을까? 먼저 기존에 호랑이의 동작을 예측하던 예제를 바꿔 자율 주행과 관련된 예제를 바탕으로 설명해보고자 한다.

 위의 예제에서도 앞에서 다뤘던 Image classification과 동일한 접근 방식을 취할 수 있다. 트럭 운전사에게 카메라를 붙여서 주변을 촬영할 수 있고, 바퀴 회전이나 연료 소모, 브레이크 제어 같은 것을 기록하는 일종의 메카니즘을 만들어서 나름의 observation을 기록할 수 있다. 물론 실제 차량이 이동하는 action도 같이 말이다.

 결국 이런 데이터를 바탕으로 training data를 만들 수 있게 되고, 여러가지 기법을 통해서 학습을 시키게 되면 나름의 신경망을 만들어낼 수 있게 되고 이게 하나의 \(\pi_{\theta}(a_{t}|o_{t})\)가 된다. 그런데 이렇게 만들면 잘 동작할까?

 답은 "아니오"다. 여러가지 요인이 있을 수도 있지만 저런식으로 모은 데이터가 운전 경로를 generalize하기에 부족한 것도 하나의 요인이 될 수 있다. 사실 데이터를 충분히 모았어도 문제는 더 있다. 

위의 그래프는 시간에 따른 state의 변화를 측정하기 위한 그래프이고, 검정색이 학습 경로, 빨강색이 학습된 \(\pi_{\theta}\)에 의해서 예측된 경로이다. 물론 잘 학습된 신경망이라면 빨강색 선도 검정색을 잘 따라가는 것을 확인할 수 있다. 하지만 100% 완벽하지 않기 때문에 어느정도의 training error가 발생할 것이고, 이에 따라 state도 변경될 것이다. 문제는 한번 error가 발생하고 난후의 state가 기존과 동일하지 않기 때문에 현재의 state 기반으로 다음 state를 예측하는 markov property 특성상 이 때 이후로는 전혀 다른 경로가 예측되게 된다. 이 때문에 final state도 training trajectory와 expected trajectory가 달라지게 되는 것이다. 결국 초기의 작은 error로 인해서 policy \(\pi_{\theta}\)가 발산하게 된다.

 이 문제에 대해서 Nvidia에서는 다음과 같은 방식으로 해결하려고 노력했다.[각주:1]

 사실 이전 접근 방식과 비슷할 수 있는데, 학습시킬 때 하나의 카메라만 썼던 기존 방식에서 이제는 left camera와 right camera를 덧붙였다. 그래서 바퀴를 회전시킬 때도 좌우에 달린 카메라를 통해서 정보를 보상(compensate)하는 기준을 두게 한 것이다. 제어쪽에서는 이런 방식으로 Stabilizing controller라고 표현한다.

카메라의 stabilizer를 생각하면 되는데, 그때도 사진찍는 사람이 어떤 포즈를 취하더라도 stabilizer가 기존의 위치를 기억해서 계속 자세를 유지하는 것처럼, 위의 경로 예측시에도 받은 정보를 보상할 수 있는 무언가가 있으면 위와 같이 경로도 어떠한 분포를 띄게 될 것이다. 이때 다음 state에 대한 확률은 다음과 같이 표현할 수 있다.
$$ p(\tau) = p(s_{1}, a_{1}, s_{2}, a_{2}, ... , s_{T}, a_{T})$$

다시 원론으로 돌아가서 우리가 알아야 할 것은 \(\pi_{\theta}(a_{t}|o_{t})\) 인데 문제가 발생하는 부분은 이 부분이었다. 

 아까도 발생한 문제는 training trajectory (\(p_{data}(o_{t})\))와 policy에 의해서 예측된 경로인 expected trajectory (\(p_{\pi_{\theta}}(o_{t})\)) 가 다르다는 것이다. 과연 이 두 값을 같게 만들 수 있을까? 다시 질문하면 training할 때 구한 trajectory의 distribution과 observation만 바탕으로 구한 trajectory의 distribution을 같게 만들 수 있냐는 것이다. 

 여기서 취할 수 있는 방법은 굳이 training을 하는데 데이터를 더 모으지 말고, expected trajectory의 distribution을 위한 데이터를 더 모으자는 것이다. 이런 방식을 DAgger (Data Aggregation)이라는 알고리즘으로 소개했다. 그럼 어떻게 하냐? 간단하게 아무것도 모르는 상태에서 무작정 \(\pi_{\theta}(a_{t}|o_{t})\)를 돌려보는 것이다. 그러면 올바른 결과이든 아니든 policy를 수행한 결과에 대한 데이터가 모아질 것이다. 그런데 이때 취한 action에 대한 라벨링이 정의되어야 학습의 의미가 부여될텐데, 이 역할을 사람이 하게끔 한 것이다. 간단하게 알고리즘을 표현하면 다음과 같다.

1. 인간으로부터 뽑은 데이터 \(D=\{o_{1}, a_{1}, ... , o_{N}, a_{N}\}\)을 바탕으로 \(\pi_{\theta}(a_{t}|o_{t})\)를 학습시킨다.
2. policy로부터 나온 데이터 \(D_{\pi} = \{o_{1}, ..., o_{M} \}\)을 구하기 위해 \(\pi_{\theta}(a_{t}|o_{t})\)를 돌려본다.
3. \(D_{\pi}\)에 대한 action \(a_{t}\)의 라벨링을 인간이 하게 한다.
4. 맨처음에 있던 데이터와 새로 policy에 의해서 생성된 데이터를 합친다 : \( D \leftarrow D \cup D_{\pi} \)
5. 다시 1번 과정을 수행한다.

 이렇게 하면 policy로부터 나온 잘못된 행동도 인간이 직접 지정한 결과를 바탕으로 학습이 될 것이므로 궁극적으로는 policy가 인간이 하는 행동대로 따라가게 될 것이다. Imitation learning이란게 이런식으로 동작한다. 다만 알고리즘이 수행하는 과정에 인간이 직접 관여를 하는 것이 조금 이상해 보일 수 있다.

 사실 학문이란게 파고파도 계속 생기는 거지만 위의 알고리즘도 완벽하지 않다. 그 문제점에 대해서는 다음 포스트에서 요약해보고자 한다.

  1. 해당 내용은 End-to-end Deep Learning for Self-Driving Cars 라는 이름으로 논문이 공개되어 있다. (https://devblogs.nvidia.com/deep-learning-self-driving-cars/) [본문으로]
댓글