메인 콘텐츠로 건너뛰기

강화학습 공부 정리

요약

0. 실습 환경 설정

필요 사양

  • OS: Windows / macOS / Linux

  • Python: 3.9 이상 권장

  • GPU: 없어도 됨 (CPU로 충분, Atari는 GPU 있으면 빠름)

환경 구축 순서

# 1. 프로젝트 폴더 생성 및 이동
mkdir gym
cd gym

# 2. 가상환경 생성 및 활성화
python -m venv venv

# Windows
venvScriptsactivate

# macOS/Linux
source venv/bin/activate

# 3. 필수 패키지 설치
pip install gymnasium numpy matplotlib stable-baselines3

# 4. (선택) Atari 게임용 추가 설치
pip install "gymnasium[atari]" "gymnasium[accept-rom-license]"
pip install "stable-baselines3[extra]"

사용 라이브러리

라이브러리용도설명
gymnasium환경강화학습 환경 (CartPole, FrozenLake 등)
stable-baselines3알고리즘DQN, PPO 등 강화학습 알고리즘 구현체
numpy수치 계산배열 연산
matplotlib시각화그래프, 차트
torch딥러닝stable-baselines3 내부에서 사용 (자동 설치)

사용 환경 (Gymnasium)

환경 이름난이도입력출력학습 시간
FrozenLake-v1쉬움16칸 위치상하좌우 4개수 초
CartPole-v1쉬움숫자 4개좌우 2개수 분
LunarLander-v3중간숫자 8개4개10~30분
ALE/Breakout-v5어려움이미지 84x844개수 시간

폴더 구조

gym/
├── venv/                    # 가상환경 (git 제외)
├── logs/                    # 학습 로그 (TensorBoard용)
├── checkpoints/             # 학습 중간 저장
├── 01_basic_env.py          # 기본 환경 테스트
├── 02_q_learning.py         # Q-Learning 실습
├── 03_dqn_cartpole.py       # DQN 학습
├── 03_dqn_test.py           # DQN 테스트
├── 04_ppo_lunarlander.py    # PPO 학습
├── 04_ppo_test.py           # PPO 테스트
├── 05_dqn_atari.py          # Atari 학습
├── 05_dqn_atari_test.py     # Atari 테스트
├── dqn_cartpole.zip         # 저장된 모델
├── ppo_lunarlander.zip      # 저장된 모델
├── requirements.txt         # 패키지 목록
└── STUDY_NOTES.md           # 이 파일

실행 방법

# 가상환경 활성화 후
python 01_basic_env.py       # 환경 테스트
python 02_q_learning.py      # Q-Learning
python 03_dqn_cartpole.py    # DQN 학습
python 03_dqn_test.py        # 학습된 모델 테스트

TensorBoard로 학습 확인

tensorboard --logdir=./logs
# 브라우저에서 http://localhost:6006 접속

자주 발생하는 문제 해결

문제해결 방법
ModuleNotFoundError: No module named 'gymnasium'가상환경 활성화 확인, pip install gymnasium
게임 화면이 안 보임render_mode="human" 옵션 확인
Atari ROM 오류pip install "gymnasium[accept-rom-license]"
CUDA 오류CPU로도 학습 가능, GPU 없어도 됨
학습이 너무 느림total_timesteps 줄이기, 또는 GPU 사용

참고 자료


1. 머신러닝 3대 분류

구분지도학습비지도학습강화학습
정답있음없음없음
피드백정답 제공없음보상
목표정답 맞추기패턴 찾기보상 최대화
예시사진 분류고객 그룹화게임 AI

2. 강화학습 기본 구조

┌─────────────────────────────────────────┐
│              환경 (게임)                 │
└─────────────────────────────────────────┘
        │                           ▲
        │ 상태 (관찰)               │ 행동
        ▼                           │
┌─────────────────────────────────────────┐
│             에이전트 (AI)                │
└─────────────────────────────────────────┘

핵심 용어

  • 상태 (State): 현재 환경 정보 (예: 막대 각도, 카트 위치)

  • 행동 (Action): AI가 선택하는 것 (예: 왼쪽/오른쪽)

  • 보상 (Reward): 행동에 대한 피드백 (예: +1 또는 0)

  • 에피소드: 게임 한 판 (시작 → 끝)

  • 스텝: 한 번의 행동


3. Q-Learning (테이블 기반)

Q-테이블이란?

"각 상태에서 어떤 행동이 얼마나 좋은지" 점수표

         ←     ↓     →     ↑
칸 0   [0.87, 0.95, 0.70, 0.80]  ← ↓가 최고!
칸 1   [0.88, 0.00, 0.00, 0.08]
...

Q값 업데이트 공식

Q(s,a) ← Q(s,a) + α × (보상 + γ × 미래가치 - Q(s,a))
  • α (alpha): 학습률 - 새 정보를 얼마나 믿을지

  • γ (gamma): 할인율 - 미래 보상을 얼마나 중요시할지

Epsilon-Greedy 정책

  • ε = 1.0: 100% 랜덤 탐험

  • ε = 0.1: 10% 탐험, 90% 학습대로

  • 처음엔 탐험 많이 → 나중엔 학습대로

한계

  • 상태가 적을 때만 가능 (16칸 OK, 100만 칸 X)


4. DQN (Deep Q-Network)

Q-Learning vs DQN

구분Q-LearningDQN
저장소테이블 (표)신경망 (뉴런)
상태 수적을 때만무한대 가능
방식외운다 (암기)이해한다 (일반화)

DQN 신경망 구조

