티스토리 뷰

Study/AI

[RL] The Best Things in Life Are Model Free

생각많은 소심남 2019. 3. 6. 11:51

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


 몇몇 포스트를 통해서, 강화학습에서의 model-free method의 어두운 면을 소개했었지만, 그렇다고 model-free 기조를 완전히 저버린 것은 아니다. 사실 핵심 제어 시스템에서 가장 많이 쓰이는 방법이 바로 model-free method이다. 가장 광범위하게 쓰이는 형태가 PID 제어인데, 이 제어는 단지 3개의 parameter만 가지고 있다. 그래서 이번 포스트를 통해 PID 제어에 대해서 소개하고, machine learning의 수많은 주제들과 얼마나 가깝게 연관되어 있는지 설명하면서, 현대 강화학습 연구에서의 model-free method에 PID를 어떻게 끌어올 수 있는지 설명하고자 한다.

PID 기초

PID는 "Proportional Integral Derivative" 제어를 나타낸다. PID 제어의 아이디어는 매우 단순하다. 만약 하나의 입력에 따라 하나의 출력이 나오는 어떤 dynamic system을 가지고 있다고 가정해보자. 제어 측면에서는, plant를 제어하는 것을 시스템이라 부르는데, 이런 의미는 화학 공정에서 나오는 것이다. 이제 어떤 상수값 \(y_{t} = v\)를 읽어오는 것을 출력이라고 정의해보자. 예를 들어 커피 머신 안의 물의 온도를 화씨 203도에 거의 가깝게 유지하고 싶다. 하지만 전체 부엌 환경을 모델링하는 정확한 미분방정식을 가지고 있지 않은 상태이다. 이때 PID는 에러 \(e_{t} = v-y_{t}\)에 기반한 제어 신호를 만들어 낸다. 이름에서 표현되어 있는 것처럼 제어 신호는 에러와 미분계수(derivative), 적분계수(integral)로 구성되어 있다.

$$u_{t} = k_{P}e_{t} + k_{I}\int_{0}^{t}e_{s}ds + k_{D}\dot e_{t} $$

 내가 다르게 알고 있을 수도 있지만, 전체 제어 시스템의 95%를 커버하는 것이 PID 제어이다. 그리고 몇몇은 "D" 항목은 무시해도 좋다고 언급하고 있다. 현대에 운용되는 전체 제어 시스템의 하위 95%는 단지 2개의 parameter를 설정함으로써 제어가 된다. 위에서 소개한 three wave 커피머신도 포함하는데, 이게 연료를 많이 먹기 때문에 좋은 연구 주제로 사용할 수 있다.

 다른 측면에서, PID 제어는 제어의 Gradient Descent라고 할 수 있다. 이를 통해 대부분의 문제를 풀 수 있고, 몇몇 특별한 케이스에 대해서만 좀 괜찮은 방법들이 사용된다. 요즘 통계와 ML 연구에서 발견되는 이상한 점은, 사람들이 gradient descent에 대해서는 아는데, ML 연구자들 대부분이 PID제어에 대해서는 잘 모르고 있다는 것이다. 그래서 PID 제어의 효용성에 대해서 ML 연구자들에게 설명하는 것이, 이와 gradient descent와 연관성을 생성하는데 도움이 될 것 같다.

Discrete Time 상에서의 PID

 진행하기에 앞서, PID 제어 신호를 만들어보고자 한다. 우리가 컴퓨터로 뭔가를 해보기 위해서 continuous time보다는 discrete time 상에서 컨트롤러를 만들어봤다. 그러면 PID 컨트롤러를 어떻게 시간대로 자를 수 있을까? 우선 다음 항을 두어서 integral 항을 계산할 수 있다.

$$ w_{t+1} = w_{t} + e_{t} $$

