MDP를 안다는 것은 다음 정보를 알고 있다는 뜻입니다.
즉 환경이 어떻게 움직이는지 완전히 알고 있는 상황입니다. 이 경우에는 수식으로 직접 Value를 계산할 수 있습니다.
현실에서는 대부분 환경의 확률을 모릅니다.
몬테카를로 방법론(Monte Carlo Method)은 확률적 샘플링(무작위 실험)을 반복하여 어떤 값의 근사해나 평균적인 결과를 계산하는 방법입니다. 즉, 어떤 문제를 수학적으로 정확하게 계산하기 어렵거나 복잡할 때, 실제로 많은 무작위 실험을 수행하고 그 결과의 평균을 이용해 답을 추정하는 방식입니다. 이름은 카지노 도시인 Monte Carlo에서 유래했는데, 이는 주사위나 룰렛처럼 확률과 무작위성(randomness)을 활용하는 방식이기 때문입니다.
1. 무작위로 실험을 한다
2. 실험을 아주 많이 반복한다
3. 결과의 평균을 계산한다
많은 랜덤 실험 → 평균값 → 실제 값에 가까워짐
강화학습에서는 보통 다음 정보를 모릅니다.
상태 전이 확률 P(s'|s,a)
보상 함수 R(s,a)
그래서 수식으로 계산할 수 없습니다.
장점
단점
Monte Carlo Learning에서 에피소드 종료가 필요한 이유는 상태의 가치를 계산할 때 그 상태 이후에 얻는 전체 누적 보상(Return)을 사용하기 때문입니다. Monte Carlo 방법은 어떤 상태에서 시작했을 때 앞으로 받을 보상을 모두 합한 값을 계산한 뒤 그 값을 평균내어 상태 가치를 추정하는 방식이므로, 에피소드가 끝나야 그 상태의 최종 Return을 정확히 알 수 있습니다. 예를 들어 게임에서 어떤 상태에서 시작했을 때 결국 승리(+1)로 끝나는지, 패배(-1)로 끝나는지, 또는 여러 보상을 거쳐 얼마의 총 보상을 얻는지 알아야 상태의 가치를 계산할 수 있는데, 이 값은 게임이 끝나기 전까지는 확정되지 않습니다. 따라서 Monte Carlo 방식은 에피소드 전체를 실행하여 최종 결과를 확인한 뒤 그때 얻은 Return을 사용해 상태 가치를 업데이트하기 때문에, 학습을 위해 반드시 에피소드 종료가 필요합니다.
import random
import numpy as np
class GridWorld():
def __init__(self):
self.x=0
self.y=0
def step(self, a):
# 0번 액션: 왼쪽, 1번 액션: 위, 2번 액션: 오른쪽, 3번 액션: 아래쪽
if a==0:
self.move_left()
elif a==1:
self.move_up()
elif a==2:
self.move_right()
elif a==3:
self.move_down()
reward = -1 # 보상은 항상 -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)
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
reward = -1
alpha = 0.001
for k in range(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 = reward + gamma*cum_reward
for row in data:
print(row)
if __name__ == '__main__':
main()
| Deep RL (0) | 2026.03.11 |
|---|---|
| TD Learning (0) | 2026.03.10 |
| 벨만기대방정식 (0) | 2026.03.05 |
| Markov Decision Process (0) | 2026.03.03 |
| 강화학습 (0) | 2026.03.03 |