<용어 복습>
- 모델(model) : 강화 학습에서 환경의 모델의 줄임말. 에이전트의 액션에 대해 환경이 어떻게 응답할지 예측하기 위해 사용하는 모든 것을 가리킨다.
- 모델 프리(model-free) : MDP를 모르는 상태(”모델을 모른다” = ”MDP를 모른다” = “모델 프리다”)
- 모델 기반(Model-based) 혹은 플래닝(planning) : MDP를 아는 상태
챕터 4에서는 MDP를 아는 상황(보상 함수, 전이확률을 알고 있는 상태)에서 밸류를 평가하였다. 챕터 5에서는 MDP를 모르는 상황에서 밸류를 평가해보자.
모델 프리 상황에서의 prediction, 즉 π가 주어졌을 때 가치를 평가하는 2가지 방법에 대해 배우자. 여전히 작은 MDP를 다루기 때문에 테이블 룩업(table look-up) 방법론으로 진행한다.
5.1. 몬테카를로 학습
100원짜리 동전이 있다고 생각해보자. 이 동전의 무게 중심이 한 쪽에 치우쳐져 있다면 동전을 던지는 행위의 기댓값을 알 수 있을까? 그냥 동전을 여러 번 던져보면 알 수 있다! 10번 던져서 앞면이 3번 나왔다면 그 확률을 대충 30%라고 가늠해 볼 수 있고 기댓값은 30원이 된다.
이것이 *몬테카를로 방법론(Monte Carlo Method)의 중심 철학이다.
MDP에서도 같은 방법으로 각 상태의 가치를 평가할 것이다. 가치 함수의 정의는 리턴의 기댓값이었다. 따라서 환경에다가 에이전트를 가져다 놓고 경험을 하도록 시킨다. → 에피소드가 끝나면, 에피소드가 끝날 때까지 얻었던 리턴들을 기록해 놓았다가 평균 계산 → 에피소드마다 반복 이런 방법을 사용한다면 샘플이 많을수록, 즉 경험을 더 많이 쌓아서 더 많은 에피소드를 진행할수록 대수의 법칙에 의해 각 상태의 밸류 예측지는 점점 더 정확해진다.
*측정하기 어려운 통계량이 있을 때 여러 번 샘플링하여 값을 가늠하는 기법의 이름에는 “몬테카를로”가 들어간다.
5.1.1. 몬테카를로 학습 알고리즘

여기서는 보상 함수와 전이 확률을 모른다. (값을 모르는 것일 뿐 실제 MDP에서는 고정된 값이 있다)
1. 테이블 초기화

테이블에 각 상태별로 N(s),V(s) 2개의 값이 필요하다. 이 값들은 0으로 초기화했다. N(s) : s를 총 몇 번 방문했는지 세기 위해서 필요한 값으로, 상태 s를 한 번 방문할 때마다 1을 더해준다. V(s) : 해당 상태에서 경험했던 리턴의 총합을 기록하기 위해 필요한 변수
2. 경험 쌓기
환경인 그리드 월드의 출발점 $s_0$에 에이전트를 가져다 놓자. 그러면 에이전트는 $s_0$로 부터 시작하여 액션 $a_0$를 정하고, 그에 따른 보상 $r_0$를 받고 $s_1$에 도착한다. 이를 반복하는 과정을 아래와 같이 표기할 수 있다.
$$ s_0,a_0,r_0,s_1,a_1,r_1,...,s_{T-1},a_{T-1},r_{T-1},s_T $$
각 상태에 대한 리턴을 계산하면 아래와 같다.
여기서 γ와 보상 $r_n$은 변수가 아니고 숫자 값이다.
3. 테이블 업데이트

2의 경험 쌓기에서 지나온 경로가 [$s_0$→$s_4$→$s_5$→$s_6$→$s_{10}$→$s_{14}$→종료]라고 하자. 그러면 해당 에피소드에서 방문했던 모든 상태에 대해 N(s)와 V(s) 값이 업데이트된다. 모든 상태의 보상은 -1, γ는 1로 계산하였다. 업데이트되는 과정에서의 수식은 아래와 같다.

4. 밸류 계산
경험 쌓기와 테이블 업데이트의 과정을 충분히 반복하면 테이블에는 상태별 리턴값들이 누적되어 있을 것이다. 충분히 경험을 쌓았다고 판단되면 최종적으로 밸류를 구하기 위해서는 모든 상태 s에 대해 리턴의 합 V(s)를 방문횟수 N(s)로 나누면 된다. 즉, 리턴의 평균을 구하면 된다.