이때 \(w_{0} = 0\)이면, \(w_{t}\)은 s<t인 조건 내에서 \(e_{s}\)의 합이 될 것이다.

 derivative 항은 finite difference를 통해 근사화 시킬 수 있다. 하지만 derivative 항을 가지는 것 자체가 노이즈를 증폭시킬 수 있으므로, 많이 쓰이는 PID 컨트롤러는 노이즈를 줄이기 위해서 derivative 항을 필터링한다. 노이즈를 필터링하는 가장 간단한 방법은 derivative 항의 평균을 취하는 것이다.

$$ v_{t} = \beta v_{t-1} + (1-\beta)(e_{t} - e_{t-1}) $$

 모든 내용을 적용해보면, discrete time상에서의 PID 컨트롤러는 다음과 같은 식을 가지게 된다.

$$ u_{t} = k_{P}e_{t} + k_{I}w_{t} + k_{D}v_{t} $$

Integral 제어

 이제 순수 integral 제어에 대해 살펴보자. 이 경우, 하나의 update 식을 통해 컨트롤러를 단순화시킬 수 있다.

$$ u_{t} = u_{t-1} + k_{i}e_{t} $$

 ML을 다루고 있는 사람들한테는, 이 식이 gradient descent와 무지 많이 유사한 것처럼 보일 것이다. 여기에 연관성을 두기 위해 우리가 제어하고자 하는 plant가 입력 u를 받고 이에 대한 output을 고정된 함수 f를 가지는 \(y = f'(u)\) 내보낸다고 해보자. 만약 \(y_{t}\)을 0으로 보내고 싶으면, 이때의 에러 신호 \(e\)는 다음과 같은 식 \(e = -f'(u)\)를 가질 것이다. 이 모델을 바탕으로 보면 integral 제어는 완전히 gradient descent와 같다. Gradient Descent와 같이 integral 제어는 절대 잘못된 답을 내놓지 않는다. 만약 제어 paramter가 어떤 상수로 수렴한다면, 이때의 에러는 0이 될 것이다.

Proportional Integral (PI) 제어

