File size: 5,004 Bytes
ed70f4e | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 | ---
license: other
tags:
- counter-strike
- world-model
- v-jepa2
- video
library_name: pytorch
---
# CS2 Match-Level Hierarchical World Model (scale300)
A causal, action-conditioned latent world model over frozen V-JEPA2 embeddings of
**single-POV Counter-Strike 2 gameplay**. Sequences span a player's whole match
(rounds concatenated, round-number embedding per token), so the belief state can
carry cross-round context. Trained on 300 matches of
[RekaAI/CS2-10k](https://huggingface.co/datasets/RekaAI/CS2-10k)
(mirage + dust2), 6.94M one-second windows at 0.5s stride.
Screen-only contract: the encoder sees POV pixels with no HUD, radar, or parsed
game state. Positions and actions are used as training targets and for
evaluation, never as inference inputs.
## Files
| file | what it is |
|---|---|
| `hwm_ckpt_scale300.pt` | the world model (12.25M params) + latent norm stats + action norm |
| `demo_heads.pt` | readout heads on the same latents: position, position@+8s, behaviour cloning (9 keys), 30s zone intent, zone-transition prior |
| `reports/*.json` | every number below, as produced by the scripts |
## Results (match-disjoint holdout, 450 sequences)
Latent MSE against the true future latent, versus a persistence ("nothing
changes") baseline:
| horizon | model | persistence |
|---|---|---|
| 0.5 s | 0.279 | 0.417 |
| 1 s | 0.436 | 0.765 |
| 2 s | 0.617 | 1.091 |
| 4 s | 0.765 | 1.369 |
| 8 s | 0.882 | 1.608 |
| 30 s | 0.976 | 1.893 |
## The limitation that matters most
Shuffling the action input and re-measuring gives the share of the model's
headroom over persistence that actually comes from knowing the action:
| horizon | 0.5 s | 1 s | 2 s | 4 s | 8 s | 30 s |
|---|---|---|---|---|---|---|
| action share of headroom | **24.4%** | 11.6% | 6.6% | 3.1% | 1.2% | **β0.0%** |
At 30 s the model is **provably action-blind**, and its MSE of 0.976 on
~unit-variance latents means it is close to a mean predictor there. It beats
persistence at 30 s only because persistence is a poor baseline at that range.
Structurally: `forward(z, a, rnd)` is causally masked, so token *t* sees actions
only up to *t* and each horizon head predicts z*t+h* directly β **there is no
slot for a candidate future action sequence**. Counterfactual "what if I do X"
requires autoregressive rollout through the h=1 head and is only meaningful for
~0.5β2 s. Macro intent must come from the destination/intent heads, not rollouts.
Reproduce with `scripts/hwm/hwm_action_sensitivity.py`.
## 30 s intent probe
| features | top-1 | top-3 | moved top-1 |
|---|---|---|---|
| latent | 0.420 | 0.781 | 0.269 |
| HWM context | 0.413 | 0.776 | 0.303 |
| latent + context | 0.407 | 0.771 | 0.299 |
| *persistence baseline* | *0.371* | β | β |
| *zone-transition prior (moved subset)* | β | β | *0.318* |
Latent top-1 clears the persistence baseline. On the **moved** subset (63% of
cases, where the player actually changes zone β the ones that matter for
next-action) all three feature sets still **lose to a trivial zone-transition
prior**. `beats_transition_prior` is false everywhere. Scaling 100 β 300 matches
narrowed that gap but did not close it, and improved the dynamics model only
~2%, so scaling in this range is sublinear.
## Demo: verified on holdout video
`scripts/hwm/demo_pov_video.py` replays a holdout match as real video through
the frozen encoder and this checkpoint, with the action input supplied by the BC
head reading the same pixels. Ground truth is overlaid only to check.
| metric | result | baseline |
|---|---|---|
| self-localization (median) | 1.99 m | β |
| 8 s position forecast | 6.03 m | 9.68 m stand-still |
| 30 s intent top-3 | 60.3% | 55.8% zone-transition prior |
| 2 s counterfactual, true action closest | 46.2% | 16.7% chance |
Caveats, in the interest of not overstating: the 8 s figure shown is a **direct**
forecast head β decoding the HWM's own h=16 latent scores slightly worse (6.53 m),
so the world model is not what drives that panel. The counterfactual is scored in
**latent space**; scored on map positions it falls to 18.6%, i.e. chance, because
the position head's ~99 u error swamps the 238 u candidate spread. It is an
aggregate claim, not a per-frame one. The position head is unconstrained and
emits off-map coordinates on ~1% of frames.
## Intended use
Research on latent world models and intent prediction from egocentric video.
Not a cheat, not an aim assist: it consumes recorded POV video offline and
predicts where a player will be, at metre-to-zone granularity.
## Provenance
Derived from RekaAI/CS2-10k; that dataset's terms apply upstream. Encoder is
`facebook/vjepa2-vitl-fpc64-256`, frozen. Match split is deterministic
(md5 of `match_id`), so the holdout is reproducible. The checkpoint itself is
**not** bit-reproducible: training seeds the RNGs but GPU nondeterminism means a
re-run yields a statistically equivalent, not identical, model.
Code: https://github.com/cristibctr/HWM-CS2
|