이 값은 각 상태의 밸류에 대한 근사치이다.
5.1.2. 조금씩 업데이트하는 버전
이번에는 에피소드가 1개 끝날 때 마다 테이블의 값을 조금씩 업데이트하는 버전을 생각해보자.

α는 얼만큼 업데이트할지 그 크기를 결정해주는 파라미터이다. α의 값이 클수록 한 번에 더 크게 업데이트하는 것이고, α의 값이 작을수록 더 조금씩 업데이트한다. 이렇게 계산하면 N($s_t$)의 값을 저장하지 않고도 에피소드가 하나 끝날 때마다 테이블의 값을 업데이트할 수 있다.
우변을 약간 변형하면 위와 같은 식이 나온다. → Gt가 V($s_t$)보다 크면 α에 곱해진 값이 양수

기존의 V($s_t$) 값을 더 크게 만든다. → Gt가 V($s_t$)보다 작으면 α에 곱해진 값이 음수 → 기존의 V($s_t$) 값을 더 작게 만든다.
5.1.3. 몬테카를로 학습 구현
이제 실제로 몬테카를로 prediction을 구현해보자. 목표는 그리드 월드에서 4방향 랜덤 정책의 상태별 가치를 구하는 것이다. 따라서 아래의 4가지 요소가 필요하다.
- 환경 : 에이전트의 액션을 받아 상태변이를 일으키고, 보상을 줌
- 에이전트 : 4방향 랜덤 정책을 이용해 움직임
- 경험 쌓는 부분 : 에이전트가 환경과 상호작용하며 데이터를 축적
- 학습하는 부분 : 쌓인 경험을 통해 테이블을 업데이트
###라이브러리 ipmort
import random
###Grid World 클래스
class GridWorld():
def __init__(self):
self.x=0
self.y=0
def step(self, a):
if a==0:
self.move_right()
elif a==1:
self.move_left()
elif a==2:
self.move_up()
elif a==3:
self.move_down()
reward = -1
done = self.is_done()
return (self.x, self.y), reward, done
def move_right(self):
self.y += 1
if self.y > 3:
self.y = 3
def move_left(self):
self.y -= 1
if self.y < 0:
self.y = 0
def move_up(self):
self.x -= 1
if self.x < 0:
self.x = 0
def move_down(self):
self.x += 1
if self.x > 3:
self.x = 3
def is_done(self):
if self.x == 3 and self.y == 3:
return True
else :
return False
def get_state(self):
return (self.x, self.y)
def reset(self):
self.x=0
self.y=0
return (self.x,self.y)
###Agent 클래스
#각각 4분의 1 확률로 4가지 액션 중 하나를 선택하는 함수
class Agent():
def __init__(self):
pass
def select_action(self):
coin = random.random()
if coin < 0.25:
action = 0
elif coin < 0.5:
action = 1
elif coin < 0.75:
action = 2
else:
action = 3
return action
###메인 함수
def main():
env = GridWorld()
agent = Agent()
data = [[0,0,0,0],[0,0,0,0],[0,0,0,0],[0,0,0,0]] #테이블 초기화
gamma = 1.0
alpha = 0.0001
for k in range(50000): #총 50000번의 에피소드 진행
done = False
history = []
#랜덤 에이전트가 경험을 쌓는 과정
while not done:
action = agent.select_action()
(x,y), reward, done = env.step(action)
history.append((x,y,reward))
env.reset()
#매 에피소드가 끝나고 바로 해당 데이터를 이용해 테이블을 업데이트
cum_reward = 0
for transition in history[::-1]:
#방문했던 상태들을 뒤에서부터 보며 차례차례 리턴을 계산
x,y,reward = transition
data[x][y] = data[x][y] + alpha*(cum_reward-data[x][y])
cum_reward = cum_reward + gamma*reward
#학습이 끝나고 난 후 데이터를 출력해보기 위한 코드
for row in data:
print(row)
출력은 다음과 같이 나오게 된다.

