티스토리 뷰

Study/AI

[RL] Clues for Which I Search and Choose

생각많은 소심남 2019. 3. 5. 09:55

 <본 포스트는 UC Berkeley 교수인 Benjamin Recht 의 블로그에 올라온 글을 번역한 것입니다. 원본>

 model-free 설명을 마치기 전에 다시 Linearization Principle에 대해서 살펴보자. 우리는 간단한 선형성 문제에서 random search도 잘 동작하는 것을 확인했고, 어쩔 때는 Policy Gradient같은 강화학습보다 더 잘 동작하는 것도 보았다. 그러면 뭔가 어려운 문제를 풀 때 Random Search로 해결해야 할까? 미리 말하자면, 아니다. 그래도 계속 읽어봐라!

 이제 강화학습 커뮤니티에서 흥미있는 문제에 random search를 적용해보자. Deep RL 커뮤니티에서는 OpenAI에서 관리되고, MuJoCo 시뮬레이터를 기반으로 하는, 일종의 benchmark에 많은 시간을 할애하고 있다. 여기서 optimal control problem이란 다리가 달린 로봇을 한 방향으로 최대한 빠르게, 그리고 최대한 멀리 움직이게끔 시뮬레이션하는 것이다. 어떤 작업들은 매우 간단하지만, 22 자유도(Degree of Freedom)를 가진 복잡한 휴머노이드 로봇를 움직이는 것은 조금 어려울 수 있다. 다리가 달린 로봇의 Dynamics는 보통 Hamiltonian Equation에 의해서 잘 정의되어 있는데, 여전히 locomotion을 planning하는 것은 여전히 어려운 과제이다. 그 이유는 objective function을 가장 잘 설계하는 것이 아직까지 명확하지 않은 부분도 있고, 또다른 이유로는 모델 구성 요소들 하나하나가 선형적이기도 한 것도 있다. 모델은 로봇의 일부가 solid object와 접촉이 발생하면 언제나 변화하게 되는데, 이로 인해 로봇한데 이전에 작용하지 않았던 힘이 발생한다. 그래서 복잡한 nonconvex한 비선형 모델을 다루지 않고 로봇을 동작시키는 것이 강화학습 관점에서는 제법 흥미로운 주제이기도 하다.

 최근에는 OpenAI의 Salimans와 그의 동료들이 Random Search도 이런 benchmark에서 잘 동작하는 것을 보여줬다. 세부적으로 말하자면, 약간의 알고리즘적인 기법들을 반영한 random search를 사용해서 neural network 컨트롤러를 학습시켰다.(그들은 이런 방식을 "진화(Evolution Strategies)"라고 표현했지만, 난 내가 붙인 이름이 더 잘 맞는 것 같다.) 또다른 업적으로, Rajeswaran과 그의 동료들은 아주 원초적인 Policy Gradient로도 위의 benchmark를 해결할 수 있는 linear policy를 학습시킬 수 있다는 것을 보여줬다. 이 말은, 우리가 이전에 LQR 문제에도 사용했던 것과 같은 static linear state feedback도 복잡한 로봇 관련 시뮬레이터를 제어하는데 충분하다는 것을 의미한다. 사실 이것도 똑같은 질문을 던진다. 과연 MuJoCo 작업에 대해서도 간단한 random search 기법이 선형 컨트롤러를 찾을 수 있을까?

 내 학생인 Aurelia Guy와 Horia Mania가 이런 테스트를 진행했고, 간단한 방식의 random search 방식을 작성했다.(이전 포스트에서 lqrpols.py에 구현되어 있는 내용 중 하나이다.) 놀랍게도 (어쩌면 놀랍지 않겠지만) 이런 간단한 알고리즘도 Swimmer-v1, Hopper-v1, HalfCheetah-v1, walker2d-v1, Ant-v1에 대해서 이전 논문에서 언급되었던 reward를 얻는 선형 policy를 학습했다. 나쁘지 않은 것 같다.

 

