서론

강화 학습은 바둑과 같은 게임이나 자율 주행 자동차와 같은 실제 응용 분야에서 최근 달성한 성과들로 인해 지난 10년 동안 인기를 얻은 머신러닝의 융합 분야입니다. 이러한 성장은 최신 GPU의 비약적인 발전 및 머신러닝 기술의 진화와도 맞물려 있습니다. 우리는 이제 기계가 컴퓨터 게임에서 인간을 쉽게 뛰어넘을 수 있는 단계에 이르렀습니다. 심층 Q-네트워크(DQN)는 고차원성 및 장기적 계획이 필요한 아타리(Atari)와 같은 비디오 게임을 처리하는 데 큰 가능성을 보이는 강화 학습 알고리즘입니다. 본 튜토리얼에서는 DQN의 작동 방식을 설명하고, 기존에 OpenAI에서 관리했던 Gymnasium의 루나 랜더를 해결하는 과정을 통해 그 효과를 살펴봅니다.

강화 학습이란 무엇인가?

강화학습의 전체 순환 구조를 나타낸 다이어그램

강화 학습은 누적 보상을 극대화하기 위해 에이전트가 환경 내에서 행동을 수행하며 의사 결정을 내리는 과정입니다. 주요 구성 요소는 다음과 같습니다.

  • 에이전트(Agent): 환경과 상호작용하는 의사 결정 주체입니다.
  • 환경(Environment): 에이전트가 상호작용하는 외부 시스템입니다.
  • 상태(State, S): 환경의 현재 상황이나 구성입니다.
  • 행동(Action, A): 에이전트가 취할 수 있는 가능한 움직임이나 결정입니다.
  • 보상(Reward, R): 행동의 품질을 나타내는 환경으로부터의 피드백입니다.
  • 정책(Policy, π): 상태를 행동에 매핑하여 에이전트의 행동 방식을 정의하는 전략입니다.
  • 가치 함수(Value Function, V): 주어진 상태에서 기대되는 누적 보상을 추정합니다.
  • Q-함수(Q-Function, Q): 주어진 상태에서 특정 행동을 취했을 때 기대되는 누적 보상을 추정합니다.

강화 학습의 작동 원리

  1. 초기화(Initialization): 에이전트는 환경에 대한 지식이 없거나 아주 최소한의 정보만 가진 상태로 시작합니다.
  2. 상호작용(Interaction): 에이전트는 자신의 정책에 기반하여 행동을 취함으로써 환경과 상호작용합니다.
  3. 피드백(Feedback): 환경은 각 행동에 대해 새로운 상태와 보상으로 응답합니다.
  4. 학습(Learning): 에이전트는 향후 의사 결정을 개선하기 위해 받은 보상을 바탕으로 정책 및 가치 함수를 업데이트합니다.

핵심 개념

  • 탐험과 활용(Exploration vs. Exploitation): 새로운 행동을 탐색하는 것과 이미 알려진 높은 보상의 행동을 활용하는 것 사이의 균형을 맞춥니다.
  • 할인율(Discount Factor, γ\gamma): 즉각적인 보상에 대비하여 미래 보상의 중요도를 결정합니다.
  • 벨만 방정식(Bellman Equation): 한 상태의 가치와 그 다음 이어지는 상태들의 가치 사이의 관계를 설명합니다.

벨만 방정식

벨만 방정식은 강화 학습의 기본 요소로, 가치 함수의 재귀적 분해를 제공합니다. Q-함수에 대한 벨만 방정식은 다음과 같습니다.

