[ 트렌드] 실습 #5: Embodied AI — 연속 행동 World Model과 CEM Planning
관
관리자
Lv.1
03-02 10:35
·
조회 13
·
추천 0
실습 #5: Embodied AI — 연속 행동 World Model과 CEM Planning
시리즈: World Model 실습 | 난이도: ★★☆ 중급 | 소요시간: 실행 30분 + 분석 30분
1. 목적 (Why)
이 실습에서 하려는 것
"이산 행동(CartPole)에서 연속 행동(Pendulum)으로 확장하고, Random Shooting을 CEM으로 진화시켜 실제 로봇 제어에 가까운 World Model을 구축한다."
실습 #3에서 CartPole(이산 행동 2개)을 다뤘다면, 이 실습에서는:
- 연속 행동 공간: 실제 로봇처럼 토크(힘)를 실수값으로 제어
- 보상 예측: Dreamer처럼 상태뿐 아니라 보상도 함께 예측
- CEM Planning: 후보를 반복적으로 개선하는 진화적 탐색 방법
- Dreamer v3 스타일: SiLU 활성화 + LayerNorm (v3에서 도입)
논문과의 연결
Dreamer v3 → 이 실습
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
연속 행동 지원 → Pendulum 연속 토크 [-2, 2]
SiLU + LayerNorm → 동일하게 적용
보상 예측 → reward head 추가
Imagination → CEM으로 상상 속 탐색
Actor-Critic → CEM으로 대체 (학습 불필요)
선행 학습
| 실습 | 내용 | 이 실습과의 관계 |
|---|---|---|
| #1 코드 해부 | Dreamer v3 구조 이해 | SiLU, LayerNorm 채택 근거 |
| #2 설계 | 단순화 전략 | 연속 행동 확장 설계 |
| #3 CartPole | MLP World Model | 기반 모델 확장 |
| #4 Vision | VAE + 잠재 공간 | 시각 입력의 대안적 접근 |
2. 환경: Pendulum-v1
왜 Pendulum인가
CartPole (실습 #3) Pendulum (이 실습)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
행동: {0, 1} 이산 행동: [-2, 2] 연속 토크
상태: 4D (위치, 속도, 각도...) 상태: 3D (cos(θ), sin(θ), θ̇)
물리: 선형 근사 물리: 비선형 회전 역학
보상: +1 (생존) 보상: -(θ²+0.1θ̇²+0.001a²)
종료: 쓰러지면 끝 종료: 200스텝 고정
목표: 오래 서있기 목표: 위로 세우고 유지
상태 공간 설계
Pendulum 상태 = [cos(θ), sin(θ), θ_dot]
왜 각도를 cos/sin으로 분리하는가?
θ = 0°와 θ = 360°는 같은 상태인데
숫자로는 0과 6.28로 전혀 다름
→ cos(θ), sin(θ)로 표현하면 연속적 + 고유값
이것은 Dreamer의 "표현 학습"과 같은 아이디어:
관찰을 신경망이 학습하기 좋은 형태로 변환
3. 설치 환경
필수 패키지
pip install gymnasium torch numpy matplotlib
버전 요구사항
| 패키지 | 최소 버전 | 확인 |
|---|---|---|
| Python | 3.8+ |
python3 --version |
| gymnasium | 0.26+ |
pip show gymnasium |
| torch | 1.12+ |
python3 -c "import torch; print(torch.__version__)" |
| matplotlib | 3.5+ | 시각화용 |
4. Step 1: 데이터 수집
실행
cd 실습코드/2-3_Embodied_AI/
python3 step1_collect_data.py
Input → Process → Output
Input: Pendulum-v1 환경 + 랜덤 정책
Process: 500 에피소드 × 200 스텝 랜덤 행동
Output: pendulum_data.pkl (100,000 전환)
데이터 구조:
states: (100000, 3) [cos(θ), sin(θ), θ_dot]
actions: (100000, 1) [-2.0 ~ 2.0] 연속 토크
next_states: (100000, 3) 다음 상태
rewards: (100000,) 연속 보상값
핵심 로직
# 연속 행동 샘플링 (이산과의 차이)
action = env.action_space.sample() # uniform [-2, 2] 실수
# CartPole과 비교:
# CartPole: action ∈ {0, 1} → 2가지 경우
# Pendulum: action ∈ [-2, 2] → 무한한 경우
실행 결과
총 전환 수: 100,000
에피소드 평균 길이: 200.0 스텝
상태 통계:
cos(θ) : [-1.000, 1.000] mean=-0.386
sin(θ) : [-1.000, 1.000] mean=-0.001
θ_dot : [-8.000, 8.000] mean=-0.055
행동 통계:
torque : [-2.000, 2.000] mean=0.001
보상 통계:
reward : [-16.268, -0.001] mean=-6.219
논문 연결
Dreamer v3의 데이터 수집:
- Algorithm 1, Line 3: 환경에서 에피소드 수집
- 차이점: Dreamer는 학습된 정책으로 수집, 여기서는 랜덤 정책
- 연속 행동: Dreamer v3가 Atari(이산) + DMControl(연속) 모두 지원하는 것과 동일한 확장
5. Step 2: 연속 행동 World Model 학습
실행
python3 step2_train_continuous_wm.py
Input → Process → Output
Input: pendulum_data.pkl (100,000 전환)
Process: ContinuousWorldModel 학습 (200 epoch)
Output: continuous_world_model.pt
모델 출력 2개:
next_state(3) — 다음 상태 예측
reward(1) — 보상 예측 ★ 실습 #3과의 차이
모델 아키텍처
ContinuousWorldModel (135,428 파라미터)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
입력: [cos(θ), sin(θ), θ_dot, torque] = 4차원
Linear(4 → 256) → LayerNorm → SiLU ← Dreamer v3 스타일!
Linear(256 → 256) → LayerNorm → SiLU
Linear(256 → 256) → LayerNorm → SiLU
Linear(256 → 4)
출력: [next_cos, next_sin, next_θ_dot, reward] = 4차원
실습 #3 대비 변화:
구조: ReLU → SiLU (Dreamer v3에서 채택)
정규화: 없음 → LayerNorm (학습 안정성)
출력: 상태만 → 상태+보상 (reward head 추가)
크기: 35K → 135K 파라미터 (비선형 물리)
왜 SiLU + LayerNorm인가
SiLU(x) = x · sigmoid(x)
- ReLU의 "죽은 뉴런" 문제 해결
- Dreamer v3 논문 Section 3.1에서 채택
- smooth하여 미분이 안정적
LayerNorm
- 배치 크기에 독립적인 정규화
- Dreamer v3에서 모든 MLP에 적용
- 다양한 도메인에서 안정적 학습의 핵심
손실 함수
loss = MSE(predicted_state, actual_state)
+ 0.5 × MSE(predicted_reward, actual_reward)
# 보상 가중치 0.5: 상태 예측이 더 중요
# Dreamer v3: recon_loss + reward_loss + continue_loss + KL
# 이 실습: state_loss + reward_loss (단순화)
실행 결과
파라미터 수: 135,428 (Dreamer v3 Small: 22M → 162배 큼)
Epoch [200/200]
train=0.000011
state_loss=0.000006
reward_loss=0.000009
val=0.000040
상태 예측 R²: 1.0000
보상 예측 R²: 1.0000
→ Pendulum 물리를 거의 완벽하게 학습!
논문 연결
- Dreamer v3 Section 3.1: World Model이 상태 전이 + 보상 + 종료 조건을 모두 예측
- 이 실습에서 보상 예측을 추가하여 Dreamer에 한 단계 더 근접
- SiLU, LayerNorm은 v3에서 도입된 핵심 기법
6. Step 3: CEM Planning
실행
python3 step3_cem_planning.py
CEM vs Random Shooting 비교
Random Shooting (실습 #3):
1. N개 랜덤 행동 시퀀스 생성
2. 각각 시뮬레이션
3. 최고 점수 선택
→ 끝! 개선 없음
CEM (이 실습):
1. 행동 분포 초기화: μ=0, σ=1
2. 분포에서 N개 샘플링
3. 각각 시뮬레이션 → 점수 계산
4. 상위 K개(elite) 선택
5. elite의 평균/분산으로 μ, σ 업데이트
6. 2~5를 반복 (3회)
→ 점점 더 좋은 영역으로 수렴!
CEM 알고리즘 상세
# 의사 코드
μ = zeros(horizon, 1) # 행동 평균 초기화
σ = ones(horizon, 1) # 행동 분산 초기화
for iteration in range(3):
# 64개 후보 샘플링
candidates = μ + σ × randn(64, horizon, 1)
candidates = clip(candidates, -2, 2)
# 배치 병렬 시뮬레이션 (핵심: 벡터화)
rewards = simulate_batch(candidates, world_model)
# 상위 12개 (20%) 선택
elite = candidates[top_20%(rewards)]
# 분포 업데이트 (핵심: 진화!)
μ = mean(elite)
σ = std(elite) + ε
return μ[0] # 첫 타임스텝의 평균 행동
왜 CEM이 연속 행동에서 더 좋은가
행동 공간 크기:
CartPole: 2개 → 10스텝 = 2^10 = 1,024 경우
Pendulum: 무한대 → 10스텝 = ∞ 경우
Random Shooting:
무한한 공간에서 64개 랜덤 → 바늘을 찾기 어려움
CEM:
처음에는 넓게 탐색 → 좋은 영역 발견 → 좁혀서 재탐색
3번 반복하면 좋은 행동 근처로 수렴
이것은 Dreamer 이전 MBRL의 표준:
PlaNet (Hafner, 2019): CEM으로 Planning
→ Dreamer v1 (2019): CEM → Actor-Critic으로 교체
→ 이유: Actor-Critic은 학습 후 추론이 빠름
배치 병렬 처리 (구현 핵심)
# 느린 방법 (후보별 루프):
for i in range(64): # 64번 반복
for t in range(10): # 10스텝 반복
model.predict(s, a) # 640번 개별 호출
# 빠른 방법 (배치 병렬):
state_t = expand(state, 64) # (64, 3) 배치
for t in range(10): # 10스텝만 반복
model.predict(state_t, a) # 10번 배치 호출
→ 64배 속도 향상!
실행 결과
성능 비교:
정책 평균보상 표준편차 최고
Random -1248.6 280.3 -736.2
Random Shooting -255.4 92.5 -122.4
CEM -159.8 104.4 -0.8
RS 개선율: 79.5% (vs Random)
CEM 개선율: 87.2% (vs Random)
CEM vs RS: 37.4% 추가 개선
→ CEM이 RS보다 37% 더 좋고, 최고 점수 -0.8은 거의 완벽!
(Pendulum 최적값은 약 0, 최악은 약 -1600)
논문 연결
- PlaNet (Hafner, 2019): World Model + CEM Planning의 원조
- Dreamer v1 (2019): CEM → Actor-Critic으로 교체 (추론 속도)
- 핵심 인사이트: CEM은 학습 불필요 but 매 스텝마다 최적화 필요 → Actor-Critic은 학습 필요 but 추론은 forward 1회
7. Step 4: 시각화
실행
python3 step4_visualize.py
4종 차트 설명
┌─────────────────────────┬─────────────────────────┐
│ 차트 1: 학습 곡선 │ 차트 2: 1-step 예측 │
│ State/Reward/Val loss │ θ_dot 예측 scatter │
│ → 200epoch에서 수렴 │ → R²=1.0000 (완벽) │
├─────────────────────────┼─────────────────────────┤
│ 차트 3: 성능 비교 │ 차트 4: 상상 궤적 │
│ Random vs RS vs CEM │ 실제 vs 상상 (30스텝) │
│ → CEM 87.2% 개선 │ → 발산 지점 확인 │
└─────────────────────────┴─────────────────────────┘
Output
embodied_ai_results.png (4종 차트)
8. 전체 파이프라인 흐름
Step 1 Step 2 Step 3 Step 4
데이터 수집 → 모델 학습 → CEM Planning → 시각화
━━━━━━━━━━ ━━━━━━━━━━ ━━━━━━━━━━━ ━━━━━━━
Pendulum-v1 MLP(4→256³→4) μ,σ → 샘플 4종 차트
500 ep × 200 st SiLU+LayerNorm → 시뮬 → elite
→ 100K 전환 state+reward 예측 → 분포 업데이트
R²=1.0000 87.2% 개선
pendulum_data.pkl → continuous_wm.pt → test_results.pkl → PNG
9. 전체 실습 시리즈 비교
| 항목 | 실습 #3 (2-1) | 실습 #4 (2-2) | 실습 #5 (2-3) |
|---|---|---|---|
| 환경 | CartPole | CartPole | Pendulum |
| 행동 | 이산 (0/1) | 이산 (0/1) | 연속 [-2,2] |
| 상태 | 4D 수치 | 이미지→32D | 3D 삼각함수 |
| 모델 | MLP+ReLU 35K | VAE+MLP 530K | MLP+SiLU 135K |
| 계획 | Random Shooting | Random Shooting | CEM |
| 보상예측 | X | X | O |
| 성능 | 11.4배 향상 | R²=0.978 | 87.2% 개선 |
Dreamer v3로의 진화 경로
실습 #3 (기본) 실습 #5 (이 실습) Dreamer v3 (최종)
━━━━━━━━━━ ━━━━━━━━━━━━ ━━━━━━━━━━━━
MLP MLP+SiLU+LN RSSM(GRU+z)
이산 행동 연속 행동 연속 행동
상태만 예측 상태+보상 예측 상태+보상+종료
Random Shooting CEM Actor-Critic
ReLU SiLU SiLU
없음 LayerNorm LayerNorm
없음 없음 Symlog
없음 없음 이산 카테고리컬
10. 한계와 다음 단계
이 실습의 한계
1. 아직 Markov 가정
→ Pendulum은 현재 상태만으로 다음 예측 가능
→ 실제 로봇은 과거 히스토리가 필요 (RSSM)
2. Actor-Critic 미도입
→ CEM은 매 스텝 최적화 → 느림
→ Actor-Critic은 학습 후 즉시 추론
3. 시각 입력 미사용
→ 수치 상태 직접 사용
→ 실제 로봇은 카메라 입력 (실습 #4 VAE 필요)
4. 단일 태스크
→ Dreamer v3는 150+ 태스크에서 동일 설정
→ 여기서는 Pendulum 1개만
다음으로 갈 방향
이 실습 (CEM + 연속 행동)
↓
MuJoCo 고급 환경 (HalfCheetah, Ant)
↓
Actor-Critic 추가 (Dreamer 방식)
↓
이미지 입력 + RSSM
↓
Dreamer v3 완전 구현
◀
실습 #2: CartPole World Model 설계 — Dreamer를 극단적으로 단순화하기
실습 #6: MuJoCo 심화 — RSSM-Lite + Actor-Critic으로 Dreamer 재현
▶
💬 0
로그인 후 댓글 작성
첫 댓글을 남겨보세요!