티스토리 뷰

Study/AI

[RL] Updates on Policy Gradients

생각많은 소심남 2019. 3. 4. 22:54

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


 지난번 nominal control에 대한 포스트 이후에, Pavel Christof로부터 메일을 받았었는데, 내용은 만약 Stochastic Gradient Descent를 Adam 으로 바꾼다면 Policy Gradient가 더 잘 동작한다는 것이었다. 실제로 내가 구현해보니까, 그가 말한 말이 맞았다. 한번 지난 Jupyter notebook과 함께 포스트 내용을 살펴보자.

 우선 다른 딥러닝 패키지간의 dependency를 제거하기 위해서 adam을 순수 python으로 구현했다.( python으로 4줄로 구현했다.) 두번째로 지난번 코드에서 구현한 random search 부분에서 부적절하게 탐색방향을 잡는 것에 대한 버그를 수정했다. 이제 다시 median performance를 살펴보면 아래와 같이 그래프를 확인할 수 있다.

 Policy Gradient가 많이 좋아졌다. 물론 순수 random search에 비하면 그렇게 좋은건 아니지만, 그래도 많이 가까워졌다. 그리고 Pavel이 지적한 것과 같이, Policy Gradient를 수렴시키기 위해 필요한 조건인 [-2, 2] hypercube 영역에 딱 "찝혀 있는(clipping)" 현상을 제거할 수 있다. 물론 둘다 여전히 uniform sampling 방식에 비하면 여전히 안 좋고, nominal control에 비하면 몇배나 안 좋다. 무한대 시간축에서 봐도, 그래프는 유사하다.

 Policy Gradient는 여전히 특정확률로 들쭉날쭉거리긴 하지만, 추정해보건데(extrapolation), 평균으로 따졌을때는 random search에 비해 약간 안 좋은 것으로 나온다.

 이렇게 하면 좋다. Policy Gradient는 Adam을 사용해서 이런 LQR 문제를 풀 수 있긴 하지만, 내 notebook에서 보이는 것과 같이 그렇게 특출나게 보이지 않다. 여전히 이런 간단한 문제에 비해서도 model-based method에 비해 그렇게 경쟁력이 있어 보이지 않는다.

 해볼만한 가치가 있는 것은 Pavel이나 나나 여전히 이 문제에 대해서 수렴하게 하는 일반적인 gradient descent를 찾지 못했다는 것이다. 누구나 동작하는 일반적인 SGD를 찾았다면, 연락주길 바란다.

 이런 긍정적인 개발에도 불구하고, 여전히 안좋다고 말해야 한다. 내가 수많은 사람들한테, Policy Gradient는 허구에 불과하고, 이를 활용하기 위해서는 본래의 estimator 위에 baseline과 특별한 solver를 위한 heuristic이 추가되어야 한다고 말해왔다. 하지만 이게 사실이라면, 왜 사람들은 여전히 순수한 random search보다 나쁜 것을 사용하고 있는 것일가 아마 문제에다가 뭔가를 추가하는 것이 성능을 향상시킨다고 생각할지도 모른다. 예를 들어 부정확한 CG solver를 이용한 trust-region을 이용하거나 value function estimation을 사용한다던지 말이다.(추후에 이에 대한 내용을 다루고자 한다.) 하지만 더 많은 parameter를 추가할수록, 이런 간단한 예제에 대해서 overfit할 가능성은 더 커질 뿐이다.

 일반적으로 ML에서, 나도 작은 benchmark 상에서 알고리즘적으로 복잡성을 더해야 할지를 결정하는 경우를 결정해야 하는 경우를 걱정한다. 그림으로 묘사된 예와 같이 LQR에 대해 조금 어려운 문제로 살펴보자. 아마 많은 사람들이 강화학습을 데이터센터의 냉각에 적용한 경우처럼, 이전에 다뤘던 quadrotor 예제에서 데이터 센터 예제로 넘어가보자. 여기에 매우 선형적으로 동작하고, 각각의 냉각 장치를 갖춘 세개의 서버가 있다고 가정해보자.

 각 요소의 상태인 \(x\)는 각 서버별 내부 온도를 나타내고, traffic이 발생하면, 지속적인 load로 인해서 열이 발생한다. 그리고 그 열이 이웃에 전달되기도 한다. 이때 제어를 통해 각각의 냉각을 시킬 수 있다. 위의 형태는 아래와 같이 선형 모델을 띄며,