하지만 random search를 단독으로 사용했을 때는 완벽하지 않았다. Aurelia와 Horia는 뭔가 흥미가 있을만한 휴머노이드 모델을 만들지 못했다. 수많은 parameter 설정 후에 train 속도를 빠르게 하기 위해 random search를 개선하기로 했다. Horia가 언급하기로는 수많은 RL관련 논문들은 state에 대한 통계적인 정보를 사용했고, state를 바로 neural net에 넣기 전에 state와 action간의 관계를 정의한 후에 처리해서 넣어준다고 했다. 그래서 그는 state에 대해서 지속적으로 online estimate를 하고, 선형 컨트롤러에 넣기 전에 state를 정리해주는 작업을 해줬다. 그랬더니 짠! 간단한 방법만으로도 Aurelia와 Horia는 휴머노이드에 대해서 거의 최고의 성능을 내었다. 실제로, 그들은 11000 이상의 reward를 얻었는데, 이 값은 내가 본 값들 보다 훨씬 더 큰 값이었다. 이 값은 앞에서 소개한 Salimans에서 benchmark시 사용했던 "성공기준점"에 거의 2배 정도의 값이다. 선형 컨트롤러에는 Random Search. 정말 간단한 트릭이다.

 이런 간단한 것에서 발견한 더 신기한 것은 OpenAI에서 발표한 진화관련 논문에서 소개한 것보다 15배이상 더 빠르게 동작한다는 것이다. 더 적은 연산량을 사용해서 더 높은 reward를 얻은 것이다. 18개 core를 가진 가장 표준적인 EC2 instance를 사용했을때, 높은 성능을 보이는 휴머노이드 모델을 1시간안에 학습시킬 수 있는 것이다.

 이제 online으로 state를 update하는 관점에서 보면, random search는 휴머노이드 모델에서도 높은 성능을 내보일 뿐만 아니라 Swimmer-v1, Hopper-v1, HalfCheetah-v1에서도 좋은 성능을 나타냈다. 그런데 Walker2d-v1과 Ant-v1에서는 그렇게 좋게 나오지 않았다. 하지만 여기에 한가지 트릭을 더해볼 수 있다. 학습을 하면서 좋은 reward를 내지 않는 방향은 학습 샘플에서 배제시키는 것이다. 결국 이를 위한 hyperparameter(방향을 유지하는 것에 대한 비율)가 추가되는 것인데, 한가지만 더 추가한 상태에서도 Random Search는 OpenAI Gym에 있는 모든 MuJoCo baseline 에 대해서 최고의 성능을 보이거나 넘어서는 결과를 보여준다. 여기서 유념할 것은 policy gradient와의 비교를 제한하자고 하는 것이 아니다. 내가 아는 한, 이런 policy들은 model-free 기반의 강화학습 방법을 문제에 적용한 결과보다 훨씬 더 좋은 결과를 보여준다. 그게 Actor Critic method든, Value Function method든, 어떤 방법이 적용되든 말이다. 이런 MuJoCo 문제에 대해서는 순수한 Random Search가 deep RL이나 neural net을 사용한 것보다 좋은 것처럼 보인다.

 몇가지 트릭이 가해진 Random Search는 위의 MuJoCo 테스트에 대해서 다른 방법들 보다 훨씬 더 좋게 동작했고, 또한 동작도 빠르게 이뤄졌다. 우리는 이 결과를 바탕으로 논문을 썼고, 더 자세한 내용은 여기에 있다. 그리고 코드도 여기에 있다. 물론 스스로 코드를 짜보는게 훨씬 쉬울 수도 있겠지만 말이다.

Random Search를 통해서 강화학습이 어떤 것을 학습할 수 있을까?

몇가지 짚어야 할 부분이 있다.

 benchmark는 어렵다.

내가 생각하기에, 위의 결과에서 도출할 수 있는 합리적이고 유일한 결론은 MuJoCo 데모들이 매우 쉽다는 것이다. 이게 잘못됬다는 것은 아니다. 하지만 이 결과를 통해서 NIPS나 ICML, ICLR에 나온 논문들에 나온 것보다 성능이 높다고 결정지을 만한 것들이 아니다. 결국 중요한 질문 하나가 나오게 된다. 강화학습에 가장 적합한 benchmark가 어떤 것일까? 일단, Mountain Car보다는 더 심오한 것들을 다뤄야 한다. Dynamics를 모르는 상태에서 LQR을 적용하는 것이 뭔가를 학습하는데 좋은 테스트라고 생각하는데, 그 이유는 이게 새로운 인스턴스를 정의하기도 쉬울 뿐더러, 최대한 얻을 수 있는 성능의 한계를 이해하기도 쉽기 때문이다. 하지만 커뮤니티 입장에서는 쉽게 동작되지 않는 baseline과 benchmark를 어떻게 세울 수 있는지를 이해하는데 많은 시간을 할애해야 한다.

 Simulator에 관용을 많이 베풀지 마라

