RL을 공부하다 나오는 개념들을 따로 공부하다 보면 궁금한 것들이 생기고 앞의 내용들을 다시 살펴보곤 하는데, 그러면서 찾아본 내용과 알게 된 내용들을 흐름에 맞게 간단히 정리해 보았다.
환경(에 대한 정보)을 아는가 모르는가.
Model based 방법: 환경에 대한 정보를 알고 있는 경우 (예를 들면 오목 게임 같은 경우 내가 어떤 수를 두었을 때 미래에 펼쳐질 경우의 수들을 계산 가능한 것과 같은 경우) 사용하는 방법이나 현실에서는 거의 없으므로 이 방법은 사용하기 어려움. (근사하는 방법도 있으나 부정확할 경우 오류가 커질 수 있음.)
Model free 방법: 환경에 대한 정보를 모르는 경우 사용되며, 현실에 적용하기 적합하다. 그러므로 대부분의 알려진 방법들이 이에 해당한다.
Model free를 위한 2가지 방법: Monte-Carlo, Temporal difference
Monte-Carlo (MC): MC 방법은 RL뿐 아니라 많은 통계학 분야에서 사용되는 방법으로, 무작위 샘플을 통해 통계적 근사를 얻는 방법이다. RL에서는 에피소드를 끝날 때마다 얻어진 return(reward의 합)에 근접하도록 학습된다. $ V(S_{t}) \leftarrow V(S_{t}) + \alpha (G_{t} - V(S_{t}))$
Temporal Difference (TD): 일반적으로 많이 사용되는 방법으로 말 그대로 일시적 차이를 이용해 학습한다. $ V(S_{t}) \leftarrow V(S_{t}) + \alpha (R_{t+1} + \gamma V(S_{t+1}) - V(S_{t})) $ 와 같이 나타내며(마르코프를 가정하므로 가능함) Monte-Carlo(MC) 방법과 다르게 에피소드 중간중간 업데이트 할 수 있다는 장점이 있다. 또한 MC는 에피소드가 끝나고 받게 되는 보상을 이용해서 업데이트하는 반면, TD는 실제 보상($R_{t+1}$)과 다음 step에 대한 미래 추정 가치($V(S_{t+1})$)를 이용해서 학습하게 된다는 차이가 있다.
Q learning 그리고 SARSA (Off policy, On policy)
Q learning과 SARSA는 비슷해 보여 헷갈리기 쉬운 개념이지만 중요한 차이가 있으므로 간단하게 짚고 넘어간다.
Q learning: $Q(s, a)$가 $r+\gamma max_{a'} Q(s', a') - Q(s, a)$에 가까워지도록 업데이트하는 방법.
SARSA: $Q(s, a)$가 $r+\gamma Q(s', a') - Q(s, a)$에 가까워지도록 업데이트하는 방법.
두 방법 모두 행동 a를 Q(s, a)를 활용해서 결정(행동 정책 $\mu$를 활용해서($\epsilon$ greedy 과 같은)) 하고 행동 a를 환경에 가한 후 차이가 생긴다. Q learning의 경우엔 Q(s, a)를 평가할 때, 모든 행동 a'에서 Q(s', a')이 maximize 되는 것을 직접 찾는 off-policy(행동 정책($\mu$)과 평가 정책($\pi$)이 다른 방법)이다. 반면 SARSA는 a'이 s'에서 행동 정책($\mu$)을 활용해 미리 결정되어 사용되는 on-policy(행동 정책과 평가 정책이 같은 방법)이다.
(뒤에서 과거 메모리(replay buffer)를 사용해서 훈련을 하는 방법이 나오는데, 이는 off-policy에만 적용이 가능하다. 왜냐하면 매 episode(혹은 step)마다 정책이 업데이트가 되는데, on-policy의 경우 이 정책을 이용해서 행동을 결정하게 되기 때문에 과거(업데이트 전) 행동 정책에 의해 결정된 (s, a, r, s')를 다시 사용할 수 없게 된다. 반면 off-policy는 행동 정책이 따로 분리되어 있어서 과거에 저장해둔 (s, a, r, s')를 사용해도 무방하다.)
Policy Gradient
가치 기반 강화학습과 다르게 데이터로부터 정책을 만드는 방법을 정책 기반 강화학습이라 한다. 행동 가치 함수 $Q^{\pi}(s, a)$로부터 정책을 만드는 기존의 방법과 다르게 직접 정책 함수를 이용하는 것이라 gradient 방법을 사용할 수 있게 된다. 정책 함수 $\pi_{\theta}(a|s)$의 좋고 나쁨을 판단하는 기준 $J(\theta)$를 만들고 기준에 대한 정책 함수의 gradient를 계산하여 경사 상승법(정책을 좋은 방향으로 만들기 위해)을 활용해 정책을 최적화해 나가는 것이다!
목적 함수 $J(\theta) = V^{\pi_{\theta}}(s_{0})$로 정의 가능하다. $s_{0}$: 고정된 시작 상태, $V^{\pi_{\theta}}(s_{0})$는 $s_{0}$의 상태에 대한 가치함숫값이다. $$\mathbf {\triangledown}_{\theta} J(\theta) \propto \mathbb {E}_{\pi}[\mathbf {\triangledown}_{\theta} ln \pi_{\theta} (a|s) Q^{\pi}(s, a)]$$
목적 함수에 대한 gradient를 구하는 과정은 길지만 모두 생략하고 간략히 표현하면 위와 같다. gradient를 이용한 방법은 방향이 중요하므로 위와 같이 비례를 이용한 방법이 가능하다.
REINFORCE 알고리즘은 위와 같은 정책 경사에서 MC 방법을 도입한 것이다. $Q^{\pi}(s, a)$를 구하기 위해 MC 방법을 사용해서 $G_{t}$로 대신 추산하여 사용하는 것이다. ($Q^{\pi}(s, a) \overset {\underset {\mathrm {def}}{}}{=} \mathbb {E}_{\pi} [G_{t}|S_{t}=s, A_{t}=a]$)
$$\mathbf {\triangledown}_{\theta} J(\theta) \propto \mathbb {E}_{\pi}[\mathbf {\triangledown}_{\theta} ln \pi_{\theta} (a|s) G_{t} ]$$
위의 수식을 파이썬으로 구현해 보면 아래와 같은 형태가 될 수 있다.(업데이트 부분만 첨부)
def update(self, states, actions, rewards):
g = 0
for s, a, r in zip(states, actions, rewards):
g = r + self.gamma * g
dist = Categorical(logits=self.policy(s))
prob = dist.probs[a]
# add 'self_eps' to prevent numerical problems of logarithms
pg_loss = - torch.log(prob + self._eps) * g
self.opt.zero_grad()
pg_loss.backward()
self.opt.step()
Baseline 방법
위의 REINFORCE 알고리즘은 MC 방법이기 때문에 다른 MC 방법들처럼 편향이 작지만 분산이 크다는 단점이 있다. 이를 위해 'Baseline' b(s)를 사용하는데 아래와 같이 행동 가치함수에서 Baseline을 빼서 분산을 낮추는 방법이다.
$$\mathbf {\triangledown}_{\theta} J(\theta) \propto \mathbb {E}_{\pi}[\mathbf {\triangledown}_{\theta} ln \pi_{\theta} (a|s) Q^{\pi}(s, a) - b(s)]$$
(위의 식이 성립함과 분산을 낮춰준다는 증명은 링크에 나와있다.)
Baseline은 행동 a에 대해 독립적인 함수라면 뭐든지 가능하다. 하지만 어떻게 적당한 값을 찾을지는 문제이다. 간단한 트릭은 리턴 $G_{t}$를 표준화시켜 버리는 것이다. $G_{t}^{*} = \frac {G_{t}-\bar {G}}{\sigma(G)}$. 이런 트릭은 실제로 엄청 잘되는 방법으로 [1]에서 보여주었다.
Actor-Critic
Q Actor-Critic
Actor-Critic은 $\triangledown_{\theta} J(\theta)$를 업데이트할 때 MC 방법으로 $Q^{\pi}(s, a)$ 대신 $G_{t}$를 썼던 것과 다르게, MC, TD 등으로 $Q^{\pi}(s,a) $를 학습한다는 아이디어를 사용한 방법이다. Actor는 $\pi_{\theta} (a|s)$로 나타내고 Critic은 $Q_{\phi}^{\pi}(s, a)$로 표현된다. Actor는 위의 policy gradient에서 $G_{t}$ 부분을 $Q^{\pi}_{\phi}$ 로 바꾼 $\mathbf {\triangledown}_{\theta} J(\theta) \propto \mathbb {E}_{\pi}[\mathbf{\triangledown}_{\theta} ln \pi_{\theta} (a|s) Q^{\pi}_{\phi} ]$의 형태로 업데이트 할 수 있고, Critic은(SARSA style) $\triangledown_{\phi}(r+\gamma Q_{\phi}(s', a') - Q_{\phi}(s,a))^{2}$의 형태로 업데이트 할 수 있다.
Advantage Actor-Critic
'Advantage'라는 개념이 있다. Advantage function은 $A^{\pi}(s, a) = Q^{\pi}(s, a) - V^{\pi}(s)$로 정의된다. 이는 REINFORCE에서 봤던 'Baseline (b(s))'과 관계가 있다. b(s)는 행동 a에 독립적인 함수라면 가능하며 분산을 낮춰준다는 장점이 있었다. $V^{\pi}$가 조건을 만족하고 Advantage 함수를 해석해 보면 '상황 s에서 행동 a가 얼마나 다른 행동에 비해 좋은가'를 보여주므로 의미도 있어 Baseline으로 사용되기 괜찮아 보인다. 하지만 문제가 있다. $Q^{\pi}(s, a)$와 $V^{\pi}(s)$를 모르므로 둘 다 학습해야 한다는 것이다. 최종적으로 Actor까지 합해서 $ Q^{\pi}_{\phi}(s, a), V^{\pi}_{\psi}(s), \pi_{\theta}(a|s)$ 3개의 모델을 학습하는 방법이다.
$$ \mathbf {\triangledown}_{\theta} J(\theta) \propto \mathbb {E}_{\pi}[\mathbf {\triangledown}_{\theta} ln \pi_{\theta} (a|s) A^{\pi}_{\phi, \psi}(s, a)] $$
TD Actor-Critic
True 행동 가치 함수 $Q^{\pi}(s, a) \overset {\underset {\mathrm {def}}{}}{=} \mathbb{E}_{\pi} [r+\gamma V^{\pi}(s')|S_{t}=s, A_{t}=a]$이고 (True) TD error $\delta^{\pi} \overset {\underset {\mathrm {def}}{}}{=} r+V^{\pi}(s') - V^{\pi}(s)$로 나타낼 수 있다. 그러므로 $ \mathbb {E}_{\pi}[\delta^{\pi}|s, a] = \mathbb {E}_{\pi}[ r+V^{\pi}(s') | s, a] - V^{\pi}(s)$ = $Q^{\pi}(s, a) - V^{\pi}(s) = A^{\pi}(s, a)$로 유도된다. 즉, (True) TD error는 Advantage function의 불편추정량이다. 현실적으로 True TD error는 알기 어려우니 TD error의 추산을 사용해야 한다. 이런 방법을 이용하면 Advantage Actor-Critic과 달리 행동 가치 함수 $Q_{\phi}^{\pi}(s, a)$를 따로 학습할 필요가 없어진다. $V^{\pi}_{\psi}(s)$과 $\pi_{\theta}(a|s)$만 학습하면 된다.
$$ \mathbf {\triangledown}_{\theta} J(\theta) \propto \mathbb {E}_{\pi}[\mathbf {\triangledown}_{\theta} ln \pi_{\theta} (a|s) \delta^{\pi}_{\psi}(s, a)] $$
Ref.
[1] https://arxiv.org/abs/2005.12729
'머신러닝&딥러닝 > 강화학습' 카테고리의 다른 글
PPO paper 리뷰 (1) | 2023.12.13 |
---|---|
TD3 paper 리뷰 (0) | 2023.12.11 |
DQN 부터 DDPG 까지 정리 (0) | 2023.12.02 |
강화학습 기초 다지기 (2) - 강화학습 문제 풀이 기법 (DP, MC, TD) (0) | 2022.05.08 |
강화학습 기초 다지기 (1) - 마르코프 (0) | 2022.05.01 |