본문 바로가기

트렌드 한눈에 보기/학계 트렌드

PyTorch를 활용한 Actor-Critic Tutorial 3탄

2016년 발표된 논문을 따라 읽던 중,

해당 논문의 알고리즘이 DDPG라는 이름을 가지고 있다는 것을 알게 되었고

더 나아가, colab의 코드가 해당 논문에 기반하고 있다는 확신을 얻게 되었다.

그래서 본격적으로 논문을 정리해 보았다.

 

1. DDPG

Deep Deterministic Policy Gradient의 줄임말로서, DPG라는 알고리즘을 개선한 것이다.

구체적으로는, DQN와 DPG를 섞었다는 게 포인트인데,

DQN은 discreet한 상황이 주어졌을 때에만 적용 가능하다는 한계점이 있다.

매 상황마다 최적의 Q를 찾아야 하는데, 연속된 상황(continuous states)이 주어졌을 경우에는 

처리해야 하는 계산량이 기하급수적으로 늘어나기 때문이다.

 

반면에 DPG는 Actor Critic 알고리즘을 활용해서 연속된 상황에서도 사용될 수 있다.

Actor란, $\mu (s | \theta)$ 로 표기되며,

상태값(states)들을 행동과 매칭시켜주는 역할을 한다.

"이런 상황이 들어왔다? 저런 행동을 하자!"하는 혼잣말을 되뇌이는 녀석이라고 생각하면 된다.

Critic은, $Q(s, a)$로 표기되는 바와 같이, 그냥 Q value이다. 

 

두 녀석이 등장한 배경에는 강화학습의 목표를 살펴볼 필요가 있다.

모든 강화학습의 목표는, 앞으로 주어질 상황에서 받는 보상의 현재가치를 최대화하는 것이다.

이는 아래와 같이 표기할 수 있다.

 

J를 최대화하는 것이 목표이므로 $\theta$에 따라 편미분 한 후에

최대 변화 방향으로 $\theta$를 변화시켜주는 방법을 사용할 수 있다.

$\theta$에 따라 편미분 한 값은 아래와 같다.

 

바로 Actor와 Critic인 것이다!

그러므로 학자들은 두 녀석을 각각 최적화시켜주면

자연스레 J도 적절한 값을 가질 수 있다는 생각을 하게 되었고

Actor Critic 알고리즘이 탄생하게 되었다.

 

이 두 녀석에다가, 지난 DQN시간에 봤던 Replay Memory와 Fixed Target(제대로 다루진 못했지만)들을

가미해준 것이 DDPG라고 할 수 있다.

 

Replay Memory야 연속된 상황들로 학습을 하지 않을 수 있는

명백하게 좋은 방법이지만, Fixed Target은 무슨 의미일까?

이를 알기 위해서는 또 Q-Learning을 알아야 한다.

 

Q는 대충 말하자면, 앞으로 받을 보상들의 현재 가치이다.

그런데 복잡한 현실 세계를 완벽하게 수치화해서 가치를 매길 수는 없는 노릇이기에

파라미터 $\theta$를 활용해서 현실 세계($y_t$로 근사된다)와 최대한 비슷하게 만들어 주는 것이 최선이다.

그래서 학습을 통해, L값을 최소화 시켜주는 것이 Q-Learning인데

y에도 Q값이 사용된다는 것이다.

 

 

업데이트되는 존재를 기반으로 업데이트를 한다? 

그야말로 언발에 오줌누기, 하석상대 동족방뇨가 아닐 수가 없다.

그래서 target (Q가 모방해야 하는 값, 즉 y 값) 에 사용되는 $\theta$의 업데이트를 미뤄주는 방법을 사용하는 것이다.

이 논문에서는 업데이트를 아예 멈추는 것은 아니고

$\theta' = \tau * \theta + (1-\tau) * \theta $ 라는 식을 통해서

최대한 천천히 업데이트 되도록 했다.

 

당연히 target값과 Q 사이에 괴리가 생기면서, 

둘이 같은 값으로 수렴하기까지 시간이 더 걸리게 되지만(학습 시간이 더 걸리게 되었지만)

학습 안정성에 있어서는 크게 기여하는 요인이 되었다.

 

그래서 본격적인 DDPG 알고리즘은 아래와 같다.

 

초기의 actor 에서 행동값을 뽑아낸 후, 보상과 다음 상태까지 관찰해서

Replay Memory에 저장한다.

이를 바탕으로 critic을 다시 학습시켜 주고, 

이에 따라서 actor도 학습시켜준다. 

그 후에 파라미터 업데이트를 Fixed Target 규칙에 따라 진행해준 후

다시 행동값을 뽑아주는 일의 반복이 된다. 

 

이 역시 상당히 간결한 알고리즘이 아닐 수가 없다.

더 이상 발전시킬 여지가 없어보이는 데도, 꾸준하게 발전된 것을 보면

학자는 아무나 하는 게 아니구나 싶다.

나는 사람들이 만들어 놓은 것을 최대한 뽑아먹으면 그만이지만,

간간이 박수쳐주는 것도 잊지 말아야겠다.

 

코드 구현된 것을 간단히 살펴보자. finish episode 함수만 일단 확인해보자.

def finish_episode():
  R = 0
  saved_actions = model.saved_actions
  policy_losses = []
  value_losses = []
  returns = []

  for r in model.rewards[::-1]:
    R = r + 0.99*R
    returns.insert(0, R)

  returns = torch.tensor(returns)
  returns = (returns - returns.mean()) / (returns.std() + eps)

  for (log_prob, value), R in zip(saved_actions, returns):
    advantage = R - value.item()

    policy_losses.append(-log_prob * advantage)

    value_losses.append(F.smooth_l1_loss(value, torch.tensor([R])))

  optimizer.zero_grad()

  loss = torch.stack(policy_losses).sum() + torch.stack(value_losses).sum()

  loss.backward()
  optimizer.step()

  del model.rewards[:]
  del model.saved_actions[:]

 

Fixed Target 규칙을 R = r + 0.99 * R로 표현한 것을 확인할 수 있다.

Critic 업데이트에 활용되는 Loss 는 advantage라는 이름으로

R( = replay memory에서 추출) - value로 설정되었고

이를 바탕으로 critic( = value_losses) 과 actor( = policy_losses)를 학습시킨 것을 볼 수 있다.

 

아는 만큼 보인다고, 막막하기만 했던 코드가 이렇게 간결하게 짜여져 있었구나 새삼 놀랐다.

알고리즘을 보고서 코드로 직접 구현하는 것은 아직 무리가 있어보이지만

이렇게 계속 공부하다보면 가능해질 것 같기도 하다.

 

다음에는 가장 최근에 나온 강화학습 알고리즘(이왕이면 actor critic으로...)을 사용해서

Cartpole 문제를 풀어보는 것을 마지막으로 cartpole문제를 졸업해야겠다.


추가 관련 글

1) Soft-Actor Critic을 활용한 정책만들기

 

강화학습(SAC)을 활용한 코로나 대응 정책 만들기 - Sony AI

 스탠포드 유튜브 강의(CS234)로 강화학습을 공부한 게 올해 1~2월 쯤이었다. 마냥 공부만 하면 재미가 없으니 Cartpole 예제로 직접 구현해보는 시간도 가졌더랬다(관련 글). 대학원에 입학하게 되

mech-literacy.tistory.com