강화학습 공부 정리
요약
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 | 어려움 | 이미지 84x84 | 4개 | 수 시간 |
폴더 구조
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-Learning | DQN |
|---|---|---|
| 저장소 | 테이블 (표) | 신경망 (뉴런) |
| 상태 수 | 적을 때만 | 무한대 가능 |
| 방식 | 외운다 (암기) | 이해한다 (일반화) |
DQN 신경망 구조
입력층 (상태) 은닉층 출력층 (행동 점수)
[카트위치 ] [왼쪽 점수: 2.1]
[카트속도 ] → 🧠 신경망 64개 뉴런 →
[막대각도 ] [오른쪽 점수: 4.8]
[막대각속도]학습 과정
경험 수집: 상태 → 행동 → 결과 → 저장
리플레이 버퍼: 경험 50,000개 저장
미니배치 학습: 32개 랜덤 추출해서 신경망 학습
반복: 20만 번 반복
핵심 포인트
신경망은 "쓰러진다/안쓰러진다" 모름
그냥 "어떤 행동 점수가 높은지" 예측
보상 설계가 핵심! (살아있으면 +1)
5. 학습 vs 테스트
| 단계 | 과정 | 특징 |
|---|---|---|
| 학습 | 해보고 → 결과 보고 → 신경망 업데이트 | 시간 오래 걸림 |
| 테스트 | 상태 입력 → 신경망 → 바로 행동 | 즉시 |
6. LLM과 강화학습
LLM (ChatGPT 등)은 세 단계로 학습:
사전학습 (지도학습): 텍스트로 다음 단어 예측
미세조정 (지도학습): 좋은 답변으로 학습
RLHF (강화학습): 사람 피드백으로 개선
7. 실습 파일 정리
| 파일 | 내용 |
|---|---|
01_basic_env.py | CartPole 기본 환경 테스트 (랜덤) |
02_q_learning.py | Q-Learning으로 FrozenLake 학습 |
03_dqn_cartpole.py | DQN으로 CartPole 학습 |
03_dqn_test.py | 학습된 DQN 모델 테스트 |
04_ppo_lunarlander.py | PPO로 LunarLander 학습 |
05_dqn_atari.py | DQN으로 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:
break5단계: 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/LunarLander | Atari |
|---|---|---|
| 입력 | 숫자 벡터 (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개)
학습: 보상 많이 받는 패턴 찾기"직접 해보고, 결과 보고, 기억하고, 더 잘하기"
