2025.06.29 - [Data & Research] - [Reinforcement Learning] Table of Contents
Policy 기반 알고리즘의 일반론에 대해서 알아봤으니 구체적 방법론들을 알아보겠습니다. 지난번 포스팅에서 유도한대로 정책경사관점에서의 목적함수의 미분값은
\[\nabla_{\theta} J(\theta) = \mathbb{E}_{\pi} \left[ \nabla_{\theta} \log \pi_{\theta}(A_t|S_t) Q^{\pi}(S_t, A_t) \right]\]
입니다. 이 식에는 여전히 행동가치함수가 담겨있죠. REINFORCE 알고리즘에서는 이것을 샘플링기반의 MC방식으로 접근합니다. 몬테카를로 방법을 사용하기 때문에 'Monte Carlo Policy Gradient'라고도 불립니다.
\(Q^{\pi}(S_t, A_t)\)는 그 정의를 풀어헤쳐보면 상태 \(S_t\)에서 행동 \(A_t\)를 취했을 때의 기댓값, 즉 \(\mathbb{E}_{\pi}[G_t | S_t, A_t]\)입니다. REINFORCE는 이 기댓값을 계산하는 대신, 에피소드를 끝까지 진행하여 얻은 실제 리턴값 \(G_t\) 하나를 Q값의 편향되지 않은 샘플(unbiased sample)로 간주하고 사용합니다.
따라서 정책 경사도는 다음과 같이 근사할 수 있습니다.
\[ \nabla_{\theta} J(\theta) \approx \mathbb{E}_{\pi} \left[ \nabla_{\theta} \log \pi_{\theta}(A_t|S_t) G_t \right] \]
이제 우리는 이 기댓값을 샘플링, 즉 에피소드를 생성하여 얻은 \(G_t\)를 이용해 경사 상승법(Stochastic Gradient Ascent) 업데이트를 수행할 수 있습니다.
1. REINFORCE Algorithm
REINFORCE 알고리즘은 다음과 같은 흐름으로 진행됩니다.
- 정책 \(\pi_\theta(a|s)\)의 파라미터 \(\theta\)를 임의의 값으로 초기화합니다.
- loop (각 에피소드마다 반복):
- 현재 정책 \(\pi_\theta\)를 사용하여 하나의 완전한 궤적(trajectory)을 생성합니다.
\(S_0, A_0, R_1, S_1, A_1, R_2, \dots, S_{T-1}, A_{T-1}, R_T\) - loop (에피소드의 각 스텝 t = 0, 1, ..., T-1 에 대해):
- 시점 t 이후의 리턴 \(G_t\)를 계산합니다.
\( G_t \leftarrow \sum_{k=t+1}^{T} \gamma^{k-t-1} R_k \) - 정책 파라미터 \(\theta\)를 업데이트합니다. (경사 상승법)
\[ \theta \leftarrow \theta + \alpha \gamma^t G_t \nabla_{\theta} \log \pi_{\theta}(A_t|S_t) \]
- 시점 t 이후의 리턴 \(G_t\)를 계산합니다.
- 현재 정책 \(\pi_\theta\)를 사용하여 하나의 완전한 궤적(trajectory)을 생성합니다.
* 위 업데이트 식에서 \(\gamma^t\) 항은 할인된 상태 분포를 고려한 것으로, 생략되기도 합니다. 가장 기본적인 형태는 \(\theta \leftarrow \theta + \alpha G_t \nabla_{\theta} \log \pi_{\theta}(A_t|S_t)\) 입니다.
업데이트 규칙을 보면, 만약 리턴 \(G_t\)가 크고 긍정적인 값이라면, 그 행동 \(A_t\)를 할 확률 \(\pi_{\theta}(A_t|S_t)\)을 높이는 방향으로 \(\theta\)가 업데이트됩니다. 반대로 \(G_t\)가 작거나 음수라면, 그 행동을 할 확률을 낮추는 방향으로 업데이트됩니다. 즉, '좋은 결과를 낸 행동은 더 많이 하도록, 나쁜 결과를 낸 행동은 덜 하도록' 학습하는 것입니다.
2. 변형 알고리즘
REINFORCE는 step마다 업데이트하는 대신, episode 단위 혹은 여러 episode 단위로 업데이트할 수도 있습니다.
- episode 단위 업데이트: episode가 끝난 후, 모든 step의 그래디언트 \(\nabla \log \pi_{\theta} \cdot G_t\)를 모두 계산하여 합친 뒤, 파라미터 \(\theta\)를 한 번만 업데이트합니다.\[ \theta \leftarrow \theta + \alpha \sum_{t=0}^{T-1} \nabla_{\theta} \log \pi_{\theta}(A_t|S_t) G_t \]
- 여러 episode 단위 업데이트 (Batch 업데이트): N개의 episode를 실행하여 얻은 모든 그래디언트들의 평균을 내어 파라미터를 한 번 업데이트합니다. 이는 더 안정적인 업데이트를 가능하게 합니다.\[ \theta \leftarrow \theta + \alpha \frac{1}{N} \sum_{i=1}^{N} \left[ \sum_{t=0}^{T_i-1} \nabla_{\theta} \log \pi_{\theta}(A_t^{(i)}|S_t^{(i)}) G_t^{(i)} \right] \]
3. REINFORCE의 특징 및 한계
- MC 기반 학습: 전체 리턴 \(G_t\)를 사용하므로, 에피소드가 반드시 종료되어야만 학습이 가능합니다.
- 높은 분산 (High Variance): 가치기반에서와 마찬가지로 이러한 방식은 높은 분산이 알고리즘의 가장 큰 단점입니다. \(G_t\)는 에피소드의 모든 랜덤한 행동과 상태 전이에 영향을 받기 때문에, 같은 상태-행동 쌍이라도 에피소드마다 그 값이 매우 크게 달라질 수 있습니다. 이로 인해 그래디언트의 분산이 커져 학습이 불안정하고 수렴이 느릴 수 있습니다.
이러한 높은 분산 문제를 완화하는 테크닉이 등장하게됩니다.
4. REINFORCE의 분산 완화 테크닉
1) Causality를 고려한 Summation
간단하면서도 효과적인 첫번째 방법은 "시간 t'에 취한 행동은 그 이전 시점(t < t')의 보상에는 영향을 줄 수 없다."라는 것을 염두해두고 식계산에 적용하는 것입니다.
기본적인 REINFORCE 업데이트 규칙에서, 시점 t의 행동 \(A_t\)에 대한 그래디언트 \(\nabla_{\theta}\log\pi_{\theta}(A_t|S_t)\)를 계산할 때, 에피소드 전체의 리턴 \(G_0 = \sum_{k=1}^{T}r_k\)를 곱해주는 것은 비합리적입니다. \(A_t\)는 오직 미래의 보상 \(R_{t+1}, R_{t+2}, \dots\)에만 영향을 미치기 때문입니다.
따라서, 업데이트 규칙에 사용하는 리턴을 전체 리턴이 아닌, 해당 행동이 일어난 시점 t 이후의 리턴으로 수정합니다.
\[ \hat{Q}_{i,t} = \sum_{t'=t}^{T} r(s_{i,t'}, a_{i,t'}) \]
이렇게 수정된 리턴값(Q값의 MC 추정치)을 사용하여 그래디언트를 계산하면, 행동 \(A_t\)와 무관한 과거의 보상들이라는 '노이즈'가 제거되어 그래디언트 추정치의 분산을 줄일 수 있습니다.
\[ \nabla_{\theta}J(\theta) \approx \frac{1}{N} \sum_{i=1}^{N} \sum_{t=1}^{T} \nabla_{\theta} \log\pi_{\theta}(a_{i,t}|s_{i,t}) \hat{Q}_{i,t} \]
2) Baseline
좀더 직접적인 방법은 return에서 Baseline을 빼주는 것입니다. 이 베이스라인 \(b(s)\)는 현재 상태 \(s\)에만 의존하는 임의의 함수입니다.
\[ \nabla_{\theta} J(\theta) \approx \frac{1}{N} \sum_{i=1}^{N} \sum_{t=1}^{T} \nabla_{\theta} \log\pi_{\theta}(A_t|S_t) (G_t - b(S_t)) \]
리턴에서 임의의 값을 빼주는데 어떻게 학습이 올바르게 진행될 수 있을까요? 그 이유는 베이스라인을 추가한 항의 기댓값이 0이 되어, 전체 그래디언트의 기댓값을 변화시키지 않기(unbiased)때문입니다.
\[ \mathbb{E}_{\pi} \left[ \nabla_{\theta} \log\pi_{\theta}(a|s) \cdot b(s) \right] = 0 \]
$$ \begin{aligned} \mathbb{E}_{\pi} \left[ \nabla_{\theta} \log\pi_{\theta}(a|s) b(s) \right] &= \sum_{s \in S} d^{\pi}(s) \sum_{a \in \mathcal{A}} \pi_{\theta}(a|s) \left( \nabla_{\theta} \log\pi_{\theta}(a|s) \right) b(s) \\ &= \sum_{s} d^{\pi}(s) b(s) \sum_{a} \pi_{\theta}(a|s) \frac{\nabla_{\theta}\pi_{\theta}(a|s)}{\pi_{\theta}(a|s)}\\ &= \sum_{s} d^{\pi}(s) b(s) \sum_{a} \nabla_{\theta}\pi_{\theta}(a|s) & \text{;} \\ &= \sum_{s} d^{\pi}(s) b(s) \nabla_{\theta} \sum_{a} \pi_{\theta}(a|s)\\ &= \sum_{s} d^{\pi}(s) b(s) \nabla_{\theta} (1) & \text{; (모든 행동 확률의 합은 1)} \\ &= 0 \end{aligned} $$
가장 널리 쓰이고 효과적인 baseline은 바로 상태 가치 함수 \(V^{\pi}(s)\)입니다.
\[ b(S_t) = V^{\pi}(S_t) \]
리턴 \(G_t\)에서 상태 가치 \(V^{\pi}(S_t)\)를 빼준 값 \(G_t - V^{\pi}(S_t)\)는 어드밴티지 함수(Advantage Function) \(A^{\pi}(S_t, A_t)\)의 추정치가 됩니다. 이는 '평균적인 상황(V)보다 행동 \(A_t\)가 실제로 얼마나 더 좋았는가'를 의미합니다.
정리하면, 베이스라인을 적용한 REINFORCE의 최종 업데이트 규칙은 다음과 같습니다.
\[ \theta \leftarrow \theta + \alpha \nabla_{\theta} \log \pi_{\theta}(A_t|S_t) (G_t - V(S_t)) \]
이 방식은 REINFORCE의 높은 분산을 크게 줄여주어 훨씬 안정적이고 빠른 학습을 가능하게 합니다.
'Data & Research' 카테고리의 다른 글
[Reinforcement Learning] Off-policy Gradient (0) | 2025.06.29 |
---|---|
[Reinforcement Learning] Rethinking Policy Gradient (0) | 2025.06.28 |
[Reinforcement Learning] Policy Gradient (2) | 2025.06.25 |
[Reinforcement Learning] 가치기반 강화학습 vs. 정책기반 강화학습 (0) | 2025.06.24 |
[Reinforcement Learning] Q-learning (Off-policy TD Control) (3) | 2025.06.23 |