강화학습

강화 학습: 강화 학습에서의 보상 형성 (Reward Shaping)

move84 2025. 4. 6. 09:56
반응형

강화 학습(Reinforcement Learning, RL)은 에이전트가 환경과 상호 작용하며 학습하는 머신 러닝의 한 분야입니다. 에이전트는 환경으로부터 보상(Reward)을 받으며, 이 보상을 최대화하는 방향으로 행동을 학습합니다. 그런데, 복잡한 환경에서는 에이전트가 원하는 목표에 도달하기까지 많은 시간과 시행착오가 필요할 수 있습니다. 이러한 학습 과정을 가속화하고, 에이전트의 성능을 향상시키기 위해 보상 형성(Reward Shaping)이라는 기법이 사용됩니다. 보상 형성이란, 에이전트가 특정 행동을 하거나, 특정 상태에 도달했을 때 추가적인 보상을 제공하여 학습을 유도하는 방법입니다. 이 글에서는 보상 형성의 개념, 장단점, 그리고 실제 구현 예시를 자세히 살펴보겠습니다.

🚀 보상 형성의 개념 (Concept of Reward Shaping)

보상 형성이란, 에이전트가 학습하는 동안 환경으로부터 받는 보상 외에, 추가적인 보상을 부여하는 기법입니다. 기본적으로 강화 학습의 목표는 에이전트가 누적 보상을 최대화하는 것입니다. 보상 형성은 이러한 목표를 달성하기 위해 에이전트의 행동을 유도하는 역할을 합니다. 즉, 에이전트가 좋은 행동을 할 때 긍정적인 보상을 주고, 나쁜 행동을 할 때는 부정적인 보상을 줍니다. 이렇게 함으로써 에이전트는 원하는 방향으로 학습을 더 빠르게 진행할 수 있습니다. 핵심은, 보상 형성은 에이전트의 학습을 돕는 '보조적인' 수단이라는 것입니다. 원칙적으로 환경의 보상 구조를 변경하는 것은 아닙니다.

보상 형성은 크게 두 가지 종류로 나눌 수 있습니다:

  1. 수동 보상 형성 (Manual Reward Shaping): 사람이 직접 보상 함수를 설계하고, 에이전트에게 추가적인 보상을 부여하는 방식입니다. 예를 들어, 미로 찾기 문제에서 에이전트가 출구에 가까워질수록 더 많은 보상을 주는 경우가 있습니다. 수동 보상 형성은 직관적이고 구현하기 쉽지만, 보상을 잘못 설계하면 에이전트의 학습을 방해할 수 있다는 단점이 있습니다.
  2. 자동 보상 형성 (Automatic Reward Shaping): 특정 규칙이나 알고리즘에 따라 자동으로 보상을 형성하는 방식입니다. 대표적인 예로, 잠재 기반 보상 형성(Potential-Based Reward Shaping)이 있습니다. 잠재 기반 보상 형성은 특정 상태에서 다른 상태로 이동할 때 잠재 함수의 차이만큼 보상을 주는 방식입니다. 이 방식은 수동 보상 형성에 비해 안전하고, 에이전트의 학습을 안정적으로 유도할 수 있다는 장점이 있습니다.

💻 보상 형성의 장점 (Advantages of Reward Shaping)

보상 형성은 강화 학습에서 여러 가지 장점을 제공합니다.

  • 학습 속도 향상 (Improved Learning Speed): 보상 형성은 에이전트가 유용한 행동을 더 자주 하도록 유도하여 학습 속도를 가속화합니다. 특히, 희소 보상(sparse reward) 환경에서 효과적인데, 희소 보상이란 에이전트가 특정 목표에 도달했을 때만 보상을 받는 환경을 의미합니다. 이러한 환경에서는 에이전트가 보상을 받기까지 많은 시행착오를 겪어야 하므로 학습이 매우 느립니다. 보상 형성을 통해 에이전트가 목표에 더 빨리 접근하도록 유도할 수 있습니다.
  • 탐색 효율성 증대 (Enhanced Exploration Efficiency): 보상 형성은 에이전트가 탐색해야 할 공간을 줄여줍니다. 예를 들어, 미로 찾기 문제에서 보상 형성을 사용하면 에이전트가 막다른 길을 탐색하는 시간을 줄이고, 출구로 가는 길을 더 효율적으로 찾도록 유도할 수 있습니다.
  • 성능 향상 (Performance Improvement): 보상 형성은 에이전트가 특정 목표를 달성하는 데 필요한 행동을 더 잘 배우도록 도와줍니다. 이는 최종적인 에이전트의 성능 향상으로 이어집니다.

