본문 바로가기
IT

Lab 6-1: Q-Network를 활용한 프로즌 레이크 강화 학습

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

Lab 6-1: Q-Network를 활용한 프로즌 레이크 강화 학습

지난 강의에서 우리는 Q-테이블을 사용하여 Q-learning을 학습하는 방법을 배웠습니다. 그러나 Q-테이블은 큰 상태 공간을 다룰 때 비효율적이므로, 이번에는 Q-Network를 사용하여 강화 학습을 수행해 보겠습니다. 이를 위해 TensorFlow를 이용하여 Q-Network를 구현하고, 이를 프로즌 레이크 환경에 적용해 보겠습니다.

Q-Network 개요

Q-Network는 신경망을 사용하여 주어진 상태에서 가능한 모든 행동에 대한 Q값을 출력합니다. 이는 Q-테이블보다 훨씬 더 큰 상태 공간을 효율적으로 처리할 수 있게 해줍니다.

Q-Network의 기본 구조

Q-Network의 입력은 현재 상태이며, 출력은 가능한 모든 행동에 대한 Q값입니다. 이를 통해 주어진 상태에서 최적의 행동을 선택할 수 있습니다.

import tensorflow as tf
import numpy as np
import gym

# 환경 설정
env = gym.make('FrozenLake-v0', is_slippery=True)
state_size = env.observation_space.n
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의 입력은 원-핫 인코딩된 상태입니다. 원-핫 인코딩은 상태를 이진 벡터로 변환하여 신경망이 이를 처리할 수 있도록 합니다.

def one_hot_encode(state, state_size):
    return np.identity(state_size)[state:state + 1]
 

Q-Network 학습

이제 Q-Network를 학습시키는 방법을 알아보겠습니다. 학습 과정은 다음과 같습니다:

  1. 상태와 행동 선택: 현재 상태에서 ε-탐욕 정책을 사용하여 행동을 선택합니다.
  2. 행동 수행 및 보상 수집: 선택한 행동을 수행하고, 새로운 상태와 보상을 수집합니다.
  3. Q값 업데이트: 다음 상태에서의 최대 Q값을 사용하여 현재 Q값을 업데이트합니다.
python
 
# 학습 파라미터 설정
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 = one_hot_encode(state, state_size)
    done = False
    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 = one_hot_encode(next_state, state_size)

        # Q값 업데이트
        target = q_network.predict(state)
        if done:
            target[0][action] = reward
        else:
            t = q_network.predict(next_state)
            target[0][action] = reward + gamma * np.max(t)

        q_network.update(state, target)
        state = next_state

    # epsilon 감소
    if epsilon > epsilon_min:
        epsilon *= epsilon_decay

    if episode % 100 == 0:
        print(f"에피소드: {episode}, epsilon: {epsilon:.2f}")
 

위 코드에서는 ε-탐욕 정책을 사용하여 행동을 선택하고, 선택한 행동에 따른 보상을 수집한 후 Q-Network를 업데이트합니다. 또한, 학습이 진행될수록 epsilon 값을 감소시켜 탐험의 비율을 줄이고 착취의 비율을 높입니다.

 

실습 결과 분석

Q-Network를 사용한 학습 결과를 분석해보면, 초기에는 탐험 비율이 높아 학습 성능이 낮지만, 에피소드가 진행될수록 탐험 비율이 줄어들며 학습 성능이 향상됩니다. 이를 통해 Q-Network가 효과적으로 학습하고, 비결정론적 환경에서도 안정적으로 작동하는 것을 확인할 수 있습니다.

python
 
 
successes = 0
for _ in range(100):
    state = env.reset()
    state = one_hot_encode(state, state_size)
    done = False
    while not done:
        q_values = q_network.predict(state)
        action = np.argmax(q_values[0])
        next_state, reward, done, _ = env.step(action)
        state = one_hot_encode(next_state, state_size)
        if done and reward == 1:
            successes += 1

print(f"성공률: {successes}%")
 

위 코드는 학습된 Q-Network를 사용하여 100번의 에피소드를 실행하고, 성공률을 측정합니다. 이를 통해 학습된 정책의 성능을 평가할 수 있습니다.

 

결론

이번 실습을 통해 Q-Network를 사용하여 강화 학습을 수행하는 방법을 배웠습니다. Q-테이블의 한계를 극복하고, 더 복잡한 환경에서도 효과적으로 학습할 수 있는 Q-Network의 중요성을 이해하셨을 것입니다. 앞으로 Q-Network를 활용하여 다양한 응용 분야에 적용할 수 있기를 기대합니다.

 

태그: Q-Network, 강화학습, 딥러닝, Q-learning, 신경망, 머신러닝, Python, TensorFlow, ε-탐욕정책, 프로즌레이크

반응형

댓글