위의 benchmark가 쉬운 이유 중 하나는 MuJoCo 자체가 완벽한 시뮬레이터가 아니기 때문이다. MuJoCo는 엄청나게 빠르기도 하고, 뭔가를 증명하는데 좋은 툴이다. 하지만 이게 빠르게 동작하기 위해서 접촉되는 면에 뭔가 smoothing이 가해져야만 한다.(기억해야 할 게 접촉면에서 불연속성 자체가 다리 달린 로봇의 제어(locomotion)을 어렵게 하는 이유이기도 하다.) 더불어 이 시뮬레이터 내에서 걷게 하는 것이 실제 로봇을 걷게 한다는 것을 의미하는 게 아니다. 실제로 다음의 결과가 6000의 reward를 달성한 걸음걸이인데, 어떠한 것도 현실적으로 보이지 않는다.


높은 성능을 보인 모델(reward 11600)도 실제 환경에서는 동작하지 않는 우스꽝스런 걸음걸이를 보이고 있다.

 알고리즘 내에서 간략하게 하는 것에 힘써라

알고리즘을 단순화하기 위해서 Hyperparameter나 알고리즘적인 툴을 더하는 것은 작지만 충분한 benchmark에 대해서 성능을 향상시킬 수 있다. 학습시 최고 성능을 낸 샘플을 떨어뜨리거나, state normalization를 적용하는 것이 새로운 random search 문제 상에서도 동작할지는 잘 모르겠지만, 적어도 위의 MuJoCo benchmark에서는 동작한다. 튜닝가능한 parameter를 더 추가함으로써 더 높은 reward를 얻을 수도 있다. 이런 식으로 이것저것 붙이다 보면 아마, 어떠한 알고리즘도 이런 적은 benchmark상에서는 잘 동작하게 될 거라 생각할 수 있다.

 탐욕(Exploit)을 취하기 전에 탐색(Explore)해라

 우리가 만든 random search 방식이 빠르게 동작하기 때문에, 다양한 랜덤 시드를 가지고 성능을 측정할 수 있다. 이런 model-free method는 위의 benchmark에 대해서 매우 놀랄만큼 높은 variance를 보여준다. 예를 들어 휴머노이드 테스트의 경우, 우리가 좋은 parameter라고 생각하고 값을 넣어준다 해도 학습하는 속도가 느리다. 그리고 랜덤 시드를 다르게 줄 때마다, 독특한 걸음걸이가 나왔다. 그리고 random search시 3번의 랜덤 시드를 가지고 결론을 내는 것도 자주 일어나는 잘못인데, 이유는 성능 자체가 이런 랜덤 시드 생성기의 특성에 따라 변할 수 있기 때문이다.

 이런 동작은 LQR에서도 자주 발생한다. 몇몇 랜덤 시드를 통해서 성능을 변경할 수 있고, 새로운 랜덤 시드에 따라 완전히 다른 동작을 보여주기도 한다. Henderson과 연구자들은 이런 현상이 Deep RL에서 자주 발생하는 현상이라는 것을 확인했지만, 내가 생각하기엔 이런 높은 variability가 나오는 것은 모든 model-free method에서 관찰할 수 있는 부분이라고 생각한다. 시뮬레이션 단독으로 해결하기엔 수많은 예외 케이스들이 존재한다. 내가 지난 포스트에서도 언급했다시피, "모델과 기반 지식을 버리게 되면, generalize에 필요한 몇몇 instance와 랜덤 시드만 가지고 학습할 수 있는지는 확실히 불명확하다" 다.

model-free RL을 버릴 수 없다.

 다음 포스트에서 model-free RL을 선택하는 한가지 경우에 대해 소개할 것이다. 이건 사실 모든 강화학습이나 iterative learning control에서도 발견할 수 있는 내용인데, 과연 "sample complexity"가 무엇을 의미하냐는 것이다. 적은 benchmark상에서 sample complexity를 줄이기 위한 연구로부터 우리가 무엇을 배울 수 있을까? 그리고 연구 커뮤니티로써 더 나아가기 위해 무엇을 해야 할까?

 거기로 가기전에, 이론적으로나 실전에서 잘 동작하는 model-free RL의 몇몇 대안에 대해 다뤄볼 것이고, 머신러닝 학계에서 현재 관심을 많이 끌고 있는 과제로 발전시킬 수 있는지 여부를 확인할 것이다.

댓글