💡 보상 형성의 단점 (Disadvantages of Reward Shaping)

보상 형성은 여러 장점을 가지고 있지만, 몇 가지 단점도 존재합니다.

  • 보상 설계의 어려움 (Difficulty in Reward Design): 보상 형성을 효과적으로 사용하기 위해서는 적절한 보상 함수를 설계해야 합니다. 보상을 잘못 설계하면 에이전트가 잘못된 방향으로 학습하거나, 목표를 달성하지 못할 수 있습니다. 예를 들어, 미로 찾기 문제에서 에이전트가 벽에 가까워질 때 보상을 주면, 에이전트는 벽을 따라가는 이상한 행동을 학습할 수 있습니다.
  • 편향된 학습 (Biased Learning): 보상 형성은 에이전트의 학습을 특정 방향으로 유도하므로, 에이전트가 최적의 정책을 찾지 못할 수 있습니다. 이는 보상 형성이 에이전트의 탐색 공간을 제한하기 때문입니다.
  • 부정적 영향 (Negative Impact): 잘못된 보상 형성은 에이전트의 성능을 저하시키거나, 학습을 아예 불가능하게 만들 수 있습니다. 예를 들어, 보상 함수의 불일치로 인해 에이전트가 루프에 갇히거나, 목표를 영원히 달성하지 못할 수 있습니다.

📚 잠재 기반 보상 형성 (Potential-Based Reward Shaping)

잠재 기반 보상 형성은 보상 형성의 한 가지 방법으로, 안전하고 효과적인 보상 형성을 제공합니다. 잠재 기반 보상 형성의 핵심 아이디어는 '잠재 함수(potential function)'를 사용하여 보상을 형성하는 것입니다. 잠재 함수는 각 상태(state)에 특정 값을 할당하는 함수입니다. 에이전트가 상태를 이동할 때, 잠재 함수의 차이만큼 보상을 받습니다. 즉, 상태 s에서 상태 s'로 이동할 때, 받는 보상은 다음과 같습니다:

R'(s, a, s') = R(s, a, s') + γ * φ(s') - φ(s)

