--- license: mit library_name: pytorch pipeline_tag: reinforcement-learning tags: - reinforcement-learning - planning - discrete-diffusion - remdm - minihack - nethack - pytorch --- # ReMDM Planner: MiniHack checkpoints Trained weights accompanying *The Double Intractability of Reinforcement Learning for Discrete Diffusion Planners*: a remasking discrete diffusion model (ReMDM) used as an action-sequence planner in [MiniHack](https://github.com/facebookresearch/minihack), together with the BFS oracle rollouts that supervise it, and the results reported in the paper. Code, configs and evaluation harness: https://github.com/mathisweil/minihack-ReMDM-planner ## Contents | Path | Role | Environment | Architecture | Selected at | Training | Size | |---|---|---|---|---|---|---| | `checkpoints/offline/Minihack-Offline-Diffusion-BC-100M` | Diffusion planner (offline BC) | `MiniHack` | 4L, d_model 256, 4 heads, horizon 64, 5M params | gradient step 50,000 | 102,400,000 sample-equivalents | 100 MB | | `checkpoints/online/Minihack-Online-Diffusion-DAgger-100M` | Diffusion planner (online DAgger) | `MiniHack` | 4L, d_model 256, 4 heads, horizon 64, 5M params | iteration 563 | 5,654,965 env steps | 100 MB | Each checkpoint ships the `.pth` training state it was published from (weights, EMA shadow, optimiser, scheduler, and for the DAgger run the curriculum and RNG state, so training resumes exactly), a `model.safetensors` export of the EMA weights for inference, the YAML config snapshot it was trained under, and a `selection.json` recording how it was chosen. Weights are PyTorch training states with a `safetensors` export of the EMA weights alongside, and the paths above mirror the source repository so a snapshot can be dropped straight into a working copy. ## Results RL fine-tuning ablation runs, as produced by `experiments/rl_finetuning/run_ablations.py`. Each run ships its `results.json` summary, the `diagnosis.md` write-up, and the tables (`.csv` and `.tex`) and figures generated from it. | Run | Contents | Size | |---|---|---| | `experiments/rl_finetuning/outputs/minihack_ablations` | `results.json`, `diagnosis.md`, 17 tables, 113 figures | 27 MB | Evaluation results produced by `main.py --mode inference` on the checkpoints above, under `results/inference/`. | File | Environment | Evaluation | Headline metric | Size | |---|---|---|---|---| | `eval_offline_s0.json` | `7 envs` | 100 episodes per env | mean win rate 0.46 | 1 KB | | `eval_online_s0.json` | `7 envs` | 100 episodes per env | mean win rate 0.41 | 1 KB | ## Download ```python from huggingface_hub import snapshot_download # everything (~228 MB) snapshot_download(repo_id="mathisweil/remdm-minihack-checkpoints", local_dir=".") # a single model snapshot_download( repo_id="mathisweil/remdm-minihack-checkpoints", local_dir=".", allow_patterns="checkpoints/offline/Minihack-Offline-Diffusion-BC-100M/**", ) ``` ## Use From a clone of the code repository, after downloading into it: ```bash DIR=checkpoints/offline/Minihack-Offline-Diffusion-BC-100M uv run python main.py --mode inference \ --config $DIR/config.yaml --checkpoint $DIR/offline_step50000.pth \ --output results/inference/eval.json ``` Programmatic loading uses `src.models.denoiser.make_model` with the checkpoint's own config, then the safetensors export: ```python from safetensors.torch import load_file from src.config import load_config from src.models.denoiser import make_model cfg = load_config("checkpoints/offline/Minihack-Offline-Diffusion-BC-100M/config.yaml") model = make_model(cfg) model.load_state_dict(load_file("checkpoints/offline/Minihack-Offline-Diffusion-BC-100M/model.safetensors")) model.eval() ``` Architecture arguments should be read from the checkpoint's own config snapshot rather than from `configs/defaults.yaml`, which tracks the current code. ## Training The planners are bidirectional transformers that denoise a masked action plan conditioned on a cropped MiniHack glyph observation, trained either by offline behaviour cloning on oracle rollouts or by online DAgger against the BFS oracle under a dynamic environment curriculum. Model size and horizon differ per run (see the table). Exact hyperparameters for every run, including the in-distribution and out-of-distribution environment sets, the remasking strategy, schedule and sampling settings, are in the per-checkpoint config snapshots listed above, which are the authoritative record. Both models are best-checkpoint selections rather than final-step dumps: each trainer evaluates every periodic checkpoint on its configured number of episodes per environment using EMA weights, and the highest-scoring one is published (the metric behind that selection is not recorded in this release). Directory names encode the sample-equivalents the published model consumed (gradient steps x batch size, rounded); file names carry each trainer's own counter, DAgger iterations online and gradient steps offline. Each checkpoint's `selection.json` records the configured budget it was drawn from and the step it was selected at. ## Limitations These are research artefacts tied to specific MiniHack environment versions and to the cropped-glyph observation encoding; they are not general-purpose agents and will not transfer to other environments or to pixel observations. Evaluation results and their variance are reported in the paper. ## Citation ```bibtex @inproceedings{remdm-minihack-planner, title = {The Double Intractability of Reinforcement Learning for Discrete Diffusion Planners}, author = {Weil, Mathis}, year = {2026}, note = {NeurIPS 2026 Workshop: Beyond Next-Token Prediction} } ``` ## License MIT, see `LICENSE`.