1.1 강화학습이란?
강화학습(Reinforcement Learning, RL)은 에이전트가 환경과 상호작용하며 의사결정을 학습하는 머신러닝의 한 분야입니다. 지도학습처럼 레이블된 데이터에 의존하거나 비지도학습처럼 패턴을 찾는 것이 아니라, 시행착오를 통해 학습하며 보상이나 벌칙 형태의 피드백을 받습니다.
강화학습은 무엇을 할지 학습하는 것입니다. 상황을 행동에 매핑하여 수치적 보상 신호를 최대화합니다. 학습자는 어떤 행동을 취해야 하는지 직접 알려주지 않고, 시도해보며 가장 많은 보상을 주는 행동을 발견해야 합니다.
강화학습의 세 가지 핵심 요소
- 에이전트(Agent): 학습자 또는 의사결정자
- 환경(Environment): 에이전트가 상호작용하는 세계
- 보상(Reward): 학습을 유도하는 피드백 신호
시간 t에서:
1. 에이전트가 상태 sₜ 관찰
2. 행동 aₜ 선택 및 실행
3. 보상 rₜ₊₁ 수신
4. 새로운 상태 sₜ₊₁ 관찰
1.2 강화학습 문제
강화학습의 목표는 시간에 따른 기대 누적 보상을 최대화하는 최적 정책 π*를 찾는 것입니다:
Gₜ = Rₜ₊₁ + γRₜ₊₂ + γ²Rₜ₊₃ + ... = Σ γᵏRₜ₊ₖ₊₁
where:
- Gₜ: 시간 t부터의 수익(return)
- γ: 할인 계수 (0 ≤ γ ≤ 1)
- Rₜ: 시간 t의 보상
할인 계수 γ의 역할
- γ = 0: 근시안적 에이전트, 즉각적인 보상만 고려
- γ → 1: 원시안적 에이전트, 미래 보상을 현재와 거의 동등하게 평가
- γ = 0.9: 일반적인 선택, 즉각적 보상과 미래 보상의 균형
1.3 탐색 vs 활용 딜레마
강화학습의 가장 근본적인 딜레마는 탐색-활용 트레이드오프입니다:
- 활용(Exploitation): 과거에 잘 작동한 행동 선택하여 즉각적인 보상 최대화
- 탐색(Exploration): 새로운 행동 시도하여 잠재적으로 더 나은 전략 발견
많은 보상을 얻으려면 과거에 효과적이었던 행동을 선호해야 합니다(활용). 하지만 그러한 행동을 발견하려면 이전에 선택하지 않은 행동을 시도해야 합니다(탐색).
엡실론-탐욕 전략
def epsilon_greedy(Q, state, epsilon=0.1):
if random() < epsilon:
return random_action() # 탐색
else:
return argmax(Q[state]) # 활용
1.4 강화학습 vs 다른 머신러닝 패러다임
| 측면 | 지도학습 | 강화학습 |
|---|---|---|
| 학습 신호 | 정확한 레이블 제공 | 보상 신호 (평가적) |
| 피드백 | 지시적 (무엇이 정답인지) | 평가적 (얼마나 좋은지) |
| 데이터 수집 | 정적 데이터셋 | 상호작용으로 데이터 수집 |
| 목표 | 예측 오류 최소화 | 누적 보상 최대화 |
| 시간적 측면 | 독립적 샘플 | 순차적 의사결정 |
1.5 실제 응용 사례
게임 플레이
- 바둑(AlphaGo, 2016): 딥 강화학습과 몬테카를로 트리 탐색으로 세계 챔피언 격파
- 스타크래프트 II(AlphaStar, 2019): 복잡한 다중 에이전트 전략 게임 마스터
- Atari 게임(DQN, 2013): 픽셀에서 게임 플레이 학습
로보틱스
// 로봇 제어 예제
class RobotAgent:
def act(self, observation):
# 관찰: 관절 각도, 속도, 촉각 피드백
state = self.process_sensors(observation)
# 출력: 모터 명령
action = self.policy(state)
return action
자율주행
- 차선 유지 및 추종
- 합류 및 추월 결정
- 주차
- 다른 차량 및 보행자와의 상호작용
금융
- 트레이딩: 알고리즘 매매 전략
- 포트폴리오 관리: 자산 배분 최적화
- 리스크 관리: 동적 헤징 전략
1.6 첫 번째 강화학습 에이전트
import numpy as np
import gym
# 환경 생성
env = gym.make('FrozenLake-v1')
# Q-테이블 초기화
Q = np.zeros([env.observation_space.n, env.action_space.n])
# 하이퍼파라미터
alpha = 0.1 # 학습률
gamma = 0.99 # 할인 계수
epsilon = 0.1 # 탐색 비율
episodes = 10000
# 학습 루프
for episode in range(episodes):
state = env.reset()
done = False
while not done:
# 엡실론-탐욕 행동 선택
if np.random.random() < epsilon:
action = env.action_space.sample() # 탐색
else:
action = np.argmax(Q[state]) # 활용
# 행동 실행
next_state, reward, done, _ = env.step(action)
# Q-러닝 업데이트
Q[state, action] = Q[state, action] + alpha * (
reward + gamma * np.max(Q[next_state]) - Q[state, action]
)
state = next_state
print("학습 완료!")
1.7 강화학습의 과제
샘플 효율성
강화학습은 효과적인 정책을 학습하기 위해 수백만 번의 상호작용이 필요한 경우가 많습니다. 다음과 같은 경우 문제가 됩니다:
- 실제 상호작용이 비용이 많이 드는 경우 (로보틱스)
- 안전이 중요한 경우 (자율주행, 의료)
- 환경 상호작용이 느린 경우 (물리적 시스템)
신용 할당 문제
보상을 받았을 때, 어떤 과거 행동이 책임이 있는가? 다음과 같은 경우 어렵습니다:
- 보상이 희박한 경우 (에피소드 끝에만)
- 지연이 긴 경우 (행동 → 보상 시차)
- 여러 에이전트가 관여된 경우
1.8 강화학습 라이브러리
주요 라이브러리
| 라이브러리 | 설명 | 최적 사용처 |
|---|---|---|
| OpenAI Gym | 표준 환경 인터페이스 | 환경 개발 |
| Stable-Baselines3 | 신뢰할 수 있는 RL 알고리즘 구현 | 프로덕션 준비 에이전트 |
| Ray RLlib | 분산 RL at scale | 대규모 학습 |
1.9 앞으로의 여정
이 장에서는 강화학습의 기초를 소개했습니다. 다음 장에서는 더 깊이 파고들 것입니다:
- 제2장: 마르코프 결정 과정 - 수학적 기초
- 제3장: 가치 기반 방법 - Q-러닝과 DQN
- 제4장: 정책 경사 - 직접 정책 최적화
- 제5장: 액터-크리틱 - 가치와 정책 학습 결합
- 제6장: 모델 기반 RL - 모델로 학습하고 계획하기
- 제7장: 다중 에이전트 RL - 여러 에이전트 조율
- 제8장: 프로덕션 배포 - RL을 실제 애플리케이션으로 확장
요약
- 강화학습은 상호작용을 통해 누적 보상을 최대화하는 학습입니다
- 에이전트-환경 인터페이스: 상태, 행동, 보상
- 탐색-활용 딜레마는 강화학습의 근본적인 과제입니다
- 강화학습은 평가적이고 순차적인 특성에서 지도학습과 다릅니다
- 실제 응용 사례는 게임, 로보틱스, 금융, 의료 등을 포함합니다
- 주요 과제는 샘플 효율성, 신용 할당, 안정성을 포함합니다
- Gym과 Stable-Baselines3 같은 현대 도구로 강화학습이 접근 가능해졌습니다
- 할인 계수 γ는 즉각적 보상과 미래 보상의 균형을 맞춥니다
- 모델 프리와 모델 기반 접근법은 서로 다른 트레이드오프를 제공합니다
- 강화학습은 순차적 의사결정 문제에 특히 적합합니다
복습 문제
답변: 에이전트(학습자), 환경(에이전트가 상호작용하는 세계), 보상(피드백 신호)입니다.
답변: 활용은 즉각적인 보상을 최대화하기 위해 이전에 잘 작동한 행동을 선택하는 것을 의미합니다. 탐색은 잠재적으로 더 나은 전략을 발견하기 위해 새로운 행동을 시도하는 것입니다. 트레이드오프가 중요한 이유는 둘 다 필요하기 때문입니다: 보상을 얻기 위한 활용, 더 나은 행동을 찾기 위한 탐색.
답변: 할인 계수는 (1) 무한 수평선 문제를 수학적으로 다루기 쉽게 만들고, (2) 미래에 대한 불확실성 때문에 즉각적인 보상이 미래 보상보다 더 가치 있다는 아이디어를 나타냅니다.
답변: 강화학습은 지시적 피드백(정확한 행동이 무엇인지) 대신 평가적 피드백(행동이 얼마나 좋은지)을 사용합니다. 강화학습은 행동이 미래 상태에 영향을 미치는 순차적 결정을 다루는 반면, 지도학습은 일반적으로 독립적인 샘플을 가정합니다.