Q(s,a)=r+γmaxaQ(s,a)Q(s, a)=r+\gamma \max_{a'} Q(s', a')

여기서:

  • Q(s,a)Q(s, a)는 상태 ss에서 행동 aa를 취했을 때의 Q-값입니다.
  • rr은 행동 aa를 취한 후 받는 보상입니다.
  • γ\gamma는 할인율로, 미래 보상의 중요도를 결정합니다.
  • maxaQ(s,a)\max_{a'} Q(s', a')는 가능한 모든 행동 aa'에 대하여 다음 상태 ss'에서 얻을 수 있는 최대 Q-값입니다.

시간차 학습(Temporal Difference Learning)

시간차(TD) 학습은 동적 계획법(Dynamic Programming)과 몬테카를로(Monte Carlo) 방법의 아이디어를 결합한 강화 학습의 핵심 접근법입니다. 예측된 가치와 실제 받은 보상에 다음 상태의 할인된 가치를 더한 값 사이의 차이, 즉 시간차 오차를 바탕으로 가치 함수를 업데이트합니다.

TD 학습의 일종인 Q-러닝의 업데이트 규칙은 다음과 같습니다.

Q(s,a)Q(s,a)+α(r+γmaxaQ(s,a)Q(s,a))Q(s, a) \leftarrow Q(s, a) + \alpha \left( r + \gamma \max_{a'} Q(s', a') - Q(s, a) \right)

여기서:

  • α\alpha는 학습률(learning rate)로, 새로운 정보가 기존 정보를 덮어쓰는 정도를 제어합니다.
  • r+γmaxaQ(s,a)r+\gamma \max_{a'} Q(s',a')는 현재 Q-값에 대한 타깃(target)으로, 즉각적인 보상과 추정된 미래 보상을 결합한 값입니다.

강화 학습은 복잡한 의사 결정 문제를 해결하기 위한 강력한 프레임워크입니다. 이 프레임워크는 환경과의 상호작용 과정에서 겪는 시행착오를 통해 최적의 전략을 학습합니다.

DQN의 작동 원리

심층 Q-네트워크(DQN)는 Q-러닝을 심층 신경망(deep neural networks)과 결합하여 수많은 상태와 행동이 존재하는 환경을 처리합니다.

DQN 학습 루프, 경험 재생, 타깃 네트워크를 설명하는 다이어그램

경험을 통한 학습

Q-러닝은 에이전트가 환경과의 상호작용을 통해 보상을 극대화하도록 학습하는 강화 학습 알고리즘입니다. 이는 미래 보상을 예측하기 위해 Q-함수 Q(s,a)Q(s, a)를 사용합니다. 에이전트는 벨만 방정식을 사용하여 Q-값을 업데이트하며, 받은 보상과 예상되는 미래 보상을 바탕으로 예측값을 조정합니다.

실제 예시

예측된 Q(s,a)=100Q(s, a)=100인 상태 ss에 있다고 가정해 봅시다. 행동 aa를 취한 후 상태 ss'로 전이되고 8의 보상을 받습니다. ss'에서의 최적 행동에 대한 Q-값은 95이며, 할인율은 0.99입니다. 시간차는 다음과 같습니다.

8+0.99×95100=2.058 + 0.99 \times 95 - 100 = 2.05

학습률이 0.1이라면, 업데이트된 Q-값은 다음과 같습니다.

100+0.1×2.05=100.205100 + 0.1 \times 2.05 = 100.205

딥 Q-러닝

전통적인 Q-러닝은 Q-값을 저장하기 위해 테이블을 사용하지만, 이는 상태와 행동 공간이 방대한 환경에서는 사실상 적용이 불가능합니다. DQN은 Q(s,a)Q(s, a)를 근사하기 위해 신경망을 사용하므로, 에이전트가 아직 겪어보지 못한 상태-행동 쌍에 대해서도 일반화할 수 있게 해줍니다. 신경망의 입력은 관측값(observation)이며, 출력은 가능한 각 행동에 대한 Q-값입니다.

DQN 알고리즘

  1. 경험 재생(Experience Replay): 경험들 (s,a,r,s)(s, a, r, s')을 재생 버퍼(replay buffer)에 저장합니다. 버퍼에서 무작위로 샘플링하면 시간적 상관관계를 깨는 데 도움이 되어 학습이 더 안정적으로 이루어집니다.
  2. 타깃 네트워크(Target Network): 의사 결정을 위한 로컬(primary) 네트워크와 안정적인 Q-값 타깃을 제공하기 위한 타깃 네트워크 등 두 개의 신경망을 사용합니다.
  3. 훈련 단계:

재생 버퍼와 네트워크들을 초기화합니다.

각 에피소드마다:

시작 상태를 초기화합니다.

각 단계에 대해:

  1. ϵ\epsilon-탐욕(ϵ\epsilon-greedy) 정책을 사용하여 행동 aa를 선택합니다.
  2. 행동을 실행하고 보상 rr과 다음 상태 ss'를 관측합니다.
  3. 경험을 재생 버퍼에 저장합니다.
  4. 재생 버퍼에서 미니배치(mini-batch)를 샘플링합니다.
  5. 타깃 Q-값을 계산하고 손실(loss)에 대해 경사하강법을 수행합니다.
  6. 타깃 네트워크를 주기적으로 업데이트합니다.

안정성을 위한 개선 사항

안정성과 수렴성을 보장하기 위해 다음과 같은 여러 개선 사항이 구현됩니다.

  1. ϵ\epsilon-탐욕 행동 선택: 시간이 지남에 따라 탐색률을 조정하여 탐험과 활용 사이의 균형을 맞춥니다.
  2. 경험 재생: 과거 경험의 배치(batch)로부터 학습할 수 있게 하여 안정적인 훈련과 더 나은 수렴을 보장합니다.
  3. 타깃 네트워크 및 로컬 네트워크(Target vs. Local Network): 안정적인 Q-값 타깃을 제공하는 타깃 네트워크를 사용하여 진동과 발산을 줄입니다.

타깃 네트워크 및 로컬 네트워크

DQN에서는 학습을 안정화하기 위해 두 개의 네트워크가 사용됩니다.

  • 주(로컬) 네트워크(Primary/Local Network): 이 네트워크는 지속적으로 업데이트되며 훈련 중에 행동을 선택하는 데 사용됩니다. 예측된 Q-값과 타깃 Q-값 사이의 손실을 최소화하여 학습합니다.
  • 타깃 네트워크(Target Network): 이 네트워크는 Q-값 업데이트를 위한 안정적인 타깃을 제공합니다. 주 네트워크와 달리 타깃 네트워크의 가중치는 덜 빈번하게 업데이트되며, 일반적으로 수천 스텝마다 주 네트워크의 가중치를 복사하여 반영합니다.

두 개의 네트워크를 사용하는 이유

  1. 안정성: 주 네트워크의 가중치는 자주 업데이트되기 때문에 불안정성과 발산으로 이어질 수 있습니다. 타깃 네트워크를 사용하여 안정적인 Q-값 타깃을 제공함으로써, 학습 중 발생하는 급격한 변동을 방지합니다.
  2. 일관성: 타깃 네트워크는 주기적으로만 업데이트되므로 일관된 학습 목표를 유지하는 데 도움이 됩니다. 이를 통해 Q-값 업데이트가 더욱 안정적이고 신뢰할 수 있는 목표를 기반으로 이루어지며, 결과적으로 더 매끄럽고 안정적인 학습이 가능해집니다.

업데이트 메커니즘

  1. 주 네트워크 업데이트: 매 행동 이후, 주 네트워크는 예측된 Q-값과 타깃 네트워크가 제공하는 타깃 Q-값 간의 차이로 계산된 손실을 사용하여 가중치를 업데이트합니다.
  2. 타깃 네트워크 업데이트: 수천 스텝마다 주 네트워크의 가중치가 타깃 네트워크로 복사되며, 이를 통해 타깃 네트워크가 다시 업데이트되기 전까지 일정 스텝 동안 안정적인 목표를 제공하도록 보장합니다.
착륙선이 표시된 Lunar Lander 화면으로, 좌·우·하단 추진기를 나타내는 화살표와 두 깃발 사이 착륙 지점으로 향하는 곡선 경로가 보인다

다음은 상세한 코드 예제입니다

1단계: 필수 라이브러리 설치
pip install swig gymnasium gymnasium[box2d] stable-baselines3 torch
2단계: 라이브러리 임포트 및 환경 설정
import gymnasium
from stable_baselines3 import DQN
from stable_baselines3.common.evaluation import evaluate_policy

# 루나 랜더 환경 생성
env = gymnasium.make("LunarLander-v3")
3단계: DQN 모델 정의
# DQN 모델 정의
model = DQN("MlpPolicy", env, verbose=1)
4단계: DQN 모델 학습
# 필요에 따라 타임스텝 조정
model.learn(total_timesteps=750_000)
5단계: 학습된 모델 평가
mean_reward, std_reward = evaluate_policy(model, env, n_eval_episodes=10)
print(f"Mean reward: {mean_reward} +/- {std_reward}")

# 선택 사항: 모델 저장
model.save("dqn_lunar_lander")
6단계: 학습된 모델 시각화
import time

# 필요한 경우 모델 불러오기
# model = DQN.load("dqn_lunar_lander")

# 모델 성능 시각화
episodes = 5

for episode in range(1, episodes + 1):
    obs, info = env.reset()
    done = False
    score = 0

    while not done:
        env.render()
        action, _states = model.predict(obs)
        obs, reward, terminated, truncated, info = env.step(action)
        done = terminated or truncated
        score += reward

    print(f"Episode: {episode}, Score: {score}")
    time.sleep(1)

env.close()

설명

  • 환경 설정: gymnasium.make("LunarLander-v3")는 루나 랜더 환경을 초기화합니다.
  • DQN 모델: Stable Baselines3의 DQN 클래스를 사용하여 MLP 정책이 적용된 모델을 정의합니다.
  • 학습: learn 메서드는 지정된 타임스텝 수만큼 모델을 학습시킵니다.
  • 평가: evaluate_policy 함수는 여러 에피소드에 걸쳐 모델의 성능을 평가합니다.
  • 시각화: 루프 내에서 환경을 렌더링하여 학습된 모델의 성능을 실시간으로 시각화합니다.

추가 팁

  • 하이퍼파라미터: 더 나은 성능을 위해 하이퍼파라미터(학습률, 배치 크기 등)를 조정해야 할 수도 있습니다.
  • 체크포인트: 학습 진행 상황이 유실되는 것을 방지하기 위해 훈련 중 중간 모델을 저장합니다.
  • 모니터링: 텐서보드(TensorBoard)를 사용하여 실시간으로 학습 지표를 모니터링합니다.
에피소드 번호에 대한 점수 학습 곡선: -200 부근에서 시작해 -500까지 떨어지기도 하다가 약 500 에피소드까지 가파르게 상승한 뒤, 2,600 에피소드까지 +250에서 +300 사이에서 안정된다

결론

DQN은 Q-러닝과 심층 신경망을 결합한 강력한 강화 학습 알고리즘입니다. 경험 재생 및 타깃 네트워크와 같은 기법을 활용함으로써, DQN은 Gymnasium의 루나 랜더와 같은 복잡한 환경을 효과적으로 해결하도록 학습하며 게임과 실제 응용 분야 모두에서 잠재력을 보여줍니다. 주 네트워크와 함께 타깃 네트워크를 사용하면 학습의 안정성과 일관성이 보장되므로, DQN은 광범위한 강화 학습 문제에 적용할 수 있는 강력하고 효율적인 알고리즘이 됩니다.

추가 학습 자료

코드 저장소 및 모델

Github 저장소

학습 진행 과정 영상

초기 체크포인트

200,000 학습 스텝

에이전트가 안정화되기 시작했지만 착륙은 아직 일관적이지 않습니다.
중간 학습

400,000 학습 스텝

학습된 정책은 더 깔끔한 하강 제어와 더 나은 접근 타이밍을 보여줍니다.
최고 체크포인트

최고 모델

최고 체크포인트는 LunarLander-v3에서 신뢰할 수 있는 착륙 정책에 도달합니다.

모델 성능

환경모델 유형평균 보상총 학습 스텝HuggingFaceGoogle Colab
LunarLander-v3DQN218.56 +/- 63.62750,000모델 보기Colab 보기