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 알고리즘은 다음과 같은 과정을 거쳐 학습합니다:
- 신경망 초기화: Q 값을 추정하는 메인 네트워크와 목표 Q 값을 계산하는 타겟 네트워크를 초기화합니다.
- 환경 초기화: CartPole 환경을 초기화합니다.
- 행동 선택: ε-greedy 정책을 사용하여 행동을 선택합니다.
- 행동 실행: 선택한 행동을 환경에 적용하고, 다음 상태와 보상을 얻습니다.
- 경험 저장: 현재 상태, 행동, 보상, 다음 상태, 종료 여부를 리플레이 메모리에 저장합니다.
- 학습: 일정 주기마다 리플레이 메모리에서 무작위로 샘플링하여 미니 배치를 구성하고, 신경망을 업데이트합니다.
- 타겟 네트워크 업데이트: 일정 주기마다 타겟 네트워크를 메인 네트워크의 가중치로 업데이트합니다.
1. 환경 및 네트워크 초기화
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. 행동 선택 및 실행
# ε-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)와 중요한 경험을 더 자주 학습하지 못하는 문제 등이 있습니다. 이를 개선하기 위해 다음과 같은 방법을 사용할 수 있습니다:
- Double DQN: 행동 선택과 가치 추정을 다른 네트워크로 분리하여 Q 값의 과대평가 문제를 완화합니다.
- Prioritized Experience Replay: 중요한 경험을 더 자주 학습하도록 메모리를 우선순위 큐로 관리합니다.
- Dueling DQN: 상태-가치 함수와 상태-행동 가치 함수를 분리하여 더 안정적인 학습을 제공합니다.
4. 구현 예제 코드
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, 딥러닝
'IT' 카테고리의 다른 글
내가 더 이상 GitHub Copilot을 사용하지 않는 이유 : (지극히 개인적이고 주관적인!) 의견 공유해봅니다. (0) | 2024.07.20 |
---|---|
Lecture 7: DQN (Deep Q-Network) 알고리즘과 강화 학습의 이해 (DeepMind Algorithm) (0) | 2024.07.20 |
구글의 천재 프로그래머 제프 딘 Jeff Dean (0) | 2024.07.19 |
일은 AI가 한대! 돈은 누가 벌래? 노코딩 자동화 툴 MAKE 완벽 튜토리얼 (0) | 2024.07.18 |
Lab 6-2: Q-Network를 활용한 카트폴 강화 학습 (0) | 2024.07.18 |
댓글