강화 학습(Reinforcement Learning)은 기계 학습의 한 분야로, 에이전트가 환경과 상호작용하면서 보상을 최대화하기 위한 정책을 학습하는 방법입니다. 강화 학습의 여러 가지 알고리즘 중에서 가장 유명한 두 가지는 Q-러닝(Q-Learning)과 SARSA(State-Action-Reward-State-Action)입니다. 이 강좌에서는 이 두 알고리즘의 원리, 동작 방식, 그리고 차이점에 대해 자세히 설명하겠습니다.
Q-러닝(Q-Learning)
Q-러닝의 개념
Q-러닝은 정책에 독립적인 가치 기반 방법론으로, 에이전트가 각 상태에서 어떤 행동을 취했을 때 기대할 수 있는 보상을 추정합니다. Q-러닝의 핵심은 Q-값(Q-value)을 업데이트하여 최적의 정책을 학습하는 것입니다.
Q-러닝 알고리즘의 구조
Q-러닝 알고리즘은 다음과 같은 구조를 가지고 있습니다:
- 초기화: 모든 상태-행동 쌍에 대한 Q-값을 초기화합니다 (예: 0 또는 무작위 값).
- 반복: 에이전트가 매 시간 스텝에서 아래 단계들을 수행합니다:
- 현재 상태에서 행동 선택 (ε-greedy 정책 또는 다른 방법 사용).
- 행동을 취하고 보상을 관찰 및 다음 상태로 이동.
- Q-값 업데이트:
Q(s, a) ← Q(s, a) + α[R + γ max Q(s', a') - Q(s, a)]
Q-값 업데이트 과정 설명
Q-값 업데이트 식에서 각 요소의 의미는 다음과 같습니다:
Q(s, a)
: 현재 상태 s에서 행동 a를 취했을 때의 Q-값.α
: 학습률(0 < α ≤ 1), 새로운 정보에 대한 가중치.R
: 현재 상태에서 행동 a를 취했을 때의 보상.γ
: 할인율(0 ≤ γ < 1), 미래 보상에 대한 중요성.max Q(s', a')
: 다음 상태 s’에서 가능한 행동 a’ 중 가장 높은 Q-값.
Q-러닝 예제 코드
import numpy as np
import gym
# 환경 생성
env = gym.make('Taxi-v3')
# Q-러닝 매개변수
alpha = 0.1 # 학습률
gamma = 0.9 # 할인율
epsilon = 0.1 # epsilon-greedy를 위한 탐험 비율
# Q-테이블 초기화
Q = np.zeros([env.observation_space.n, env.action_space.n])
# 학습 과정
for episode in range(1000):
state = env.reset()
done = False
while not done:
# 탐험 또는 이용
if np.random.rand() < epsilon:
action = env.action_space.sample() # 무작위 행동 선택
else:
action = np.argmax(Q[state]) # 현재 Q-값 기반 행동 선택
# 환경에서 행동 수행
next_state, reward, done, _ = env.step(action)
# Q-값 업데이트
Q[state, action] += alpha * (reward + gamma * np.max(Q[next_state]) - Q[state, action])
# 상태 업데이트
state = next_state
print("Q-테이블:\n", Q)
SARSA(상태-행동-보상-상태-행동)
SARSA의 개념
SARSA는 Q-러닝과 유사하지만, 정책에 의존하는 방법입니다. SARSA는 에이전트의 실제 행동을 기반으로 Q-값을 업데이트하여, 현재 정책을 따라 학습합니다.
SARSA 알고리즘의 구조
SARSA 알고리즘도 Q-러닝과 유사한 구조를 가지고 있지만, 행동 선택과 Q-값 업데이트에서 차이가 있습니다:
- 초기화: Q-값 초기화 (Q(s, a) = 0 또는 무작위).
- 반복: 아래 단계들을 수행합니다:
- 현재 상태에서 행동 선택 (ε-greedy 정책).
- 행동 수행 후 보상 및 다음 상태를 관찰.
- 다음 상태에서 다음 행동 선택.
- Q-값 업데이트:
Q(s, a) ← Q(s, a) + α[R + γ Q(s', a') - Q(s, a)]
SARSA의 Q-값 업데이트 과정 설명
SARSA에서 Q-값 업데이트 식은 다음과 같이 될 수 있습니다:
Q(s, a)
: 현재 상태와 행동의 Q-값.R
: 행동 수행 후 받은 보상.Q(s', a')
: 다음 상태에서 선택한 행동의 Q-값.
SARSA 예제 코드
import numpy as np
import gym
# 환경 생성
env = gym.make('Taxi-v3')
# SARSA 매개변수
alpha = 0.1 # 학습률
gamma = 0.9 # 할인율
epsilon = 0.1 # epsilon-greedy 탐험 비율
# Q-테이블 초기화
Q = np.zeros([env.observation_space.n, env.action_space.n])
# 학습 과정
for episode in range(1000):
state = env.reset()
action = env.action_space.sample() # 첫 행동 무작위 선택
done = False
while not done:
# 환경에서 행동 수행
next_state, reward, done, _ = env.step(action)
# 다음 상태에서의 행동 선택
next_action = env.action_space.sample() if np.random.rand() < epsilon else np.argmax(Q[next_state])
# Q-값 업데이트
Q[state, action] += alpha * (reward + gamma * Q[next_state, next_action] - Q[state, action])
# 상태와 행동 업데이트
state = next_state
action = next_action
print("SARSA의 Q-테이블:\n", Q)
Q-러닝과 SARSA의 차이점
Q-러닝과 SARSA는 기본적인 구조는 유사하지만, Q-값 업데이트 방식에서 중요한 차이가 있습니다:
- 정책의 의존성: Q-러닝은 정책에 무관하게 학습하고, 미래의 최적 행동을 고려하여 업데이트하는 반면, SARSA는 실제로 선택된 행동을 기반으로 Q-값을 업데이트합니다. 이는 SARSA가 탐험 비율이나 현재 정책의 영향을 더 많이 받는다는 것을 의미합니다.
- 탐험 대 이용: Q-러닝에서는 다음 상태에서 가능한 최대 Q-값을 사용하는 반면, SARSA에서는 실제로 선택된 다음 행동의 Q-값을 사용합니다. 따라서 Q-러닝은 더 공격적인 방법이며, SARSA는 더 보수적인 방법입니다.
- 수렴성: 두 알고리즘 모두 적절한 조건 하에 수렴성을 가지지만, Q-러닝은 최적 정책을 더욱 빠르게 찾는 경향이 있습니다. 반면, SARSA는 보다 안정적인 학습을 제공합니다.
결론
Q-러닝과 SARSA는 강화학습에서 중요한 두 가지 알고리즘으로, 각각의 장단점이 있습니다. Q-러닝은 보다 높은 수익을 목표로 한 공격적인 접근 방식을 제공하는 반면, SARSA는 정책에 따라 안정적인 학습을 제공합니다. 사용자는 각 문제의 특성에 따라 적절한 알고리즘을 선택하여 사용할 수 있습니다.
이 글을 통해 Q-러닝과 SARSA의 기본 개념과 코드 예제를 이해하는 데 도움이 되셨기를 바랍니다. 다음 강좌에서는 더 발전된 알고리즘이나 딥 강화학습에 대해 다룰 예정입니다.