Python/Deep Learning

Q-Learning 알고리즘의 이해 및 구현

임베디드 친구 2026. 1. 20. 19:55
728x90
반응형

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 알고리즘의 기본적인 흐름은 다음과 같습니다.

  1. Q-테이블을 초기화한다.
  2. 환경에서 초기 상태 $ s $를 설정한다.
  3. 특정 확률(탐색 vs. 활용 전략, ε-greedy 정책)을 이용하여 행동 $ a $를 선택한다.
  4. 선택한 행동을 실행하고 보상 $ R $을 얻은 후, 새로운 상태 $ s' $로 이동한다.
  5. Q-값을 업데이트한다.
  6. 종료 상태에 도달할 때까지 반복한다.
  7. 충분히 학습된 후 최적의 정책을 결정한다.

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)와 같은 딥러닝 기반의 강화 학습 기법이 필요할 수도 있습니다.

반응형