Lab 6-2: Q-Network를 활용한 카트폴 강화 학습
지난 강의에서는 Q-Network를 사용하여 프로즌 레이크 환경에서 강화 학습을 수행했습니다. 이번에는 더 재미있는 환경인 카트폴(CartPole)을 이용하여 Q-Network를 적용해 보겠습니다. 카트폴은 막대기(cart)의 균형을 맞추는 게임으로, 이 환경을 통해 강화 학습의 실제 적용 예를 배울 수 있습니다.
https://www.youtube.com/watch?v=MF_Wllw9VKk
카트폴 환경 소개
카트폴 환경은 카트 위에 막대기를 세우고, 이를 왼쪽 또는 오른쪽으로 움직여 균형을 유지하는 게임입니다. 목표는 막대기가 넘어지지 않도록 최대한 오래 유지하는 것입니다. 이 환경은 OpenAI의 Gym 라이브러리에서 제공되며, 강화 학습 알고리즘을 테스트하는 데 자주 사용됩니다.
(이미지를 입력하세요)
Q-Network를 이용한 카트폴 학습
카트폴 환경에서는 상태(state)가 실수(real number)로 주어집니다. 이러한 경우, Q-테이블을 사용하는 것이 비효율적이므로, Q-Network를 사용하여 상태와 행동을 매핑하는 함수를 학습합니다.
Q-Network의 기본 구조
Q-Network는 상태를 입력으로 받고, 각 행동에 대한 Q값을 출력합니다. 카트폴 환경에서는 상태가 4개의 실수 값으로 이루어져 있고, 가능한 행동은 왼쪽 또는 오른쪽으로 움직이는 두 가지입니다.
import numpy as np
import gym
# 환경 설정
env = gym.make('CartPole-v1')
state_size = env.observation_space.shape[0]
action_size = env.action_space.n
# Q-Network 구조 정의
class QNetwork:
def __init__(self, state_size, action_size):
self.state_size = state_size
self.action_size = action_size
self.model = self.build_model()
def build_model(self):
model = tf.keras.Sequential()
model.add(tf.keras.layers.Dense(24, input_dim=self.state_size, activation='relu'))
model.add(tf.keras.layers.Dense(24, activation='relu'))
model.add(tf.keras.layers.Dense(self.action_size, activation='linear'))
model.compile(loss='mse', optimizer=tf.keras.optimizers.Adam(learning_rate=0.001))
return model
def predict(self, state):
return self.model.predict(state)
def update(self, state, target):
self.model.fit(state, target, epochs=1, verbose=0)
q_network = QNetwork(state_size, action_size)
위 코드에서는 Q-Network를 정의하고, 이를 통해 상태를 입력받아 가능한 행동에 대한 Q값을 예측하는 모델을 생성합니다.
학습 알고리즘
Q-Network를 학습시키기 위해 ε-탐욕 정책을 사용합니다. ε-탐욕 정책은 탐험과 착취의 균형을 맞추기 위해 ε의 확률로 랜덤한 행동을 선택하고, 나머지 1-ε의 확률로 Q값이 최대인 행동을 선택합니다.
episodes = 1000
epsilon = 1.0
epsilon_decay = 0.995
epsilon_min = 0.01
gamma = 0.99
# 학습 루프
for episode in range(episodes):
state = env.reset()
state = np.reshape(state, [1, state_size])
done = False
time = 0
while not done:
# 행동 선택
if np.random.rand() < epsilon:
action = env.action_space.sample()
else:
q_values = q_network.predict(state)
action = np.argmax(q_values[0])
# 행동 수행 및 새로운 상태, 보상 수집
next_state, reward, done, _ = env.step(action)
next_state = np.reshape(next_state, [1, state_size])
# Q값 업데이트
target = q_network.predict(state)
if done:
target[0][action] = reward if time >= 199 else -100
else:
t = q_network.predict(next_state)
target[0][action] = reward + gamma * np.max(t)
q_network.update(state, target)
state = next_state
time += 1
# epsilon 감소
if epsilon > epsilon_min:
epsilon *= epsilon_decay
print(f"에피소드: {episode+1}/{episodes}, 점수: {time}, epsilon: {epsilon:.2f}")
위 코드에서는 ε-탐욕 정책을 사용하여 행동을 선택하고, 선택한 행동에 따른 보상을 수집한 후 Q-Network를 업데이트합니다. 또한, 학습이 진행될수록 epsilon 값을 감소시켜 탐험의 비율을 줄이고 착취의 비율을 높입니다.
학습 결과 평가
학습이 완료된 후, Q-Network를 사용하여 카트폴 환경에서 얼마나 잘 작동하는지 평가합니다. 이를 위해 학습된 Q-Network를 사용하여 100번의 에피소드를 실행하고, 성공한 횟수를 측정합니다.
for _ in range(100):
state = env.reset()
state = np.reshape(state, [1, state_size])
done = False
time = 0
while not done:
q_values = q_network.predict(state)
action = np.argmax(q_values[0])
next_state, reward, done, _ = env.step(action)
state = np.reshape(next_state, [1, state_size])
time += 1
if done:
if time >= 199:
successes += 1
break
print(f"성공률: {successes}%")
위 코드는 학습된 Q-Network를 사용하여 100번의 에피소드를 실행하고, 성공한 횟수를 측정합니다. 이를 통해 학습된 정책의 성능을 평가할 수 있습니다.
결론
이번 실습을 통해 Q-Network를 사용하여 카트폴 환경에서 강화 학습을 수행하는 방법을 배웠습니다. Q-Network를 사용하면 큰 상태 공간에서도 효과적으로 학습할 수 있으며, 복잡한 환경에서도 잘 작동합니다. 앞으로 Q-Network를 활용하여 다양한 응용 분야에 적용할 수 있기를 기대합니다.
태그: Q-Network, 강화학습, 딥러닝, Q-learning, 신경망, 머신러닝, Python, TensorFlow, ε-탐욕정책, 카트폴
'IT' 카테고리의 다른 글
구글의 천재 프로그래머 제프 딘 Jeff Dean (0) | 2024.07.19 |
---|---|
일은 AI가 한대! 돈은 누가 벌래? 노코딩 자동화 툴 MAKE 완벽 튜토리얼 (0) | 2024.07.18 |
Lab 6-1: Q-Network를 활용한 프로즌 레이크 강화 학습 (0) | 2024.07.18 |
Lecture 6: Q-Network를 활용한 강화 학습 (0) | 2024.07.18 |
Lab 05-1: 비결정론적 세계에서의 Q-learning 학습 (0) | 2024.07.18 |
댓글