입력층 (상태)        은닉층           출력층 (행동 점수)
[카트위치  ]                         [왼쪽 점수: 2.1]
[카트속도  ] → 🧠 신경망 64개 뉴런 →
[막대각도  ]                         [오른쪽 점수: 4.8]
[막대각속도]

학습 과정

  1. 경험 수집: 상태 → 행동 → 결과 → 저장

  2. 리플레이 버퍼: 경험 50,000개 저장

  3. 미니배치 학습: 32개 랜덤 추출해서 신경망 학습

  4. 반복: 20만 번 반복

핵심 포인트

  • 신경망은 "쓰러진다/안쓰러진다" 모름

  • 그냥 "어떤 행동 점수가 높은지" 예측

  • 보상 설계가 핵심! (살아있으면 +1)


5. 학습 vs 테스트

단계과정특징
학습해보고 → 결과 보고 → 신경망 업데이트시간 오래 걸림
테스트상태 입력 → 신경망 → 바로 행동즉시

6. LLM과 강화학습

LLM (ChatGPT 등)은 세 단계로 학습:

  1. 사전학습 (지도학습): 텍스트로 다음 단어 예측

  2. 미세조정 (지도학습): 좋은 답변으로 학습

  3. RLHF (강화학습): 사람 피드백으로 개선


7. 실습 파일 정리

파일내용
01_basic_env.pyCartPole 기본 환경 테스트 (랜덤)
02_q_learning.pyQ-Learning으로 FrozenLake 학습
03_dqn_cartpole.pyDQN으로 CartPole 학습
03_dqn_test.py학습된 DQN 모델 테스트
04_ppo_lunarlander.pyPPO로 LunarLander 학습
05_dqn_atari.pyDQN으로 Atari (Breakout) 학습

8. 핵심 코드 예시

1단계: 환경 기본 사용법

import gymnasium as gym

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

# 환경 초기화
observation, info = env.reset()

# 한 스텝 실행
action = env.action_space.sample()  # 랜덤 행동
observation, reward, terminated, truncated, info = env.step(action)

# observation: [카트위치, 카트속도, 막대각도, 막대각속도]
# reward: 보상 (살아있으면 +1)
# terminated: 실패 여부
# truncated: 시간초과 여부

2단계: Q-Learning 핵심

import numpy as np

# Q-테이블 초기화 (상태 16개 x 행동 4개)
q_table = np.zeros([16, 4])

# 학습 루프
state, _ = env.reset()
action = np.argmax(q_table[state])  # 최고 점수 행동 선택

# Q값 업데이트 (핵심 공식!)
next_state, reward, done, _, _ = env.step(action)
old_value = q_table[state, action]
next_max = np.max(q_table[next_state])

# 새 Q값 = 기존값 + 학습률 × (보상 + 할인율 × 미래가치 - 기존값)
q_table[state, action] = old_value + 0.1 * (reward + 0.99 * next_max - old_value)

3단계: DQN 학습 (Stable-Baselines3)

from stable_baselines3 import DQN
import gymnasium as gym

# 환경 & 모델 생성
env = gym.make("CartPole-v1")
model = DQN("MlpPolicy", env, verbose=1)

# 학습 (이게 전부!)
model.learn(total_timesteps=200000)

# 저장
model.save("dqn_cartpole")

4단계: 학습된 모델 테스트

from stable_baselines3 import DQN
import gymnasium as gym

# 모델 불러오기
model = DQN.load("dqn_cartpole")
env = gym.make("CartPole-v1", render_mode="human")

# 테스트
obs, _ = env.reset()
while True:
    action, _ = model.predict(obs, deterministic=True)
    obs, reward, done, _, _ = env.step(action)
    if done:
        break

5단계: PPO로 다른 환경 학습

from stable_baselines3 import PPO
import gymnasium as gym

# LunarLander 환경
env = gym.make("LunarLander-v3")
model = PPO("MlpPolicy", env, verbose=1)

# 학습
model.learn(total_timesteps=500000)
model.save("ppo_lunarlander")

코드 패턴 요약

1. 환경 생성    → gym.make("환경이름")
2. 모델 생성    → DQN("MlpPolicy", env) 또는 PPO(...)
3. 학습        → model.learn(total_timesteps=N)
4. 저장        → model.save("파일명")
5. 불러오기     → model.load("파일명")
6. 예측        → model.predict(observation)

9. Atari 게임 학습 (이미지 입력)

기존 환경과 차이점

구분CartPole/LunarLanderAtari
입력숫자 벡터 (4~8개)이미지 (84x84)
정책MlpPolicy (일반 신경망)CnnPolicy (CNN)
전처리없음그레이스케일, 리사이즈
프레임1프레임4프레임 스택
학습 시간수 분수 시간

이미지 전처리 과정

원본 이미지          전처리 후
┌─────────────┐     ┌─────────┐
│ 210 x 160   │ →   │ 84 x 84 │ x 4프레임
│   RGB       │     │그레이스케일│
└─────────────┘     └─────────┘

프레임 스택이 필요한 이유

  • 1장 사진만으로는 공의 방향을 알 수 없음

  • 4장을 쌓으면 움직임 인식 가능

  • 예: 공이 어디서 어디로 가는지 파악

Atari 실행 전 설치

pip install gymnasium[atari] gymnasium[accept-rom-license]
pip install stable-baselines3[extra]

10. 핵심 요약

강화학습 = 해보고 배우는 방식
신경망 = 배운 걸 저장하는 뇌
DQN = 강화학습 + 신경망

입력: 상태 (숫자 4개)
출력: 각 행동의 점수 (숫자 2개)
학습: 보상 많이 받는 패턴 찾기

"직접 해보고, 결과 보고, 기억하고, 더 잘하기"