위에서 소개한 바와 같이, PI 제어는 제어에서 가장 많이 쓰이는 방법이다. 최적화 입장에서 보면, 이건 그렇게 흔하지 않지만, 여전히 \(e=-f'(u)\)에 대해서 적절한 알고리즘을 찾을 수 있다.

 변수 대입을 통해서, PI 컨트롤러는 다음의 식을 가진다.

$$ u_{t+1} = u_{t} + (k_{I} - k_{P})e_{t} + k_{P}e_{t+1} $$

 이때 \(e_{t} = -f'(u_{t})\)이라면, 우리는 다음과 같은 알고리즘을 얻을 수 있다.

$$ u_{t+1} + k_{P}f'(u_{t+1}) = u_{t} - (k_{I} - k_{P})f'(u_{t}) $$

 위의 방법은 현재 시간에 f에 대한 gradient를 계산할 때 필요한 약간의 트릭처럼 보일 수 있다. 하지만 여기에 최적화를 적용해보면, 해당 식은 다음 알고리즘

$$ u_{t+1} = \mathrm{prox}_{k_P f} ( u_t - (k_I-k_P) f'(u_t) ) $$

에 대해서 optimality condition을 만족하는 것이라는 것을 알게 될 것이다. 더불어, PI 제어가 proximal step과 gradient step이 결합되어 있는 형태로 되어 있다. 그렇기 때문에 위의 알고리즘은 전통적인 proximal point method와 gradient descent를 절충하는 방법이 된다. 그래서 만약 이 방법이 특정 점으로 수렴하게 된다면, \(f'(u)=0\) 인 지점에서 수렴하게 될 것이다.

Proportional Integral Derivative (PID) 제어

 가장 완벽한 알고리즘이 PID 제어일텐데, 여기에는 어떻게 적용할 수 있을까? Laurent Lessard가 나한테 소개했던 특정 변수에 대한 변화를 적용해보도록 하겠다. 이때 사용될 보조(Auxiliary) 변수를 다음과 같이 정의해보자.

$$ x_{t} = \frac{1}{1- \beta}w_{t} + \frac{\beta}{(1-\beta)^3}v_{t} - \frac{\beta}{(1-\beta)^2}e_{t} $$

 이때 새로운 hidden state \(x_{t}\)를 이용해서, PID 컨트롤러는 다음과 같은 방정식으로 줄여볼 수 있다.

$$ x_{t} = (1+\beta)x_{t} - \beta x_{t-1} + e_{t} $$
$$ u_{t} = C_{1}x_{t} + C_{2}x_{t-1}+C_{3}e_{t} $$

  여기서 계수 \(C_{i}\)는 다음과 같이 주어져 있다.

$$ \begin{aligned} C_1 &= -(1-\beta)^2 k_D+k_I\\ C_2 &= (1-\beta)^2 k_D-\beta k_I\\ C_3 &= k_P + (1-\beta) k_D \end{aligned} $$

여기서 \(x_{t} \) 시퀀스는 최적화시 사용할 수 있는 momentum 시퀀스처럼 보인다. 실제로, 적절한 gain 설정을 통해서, 머신러닝에서 일반적으로 사용할 수 있는 다양한 알고리즘들을 만들어낼 수 있다. learning rate \(\alpha\)를 가지는 momentum을 적용한 Gradient descent(Heavy Ball method라고 알려져 있다.)는 다음과 같은 설정값을 가지고 있다.

$$ k_{I} = \frac{\alpha}{1-\beta}, ~~~~ k_{D} = \frac{\alpha \beta}{(1-\beta)^3}, ~~~~ k_{P} = \frac{-\alpha \beta}{(1-\beta)^2} $$

여기서 각 계수를 다음과 같이 

$$ k_{I} = \frac{\alpha}{1-\beta}, ~~~~ k_{D} = \frac{\alpha \beta^{2}}{(1-\beta)^3}, ~~~~ k_{P} = \frac{-\alpha \beta^{2}}{(1-\beta)^2} $$

라고 정의하면 Nestrov`s accelerated method가 도출되게 된다. 위 식들은 proportional과 derivative 항의 분자에 있는 \(\beta\)의 차수가 다를 뿐, 거의 유사하다.

Lur`e의 문제

 Laurent는 나한테 PID 제어와 최적화 기법간의 연결점을 소개하면서 내 마음을 들뜨게 했다. 어떻게 이렇게 ML에서 유명한 알고리즘 중 대부분이 결국 PID 제어의 특별한 종류 중 하나인 것일까? 아마 내가 산업계에 적용되어 있는 머신러닝들에 대한 서베이를 진행해봤는데, 양산되고 있는 머신러닝 모델중 95%에 달하는 것이 일종의 gradient descent 기법을 사용해서 학습하고 있었다. 결국 이 것도 또한 PID의 또다른 능력이 되는 것이다.

 이를 통해, static하고 비선형적인 매핑관계를 갖는 feedback 문제는 제어쪽에서 오랫동안 다뤄져 왔다는 것을 알게 되었고, 이 문제가 Lur`e problem이라는 또다른 이름을 가지고 있었다. 특정점에서 static nonlinear system에 맞는 컨트롤러를 찾는 문제는 결국 gradient를 0으로 만들어주는 최적화 알고리즘을 설계하는 것과 동일하다는 것으로 나타났다.


Laurent Lessard와 Andy Packard, 내가 논문에서 이런 관계에 대해 설명했고, 최적화 알고리즘에 사용되는 수많은 수렴률에 대한 기법이 제어에서는 안정화 기법을 사용함으로써 도출된다는 것을 보여줬다. 또한 이 점근법을 사용해서 Heavy ball method가 accelerated rate를 항상 수렴하게 만들지는 못한다는 것을 보여주고 했고, 이를 통해 조금 더 복잡한 Nesterov accelerated method가 좋은 성능을 내기 위해서 필요하다는 것을 명확히 하고자 했다. 실제로 2차원에서 Heavy Ball method가 선형적으로 수렴하는 설정을 찾긴 했지만, 일반적인 convex function 상에서는 전혀 수렴하지 못했다. 물론 당신이 어떤 parameter를 설정했느냐에 따라서 위의 방법들이 다른 결과를 나타내겠지만, 이런 미묘한 변화는 결국 수렴(convergence)할지 진동(oscillation)할지의 차이일 뿐이다.

Robert Nishihara와 Mike Jordan과 함께 우리는 이 일을 계속 진행했고, prox method와 proportional integral 제어 사이의 관계를 사용해서 ADMM을 공부하는데 이 방법을 사용해볼 수 있다. Bin Hu, Pete Seiler, 그리고 Anders Rantzer가 이 방법을 generalize해서 stochastic optimization method를 조금 더 잘 이해할 수 있도록 했다. 그리고 Laurent와 Bin이 내가 이 포스트에서 소개하고 있는, PID 제어 상에서 일반적인 연결을 만들었다.

학습을 학습하기(learning to learn)

 PID 제어를 염두에 두고, learning rate 튜닝을 컨트롤러 튜닝 처럼 바라볼 수 있다. (40년대에 개발된) Nichols-Ziegler 방법은 간단하게 system이 oscillate되는 가장 큰 gain \(k_{P}\)를 찾고, oscillation이 되는 gain과 frequency를 기반으로 해서 PID parameter를 설정했다. 가장 흔하게 쓰이는 gradient descent 튜닝 방식도 gradient descent가 발산하지 않는 가장 큰 값을 찾고, 이 시작점에서부터 momentum과 learning rate를 설정하는 것이다.

 이와 유사하게, 머신러닝상에서 "학습을 학습하는" 기조를 컨트롤러 설계의 특수한 케이스라고 생각할 수 있다. 비록 PID가 대부분의 application에서 동작하지만, 조금 더 복잡한 컨트롤러도 특정 application에서도 잘 동작할 것이다. 같은 흐름으로 볼때, 당신이 적용할 케이스를 조금 제한한다면, Nesterov`s method 보다 더 좋은 어떤 것도 충분히 나올 수 있다. 아마 gradient descent를 사용해서도 이런 컨트롤러를 만들 수 있다. 하지만 항상 기억해야 할 것이, 전체의 95%가 여전히 PID로 제어되고 있다.

 나는 다음과 같은 이유를 들어 이런 연결점을 만들었다. 먼저 gradient descent나 PID 제어나 우리는 특정 설정 상에서 타당한 행동에 대해서 증명할 수 있다. PID도 특정한 nonlinear control system에 대해 평가를 할 수 있지, 전체에 대해서는 할 수 없고, 최적화 관점에서도 convex function이나 "거의" convex function에 가까운 문제에 대해서만 행동을 이해할 수 있다. 명백하게 모든 plant/function을 안정화시킬 수 있는 간단한 method를 찾는 것은 거의 힘들다(아니면 우리는 복잡성 이론에 몇가지 가정을 벗어나게 된다.) 그래도 우리는 우리가 만든 방법이 단순한 케이스에서는 잘 동작하고, 이에 대한 성능도 문제에 복잡성을 더한 만큼 감소하는 것도 확인할 수 있다.

 게다가 ,단순한 케이스를 통해서 우리는 일반적으로 설계해야 할 기법들의 틀을 만들 수 있다. 물론 우리가 직관을 찾고 원초적인 한계를 경험하면서 특정 케이스에 대한 이론을 세우면서 말이다. 내 생각에는 일반적인 강화학습도 같은 생각이 필요할거 같다. 그리고 이게 바로 내가 LQR과 이와 가까운 generalization에 많은 시간을 쏟는 이유이다.

 이제 PID에 이 관점을 적용해보자. PID가 워낙 좋은 툴이긴 하지만, 일반적으로는 어떤 static equilibrium을 유지하기 위위한 low-level 제어에서만 유용하게 쓰인다. 어쩌면 로봇 동작 제어와 같은 조금 복잡한 작업에 대해서는 유용하지 않을 것처럼 보이겠지만, 다음 포스트에선 PID 같은 기법으로도 더 복잡한 제어 작업을 수행할 수 있는 것을 보여주고자 한다.

댓글