flydexo/world-models-carracing-v3
03
ποΈ World Models β CarRacing-v3
A faithful reproduction of Ha & Schmidhuber's *World Models* on CarRacing-v3. The agent factorises into three parts β Vision, Memory, Controller β trained in that order:
- V β a Ξ²-VAE that compresses each
64Γ64Γ3frame into a 32-d latentz - M β an MDN-RNN (LSTM-256, 5-mixture density head) that predicts the next latent
p(zβ² | z, a, h) - C β a single 867-parameter linear layer mapping
[z; h] β action, evolved with CMA-ES
Only the controller ever touches the reward; V and M are trained once, self-supervised, then frozen.
π― Result
left: what the car sees Β· middle: the frame round-tripped through V Β· right: the next frame as M predicts it, one step ahead.
Files
Usage
import torch
from omegaconf import OmegaConf
from huggingface_hub import hf_hub_download
from model import AutoEncoder, RNN # model.py from this repo
repo = "flydexo/world-models-carracing-v3"
cfg = OmegaConf.load(hf_hub_download(repo, "config.yaml"))
vae = AutoEncoder(cfg)
vae.load_state_dict(torch.load(hf_hub_download(repo, "vae.pt"), map_location="cpu"))
rnn = RNN(cfg)
rnn.load_state_dict(torch.load(hf_hub_download(repo, "rnn.pt"), map_location="cpu"))
# Controller: a plain linear [z; h] -> action
ctrl = torch.nn.Linear(cfg.controller.state_dim + cfg.controller.hidden_dim,
cfg.controller.action_dim)
ctrl.load_state_dict(torch.load(hf_hub_download(repo, "controller.pt"), map_location="cpu"))Rollout loop: encode obs β z, concat [z; h] β controller β action, step env, feed [z; a] through the RNN to advance the hidden state h.
Reproduction notes
The gap between a naΓ―ve implementation (~600) and the paper (~906) came down to a few details:
- VAE β sum-reduced reconstruction paired with a free-bits KL floor (Ξ» = 0.5/dim), KL scaled consistently against the recon term. No posterior collapse β all 32 latents stay alive.
- MDN-RNN β trained on
z ~ N(ΞΌ, Ο)sampled every batch (not the mean ΞΌ); softmax temperature applied only at sampling, never inside the training loss; correct mixture sampling. - Controller β input is
[z; h](latent plus the RNN hidden state). - CMA-ES β population 64, 16 rollouts averaged per candidate, Ο = 0.3.
Links
- π Paper: World Models (Ha & Schmidhuber, 2018)
- π€ Collection: World Models
- π Live training dashboards (Trackio): VAE sweep Β· RNN / controller
