Q-Learning 알고리즘의 이해 및 구현
1. 강화 학습과 Q-Learning 개요
강화 학습(Reinforcement Learning, RL)은 환경(Environment)과 상호작용하며 최적의 행동을 학습하는 기계 학습 방법입니다. RL에서는 에이전트(Agent)가 환경에서 특정 상태(State)에 있을 때, 어떤 행동(Action)을 해야 보상을 최대화할 수 있는지를 학습합니다.
Q-Learning은 대표적인 강화 학습 알고리즘 중 하나로, 모델 프리(Model-Free) 방법이며 오프 폴리시(Off-Policy) 학습 방법입니다. 즉, 환경의 동적 모델을 모르더라도 학습할 수 있으며, 현재 정책(Policy)과 무관하게 최적 정책을 학습할 수 있습니다.
2. Q-Learning의 원리
Q-Learning은 Q-값(Q-value, 행동 가치 함수)을 업데이트하는 방식으로 동작합니다. Q-값은 특정 상태에서 특정 행동을 했을 때 기대되는 누적 보상을 의미합니다.
Q-Learning의 핵심 수식은 다음과 같습니다.
$$
Q(s, a) \leftarrow Q(s, a) + \alpha \big[R + \gamma \max_{a'} Q(s', a') - Q(s, a)\big]
$$
여기서:
- $ Q(s, a) $ : 상태 $ s $에서 행동 $ a $를 했을 때 기대되는 보상
- $ \alpha $ : 학습률 (Learning Rate, 0~1 사이 값)
- $ R $ : 현재 행동을 수행한 후 받은 보상 (Reward)
- $ \gamma $ : 할인율 (Discount Factor, 0~1 사이 값, 미래 보상 반영 비율)
- $ \max_{a'} Q(s', a') $ : 다음 상태 $ s' $에서 가능한 최대 Q값
이 수식을 통해 Q-값이 점진적으로 최적 Q-값에 수렴하게 됩니다.
3. Q-Learning 알고리즘 단계
Q-Learning 알고리즘의 기본적인 흐름은 다음과 같습니다.
- Q-테이블을 초기화한다.
- 환경에서 초기 상태 $ s $를 설정한다.
- 특정 확률(탐색 vs. 활용 전략, ε-greedy 정책)을 이용하여 행동 $ a $를 선택한다.
- 선택한 행동을 실행하고 보상 $ R $을 얻은 후, 새로운 상태 $ s' $로 이동한다.
- Q-값을 업데이트한다.
- 종료 상태에 도달할 때까지 반복한다.
- 충분히 학습된 후 최적의 정책을 결정한다.
4. Q-Learning 구현 (Python)
아래는 gym 라이브러리를 사용하여 간단한 FrozenLake 환경에서 Q-Learning을 구현하는 예제입니다.
4.1 필요한 라이브러리 설치
먼저, OpenAI Gym을 설치해야 합니다.
pip install gym numpy
4.2 Q-Learning 코드 구현
import numpy as np
import gym
# 환경 생성
env = gym.make("FrozenLake-v1", is_slippery=False)
n_actions = env.action_space.n # 가능한 행동 개수
n_states = env.observation_space.n # 가능한 상태 개수
# Q-테이블 초기화
Q_table = np.zeros((n_states, n_actions))
# 학습 하이퍼파라미터 설정
alpha = 0.1 # 학습률
gamma = 0.99 # 할인율
epsilon = 1.0 # 탐색 확률
epsilon_decay = 0.995
epsilon_min = 0.01
episodes = 1000
# Q-Learning 학습
for episode in range(episodes):
state = env.reset()[0] # 초기 상태
done = False
while not done:
# ε-greedy 탐색
if np.random.rand() < epsilon:
action = env.action_space.sample() # 랜덤 선택
else:
action = np.argmax(Q_table[state, :]) # 최적 행동 선택
# 행동 수행 및 보상 획득
next_state, reward, done, truncated, _ = env.step(action)
# Q-값 업데이트
best_next_action = np.argmax(Q_table[next_state, :])
Q_table[state, action] = Q_table[state, action] + alpha * (reward + gamma * Q_table[next_state, best_next_action] - Q_table[state, action])
# 상태 업데이트
state = next_state
# 탐색 확률 감소
epsilon = max(epsilon * epsilon_decay, epsilon_min)
print("학습 완료된 Q-테이블:")
print(Q_table)
4.3 코드 설명
env.make("FrozenLake-v1"): Gym에서 FrozenLake 환경을 로드합니다.Q_table: Q-값을 저장하는 테이블입니다.ε-greedy: 일정 확률(ε)로 무작위 행동을 선택하고, 나머지는 최적 행동을 선택합니다.alpha,gamma: 학습률과 할인율을 설정합니다.epsilon_decay: 탐색 확률을 점진적으로 줄여 최적의 정책을 찾도록 합니다.
5. 학습 결과 및 성능 평가
학습이 완료되면 Q-테이블이 업데이트되며, 특정 상태에서 최적의 행동을 선택할 수 있게 됩니다. 학습된 Q-테이블을 활용하여 새로운 환경에서도 올바른 경로를 찾을 수 있습니다.
5.1 성능 테스트
학습된 Q-테이블을 이용하여 최적의 행동을 수행하는 코드를 실행해볼 수 있습니다.
state = env.reset()[0]
done = False
env.render()
while not done:
action = np.argmax(Q_table[state, :]) # 최적 행동 선택
next_state, reward, done, truncated, _ = env.step(action)
state = next_state
env.render()
이제, 환경을 실행해보면 학습된 정책을 기반으로 에이전트가 최적의 경로를 선택하는 모습을 볼 수 있습니다.
6. 마무리 및 확장
Q-Learning은 기본적인 모델 프리 강화 학습 기법으로, 다양한 환경에 적용할 수 있습니다. 하지만 Q-테이블 방식은 상태 공간이 커질수록 비효율적이므로, 심층 Q-네트워크(DQN)와 같은 딥러닝 기반의 강화 학습 기법이 필요할 수도 있습니다.
'Python > Deep Learning' 카테고리의 다른 글
| 간단한 게임 에이전트 만들기 (CartPole 예제) (0) | 2026.02.03 |
|---|---|
| Deep Q-Learning (DQN) 개념 및 구현 (0) | 2026.01.21 |
| 강화 학습(Reinforcement Learning)이란? 기초 개념 정리 (0) | 2026.01.19 |
| 전이 학습을 활용한 스타일 변환(Style Transfer) (1) | 2026.01.18 |
| Fine-Tuning을 이용한 모델 성능 개선 (1) | 2026.01.15 |