여기서:

  • R'(s, a, s') : 새롭게 형성된 보상
  • R(s, a, s') : 원래 환경에서 주어지는 보상
  • φ(s) : 상태 s의 잠재 함수 값
  • γ : 할인율 (discount factor)

잠재 기반 보상 형성은 다음과 같은 중요한 특징을 가지고 있습니다:

  • 최적 정책 불변성 (Optimal Policy Invariance): 잠재 기반 보상 형성은 에이전트의 최적 정책을 변경하지 않습니다. 즉, 잠재 기반 보상 형성을 사용하더라도, 에이전트는 여전히 원래의 목표를 달성하기 위한 최적의 행동을 학습합니다.
  • 안전성 (Safety): 잠재 기반 보상 형성은 에이전트의 학습을 안정적으로 유도하며, 잘못된 보상 설계로 인한 문제를 방지합니다.

📋 Python 코드 예시 (Python Code Example)

다음은 간단한 미로 찾기 문제에 잠재 기반 보상 형성을 적용하는 Python 코드 예시입니다. 이 예시에서는 간단한 그리드 월드(grid world)를 사용하고, 에이전트가 출구에 도달하면 1점의 보상을 받도록 설정합니다. 또한, 잠재 함수를 사용하여 출구에 가까워질수록 추가적인 보상을 줍니다.

import numpy as np

# 그리드 월드 정의 (Grid World Definition)
GRID_SIZE = 5
GOAL = (GRID_SIZE - 1, GRID_SIZE - 1)  # 목표 지점 (Goal)

# 잠재 함수 (Potential Function)
def potential_function(state):
    """상태와 목표 지점 사이의 거리를 기반으로 잠재 값을 계산합니다."""
    return -np.sqrt((state[0] - GOAL[0])**2 + (state[1] - GOAL[1])**2)  # 유클리드 거리 (Euclidean distance)

# 환경 (Environment)
class GridWorld:
    def __init__(self):
        self.state = (0, 0)

    def reset(self):
        self.state = (0, 0)
        return self.state

    def step(self, action):
        x, y = self.state
        if action == 0:  # up
            y = max(0, y - 1)
        elif action == 1:  # down
            y = min(GRID_SIZE - 1, y + 1)
        elif action == 2:  # left
            x = max(0, x - 1)
        elif action == 3:  # right
            x = min(GRID_SIZE - 1, x + 1)
        self.state = (x, y)

        reward = 0
        done = False
        if self.state == GOAL:
            reward = 1
            done = True
        return self.state, reward, done


# 잠재 기반 보상 형성 (Potential-Based Reward Shaping)
def shaped_reward(state, action, next_state, reward, gamma=0.9):
    """잠재 기반 보상으로 변경된 보상을 계산합니다."""
    return reward + gamma * potential_function(next_state) - potential_function(state)

# 에이전트 (Agent)
class Agent:
    def __init__(self, env):
        self.env = env
        self.q_table = np.zeros((GRID_SIZE, GRID_SIZE, 4))  # Q-table 초기화 (Q-table initialization)
        self.alpha = 0.1  # 학습률 (learning rate)
        self.epsilon = 0.1  # 탐험 확률 (exploration probability)

    def choose_action(self, state):
        if np.random.uniform(0, 1) < self.epsilon:
            return np.random.choice(4)  # 무작위 행동 (random action)
        else:
            return np.argmax(self.q_table[state[0], state[1]])  # 탐욕적 행동 (greedy action)

    def learn(self, state, action, reward, next_state, done):
        q_value = self.q_table[state[0], state[1], action]
        next_max_q = np.max(self.q_table[next_state[0], next_state[1]])
        new_q_value = q_value + self.alpha * (reward + gamma * next_max_q - q_value)
        self.q_table[state[0], state[1], action] = new_q_value

# 학습 (Training)
if __name__ == '__main__':
    env = GridWorld()
    agent = Agent(env)
    gamma = 0.9 # 할인율 (discount factor)
    num_episodes = 1000 # 에피소드 수 (number of episodes)

    for episode in range(num_episodes):
        state = env.reset()
        done = False

        while not done:
            action = agent.choose_action(state)
            next_state, reward, done = env.step(action)
            # 보상 형성을 적용 (Apply Reward Shaping)
            shaped_r = shaped_reward(state, action, next_state, reward, gamma)
            agent.learn(state, action, shaped_r, next_state, done)
            state = next_state

    # 학습된 Q-table 출력 (Print the trained Q-table)
    print("Q-table:")
    print(agent.q_table.round(2))

이 코드는 간단한 GridWorld 환경에서 Q-learning 알고리즘을 사용하여 학습합니다. potential_function을 사용하여 잠재 함수를 정의하고, shaped_reward 함수를 사용하여 보상을 형성합니다. 에이전트는 학습 과정에서 잠재 기반 보상을 사용하여, 출구에 더 빠르게 도달하도록 학습됩니다.

🔖 핵심 용어 정리 (Key Term Summary)

  • 강화 학습 (Reinforcement Learning, RL): 에이전트가 환경과 상호 작용하며 보상을 최대화하는 방향으로 학습하는 머신 러닝의 한 분야입니다.
  • 보상 (Reward): 환경으로부터 에이전트가 받는 신호로, 에이전트의 행동을 평가하는 데 사용됩니다.
  • 보상 형성 (Reward Shaping): 에이전트의 학습을 가속화하기 위해 추가적인 보상을 부여하는 기법입니다.
  • 수동 보상 형성 (Manual Reward Shaping): 사람이 직접 보상 함수를 설계하고 보상을 부여하는 방식입니다.
  • 자동 보상 형성 (Automatic Reward Shaping): 특정 규칙이나 알고리즘에 따라 자동으로 보상을 형성하는 방식입니다.
  • 잠재 기반 보상 형성 (Potential-Based Reward Shaping): 잠재 함수를 사용하여 보상을 형성하는 방식입니다.
  • 상태 (State): 환경의 특정 시점의 상황을 나타냅니다.
  • 정책 (Policy): 특정 상태에서 에이전트가 어떤 행동을 할지 결정하는 규칙입니다.
  • Q-table: 상태-행동 쌍에 대한 가치를 저장하는 테이블입니다.
  • 탐험 (Exploration): 에이전트가 새로운 행동을 시도하여 환경을 탐색하는 과정입니다.
  • 탐욕 (Exploitation): 에이전트가 현재까지 가장 좋은 행동을 선택하는 과정입니다.

보상 형성은 강화 학습에서 에이전트의 학습을 돕는 유용한 기법입니다. 특히, 복잡한 환경이나 희소 보상 환경에서 그 효과가 큽니다. 하지만, 보상 설계에 신중해야 하며, 잠재 기반 보상 형성과 같은 안전한 방법을 사용하는 것이 좋습니다. 보상 형성을 적절하게 활용하면, 강화 학습 모델의 성능을 향상시키고, 더 빠르게 원하는 목표를 달성할 수 있습니다.

반응형