본문 바로가기
IT

Lab 7-1: DQN 1 (NIPS 2013) 알고리즘 구현

by 작은비움 2024. 7. 20.
반응형

Lab 7-1: DQN 1 (NIPS 2013) 알고리즘 구현

https://www.youtube.com/watch?v=Fbf9YUyDFww

 

이번 실습에서는 2013년도에 발표된 DQN(Deep Q-Network) 알고리즘을 구현해 보겠습니다. DQN은 Q-테이블을 신경망으로 대체하여 상태 공간이 큰 문제에서도 효과적으로 학습할 수 있도록 합니다. 이 알고리즘은 Experience Replay와 타겟 네트워크를 도입하여 학습의 안정성과 효율성을 높입니다. 이번 실습에서는 이 알고리즘을 구현하고 CartPole 환경에서 학습시켜 보겠습니다.

알고리즘 개요

DQN 알고리즘은 다음과 같은 과정을 거쳐 학습합니다:

  1. 신경망 초기화: Q 값을 추정하는 메인 네트워크와 목표 Q 값을 계산하는 타겟 네트워크를 초기화합니다.
  2. 환경 초기화: CartPole 환경을 초기화합니다.
  3. 행동 선택: ε-greedy 정책을 사용하여 행동을 선택합니다.
  4. 행동 실행: 선택한 행동을 환경에 적용하고, 다음 상태와 보상을 얻습니다.
  5. 경험 저장: 현재 상태, 행동, 보상, 다음 상태, 종료 여부를 리플레이 메모리에 저장합니다.
  6. 학습: 일정 주기마다 리플레이 메모리에서 무작위로 샘플링하여 미니 배치를 구성하고, 신경망을 업데이트합니다.
  7. 타겟 네트워크 업데이트: 일정 주기마다 타겟 네트워크를 메인 네트워크의 가중치로 업데이트합니다.

 

1. 환경 및 네트워크 초기화

python
 
import gym
import numpy as np
import tensorflow as tf
from collections import deque
import random

# CartPole 환경 생성
env = gym.make('CartPole-v1')
state_size = env.observation_space.shape[0]
action_size = env.action_space.n

# Q 네트워크 정의
def build_model():
    model = tf.keras.models.Sequential([
        tf.keras.layers.Dense(24, input_dim=state_size, activation='relu'),
        tf.keras.layers.Dense(24, activation='relu'),
        tf.keras.layers.Dense(action_size, activation='linear')
    ])
    model.compile(loss='mse', optimizer=tf.keras.optimizers.Adam(learning_rate=0.001))
    return model

# 메인 네트워크와 타겟 네트워크 생성
model = build_model()
target_model = build_model()
target_model.set_weights(model.get_weights())

# 타겟 네트워크 업데이트 함수
def update_target_model():
    target_model.set_weights(model.get_weights())

# 리플레이 메모리 생성
memory = deque(maxlen=2000)

# 하이퍼파라미터 설정
gamma = 0.95
epsilon = 1.0
epsilon_min = 0.01
epsilon_decay = 0.995
batch_size = 32
train_start = 1000
 

2. 행동 선택 및 실행

python
 

# ε-greedy 정책에 따른 행동 선택
def get_action(state):
    if np.random.rand() <= epsilon:
        return random.randrange(action_size)
    q_values = model.predict(state)
    return np.argmax(q_values[0])

# 리플레이 메모리 저장
def replay():
    if len(memory) < train_start:
        return
    minibatch = random.sample(memory, batch_size)
    for state, action, reward, next_state, done in minibatch:
        target = reward
        if not done:
            target += gamma * np.amax(target_model.predict(next_state)[0])
        target_f = model.predict(state)
        target_f[0][action] = target
        model.fit(state, target_f, epochs=1, verbose=0)
    global epsilon
    if epsilon > epsilon_min:
        epsilon *= epsilon_decay

# 학습 주기
episodes = 1000
for e in range(episodes):
    state = env.reset()
    state = np.reshape(state, [1, state_size])
    for time in range(500):
        action = get_action(state)
        next_state, reward, done, _ = env.step(action)
        next_state = np.reshape(next_state, [1, state_size])
        if done:
            reward = -100
        memory.append((state, action, reward, next_state, done))
        state = next_state
        if done:
            print(f"episode: {e}/{episodes}, score: {time}, epsilon: {epsilon:.2}")
            break
        replay()
    if e % 10 == 0:
        update_target_model()

 

