강화학습(Reinforcement Learning, RL)은 에이전트가 환경과 상호작용하여 보상을 극대화하는 방법을 배우는 기계 학습의 한 분야입니다. 이번 글에서는 기본적인 강화학습 알고리즘인 Q-러닝과 SARSA를 소개하고, 이 두 알고리즘의 차이점을 살펴보겠습니다. 또한, 간단한 예제를 통해 이 알고리즘들이 어떻게 작동하는지를 자세히 알아보겠습니다.
1. 강화학습의 기초
강화학습은 다음과 같은 구성 요소로 이루어져 있습니다:
- 에이전트(Agent): 환경과 상호작용하여 학습하는 주체입니다.
- 환경(Environment): 에이전트가 상호작용하며 결과를 얻는 세계입니다.
- 상태(State): 현재 환경의 상태를 나타내며, 에이전트가 어떤 행동을 취할지를 결정하는 데에 중요한 역할을 합니다.
- 행동(Action): 에이전트가 선택할 수 있는 작업입니다.
- 보상(Reward): 에이전트가 특정 행동을 취한 후 환경이 제공하는 피드백입니다. 목표는 이 보상을 극대화하는 것입니다.
- 정책(Policy): 주어진 상태에서 어떤 행동을 선택할지를 결정하는 전략입니다.
2. Q-러닝(Q-Learning)
Q-러닝은 모델 프리(model-free) 강화학습 알고리즘으로, 주어진 상태에서 최적의 행동을 선택하기 위해 Q-값(Q-value)을 업데이트합니다. Q-값은 특정 상태에서 특정 행동을 취했을 때 기대되는 장기적인 보상의 추정치입니다.
2.1. Q-학습 알고리즘 식
Q-러닝의 핵심은 다음의 Q-값 업데이트 방정식입니다:
Q(s, a) <- Q(s, a) + α * (r + γ * max_a’ Q(s’, a’) – Q(s, a))
- s: 현재 상태
- a: 현재 행동
- r: 현재 상태에서 취한 행동에 대한 보상
- s’: 다음 상태
- α: 학습률 (0 < α < 1)
- γ: 할인율 (0 < γ < 1)
- max_a’: 다음 상태에서 가능한 행동 중 최대 Q-값을 선택
2.2. Q-러닝의 작동 방식
Q-러닝 알고리즘은 다음과 같은 절차로 진행됩니다:
- 초기 Q-값을 무작위로 설정합니다.
- 에이전트를 초기 상태로 설정합니다.
- 종료 조건이 만족될 때까지 반복합니다:
- 현재 상태에서 행동을 선택합니다 (탐색 또는 활용).
- 행동을 수행하고, 보상과 다음 상태를 관찰합니다.
- Q-값을 업데이트합니다.
- 현재 상태를 다음 상태로 업데이트합니다.
2.3. Q-러닝 간단한 예제
다음은 OpenAI의 Gym 라이브러리에서 제공하는 ‘Taxi-v3’ 환경에서 Q-러닝을 구현한 간단한 예제입니다:
import numpy as np
import gym
# 환경 만들기
env = gym.make('Taxi-v3')
# Q-테이블 초기화
Q = np.zeros((env.observation_space.n, env.action_space.n))
# 하이퍼파라미터
alpha = 0.1 # 학습률
gamma = 0.6 # 할인율
epsilon = 0.1 # 탐색 확률
# 에피소드 수
num_episodes = 1000
# Q-러닝 알고리즘
for i in range(num_episodes):
state = env.reset()
done = False
while not done:
# 행동 선택
if np.random.rand() < epsilon:
action = env.action_space.sample() # 탐색
else:
action = np.argmax(Q[state]) # 활용
next_state, reward, done, info = env.step(action)
# Q-값 업데이트
Q[state, action] += alpha * (reward + gamma * np.max(Q[next_state]) - Q[state, action])
state = next_state
print("학습된 Q-테이블:")
print(Q)
3. SARSA
SARSA(State-Action-Reward-State-Action)는 Q-러닝과 유사한 또 다른 강화학습 알고리즘입니다. SARSA의 차별점은 Q-값을 업데이트할 때 최적의 행동이 아닌 실제 취한 행동(action)을 사용한다는 것입니다. 이러한 방식은 에이전트의 탐색 경로에 더 의존하며, 좀 더 보수적인 정책을 형성합니다.
3.1. SARSA 알고리즘 식
SARSA의 Q-값 업데이트 방정식은 다음과 같습니다:
Q(s, a) <- Q(s, a) + α * (r + γ * Q(s’, a’) – Q(s, a))
- 각 요소의 의미는 앞서 설명한 Q-러닝과 유사합니다. 단, 여기서 사용되는 a’는 다음 상태 s’에서 실제로 선택된 행동입니다.
3.2. SARSA의 작동 방식
SARSA 알고리즘은 다음과 같은 절차로 진행됩니다:
- 초기 Q-값을 무작위로 설정합니다.
- 에이전트를 초기 상태로 설정합니다.
- 종료 조건이 만족될 때까지 반복합니다:
- 현재 상태에서 행동을 선택합니다.
- 행동을 수행하고, 보상과 다음 상태를 관찰합니다.
- 다음 상태에서 행동을 선택합니다.
- Q-값을 업데이트합니다.
- 현재 상태와 행동을 다음 상태와 행동으로 업데이트합니다.
3.3. SARSA 간단한 예제
다음은 ‘Taxi-v3’ 환경에서 SARSA 알고리즘을 구현한 간단한 예제입니다:
import numpy as np
import gym
# 환경 만들기
env = gym.make('Taxi-v3')
# Q-테이블 초기화
Q = np.zeros((env.observation_space.n, env.action_space.n))
# 하이퍼파라미터
alpha = 0.1 # 학습률
gamma = 0.6 # 할인율
epsilon = 0.1 # 탐색 확률
# 에피소드 수
num_episodes = 1000
# SARSA 알고리즘
for i in range(num_episodes):
state = env.reset()
action = env.action_space.sample() if np.random.rand() < epsilon else np.argmax(Q[state])
done = False
while not done:
next_state, reward, done, info = 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, action = next_state, next_action
print("학습된 Q-테이블:")
print(Q)
4. Q-러닝과 SARSA의 차이점
Q-러닝과 SARSA의 주요 차이점은 Q-값 업데이트 방식입니다. Q-러닝은 주어진 다음 상태의 최적 행동을 사용하여 Q-값을 업데이트하는 반면, SARSA는 실제로 취한 행동을 사용합니다. 이러한 차이는 다음과 같은 결과를 초래합니다:
- Q-러닝: 최적의 행동을 추정하기 때문에 학습 속도가 더 빠를 수 있습니다.
- SARSA: 실제로 취한 행동을 기반으로 하여 더 보수적인 정책을 취합니다.
5. 마무리
이번 글에서는 강화학습의 기본 알고리즘인 Q-러닝과 SARSA를 소개하였습니다. 두 알고리즘의 기본 원리와 차이점을 살펴보았으며, 각각의 구현 예제를 통해 이해를 돕고자 하였습니다. 이러한 기본 알고리즘들은 강화학습의 기반이 되며, 더 복잡한 알고리즘으로 발전하는 데에 중요한 기초 지식을 제공합니다.
강화학습은 다양한 분야에 응용될 수 있으며, 이를 통해 더욱 발전한 알고리즘과 기술들이 지금도 연구되고 있습니다. 앞으로도 강화학습에 대한 관심을 가지고 지속적인 학습을 이어나가시길 바랍니다.