[ 트렌드] 실습 #2: CartPole World Model 설계 — Dreamer를 극단적으로 단순화하기
관
관리자
Lv.1
03-02 09:49
·
조회 12
·
추천 0
실습 #2: CartPole World Model 설계 — Dreamer를 극단적으로 단순화하기
시리즈: World Model 실습 | 난이도: 설계 분석 | 소요시간: 읽기 20분
1. 목적 (Why)
이 실습에서 하려는 것
"Dreamer v3의 복잡한 구조를 CartPole이라는 가장 단순한 환경에 맞게 단순화하여, World Model의 본질만 추출한다."
실습 #1에서 Dreamer v3의 설계도를 읽었습니다. 하지만 RSSM, Actor-Critic, CNN Encoder 등 복잡한 구조를 처음부터 구현하는 것은 비현실적입니다. 이 실습에서는:
- Dreamer의 어떤 부분을 남기고 어떤 부분을 버릴 것인가?
- 버려도 되는 이유는 무엇인가?
- CartPole 환경의 특성이 어떤 단순화를 가능하게 하는가?
논문과의 연결
Dreamer v3 논문의 핵심 아이디어를 추출하고, 구현 복잡성은 제거합니다:
Dreamer v3의 핵심 아이디어 (보존):
1. 세상의 물리법칙을 데이터에서 학습한다
2. 학습된 모델 안에서 미래를 상상한다
3. 상상을 통해 좋은 행동을 찾는다
Dreamer v3의 구현 복잡성 (제거):
1. RSSM (GRU + 확률적 변수) → 단순 MLP
2. CNN Encoder/Decoder → 필요 없음 (수치 상태 사용)
3. Actor-Critic → Random Shooting MPC
4. 이산 카테고리컬 표현 → 연속 상태 그대로
5. Symlog 예측 → 표준 MSE
2. 설계 결정: 무엇을 남기고, 무엇을 버리나
결정 1: 환경 선택 — CartPole-v1
왜 CartPole인가?
┌──────────────────────────────────────────────┐
│ 상태: 4차원 (위치, 속도, 각도, 각속도) │
│ 행동: 2개 (왼쪽, 오른쪽) │
│ 물리: 뉴턴 역학 (결정적, 예측 가능) │
│ 에피소드: 짧음 (평균 ~22스텝) │
│ 보상: 단순 (서있으면 +1) │
└──────────────────────────────────────────────┘
CartPole의 특성이 가능하게 하는 단순화:
- 상태가 4차원 수치 → CNN Encoder 불필요
- 결정적 물리 → 확률적 z 불필요
- 짧은 에피소드 → GRU 시간 기억 불필요
- 이산 행동(2개) → Random Shooting으로 충분
결정 2: World Model — RSSM → MLP
Dreamer v3:
상태 = (h, z)
h_t = GRU(h_{t-1}, z_{t-1}, a_{t-1}) ← 시간 의존
z_t ~ p(z_t | h_t) ← 확률적
이 실습:
ŝ_{t+1} = MLP(s_t, a_t) ← 단일 스텝, 확정적
| 제거한 것 | 제거 이유 | 언제 필요한가 |
|---|---|---|
| GRU (h) | CartPole은 현재 상태만으로 다음 상태 결정 (마르코프) | 부분 관측 환경 (이미지만 보는 경우) |
| 확률적 z | CartPole 물리는 결정적 | 노이즈가 있는 환경, 다중 모달 결과 |
| KL 발산 | 확률 분포가 없으므로 | VAE/RSSM 사용 시 |
남긴 것: 핵심 함수
f(s_t, a_t) → s_{t+1} # 전이 함수
# 이것이 World Model의 본질
# "현재 상태와 행동이 주어지면 다음 상태를 예측한다"
결정 3: 계획 — Actor-Critic → Random Shooting MPC
Dreamer v3:
Actor network(h, z) → action
- 상상 궤적에서 정책 경사로 학습
- 한번 학습하면 빠른 추론
- 연속 행동 공간 지원
이 실습:
Random Shooting MPC
- N개 랜덤 행동 시퀀스 생성
- 각각 World Model로 시뮬레이션
- 최고 점수 시퀀스의 첫 행동 선택
| 비교 | Actor-Critic | Random Shooting |
|---|---|---|
| 학습 필요 | O (Actor 신경망 학습) | X (매번 랜덤 탐색) |
| 추론 속도 | 빠름 (forward 1회) | 느림 (N×H 시뮬레이션) |
| 행동 공간 | 연속 가능 | 이산에 적합 |
| 구현 복잡도 | 높음 | 매우 낮음 |
| 이해 난이도 | 정책경사 이해 필요 | 직관적 |
왜 Random Shooting으로 충분한가?
CartPole: 행동 = {왼쪽, 오른쪽} = 2가지
10스텝 시퀀스의 모든 경우의 수 = 2^10 = 1,024
50개 랜덤 샘플 = 전체의 ~5% 탐색
→ 이산 행동 2개 × 짧은 horizon이라 Random Shooting으로도
충분히 좋은 행동을 찾을 수 있음
연속 행동(예: 로봇 관절 각도)에서는 경우의 수가 무한이므로
Actor-Critic이나 CEM이 필수 → 실습 2-3에서 다룸
3. 4-Step 파이프라인 설계
Dreamer v3 → CartPole 매핑
Dreamer v3 이 실습
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Step 1 환경 상호작용 데이터 수집
(데이터) + Replay Buffer (랜덤 정책 1000 에피소드)
→ 시퀀스 저장 → (s, a, s') 삼쌍 저장
Step 2 RSSM 학습 MLP 학습
(모델) + Encoder/Decoder (6→128→128→128→4)
+ KL balancing + MSE loss
→ 잠재공간 전이 학습 → 상태공간 전이 학습
Step 3 Imagination Random Shooting
(계획) + Actor-Critic 학습 (50후보 × 10스텝)
→ 상상 속 정책 최적화 → 상상 속 최고 행동 선택
Step 4 (논문에는 없음) 시각화
(분석) (학습곡선, 예측정확도,
상상궤적, 성능비교)
각 Step의 Input/Output 설계
Step 1: 데이터 수집
Input: CartPole-v1 환경
Output: collected_data.pkl
{states(N,4), actions(N), next_states(N,4)}
Step 2: 모델 학습
Input: collected_data.pkl
Output: world_model.pt
{model_weights, normalization_stats, loss_history}
Step 3: 상상 + 계획
Input: world_model.pt + CartPole-v1 (테스트용)
Output: test_results.pt
{random_scores[50], wm_scores[10]}
Step 4: 시각화
Input: world_model.pt + test_results.pt
Output: 4 PNG charts
4. 모델 아키텍처 상세 설계
WorldModel 클래스
class WorldModel(nn.Module):
"""
Dreamer의 RSSM을 극단적으로 단순화.
Dreamer RSSM:
h_t = GRU(h_{t-1}, concat(z_{t-1}, a_{t-1}))
z_t ~ p(z_t | h_t)
loss = recon + KL(posterior || prior)
이 실습:
s_{t+1} = MLP(s_t, a_t)
loss = MSE(predicted, actual)
"""
Architecture:
Linear(6 → 128) → ReLU
Linear(128 → 128) → ReLU
Linear(128 → 128) → ReLU
Linear(128 → 4)
Total: 35,204 parameters
(Dreamer v3 Small: 22,000,000 parameters → 625배 작음)
설계 근거
| 설계 선택 | 이유 |
|---|---|
| 3-layer MLP | CartPole 물리는 비선형이지만 복잡하지 않음 |
| Hidden 128 | 4차원 → 4차원 매핑에 충분한 용량 |
| ReLU 활성화 | 단순하고 안정적 |
| MSE 손실 | 확정적 예측에 가장 자연스러운 선택 |
| Z-score 정규화 | 상태 차원별 범위가 다름 (위치 vs 각속도) |
| Adam lr=1e-3 | PyTorch 표준 설정, CartPole에서 잘 동작 |
| Batch 512 | ~22K 데이터에서 적절한 배치 크기 |
| 200 Epoch | 수렴 확인용 (실제로는 50~100에서 수렴) |
5. Planning 알고리즘 설계
Random Shooting MPC 의사 코드
function PLAN_ACTION(world_model, current_state):
best_score = -infinity
best_action = 0
for candidate in 1..50: # 50개 후보
actions = RANDOM_SEQUENCE(length=10) # 10스텝 행동 시퀀스
state = current_state
score = 0
for t in 0..9: # 상상 시뮬레이션
state = world_model.predict(state, actions[t])
if IS_ALIVE(state): # 막대가 서있는가?
score += 1
else:
break
if score > best_score:
best_score = score
best_action = actions[0] # 첫 행동만 사용
return best_action
하이퍼파라미터 선택 근거
| 파라미터 | 값 | 근거 |
|---|---|---|
| num_candidates | 50 | 행동 2개 × 10스텝 = 1024 경우의 수. 50개면 ~5% 커버 |
| horizon | 10 | MLP는 multi-step에서 오차 누적. 15스텝은 느리고 10스텝으로 충분 |
| 보상 함수 | alive_steps | CartPole의 목표 = 오래 서있기 → 생존 스텝 수가 보상 |
| 각도 임계값 | 0.209 rad | CartPole-v1 종료 조건 (12도) |
| 위치 임계값 | 2.4 | CartPole-v1 종료 조건 |
6. 예상 결과와 검증 기준
성공 기준
| 단계 | 기준 | 의미 |
|---|---|---|
| Step 2 (학습) | MSE < 0.001 | 물리법칙을 충분히 학습 |
| Step 3 (1-step R²) | R² > 0.95 | 다음 상태를 95%+ 정확도로 예측 |
| Step 3 (성능) | WM/Random > 5배 | 상상이 실제로 도움이 됨 |
| Step 4 (상상 궤적) | 10스텝 내 정확 | 짧은 horizon에서 오차 작음 |
실패 시 디버깅 가이드
문제: 학습 Loss가 안 줄어듦
→ 원인: 정규화 안 함, learning rate 너무 큼
→ 해결: Z-score 정규화 확인, lr를 1e-4로 낮춤
문제: WM 정책이 랜덤과 비슷함
→ 원인: horizon 너무 짧음, candidates 너무 적음
→ 해결: horizon 15, candidates 100으로 증가 (단, 시간 증가)
문제: 상상 궤적이 실제와 크게 다름
→ 원인: multi-step 오차 누적
→ 해결: 이것은 정상! Dreamer가 짧은 horizon을 사용하는 이유
7. 이 설계에서 배우는 것 → 다음 실습으로
실습 #1 (이론) 실습 #2 (설계) ← 현재 실습 #3 (구현)
Dreamer 설계도 → CartPole 단순화 설계 → 실제 코드 실행
"어떻게 만들었나" "무엇을 남기고 버릴까" "돌려보고 검증"
이 실습에서 결정한 것:
├── MLP 3-layer (128 hidden)
├── MSE loss + Z-score 정규화
├── Random Shooting (50×10)
└── 4종 시각화로 검증
↓ 실습 #3에서 실행 ↓
결과: 11.4배 성능 향상 확인!
전체 실습 시리즈 흐름
#1 코드 해부 (이론) → Dreamer의 설계도를 읽다
#2 CartPole 설계 (설계) → 무엇을 남기고 버릴지 결정
#3 CartPole 실행 (구현) → 수치 상태 World Model 검증 (11.4배)
#4 Vision 실행 (확장) → 이미지 입력, VAE, 잠재공간 (R²=0.978)
#5 Embodied AI (심화) → 연속 행동, 로봇 제어 (예정)
◀
실습 #1: Dreamer v3 코드 해부 — 꿈속에서 배우는 AI의 설계도를 읽다
실습 #5: Embodied AI — 연속 행동 World Model과 CEM Planning
▶
💬 0
로그인 후 댓글 작성
첫 댓글을 남겨보세요!