๐ MuJoCo 3D Lunar Lander v1 โ Brave Brain (74% Success DQN)
๐ก 74.0% ์ฐฉ์ง ์ฑ๊ณต๋ฅ ๋ฌ์ฑ! 3D MuJoCo ๋ฌผ๋ฆฌ ์์ง ๊ธฐ๋ฐ์ ์ฐฉ์ง์ (Lunar Lander)์ ์ค์๊ฐ ๊ฑฐ๋ฆฌยท์์ธ ๋ณด์ ์์ง๋์ด๋ง(Reward Shaping)์ ํตํด ์ ๋ฐ ์ ์ดํ๋ Deep Q-Network(DQN) ๋ชจ๋ธ์ ๋๋ค.
๐ฅ ๋นํ ๋ฐ ์ฐฉ์ง ์์ฐ (Demo)
๐ก ์ฐฉ์ง์ ์ ๋ชธํต๊ณผ ๋ ๊ฐ์ ์บก์ ๋ค๋ฆฌ๊ฐ MuJoCo ๋ฌผ๋ฆฌ ์์ง์ ์ค์๊ฐ ์ถฉ๋ ํด์(
d.contact)์ ํตํด ์์ ํ๊ฒ ์ฐฉ์ง๋์ ์์ฐฉํฉ๋๋ค.
๐ ์คํ ์ฑ๊ณผ ๋ฐ ํ๊ฐ ๊ฒฐ๊ณผ (50 Episodes Evaluation)
๋ ๋ฆฝ๋ 50๊ฐ์ ๋ฏธํ์ต ์๋(Seed 5000 ~ 5049)๋ฅผ ๋์์ผ๋ก ์ฑ๋ฅ์ ๊ฒ์ฆํ ๊ฒฐ๊ณผ์ ๋๋ค.
| ์งํ (Metrics) | 11๋ฒ ์ ๊ธฐ๋ณธํ (Baseline) | 3์ฐจ ์คํ: ์ฉ๊ฐํ ๋๋ (๋ณธ ๋ชจ๋ธ) |
|---|---|---|
| ์๋ฒฝ ์ฐฉ์ง ์ฑ๊ณต๋ฅ | ~40.0% (20/50ํ) | 74.0% (37/50ํ) ๐ |
| ์ถ๋ฝ (Crash) | 12ํ | 0ํ (0.0%) |
| ์ฐฉ์ง๋ ๋ฐ ์ฐฉ์ง | 18ํ | 13ํ (26.0%) |
| ์ํผ์๋ ํ๊ท ๋ณด์ | -12.4 | +89.8 |
- ๋จ 1ํ์ ์ถ๋ฝ์ด๋ ๋ค์งํ ์์ด 100% ์์ ํ๊ฒ ์ฐฉ์งํ์ผ๋ฉฐ, ๊ทธ์ค 74%๊ฐ ์ฐฉ์ง๋ ์ ์ค์ ์์ ์์ญ์ ์๋ฒฝ ์์ฐฉํ์ต๋๋ค.
๐ ๏ธ ํต์ฌ ๋ณด์ ์์ง๋์ด๋ง (Reward Shaping)
๊ธฐ์กด ๊ธฐ๋ณธ ์๋ฎฌ๋ ์ดํฐ(11๋ฒ ์ )๋ ์ฐฉ์ง ์์ ๊น์ง ์๋ฏธ ์๋ ๋ณด์์ด ์ฃผ์ด์ง์ง ์๋ 'ํฌ์ ๋ณด์(Sparse Reward)' ๋ฌธ์ ์ ์ฐ๋ฃ ๋ฒ์ ์ ๋ํ ๊ณตํฌ๋ก ์ธํด ๋ณด์์ ์ธ ํ๋(์ฐฉ์ง๋ ๋ฐ ์ฐฉ์ง)์ ๋ณด์์ต๋๋ค.
๋ณธ ๋ชจ๋ธ์ ๋ค์๊ณผ ๊ฐ์ ๋ณด์ ์ค๊ณ๋ฅผ ์ ์ฉํ์ต๋๋ค:
- ์ค์๊ฐ ์ง์ ๊ฑฐ๋ฆฌ ๋ณด๋์ค: $$R_{\text{dist}} = +0.5 \times \exp(-\text{๊ฑฐ๋ฆฌ})$$ ์ฐฉ์ง๋ ์ค์ฌ $(0, 0.05)$์ ๊ฐ๊น์์ง์๋ก ๋งค ์คํ ๋ง๋ค ๋์ ๊ฐ์ฐ์ ์ ์ฃผ์ด ์ค์ฌ๋ถ๋ก ๋์ด๋น๊น.
- ์์ง ์์ธ ๋ณด๋์ค: $$R_{\text{att}} = +0.1 \times \cos(\theta)$$ ๋ชธ์ฒด๊ฐ ๊ธฐ์ธ์ด์ง์ง ์๊ณ ๋๋ฐ๋ก ์ ์๋๋ก ์ ๋ํ์ฌ ์ฐฉ์ง ์ ์ ๋ณต ๋ฐฉ์ง.
- ๊ณผ๊ฐํ ๊ธฐ๋ ๋ ๋ ค (Fuel Tuning): ์ฐ๋ฃ ์๋ชจ ๋ฒ์ ์ $0.3 \to 0.05$(๊ฐ์ด๋ฐ), $0.03 \to 0.005$(์ธก๋ฉด)๋ก ๋ฎ์ถ์ด ์ ๊ทน์ ์ธ ์ ์ด ๋ถ์ฌ ์ ๋.
- ์ ๊ฒฝ๋ง ์ฉ๋ ํ์ฅ: ์๋ ๋ ธ๋๋ฅผ $128 \to 256$์ผ๋ก ํ์ฅํ์ฌ ๋น์ ํ ๋ฌผ๋ฆฌ ์ญํ์ ์ ๋ฐ ํ์ต.
๐ป ๋น ๋ฅธ ์์ ๋ฐ ์คํ ๋ฐฉ๋ฒ (Quick Start)
1. ํ๊ฒฝ ์ค์น
pip install mujoco gymnasium torch numpy
2. ์ฐฉ์ง์ ํ๊ฐ ์คํ
์ ์ฅ์๋ฅผ ํด๋ก ํ๊ฑฐ๋ ํ์ผ๋ค์ ๋ด๋ ค๋ฐ์ ํ ๋ฐ๋ก ์คํํ ์ ์์ต๋๋ค:
python mujoco_lander.py lander_brave_brain.pth
3. ํ์ด์ฌ ์ฝ๋์์ ์ง์ ๋ถ๋ฌ์ค๊ธฐ
import torch
from mujoco_lander import ๋ชจ๋ธ์์ฑ, ์ค์๊ฐ๋ณด๋์ค_์ฐฉ์งํ๊ฒฝ
# 1. 256 ์๋ ๋
ธ๋ Q-Network ๋ก๋
model = ๋ชจ๋ธ์์ฑ(์ํ์=8, ํ๋์=4, ์๋=256)
model.load_state_dict(torch.load('lander_brave_brain.pth', map_location='cpu'))
model.eval()
# 2. MuJoCo ํ๊ฒฝ ์ด๊ธฐํ
env = ์ค์๊ฐ๋ณด๋์ค_์ฐฉ์งํ๊ฒฝ()
obs, _ = env.reset(seed=42)
done = False
while not done:
with torch.no_grad():
action = int(model(torch.from_numpy(obs)).argmax())
obs, reward, terminated, truncated, info = env.step(action)
done = terminated or truncated
print(f"์ต์ข
๊ฒฐ๊ณผ: {info['๊ฒฐ๊ณผ']}")
๐ ํ์ผ ๊ตฌ์กฐ
lander_brave_brain.pth: 74% ์ฐฉ์ง ์ฑ๊ณต DQN ์ ๊ฒฝ๋ง ๊ฐ์ค์น (279KB)mujoco_lander.py: MuJoCo XML + ํ๊ฒฝ ํด๋์ค + ์ถ๋ก ํตํฉ ์คํ ํ์ผlander_demo.mp4: ๋นํ ๋ฐ ์ฐฉ์ง ์์ฐ ์์ (16KB)README.md: ๋ชจ๋ธ ์นด๋ ๋ฐ ์ฑ๋ฅ ๋ฆฌํฌํธ
Evaluation results
- Landing Success Rate (%) on MuJoCo Custom 3D Lunar Landerself-reported74.000