21. 함수 근사를 통한 대규모 상태 공간 처리, 신경망을 이용한 Q-함수 및 정책 근사

강화학습(Reinforcement Learning, RL)은 에이전트가 환경과 상호작용하며 최적의 행동 정책을 학습해 나가는 과정을 다룬다. 하지만, 많은 실제 문제들은 대규모 상태 공간을 처리해야 하며, 이로 인해 전통적인 강화학습 알고리즘의 적용이 어렵다. 이러한 문제를 해결하기 위해 함수 근사(Function Approximation) 기법이 도입되었다. 본 강좌에서는 신경망을 활용한 Q-함수 및 정책 근사에 대해 자세히 설명하겠다.

1. 함수 근사란?

함수 근사는 비선형 또는 고차원 함수의 근사를 통해 상태 또는 행동의 가치를 추정하는 기법이다. 강화학습의 맥락에서, 에이전트는 상태와 행동의 가치를 평가하기 위해 해당 함수의 근사를 필요로 한다. 특정 상태에서 좋은 행동을 선택하기 위해서는 해당 상태의 가치를 예측하고, 이를 통해 최적 정책(optimal policy)을 도출해야 한다.

1.1. Q-함수 근사

Q-함수는 주어진 상태와 행동에 대한 가치를 나타내며, 에이전트가 특정 상태에서 특정 행동을 선택했을 때, 앞으로 받을 보상의 기대값을 계산한다. 고차원 상태 공간에서는 Q-함수를 정확하게 저장하기 힘들기 때문에 함수 근사를 사용하여 Q-함수를 근사할 수 있다.

예제: Q-함수 근사

다음은 간단한 Q-함수 근사를 구현한 예제이다:


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

class DQNAgent:
    def __init__(self, state_size, action_size):
        self.state_size = state_size
        self.action_size = action_size
        self.memory = deque(maxlen=2000)
        self.gamma = 0.95    # 할인 인자
        self.epsilon = 1.0    # 탐사 확률
        self.epsilon_min = 0.01
        self.epsilon_decay = 0.995
        self.model = self._build_model()
        
    def _build_model(self):
        # 신경망 모델 정의
        model = keras.Sequential()
        model.add(keras.layers.Dense(24, input_dim=self.state_size, activation='relu'))
        model.add(keras.layers.Dense(24, activation='relu'))
        model.add(keras.layers.Dense(self.action_size, activation='linear'))
        model.compile(loss='mse', optimizer=keras.optimizers.Adam(lr=0.001))
        return model
    
    def remember(self, state, action, reward, next_state, done):
        self.memory.append((state, action, reward, next_state, done))

    def act(self, state):
        if np.random.rand() <= self.epsilon:
            return random.randrange(self.action_size)  # 탐사
        act_values = self.model.predict(state)  # Q-값 예측
        return np.argmax(act_values[0])  # 최적 행동 반환

    def replay(self, batch_size):
        minibatch = random.sample(self.memory, batch_size)
        for state, action, reward, next_state, done in minibatch:
            target = reward
            if not done:
                target += self.gamma * np.amax(self.model.predict(next_state)[0])  # 다음 상태의 최대 Q-값
            target_f = self.model.predict(state)
            target_f[0][action] = target
            self.model.fit(state, target_f, epochs=1, verbose=0)
        if self.epsilon > self.epsilon_min:
            self.epsilon *= self.epsilon_decay

# 환경 및 에이전트 설정 (예: OpenAI Gym)
# ...

1.2. 정책 근사

정책 근사는 에이전트가 특정 상태에서 어떤 행동을 선택할지를 결정하는 함수로, 일반적으로 신경망으로 구현될 수 있다. 정책이 직접적으로 업데이트되므로, Q-값을 사용하는 메시당 방법보다 더 자연스럽고 효율적으로 최적 정책을 학습할 수 있다.

예제: 정책 근사

다음은 정책 근사를 구현한 간단한 경우이다:


class PolicyAgent:
    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 = keras.Sequential()
        model.add(keras.layers.Dense(24, input_dim=self.state_size, activation='relu'))
        model.add(keras.layers.Dense(24, activation='relu'))
        model.add(keras.layers.Dense(self.action_size, activation='softmax'))  # 확률적 행동 선택
        model.compile(loss='categorical_crossentropy', optimizer=keras.optimizers.Adam(lr=0.001))
        return model

    def act(self, state):
        action_probabilities = self.model.predict(state)  # 상태에 대한 행동 확률 예측
        return np.random.choice(self.action_size, p=action_probabilities[0])  # 확률적으로 행동 선택

    def train(self, states, actions, target):
        self.model.fit(states, target, epochs=1, verbose=0)

# 정책 에이전트 사용 예
# ...

2. 대규모 상태 공간 문제

대규모 상태 공간 처리에서의 주요 과제는 ‘치수 저주(curse of dimensionality)’이며, 이는 각 상태와 행동 조합에 대한 Q-값이나 정책을 직접적으로 저장하는 것이 불가능하게 만든다. 함수 근사 기법은 이러한 문제를 해결하는 데 매우 효과적이다.

신경망을 사용한 함수 근사는 다양한 이점이 있다. 첫째, 대규모 데이터에 대해 최적화가 가능하다. 둘째, 비선형 관계를 자연스럽게 모델링 할 수 있다. 마지막으로, 정책이나 가치 함수의 일반화가 가능하며, 이는 새로운 상태에 대한 예측을 향상시킨다.

2.1. 신경망의 구조

신경망의 구조는 문제에 따라 다르게 설정될 수 있으며, 일반적으로 입력층에는 상태 벡터가 들어가고, 출력층에는 행동의 값(Q-함수인 경우) 또는 행동의 확률(정책인 경우)이 출력된다. 중간층의 수와 뉴런의 수는 문제의 복잡도에 따라 조절되어야 한다.

2.2. 경험 재생(Experience Replay)

경험 재생은 에이전트가 과거의 경험을 반복적으로 학습하는 방법으로, 이 기법은 신경망을 사용할 때 더욱 중요한 역할을 한다. 경험을 저장하고 랜덤 샘플링하여 학습하는 방식은 데이터의 상관성을 줄이고, 학습 안정성을 증가시킨다.

3. 결론

함수 근사를 통한 Q-함수 및 정책 근사는 대규모 상태 공간에서 효과적으로 작동하는 강화학습의 핵심 요소이다. 신경망을 통해 비선형 함수 근사를 실행함으로써 더욱 복잡한 환경에서도 에이전트가 성공적으로 동작할 수 있도록 돕는다. 본 강좌에서 설명한 예제 코드를 활용하여 다양한 환경에서 강화학습의 기초를 다져보시기 바란다.

4. 참고 문헌

  • Sutton, R. S., & Barto, A. G. (2018). Reinforcement Learning: An Introduction. MIT Press.
  • Silver, D., & Odena, A. (2016). Neural Network-based function approximation in reinforcement learning.
  • OpenAI Gym: A toolkit for developing and comparing reinforcement learning algorithms.