정책 경사(Policy Gradient)

배경

그냥 쉽게 생각해보자. 특정한 상황이 주어지고 내가 어떤 행동을 취하면 모종의 규칙에 따라서 즉각적인 보상을 받는 게임이 있다. 상황과 행동은 의미를 알 수 없는 숫자로 표현되기 때문에 추정할 수 없으며, 경우의 수는 무척 많다. 이 게임이 계속 반복된다고 할 때, 최대한 많은 보상을 받으려면 어떻게 해야 할까?

각 상황에서 보상이 가장 큰 행동이 무엇인지를 찾는 일 자체도 물론 어렵지만, 그것만으로는 부족하다. 문제의 정답만 외우는 것과 같아서 조금만 다른 상황이 와도 제대로 대응할 수 없기 때문이다. 상황과 행동과 보상의 관계를 학습해야 한다. 이 문제를 지도학습(Supervised Learning)으로 풀 수 있을까? 보상을 일종의 레이블로 생각할 수 있겠지만 상황과 행동의 관계를 어떻게 포뮬레이션할지가 좀 막막하다.

조금 돌아가는 해법이 있다. 주어진 상황에서 행동의 보상을 예측하는 모델을 먼저 학습시킨 뒤 실전에서는 가능한 모든 행동에 대한 보상 예측값을 비교하여 최적의 행동을 선택하는 것이다. 하지만, 행동이 이산적(e.g. 가위바위보)이지 않고 연속적(e.g. “핸들을 63.2도 돌려”)인 경우에는 적용할 수 없다는 한계가 있다.

‘A라는 상황에서는 B로 행동해’라고 직접적으로 답을 주는 함수가 있다면 좋을 것이다. 이런 방침을 우리는 정책(Policy)이라고 부른다. ‘A이면 무조건 B’라고 결정해놓는 대신 ‘A일 때 70%의 확률로 B0, 나머지 30%는 B1으로 행동해’처럼 정책을 확률적으로 표현하면 보다 일반적인 경우에도 사용할 수 있다. (가위바위보 게임을 생각해보라.) 결국 정책은 상황(S, State)에 대한 행동(A, Action)의 조건부확률로 표현할 수 있다.

정책 경사(Policy Gradient)

정책 경사(그라디언트)는 바로 이 정책 함수를 경사하강법(Gradient Descent)를 이용해서 학습하는 방법이다. 정책은 \(\pi_{\theta}(A \vert S)\)로, 상태 s에서 행동 a를 취했을 때 받는 보상은 R(a, s)로 표기한다. 우리의 목표는 주어진 상황에서의 기대 보상(R, Reward)을 최대로 하는 파라미터 \(\theta\)를 찾는 것이므로 목표 함수를 아래와 같이 놓는다.

\[J(\theta) = E_{\pi_{\theta}}[R \vert S]\]

목표 함수를 (최소화가 아니라) 최대화해야 하므로 파라미터 업데이트 식은 경사값을 (빼는 것이 아니라) 더한다.

\[\theta_{n+1} = \theta_{n} + \eta \cdot \frac{\partial J(\theta)}{\partial \theta}\]

이제 실제 경사를 구해보자.

\[\frac{\partial J(\theta)}{\partial \theta} = \nabla_{\theta} E_{\pi_{\theta}}[R \vert S=s]\\ = \nabla_{\theta} \int R(a, s) \cdot \pi_{\theta}(a \vert s)\,da\\ = \int R(a, s) \cdot \nabla_{\theta} \pi_{\theta}(a \vert s)\,da\\ = \int R(a, s) \cdot \frac{\nabla_{\theta} \pi_{\theta}(a|s)}{\pi_{\theta}(a|s)} \cdot \pi_{\theta}(a \vert s)\,da\\ = E_{\pi_{\theta}}[R(a, s) \cdot \frac{\nabla_{\theta} \pi_{\theta}(a \vert s)}{\pi_{\theta}(a \vert s)}]\]

이 식의 직관적인 의미를 참고자료1이 잘 설명해준다.

  • \(\nabla_{\theta} \pi_{\theta}(a \vert s)\): 파라미터 \(\pi\)를 업데이트할 때 어느 방향으로 움직일지를 결정한다. \(\pi_{\theta}\)의 정의에 따라 상태 s에서 행동 a를 취할 확률을 가장 높이는 쪽이다. 그런데 그 방향으로 얼마나 많이 움직일지 정하는 요소가 2개 있다.
  • \(R(a, s)\): 첫 번째는 그 행동에 대한 보상 R(a, s)이다. 행동 a가 큰 보상을 줄수록 다음 번에 또 a로 행동할 확률이 높아지는 방향으로 크게 움직이는 것이다. 만약 보상값이 음수라면 그 행동을 회피하는 방향으로 업데이트된다. (그러고 보니 이것도 방향은 방향이구나)
  • \(\frac{1}{\pi_{\theta}(a \vert s)}\): 두 번째 요소의 역할은 이렇게 해석할 수 있다. 현재 정책에서 행동 a를 취할 확률이 낮을수록 큰 폭으로 움직인다. 기회가 적은 만큼 관찰했을 때 가중치를 주는 것이다. 그러지 않는다면 현재 정책에서 이미 빈도가 높은 행동 위주로 업데이트될 위험이 있다.

만약 학습 방법으로 SGD(Stochastic Gradient Descent)를 쓴다면, 기대값을 구하는 대신, 한 번 행동할 때마다 \(R(a, s) \cdot \frac{\nabla_{\theta} \pi_{\theta}(a \vert s)}{\pi_{\theta}(a \vert s)}\)를 구해서 \(\theta\)를 갱신하고 그 결과를 다음 행동에 반영하면 된다.

취할 수 있는 행동의 범위가 연속적인 실수인 경우는 어떻게 하면 될까? 한 가지 방법은 정책 \(\pi_\theta(a \vert s)\)가 내놓는 행동의 확률분포가 정규분포라고 가정하는 것이다. 상태 s가 주어지면, 파라미터 \(\theta\)에 의해서 정규분포의 평균\(\mu\)와 표준편차\(\sigma\)를 구한다. 이 분포로부터 값을 하나 샘플링하면, 그게 바로 현재 정책에 따라서 행동을 선택한 것이다. 그에 따라 행동하고 보상받고 \(\theta\)를 업데이트하는 나머지 과정은 동일하다.

참고자료

  1. Reinforcement Learning: An Introduction 책 13장 Policy Gradient Methods
  2. Policy Gradients in a Nutshell

blog built using the cayman-theme by Jason Long. LICENSE