🤖 AI/ML

강화학습

Reinforcement Learning

에이전트가 환경과 상호작용하며 보상을 최대화하는 행동을 학습하는 ML 방식. AlphaGo, 로보틱스에서 활용.

📖 상세 설명

강화학습(Reinforcement Learning, RL)은 에이전트(Agent)가 환경(Environment)과 상호작용하며 보상(Reward)을 최대화하는 행동 정책을 학습하는 머신러닝 패러다임입니다. 지도학습과 달리 정답 레이블 없이, 시행착오를 통해 최적의 행동 전략을 스스로 발견합니다.

1950년대 동물 행동 심리학에서 영감을 받아 시작된 강화학습은 2013년 DeepMind의 DQN이 Atari 게임을 인간 수준으로 플레이하며 주목받았습니다. 2016년 AlphaGo가 바둑 세계 챔피언을 이기며 대중적으로 알려졌고, 이후 로보틱스, 자율주행, LLM 정렬(RLHF)까지 적용 범위가 확대되었습니다.

강화학습의 핵심 개념은 MDP(Markov Decision Process)입니다. 상태(State), 행동(Action), 보상(Reward), 전이확률(Transition Probability)로 구성되며, 에이전트는 상태에서 행동을 선택하고 보상을 받으며 다음 상태로 이동합니다. Q-Learning, Policy Gradient, Actor-Critic 등이 대표적인 알고리즘입니다.

최근에는 LLM의 인간 선호도 정렬에 RLHF(Reinforcement Learning from Human Feedback)가 핵심 기술로 사용됩니다. ChatGPT, Claude 등 주요 LLM들이 이 방식으로 학습되며, PPO(Proximal Policy Optimization) 알고리즘이 표준으로 자리잡았습니다.

💻 코드 예제

OpenAI Gym을 사용한 간단한 Q-Learning 예제입니다.

# pip install gymnasium numpy

import gymnasium as gym
import numpy as np

# CartPole 환경 생성
env = gym.make("CartPole-v1")

# Q-Table 초기화 (상태를 이산화하여 사용)
def discretize_state(state):
    bins = [
        np.linspace(-4.8, 4.8, 10),   # cart position
        np.linspace(-4, 4, 10),        # cart velocity
        np.linspace(-0.42, 0.42, 10),  # pole angle
        np.linspace(-4, 4, 10)         # pole velocity
    ]
    indices = []
    for i, val in enumerate(state):
        indices.append(np.digitize(val, bins[i]) - 1)
    return tuple(indices)

# Q-Table 초기화
q_table = np.zeros((10, 10, 10, 10, env.action_space.n))

# 하이퍼파라미터
learning_rate = 0.1
discount_factor = 0.99
epsilon = 1.0
epsilon_decay = 0.995

# 학습 루프
for episode in range(1000):
    state, _ = env.reset()
    state = discretize_state(state)
    total_reward = 0

    while True:
        # Epsilon-greedy 행동 선택
        if np.random.random() < epsilon:
            action = env.action_space.sample()
        else:
            action = np.argmax(q_table[state])

        # 환경에서 행동 수행
        next_state, reward, terminated, truncated, _ = env.step(action)
        next_state = discretize_state(next_state)

        # Q-Value 업데이트 (벨만 방정식)
        best_next_q = np.max(q_table[next_state])
        q_table[state + (action,)] += learning_rate * (
            reward + discount_factor * best_next_q - q_table[state + (action,)]
        )

        state = next_state
        total_reward += reward

        if terminated or truncated:
            break

    epsilon *= epsilon_decay

    if episode % 100 == 0:
        print(f"Episode {episode}, Total Reward: {total_reward:.0f}")

env.close()

🗣️ 실무에서 이렇게 말하세요

💬 회의에서

"추천 시스템을 강화학습으로 바꾸면 사용자 피드백을 실시간으로 반영할 수 있어요. 클릭률을 보상 함수로 설계하면 됩니다."

💬 면접에서

"RLHF로 챗봇을 학습시킬 때 PPO를 사용했습니다. KL divergence 페널티를 추가해서 기존 모델과 너무 멀어지지 않도록 조절했어요."

💬 기술 토론에서

"DQN의 experience replay와 target network 분리가 학습 안정성에 핵심이에요. 그게 없으면 catastrophic forgetting 문제가 심각합니다."

⚠️ 흔한 실수 & 주의사항

보상 함수 설계 실수 (Reward Hacking)

에이전트가 의도치 않은 방식으로 보상을 극대화하는 경우가 많습니다. "죽지 않기"만 보상으로 주면 아무것도 안 하고 가만히 있을 수 있어요.

샘플 효율성 무시

강화학습은 대량의 시뮬레이션이 필요합니다. 실제 로봇에 바로 적용하면 학습 비용이 엄청나게 높아집니다.

올바른 방법

시뮬레이터에서 충분히 학습 후 sim-to-real 전이를 시도하세요. 보상 함수는 sparse reward보다 적절한 shaping을 통해 학습 효율을 높이세요.

🔗 관련 용어

📚 더 배우기