본문 바로가기
Domain Knowledge/Reinforcement Learning

[7] Policy gradient : REINFORCE

by hleej 2026. 4. 14.

[강화학습] 수업 요약
created: 2026-04-13
last modified: 2026-04-15

이제 우리는 SARSA, Q-Learning과 같은 Value based 방식의 반대편에 있는 Policy based Learning에 대해 알아볼 것이다.

value와 policy, 두 방식을 모두 사용하는 Actor Critic은 다음 포스팅에서 알아볼 것이다.

 

1. Policy based Learning

지난 포스팅의 Value-based 방법에서 배웠던 ε-greedy 방법을 떠올려보자. 학습이 진행됨에 따라 ε 의 값이 작아지면서, Exploration 대신에 Exploitation을 할 가능성이 커지는 원리였다.

위 그림을 보면, 회색 칸이 2개 있다. 이 두 회색 칸의 State는 모두 {top, right, bottom, left}가 {wall, space, wall, space}로 동일하다. 만약 학습이 충분히 많이 진행되었다면, ε-greedy 방법은 greedy하게 두 회색 칸에서 모두 right 또는 left 중 한 가지 방향으로만 이동을 하게 될 것이다.이렇게 하면 agent의 초기 위치가 양쪽 끝일 때, 절대로 가장 높은 Reward를 얻을 수 없다.

 

이와 같이 복잡한 문제를 해결하기 위해, '최적의 Policy 자체를 확률적'으로 구해야 할 필요성이 있다.


Value-based 방식의 학습을 다시 떠올려 보면, State Value $V(S)$ 또는 Action Value $Q(S, A)$를 구하고, 이를 통해 table 형태로 저장된 Policy $\pi{S, A}$를 update하는 식으로 학습했다.

하지만 이렇게 table 형태로 전부 저장하는 것은 몹시 비효율적이라고 생각할 수 있다.

만약 State가 continuous하다면 어쩔 것인가? 모든 State를 0.00001 단위로 전부 저장할 것인가?

 

이를 해결하기 위해, 우리는 Deep Neural Network를 사용해 볼 수 있다.

S를 통해 A를 예측하는 확률을 위의 그림처럼 table로 만들지 않고, 확률을 출력으로 하는 신경망을 만드는 것이다.

DNN model은 일종의 함수라고 볼 수 있으므로, 기존에 확률 분포(table)로 표시했던 Policy를 함수 형태(model)로 나타낼 수 있다.

$\pi(S, A) \rightarrow \pi_\theta(S, A)$  θ 에 대한 수식이 되었다.

 

아래서부터는 Policy based Learning의 기초적인 알고리즘인 REINFORCE 로 설명한다.

 

1.1. REINFORCE

REINFORCE (REward Increment =Nonnegative Factor × Offset Reinforcement × Characteristic Eligibility)

사실 REINFORCE 자체는 

 

Policy를 Neural Network로 모델링했으니, 이제 우리는 Policy를 Gradient Descent와 같이 점진적으로 update할 수 있는 가능성이 생겼다. 하지만 잠깐, 우리는 Loss를 최소화하려는 것이 아니다. 대신에 Reward를 최대화할 것이다.

따라서 θ 를 아래와 같이 update할 것이다.

 

  Gradient Ascent

  $\theta \leftarrow \theta + \alpha\nabla_{\theta}J(\theta)$

 

그렇다면 목적함수 $J(\theta)$는 어떻게 정의할 것인가? REINFORCE에서는 3가지 식으로 나타낸다.

가장 일반적인 식은,

 

$\displaystyle \begin{align}  J_{avgV}(\theta) &= E[R]  \\ &= \sum_{s \in S} d(s)V_{\theta}(s) \\ &= \sum_{s \in S} d(s) \left(\sum_{a \in A} \pi_{\theta}(s, a)R(s, a)\right)\end{align}$

 

d(s)는 episode 내에서 state s가 등장할 확률을 의미한다. 따라서 목적함수 J()는 모든 state S의 평균 Reward를 최대화하는 것을 목적으로 한다.

 

항상 inital State가 고정되어있는 특별한 상황에서는 아래와 같이 변형할 수 있다.

$\displaystyle  J_1(\theta) = E[v_1]  = V(s_1)$

 

이제 gradient ascent를 생각해 보기 위해 목적함수 J()를 미분해 보자.

$\displaystyle \begin{align}\nabla_\theta J(\theta) &= \nabla_\theta \sum_{s \in S} d(s) \left(\sum_{a \in A} \pi_{\theta}(s, a)R(s, a)\right) \\&=  \sum_{s \in S} d(s) \left(\sum_{a \in A} \nabla_\theta \pi_{\theta}(s, a)R(s, a)\right) \end{align}$

위의 식은 수학적으로는 옳지만, 실제로 강화학습에서 저 식을 그대로 사용하면, 틀린 값이 나온다. 

 

그 이유는, 우리는 ∞번의 시행을 통해 위의 값을 정확히 구할 수가 없기 때문이다. 대신에 sampling을 한 transition에서 구한 값들의 '평균'을 통해 $\nabla J()$의 근사값을 구해야 하는데, 통계적으로 '평균(기댓값)'을 올바르게 구하기 위해서는 확률×값의 형태여야 한다. 하지만 위의 식에서는 '확률의 미분값'만 있지, '확률'은 없다. 더 이상 확률 분포가 아닌 것이다. (확률의 합은 1이어야 하는데, 기울기의 합은 0이 된다.) 따라서 간단한 trick을 통해 억지로 확률값 π를 만들어 줄 수 있다.

 

분모와 분자에 모두 π를 곱해 줬다. 이제 공식 안에 '확률' π가 생겼다.

$\displaystyle \nabla J_{avgV}(\theta)= \sum_{s \in S} d(s) \left(\sum_{a \in A} \pi_{\theta}(s, a) \frac{\nabla_\theta \pi_{\theta}(s, a)}{\pi_{\theta}(s, a)}R(s, a)\right)$

하지만 이렇게 하면 보기 안 좋을 뿐만 아니라, π 의 값이 아주 작으면 계산이 불안정하다.

따라서 log trick을 적용하면 아래처럼 바꿀 수 있다.

log trick.
log의 미분 식이다. 반대로 미분한 함수를 원래 함수로 나눠 준 건, log의 미분으로 바꿔줄 수 있다. 
$\nabla \ln{f(x)} = \frac{\nabla f(x)}{f(x)}$

$\displaystyle \nabla_\theta J_{avgV}(\theta)= E[\nabla \ln{\pi_\theta(s, a)} R(s, a)]$

이 식을 Policy Gradient라고 한다.

 

위의 식에서 단순 보상을 나타내는 R을 썼는데, 실제로 REINFORCE에서는 Return $G_t$를 쓴다.

R 대신에 $Q(s, a)$를 쓰면 Actor Critic이고,

어떤 알고리즘에서는 Advantange르 쓰기도 한다.

 

REINFORCE에서는 Monte Carlo 방법으로 모든 transition을 구해 놓고 위의 Policy Gradient식을 update하는데, 이는 비직관적이다. 그래서 개선된 알고리즘들이 많이 나왔다.