마르코프 결정 과정(MDP)과 정책의 목적
강화학습(Reinforcement Learning)에서 마르코프 결정 과정(MDP: Markov Decision Process)의 궁극적인 목적은 에이전트가 환경과 상호작용하면서 받을 수 있는 보상을 최대화할 수 있는 최적의 정책(Policy)을 찾는 것이다. 정책이란, 특정 상태(State)에서 어떤 행동(Action)을 선택할지를 확률적으로 정의하는 규칙이다. 예를 들어 상태 S에서 행동 A1을 선택할 확률이 60%, A2를 선택할 확률이 40%라면, 이러한 확률 분포가 바로 정책 π(S)이다. 좋은 정책이란, 해당 정책을 따랐을 때 기대되는 총 보상이 가장 큰 정책을 말한다.
상태가치함수 vπ(s)의 의미
상태가치함수 vπ(s)는 상태 s에서 시작하여 정책 π에 따라 행동했을 때 기대할 수 있는 총 보상의 크기를 계산하는 함수이다. 이 함수는 상태를 기준으로 가치를 평가하며, 현재 상태가 얼마나 유리한지를 수치적으로 보여준다. 하지만 정책을 더 정밀하게 평가하고 개선하려면, 단순히 상태의 가치뿐 아니라 행동의 가치도 함께 평가해야 한다.
행동가치함수 Qπ(s, a)의 개념
행동가치함수(Q함수)는 특정 상태 s에서 특정 행동 a를 선택했을 때, 그 이후 정책을 따랐을 때 얻을 수 있는 기대 보상의 총합을 계산하는 함수이다. Q함수는 상태와 행동의 조합을 기준으로 미래의 기대 보상을 계산하며, 어떤 행동을 선택할지를 직접 판단할 수 있는 기준이 된다.
MDP 행동가치함수(Q함수)
Q함수 수식의 구조와 특징
Q함수는 상태가치함수와 유사하지만, 이미 행동을 선택한 상태에서 시작한다는 점이 다르다. 정책의 평균을 계산할 필요 없이 특정 행동에 대한 기대 보상만 계산하면 된다. 다만, 다음 상태에서도 정책을 따르므로 π(s′, a′) 항이 수식에 포함된다.
상태가치함수와 Q함수의 관계
행동가치함수와 상태가치함수의 관계
상태가치함수는 정책을 따랐을 때 특정 상태에서 받을 수 있는 기대 보상을 의미하며, 행동가치함수는 특정 상태에서 하나의 행동을 선택했을 때 기대되는 총 보상을 의미한다. 상태가치함수는 가능한 모든 행동에 대한 Q값의 평균으로 계산된다.
수식의 핵심: 상태전이 확률 P(s′|s, a)
Q함수 수식에서 핵심이 되는 요소는 상태전이 확률 P(s′|s, a)이다. 이 확률은 특정 상태에서 특정 행동을 했을 때 다음 상태로 전이될 가능성을 의미하며, Q함수는 이 값을 기반으로 행동의 결과를 계산한다.
정책 평가와 Q함수의 중요성
Q함수는 정책이 얼마나 효율적인지를 판단하고, 더 나은 정책을 찾기 위한 핵심 도구로 사용된다. 강화학습에서 Q값은 다음 정책을 업데이트할 기준으로 활용되며, 결국 강화학습은 Q값을 기반으로 최적의 정책을 탐색하는 과정이라 할 수 있다.
행동가치함수 예제
import numpy as np
# (1) 상태와 행동 정의
states = ["S", "R1", "R2", "R3", "F"]
actions = ["A1", "A2"]
gamma = 0.5 # 감가율
# (2) 정책 π(s, a): 상태에서 행동을 선택할 확률
policy = {
"S": {"A1": 0.6, "A2": 0.4},
"R1": {"A1": 0.7, "A2": 0.3},
"R2": {"A1": 1.0},
"R3": {"A1": 1.0}
}
# (3) 상태 전이 확률 P(s, a, s')
transition_probs = {
("S", "A1"): "R1",
("S", "A2"): "R2",
("R1", "A1"): "R3",
("R1", "A2"): "R2",
("R2", "A1"): "R3",
("R3", "A1"): "F"
}
# (4) 보상 함수 R(s, a)
rewards = {
("S", "A1"): 0.5,
("S", "A2"): 1.5,
("R1", "A1"): 1.0,
("R1", "A2"): 1.5,
("R2", "A1"): 2.0,
("R3", "A1"): 3.0
}
# (5) 에피소드 시뮬레이션 함수 (정책 기반 경로)
def simulate_episode(start_state="S"):
state = start_state
total_return = 0
discount = 1.0
while state != "F":
action_probs = policy[state]
actions_list = list(action_probs.keys())
probs = list(action_probs.values())
action = np.random.choice(actions_list, p=probs)
reward = rewards.get((state, action), 0)
total_return += discount * reward
next_state = transition_probs.get((state, action), "F")
state = next_state
discount *= gamma
return total_return
n_episodes = 10000
state_values = {}
q_values = {}
# (6) 상태가치함수 계산
for state in states:
episode_returns = [] # 각 상태에서 시작한 에피소드들의 보상 저장 리스트
# 여러 번 시뮬레이션 실행
for _ in range(n_episodes):
result = simulate_episode(start_state=state) # 해당 상태에서 에피소드 시작
episode_returns.append(result) # 반환값 저장
# 평균 보상을 상태가치로 저장
state_values[state] = np.mean(episode_returns)
# (7) 행동가치함수 계산
for state in policy:
for action in policy[state]:
returns = []
for _ in range(n_episodes):
temp_state = state
total_return = 0
discount = 1.0
#(7-1) 첫 행동을 강제로 선택
reward = rewards.get((temp_state, action), 0)
total_return += discount * reward
next_state = transition_probs.get((temp_state, action), "F")
temp_state = next_state
discount *= gamma
#(7-2) 이후부터는 정책에 따라 행동
while temp_state != "F":
action_probs = policy[temp_state]
actions_list = list(action_probs.keys())
probs = list(action_probs.values())
next_action = np.random.choice(actions_list, p=probs)
reward = rewards.get((temp_state, next_action), 0)
total_return += discount * reward
temp_state = transition_probs.get((temp_state, next_action), "F")
discount *= gamma
returns.append(total_return)
q_values[(state, action)] = np.mean(returns)
# (8) 결과 출력
print("\n✅ 상태가치함수 Vπ(s):")
for s, v in state_values.items():
print(f" {s}: {v:.4f}")
print("\n✅ 행동가치함수 Qπ(s,a):")
for (s, a), q in q_values.items():
print(f" ({s}, {a}): {q:.4f}")
✅ 상태가치함수 Vπ(s):
S: 2.4113
R1: 2.7236
R2: 3.5000
R3: 3.0000
F: 0.0000
✅ 행동가치함수 Qπ(s,a):
(S, A1): 1.8618
(S, A2): 3.2500
(R1, A1): 2.5000
(R1, A2): 3.2500
(R2, A1): 3.5000
(R3, A1): 3.0000
나머지 부분은 상태가치함수 예제와 동일하므로 행동가치함수 계산 부분에 대해서만 설명하겠다.
(7) 행동가치함수 계산
- 이 단계는 행동가치함수(Q함수), 즉 Qπ(s, a)를 시뮬레이션 기반으로 추정하는 과정이다. Qπ(s, a)는 어떤 상태 s에서 특정 행동 a를 했을 때, 그 이후 정책을 따르며 종료 상태까지 이동하면서 얻을 수 있는 기대 보상의 총합을 의미한다.
- 이를 계산하기 위해, 각 상태에서 가능한 행동을 하나씩 고정해놓고 시뮬레이션을 반복한다. 그 결과로 얻은 총 보상들을 평균내어 Q값으로 저장한다.
이 과정은 아래 두 단계로 나뉜다.
(7)-1 첫 행동을 강제로 선택
- 상태가치함수는 정책에 따라 행동을 확률적으로 선택하지만, 행동가치함수는 “이 행동을 한다고 가정했을 때”를 평가하는 함수이다.
- 따라서, 시뮬레이션에서 첫 번째 행동은 무조건 고정된 행동으로 직접 지정해서 실행한다.
- 예를 들어 (S, A2)의 Q값을 구할 때는, S에서 무조건 A2를 선택하고 그에 따른 보상을 먼저 계산한다.
- 이 첫 보상은 감가율 없이 그대로 누적된다.
(7)-2 이후부터는 정책을 따름
- 첫 행동 이후부터는 정책에 따라 다음 행동을 확률적으로 선택한다.
- 상태가 바뀔 때마다 정책을 확인하여 가능한 행동 중 하나를 확률적으로 선택하고, 그 행동에 따른 보상을 누적해간다.
- 누적 보상에는 매 단계마다 감가율 γ를 계속 곱해주며, 미래 보상일수록 영향력을 줄인다.
- 이 과정을 종료 상태(F)에 도달할 때까지 반복한다.
- 에피소드가 끝나면 누적된 총 보상을 기록한다.
하나의 상태와 행동 조합에 대해 시뮬레이션을 반복 수행하여 평균 보상을 계산하면, 해당 조합의 행동가치 Qπ(s,a)를 추정할 수 있다. 이렇게 계산된 Q값은 현재 정책이 각 상태에서 어떤 행동을 선택하는 것이 더 유리한지를 판단할 수 있는 근거가 되며, 궁극적으로는 정책을 개선하거나 최적의 정책을 탐색하기 위한 핵심 지표로 활용된다.