3. 결과 평가 및 개선

평가

DQN 알고리즘을 사용하여 CartPole 환경에서 학습한 결과, 에이전트는 막대를 안정적으로 세울 수 있는 정책을 학습합니다. 학습이 진행됨에 따라 에피소드 당 점수가 점차 증가하며, 일정 수준 이상으로 학습이 완료되면 거의 모든 에피소드에서 높은 점수를 기록하게 됩니다.

개선

DQN 알고리즘은 몇 가지 한계를 가지고 있습니다. Q 값이 과대평가되는 문제(Overestimation Bias)와 중요한 경험을 더 자주 학습하지 못하는 문제 등이 있습니다. 이를 개선하기 위해 다음과 같은 방법을 사용할 수 있습니다:

  1. Double DQN: 행동 선택과 가치 추정을 다른 네트워크로 분리하여 Q 값의 과대평가 문제를 완화합니다.
  2. Prioritized Experience Replay: 중요한 경험을 더 자주 학습하도록 메모리를 우선순위 큐로 관리합니다.
  3. Dueling DQN: 상태-가치 함수와 상태-행동 가치 함수를 분리하여 더 안정적인 학습을 제공합니다.

 

4. 구현 예제 코드

python
 

import gym
import numpy as np
import tensorflow as tf
from collections import deque
import random

# CartPole 환경 생성
env = gym.make('CartPole-v1')
state_size = env.observation_space.shape[0]
action_size = env.action_space.n

# Q 네트워크 정의
def build_model():
    model = tf.keras.models.Sequential([
        tf.keras.layers.Dense(24, input_dim=state_size, activation='relu'),
        tf.keras.layers.Dense(24, activation='relu'),
        tf.keras.layers.Dense(action_size, activation='linear')
    ])
    model.compile(loss='mse', optimizer=tf.keras.optimizers.Adam(learning_rate=0.001))
    return model

# 메인 네트워크와 타겟 네트워크 생성
model = build_model()
target_model = build_model()
target_model.set_weights(model.get_weights())

# 타겟 네트워크 업데이트 함수
def update_target_model():
    target_model.set_weights(model.get_weights())

# 리플레이 메모리 생성
memory = deque(maxlen=2000)

# 하이퍼파라미터 설정
gamma = 0.95
epsilon = 1.0
epsilon_min = 0.01
epsilon_decay = 0.995
batch_size = 32
train_start = 1000

# ε-greedy 정책에 따른 행동 선택
def get_action(state):
    if np.random.rand() <= epsilon:
        return random.randrange(action_size)
    q_values = model.predict(state)
    return np.argmax(q_values[0])

# 리플레이 메모리 저장
def replay():
    if len(memory) < train_start:
        return
    minibatch = random.sample(memory, batch_size)
    for state, action, reward, next_state, done in minibatch:
        target = reward
        if not done:
            target += gamma * np.amax(target_model.predict(next_state)[0])
        target_f = model.predict(state)
        target_f[0][action] = target
        model.fit(state, target_f, epochs=1, verbose=0)
    global epsilon
    if epsilon > epsilon_min:
        epsilon *= epsilon_decay

# 학습 주기
episodes = 1000
for e in range(episodes):
    state = env.reset()
    state = np.reshape(state, [1, state_size])
    for time in range(500):
        action = get_action(state)
        next_state, reward, done, _ = env.step(action)
        next_state = np.reshape(next_state, [1, state_size])
        if done:
            reward = -100
        memory.append((state, action, reward, next_state, done))
        state = next_state
        if done:
            print(f"episode: {e}/{episodes}, score: {time}, epsilon: {epsilon:.2}")
            break
        replay()
    if e % 10 == 0:
        update_target_model()

 

결론

이번 포스팅에서는 DQN 알고리즘을 구현하고, CartPole 환경에서 학습시키는 과정을 살펴보았습니다. DQN은 Experience Replay와 타겟 네트워크를 통해 학습의 안정성과 효율성을 높이며, 다양한 강화 학습 문제에 적용할 수 있는 강력한 도구입니다. 다음 시간에는 DQN 알고리즘의 개선된 버전인 Double DQN과 Dueling DQN을 구현하고 비교해보겠습니다.

 

태그: DQN, 강화 학습, 신경망, Experience Replay, 타겟 네트워크, 자율 주행, 로보틱스, 게임 인공지능, Atari, 딥러닝

반응형

댓글