[ 트렌드] 실습 #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 완전 구현
💬 0 로그인 후 댓글 작성
첫 댓글을 남겨보세요!