5.2. Temporal Difference 학습
몬테카를로 학습 방법론의 단점은 업데이트를 하려면 에피소드가 끝날 때까지 기다려야 한다는 점이다. 따라서 종료하는 MDP에서만 사용할 수 있는데, 실제 세계에는 종료 조건이 따로 없는 MDP도 있다. 만약 에피소드가 끝나기 전에 밸류를 업데이트 할 수 있다면 우리는 종료하지 않는 MDP에서도 학습할 수 있다.
Temporal Difference 학습 방법론(TD)라는 접근 방법을 도입하자. 이 방법은 추측을 추측으로 업데이트하는 것이다. 정확하게는 미래의 추측으로 과거의 추측을 업데이트 하는 것이다.
예를 들어, 이번주 일요일에 비가 올지 금요일과 토요일에 추측하는 상황이라고 하자. 금요일에는 비가 올 확률을 50%로, 토요일에는 비가 올 확률을 80%로 추측했다. 이때, 금요일보다는 토요일의 추측이 정확할 것이다. MC의 방법으로 생각해보면 일요일까지 기다렸다가, 비가 오면 금요일의 추측을 비가 오는 것으로 수정한다. TD의 방법으로 생각해보면 토요일의 추측이 80%로 높아졌으므로 금요일의 확률도 높여준다.
5.2.1. 이론적 배경
미래의 추측이 더 정확한게 맞는지에 대한 의문을 해결해보자.
벨만 기대 방정식 0단계를 떠올려보자.

대괄호 안에 있는 값을 여러 번 뽑아서 평균을 내면 가치함수에 수렴한다. 따라서 이 값을 TD 타깃이라고 부른다.
5.2.2. Temporal Difference 학습 알고리즘
몬테카를로 방법론에서 확인한 그리드월드가 있다고 생각해보자.
1. 테이블 값 초기화
각 상태에 대해 그 값을 0으로 초기화한다.

2. 에이전트를 $s_0$에 놔두고 경험을 쌓게 한다.
여기까지는 MC와 동일하다. 에이전트가 다음과 같은 경로를 밟아 종료상태에 도달했다고 가정하자. [$s_0$→$s_1$→$s_2$→$s_3$→$s_7$→$s_6$→$s_{10}$→$s_{11}$→종료]
3. 각각의 상태 전이가 일어나자마자 바로 테이블의 값을 업데이트해줄 수 있다.
$$ MC : V(s_t)←V(s_t)+α(G_t-V(s_t))\\TD :V(s_t)←V(s_t)+α(r_{t+1}+γV(s_{t+1})-V(s_t)) $$
아래와 같이 총 8번 업데이트를 진행한다. 여기서 보상은 -1, α=0.01, γ=1.0을 사용했다.

이렇게 테이블의 칸을 업데이트하고 나면 하나의 에피소드에 대한 업데이트를 마친 것이다. 다음 에피소드를 경험하고, 그 데이터를 이용해 테이블의 값을 업데이트하는 과정을 값이 수렴할 때까지 반복한다.
5.2.3. Temporal Difference 학습 구현
def main():
env = GridWorld()
agent = Agent()
data = [[0,0,0,0],[0,0,0,0],[0,0,0,0],[0,0,0,0]]
gamma = 1.0
alpha = 0.01 #MC에 비해 큰 값을 사용.
#TD가 MC에 비해 학습의 변동성이 작은 덕분에 큰 폭의 업데이트가 가능해서 설정한 값.
for k in range(50000): #총 50000번의 에피소드 진행
done = False
while not done:
x,y = env.get_state()
action = agent.select_action()
(x_prime, y_prime), reward, done = env.step(action)
x_prime, y_prime = env.get_state()
#한 번의 step이 진행되자마자 바로 테이블의 데이터를 업데이트 해줌
data[x][y] = data[x][y] + alpha*(reward+gamma*data[x_prime][y_prime]-data[x][y])
env.reset()
#학습이 끝나고 난 후 데이터를 출력해보기 위한 코드
for row in data:
print(row)
출력은 다음과 같이 나오게 된다.

5.3. 몬테카를로 vs TD
5.3.1. 학습 시점
MC는 에피소드가 끝나고 리턴이 정해져야 비로소 되돌아보면서 학습을 진행할 수 있다. 반면 TD는 한 스텝이 끝날 때 마다 바로바로 테이블의 값들을 업데이트할 수 있다.
MDP는 크게 두 종류가 있다.
- Episodic MDP MDP의 상태들 중에 종료 상태라는 것이 있어서 에이전트의 경험이 에피소드 단위로 나눠질 수 있는 것
- Non-Episodic MDP 종료 상태 없이 하나의 에피소드가 무한히 이어지는 MDP
MC는 episodic MDP에만 적용할 수 있다. 반면 TD는 어떤 MDP에서든 적용할 수 있다. 학습 시점을 기준으로 생각했을 때에는 TD가 우세하다고 생각할 수 있다.
5.3.2. 편향성(Bias)