$$ x_{t+1} = Ax_{t} + Bu_{t} + w_{t} $$

이때 각 요소는 다음의 정의를 가진다.

$$ A = \begin{bmatrix} 1.01 & 0.01 & 0\\ 0.01 & 1.01 & 0.01 \\ 0 & 0.01 & 1.01 \end{bmatrix} \qquad \qquad B = I $$

 간단한 예제이긴 하지만, 매우 유익하다. 이제 \(Q=I\)와 \(R=1000I\)라는 설정을 바탕으로 LQR 문제를 풀어보도록 하겠다. 해당 식은 냉각하는데 소모되는 전력을 최소화하면서 상대적으로 데이터 상태를 냉각상태로 유지하는 것을 모델링하고자 했다. 이제 이런 문제에서 강화학습을 적용하면 어떤 일이 발생할까?

 Adam에 필요한 parameter를 튜닝해보았고,(비록 Adam 자체가 튜닝이 필요하지 않다고 말했긴 했지만...) 아래의 결과가 내가 얻었던 가장 좋은 결과였다.

이 글을 읽는 독자도 나보다 더 잘 튜닝할 수 있을 거고, 그렇게 해볼 것을 권한다.(python notebook) 다시 한번 말하지만 모든 사람들이 이 글을 읽는 것 만큼이나 나도 이 공간으로부터 들어오고 나가는 것들로부터 배우고 있다.

 더 걱정되는 부분은 내가 랜덤 시드를 1336으로 바꿨고, parameter가 같아도, PG에 대해서 성능이 감소했다는 것이다.

이 말은 여전히 Policy Gradient에 대해서 매우 높은 variance를 가지고 있다는 것을 의미한다.

이제 상기해야 할 부분은 아무리 Random Search가 Policy Gradient보다 더 좋다 하더라도, random search가 여전히 나쁘다는 것이다. 이렇게 어려운 문제에서 해를 찾는 것이 여전히 불안정하다. 우리가 이상적으로 생각하는 것보다 안 좋은 것이다. 비론 random search가 Deep RL보다 낫다 하더라도, 데이터 센터를 관리하는데에는 사용하지 않을 것이다. 이게 내가 말하고자 하는 핵심이다. 우리는 우리가 원하는 방향대로 model-free 방식을 튜닝할 수 있지만, 이런 방법론에는 원론적인 제한이 있다고 생각한다. 모델과 기반 지식들을 배제함으로써, 몇몇 instance와 랜덤 시드를 통해 generalize 시킬 수 있을지는 절대 명확하지 않다. 아마 다음 포스트에서 더 도전적인 문제를 통해서 이 부분을 다시 다룰 예정이다.

 어떤 부분이 이 문제를 어렵게 만드는 것일까? 난이도에 대해서 이해하기 위해서는 일단 instance에 대해 이해해야 한다. 주어진 dynamics는 매우 불안정하다. 이 뜻은, 적절한 제어가 가해지기 전까지는 system이 붕 떠버린다는 것이다.(그리고 아마 서버는 불이 날 것이다.) notebook에서 마지막 라인을 본다면, 아마 nominal 컨트롤러가 한 시도 횟수 후에 매우 불안정한 해를 내고 있는 것을 확인할 수 있을 것이다. 만약 우리가 \(A\)에 대해서 대각 행렬(diagonal entry) 중 하나가 1보다 작다는 것을 판단할 수 있게 된다면, 해당 제어가 안정적이고, 서버를 냉각시키는데 효율이 더해질 수 있다고 추측할 수 있을 것이다. 거의 optimal한 제어를 위해서는, system의 진짜 행동에 대한 평가를 잘하는 것은 필수적이다. 아니면 반대급부로, 우리가 사용하고 있는 policy가 안전한지, 아니면 나오는 시퀀스가 재앙을 불러올만한 것인지 판단하는 과정이 필요하게 된다. 비록 이번 주제가 조금 늘어지긴 했지만, 추후에 다룰 중요한 주제는 제어를 학습하는데 있어 얼마나 안전과 강건성(robustness)가 상관성이 있는지에 대한 내용일 것이다.

댓글