MC는 가치 함수의 정의가 리턴의 기댓값이기 때문에 리턴의 평균을 향해 업데이트 되었다. 따라서 샘플마다 리턴값이 다르더라도 평균은 실제 가치에 수렴하게 되며 편향되어 있지 않은 방법론인 것이다.
TD는 현재의 추측치를 다음 스텝의 추측치로 업데이트해주는 방법론이었다. TD 타깃을 이용하여 값을 계산했다. 벨만 방정식에서는 $r_{t+1}+γv_π(s_{t+1})$을 이용해 기댓값을 계산했다. 하지만 업데이트에 사용하는 수식은 $r_{t+1}+γV(s_{t+1})$이다. V는 테이블에 담겨있던 값일 뿐 실제 밸류값과는 다르다. 실제 TD 타깃은 불편 추정량이지만 우리가 사용하는 TD 타깃은 편향된 값이다.
따라서 편향성을 기준으로 생각했을 때에는 MC가 우세하다고 생각할 수 있다.
5.3.3. 분산(Variance)
MC는 리턴을 통해 업데이트가 이루어지기 때문에 수많은 확률적 가정을 거쳐야한다. 즉, 분산 혹은 변동성이 크다.
반면 TD는 한 샘플만 보면 바로 업데이트가 가능하기 때문에 분산이 작다. 딱 한 걸음만 떼면 되기 때문에 확률적 요소라고 할 만한 것이 별로 없다.
분산은 클수록 학습이 힘들어지기 때문에 분산을 기준으로 생각하면 TD가 우세하다고 생각할 수 있다.
5.3.4. 종합

종합적으로 생각하면 위와 같이 생각할 수 있다. 요즘 나오는 강화 학습 알고리즘은 대부분 TD를 사용한다.
5.4. 몬테카를로와 TD의 중간?
MC는 편향성이 없다는 장점이 있었고, TD는 변동성이 적다는 장점이 있었다. MC와 TD의 중간은 있으며, MC는 TD의 한 극단이라고 생각할 수 있다.
5.4.1. n 스텝 TD
TD 학습에서 TD 타깃을 생각해보자.
$$ r_{t+1}+γV(s_{t+1}) $$
한 스텝 진행하여 실제 보상을 관찰하고, 도착한 상태 $s_{t+1}$의 가치를 가치함수 V를 이용한 추측으로 정의했다. 여기서 꼭 한 스텝만으로 평가할 특별한 이유가 없다. 따라서 아래와 같이 2-스텝, 3-스텝, …, n-스텝을 진행하고 난 뒤의 추측치를 이용할 수도 있다.

그리고 n이 무한대로 간다면 아래와 같이 나타낼 수 있다. 항상 종료하는 MDP라고 가정하고 종료 시점의 스텝을 T라고 가정했다.

이렇게 n이 무한대로 가면 이 값은 리턴이 된다. 즉, MC는 TD의 한 사례인 셈이다. 한 극단에는 MC가 다른 한 극단에는 TD-zero가 있는 것이다.(N=1일 때 TD-zero라고 한다.)

이를 그림으로 나타내면 위와 같게 된다. 실제 문제에서는 TD나 MC를 사용하는 대신 n을 몇으로 할 것인지를 찾는 것이 좋다.
'ML,DL' 카테고리의 다른 글
| [바닥부터 배우는 강화학습] Chapter 7 Deep RL 첫 걸음 (0) | 2026.03.11 |
|---|---|
| [바닥부터 배우는 강화학습] Chapter 6 MDP를 모를 때 최고의 정책 찾기 (0) | 2026.03.10 |
| [바닥부터 배우는 강화학습] Chapter 4 MDP를 알 때의 플래닝 (0) | 2026.03.09 |
| [바닥부터 배우는 강화학습] Chapter 3 벨만 방정식 (0) | 2026.02.21 |
| [바닥부터 배우는 강화학습] Chapter 2 마르코프 결정 프로세스(Markov Decision Process) (0) | 2026.02.20 |