DriftWorld - Fast World Modeling through Drifting
DriftWorld: an action-conditioned world model based on drifting generative models. Generates future frames from the current observation and a candidate action sequence in a single forward pass at 30+ fps (17x faster than diffusion-based baselines).
Summary
The world model is conditioned on where:
- = initial/current observation plus any history frames
- = proposed sequence of future robot actions
- = the future video the model should generate So the desired conditional distribution is: The generator produces: , giving a model distribution:
-
Conditional drifting field defined by the initial observation and action sequence, with a modification that accentuates action following (bias against )
- i.e., for each specific starting scene and proposed robot action sequence, build a sector vector field that tells generated future videos how to move toward the correct feature, & modify that field so predictions that merely copy the starting frame are pushed away more strongly
- 🔑 Conditional - means that samples are only compared within the same starting observation and action sequence
- ^ a batch containing different demonstrations therefore has separate drifting fields, rather than one global field mixing unrelated scenes and actions.
-
A drifting feature space that leverages DINOv2/v3 to maintain visual sharpness in complex scenes
-
A U-Net architecture that ensures each video frame is precisely conditioned on the corresponding action
Training: Inference:
A note on indexing
As a note, the paper has a notational inconsistency: in Section 3.1 it writes actions which contains actions, and predicts which contains future frames. But Algorithm 1 uses: which implies actions with future frames, i.e. - None of this impacts the core ideas presented, and these notes also may have inherited some of the notational inconsistency (I tried to stick with , but some parts may be off by one) - please ignore any inconsistencies!
Drifting field
Vanilla conditional drifting field
For one condition , let:
- = the real ground-truth future video for that condition
- = generated future videos under the same condition
The drift acting on generated sample is (intuitively): The positive term attracts to the real future (minimizing will minimize which minimizes , i.e. vector difference between and ) while the negative term accounts for nearby generated samples (minimizing will maximize , i.e. prevent generated samples from collapsing to one spot): The weights are based on similarity, through some kernel : The update target is: The training loss is:
- 💡 So the network output is trained to move in the direction prescribed by the field!
Adding the no-action future to the negative distribution
A common failure mode is the world model ignoring the action and simply copying the current image: This still achieves a deceptively low reconstruction error because most pixels (the table, walls, background, stationary objects) do not move. To prevent the model from falling in this trap, DriftWorld adds the no-action-future to the negative distribution (i.e. vector field of things to not do):where . Dissecting this equation in more detail:
- is the model's generated-future distribution
- is the distribution corresponding to taking no action
- In practice, the current frame is used as a real no-action negative - i.e. the unchanged current image is treated as an example of what the future should not look like when a nonzero action is commanded
- Algorithm 1 (paper) writes this as: where = generated future samples, = most recent real observation.
- 📍 Slight nuance: for the real-world datasets, the model predicts 1 future frame per call (and then autoregressively generates), so naturally has the same shape as the generated future. For a multi-frame output, one would need to construct a matching no-action chunk, e.g. by repeating , but the paper's pseudocode does not spell out this case.
- 🔑 So the negative set is:
- Algorithm 1 (paper) writes this as: where = generated future samples, = most recent real observation.
- controls how strongly the model is discouraged from simply preserving the current state
The modified field is therefore: where the negative part is conceptually: The extra term pushes generated videos away from futures that look like "nothing happened."
Drifting feature space
DriftWorld measures attraction & repulsion between particles via feature-space, rather than RGB space / raw particle (in this drifting field, images) space.
Particles in DriftWorld's drifting field
The particles are the model's generated future-video samples.
For one fixed condition , the model samples different Gaussian noises , and each noise produces one generated future chunk: For , a particle is one predicted next frame. For , a particle is an entire predicted future chunk:
- 🔑 The model generates multiple particles under the same history and actions because different Gaussian noises may represent different plausible futures.
- 🔖 Bookkeeping: For one training example, we have...
- one positive future
- generated particles
- optionally the no-action image as an additional negative
- 📍 The paper's reported numbers of generated negatives are:
- Push-T:
- Robomimic:
- Bridge-V2/RT-1/Language Table:
- Sneak peek at content of following sections: Each generated particle receives its own drift vector . The target for that particle is
Feature space drifting
- Pass each image through a frozen visual encoder : where = number of image channels (usually for RGB), = original image height in pixels, = original image width in pixels. DINO transforms the image into a lower resolution grid: = number of feature-grid rows, = number of feature-grid columns, = number of features stored at each grid location. For DINOv3 feature vectors: at each location , we have a 768-dim. feature vector describing the corresponding image region:
- For real-world datasets, is DINOv2 or DINOv3.
- After passing an image through , it becomes a grid of feature vectors: Each feature vector (ideally 😅) represents what DINO sees at a particular image region: gripper, object edge, plate, countertop texture, etc.
- Rather than computing one giant drift between raw images, DriftWorld computes a separate drift at every spatial location: More concretely, define: Then the drift at location acts in , where a generic kernel-weighted mean-shift form of and is: For DriftWorld there is usually only one positive future for each condition (ground-truth rollout), so contains one sample, i.e. .
- = set of positive samples; = set of negative samples.
- At DINO location , these become feature vectors:
- "generic kernel-weighted mean-shift form"
- kernel-weighted mean, in generic form, is: ^ nearby samples contribute heavily; distant samples contribute little.
- mean-shift direction refers to the fact that we are shifting using : the expression contains because it is the arrow from current particle to another sample .
- generic in that the equation we have here omits details such as -
- dividing features by their average pairwise distance
- normalizing drift fields by magnitude
- summing fields computed at multiple temperatures
- The paper's normalized kernel at temperature is: where are feature vectors divided by their average pairwise distance. This keeps the kernel scale from changing drastically merely because one representation (i.e. one feature encoder's outputs) has larger magnitudes or more dimensions.
- They use several temperatures, where a kernel with a small responds mainly to nearby samples and a kernel with a larger gives broader attraction and repulsion:
- = set of positive samples; = set of negative samples.
- The feature-space training target: let the generated image be . The feature-space target is conceptually: The local loss is: Then they average over locations: The motion weight is where is a normalized difference between the DINO features of the current frame and the true future frame at that location.
- ^ thus locations where the gripper or manipulated object moves receive more weight than a static wall or table.
- = normalized amount of visual motion at location , controls how quickly the weight rises, controls the maximum extra weight.
- At 0 motion: → a static region receives baseline weight 1.
- For large motion: → weight is bounded
DINO latent space
For the real-robot datasets, the implementation uses features from blocks 2, 5, and 8 of DINOv3 ViT-B/16. The resulting map is , which means DriftWorld constructs a 768-dim. conditional drifting field at each of the DINO locations and evaluates it on every generated particle. The resulting local particle losses are averaged over particles and motion-weighted across the 256 locations.
Stable Diffusion 3 VAE latent space
They additionally compute a drifting loss in the Stable Diffusion 3 VAE latent space, which outputs a representation , so it contributes another: local drifting losses.
Total feature-space drifting loss
DINO is used only while constructing the training loss; it is not part of inference. To read more about inference, see section #Inference.
Speculation: Why might drifting in feature-space produce sharper images?
Suppose two generated grippers are shifted by a few pixels.
- A raw pixel distance can be dominated by: lighting, background texture, tiny color difference, blur spread across neighboring pixels.
- 💡 DINO features are more responsive to meaningful visual structure such as -
- "this patch contains the gripper tip"
- "this is an object boundary"
- "this region contains the manipulated object"
- 🔑 So the kernel neighborhood is based on perceptual or semantic similarity rather than only exact RGB correspondence.
Different drifting space representations considered
- RGB pixels: exact colors and pixel alignment
- VAE latents: compressed visual appearance useful for reconstructing the image
- The VAE was trained to encode enough information to reconstruct images, so its latent geometry strongly retains appearance, texture, color, and local detail. But Euclidean distance in that latent space is not guaranteed to be an ideal perceptual metric.
- DINO features: higher-level visual structure and semantic/perceptual similarity
- DINO was trained as a visual representation model, so its features tend to organize images more according to recognizable structure and content.
- 🔑 The ablation shows that using only the VAE-latent drifting loss leads to blurrier results than adding DINO.
Tallying all fields and losses for one training condition
Consider one real-world training example, e.g. one Bridge-V2 transition.
- It has one condition:
- It has:
- one positive future
- generated particles
DINO branch
Each generated and real image becomes . there are spatial locations.
- At each spatial location :
- the positive is one vector
- each particle provides
- 💡 intuitively, is DINO's description of what appears in that region of particle 's generated image
- the negative population contains the generated vectors, plus possibly the no-action vector
- 🔖 For each generated particle , at every location , compute a drift: ^ this is one vector
- So for the DINO branch, the number of particle-location drift evaluations is: .
- 🔑 At spatial location , the drifting field is a function defined over the 768-dim. DINO feature space. Evaluating that field at particle 's feature vector gives , a 768-dim. instruction telling that particular feature vector how to move toward the ground-truth feature and away from nearby negative generated samples.
- Its local loss is:
- Then average over particles and take a motion-weighted average over locations:
Mermaid diagram:
VAE-latent branch
Each image's VAE latent has shape ; there are locations. For each particle and latent location: The latent loss is:
DINO + VAE combined
where each local loss (local in the sense that this is a local spot on the global image) is a weighted mean over all generated particles .
Recap: What is the field?
The field at location is a function where for DINO and for the VAE-latent.
- 💡 specifies: "For any possible (DINO/VAE) feature vector at this image location, here is the direction in feature space that it should move."
- The generated particle supplies the query point → evaluating the field there gives a single vector
- is the field
- is the single arrow obtained by evaluating the field at particle
How to interpret the drift target?
Recall the drift target is
- 💡 The vector essentially answers - "How should DINO/VAE-latent's representation of this generated patch change so that it becomes more like the correct future patch and less like the wrong generated patches?"
Architecture
U-Net
The generator is a U-Net. It takes Gaussian noise + history observations + future actions and produces a predicted future video. Mathematically: Unlike diffusion, they do not run this U-Net repeatedly at many noise levels → it runs once!
- For simple datasets: the output is directly an RGB video.
- For complex real-world datasets: the U-Net operates in the latent space of a Stable Diffusion 3 VAE:
How history enters the U-Net
History observations are concatenated channel-wise with the Gaussian noise: for one predicted time index , this is conceptually:For latent-space operation, replace each with its VAE latent : The history therefore supplies the scene appearance and current physical state directly to every future-frame stream.
Shapes
- = number of independent training conditions in the minibatch
- = number of generated particles per condition
- = number of predicted future frames
- = number of history frames
- = channels per image or latent frame
- = spatial dimensions
- = action dimension
Omitting : The history must be supplied to every particle and predicted time index.
- Flattening history along the channel axis: Broadcast it across particles and future indices:
- Concatenate with noise: where is the initial input to the U-Net (noise + history input vector).
Spatial-temporal U-Net blocks
At an intermediate U-Net layer, the network no longer stores RGB pixels: it stores learned features , for layer : where:
- = batch size
- = predicted video frames
- = feature channels at U-Net layer
- = spatial height at that layer
- = spatial width at that layer
In this paper, U-Net convolutions are factorized into two operations: spatial and temporal.
Spatial convolution
Apply the same 2D convolution independently to each time index: this learns the spatial patterns inside each image, such as the edges, robot geometry, object shapes, and local contacts.
Temporal convolution
Then, at each spatial location , apply a temporal convolution across frames: this communicates information across time, such as where the gripper was in nearby frames, whether the object is moving, and temporal continuity.
Combined convolution
Thus a factorized block is approximately: This is cheaper than a full 3D convolution over , while still modeling both spatial appearance and temporal evolution.
- factorized - in that instead of doing a full , we've factored the two pieces into and
Action-conditioning with FiLM
- 💡 How FiLM gives frame action
Frame-wise FiLM is the mechanism behind how actions modulate future-frames in this model → how the conditioning on actions occurs.
- First, each action receives an embedding:
- At each U-Net residual block , another learned projection turns that embedding into scale and shift vectors:
- If the block's normalized feature map for frame is: ... FiLM applies The vectors are broadcast across the spatial dimensions.
- 💡 The important indexing is: So frame does not initially receive a pooled summary of the entire action chunk: it receives modulation derived from its corresponding action.
In tensor form:
The shared time index is the mathematical reason that action modulates future-frame stream .
- ⚠️ ^It is not a guarantee that the network will obey the action - it could still learn to ignore FiLM - but the architecture provides a direct, aligned conditioning path, and the drifting/motion-weighting losses penalize ignoring it.
- 🔖 2 explicit mechanisms where the loss penalizes ignoring actions:
- No-action negative: the negative repulsion term pushes the model to not ignore actions (i.e. predict something that resembles no actions)
- Motion-weighted local losses: increases the contribution of moving locations → optimization pressure to follow the actions
- 🔖 2 explicit mechanisms where the loss penalizes ignoring actions:
FiLM vs. AdaLN
FiLM is a generalized version of AdaLN: both use conditioning information to produce an affine transformation:
- FiLM: The basic FiLM equation is: It may be applied to convolutional features, with or without a normalization immediately before it.
- AdaLN: Adaptive LayerNorm is a normalization-specific (LayerNorm) form of conditional affine modulation:
- 📍 The DriftWorld paper only says that it uses F
Feature map
Let be the concatenated noise and history input, see section #Shapes.
- The first U-Net layers transform it:
- ... and so on
= the intermediate activation tensor after some U-Net layer or residual block with shape:
- A "normalized feature map" would mean something like:
The full architecture
- Gaussian video noise
- History frames concatenated channel-wise
- Action MLP
- U-Net encoder
- Residual blocks with frame-wise FiLM
- Factorized spatial and temporal convolutions
- Attention at selected resolutions
- U-Net bottleneck
- U-Net decoder with skip connections
- Output RGB frames or VAE latents
- Optional VAE decoder for real-world datasets
- During training only, DINO/VAE feature extraction for the drifting loss
The reported U-Net configurations are:
| Dataset group | Parameters | Base channels | Channel multipliers | # res blocks | Attention resolutions | # negative samples | Feature extractor | Temperatures |
|---|---|---|---|---|---|---|---|---|
| Push-T | 8.73M | 96 | 2 | 8 | None | |||
| Robomimic | 74.2M | 96 | 2 | 32 | None | |||
| Bridge-RT-1/Language Table | 160M | 160 | 2 | 64 | Dinov3 |
Compact math summary: The U-Net makes the video; the DINO defines a better geometry for telling the U-Net how its generated samples should drift during training.
Mermaid diagram
Inference
Inference steps
Training vs. inference: DINO
During training
For a generated latent , the pipeline is approximately: The ground truth image also passes through DINO: The DINO features are used to compute the training drift and loss: . Gradients then flow back through the generated-image path to train the U-Net.
At inference
There is no ground-truth future and no training loss to compute at inference! Therefore no DINO comparison is needed.
The inference pipeline is only: So at inference, we use:
- VAE encoder for history images, when operating in latent space
- the trained action-conditioned U-Net
- the VAE decoder for the predicted future latents
- 💡 DINO is a training-time teacher/metric, not part of the deployed generator
- Analogy: we train the student using a detailed answer key, but the student does not carry the answer key during the exam.
Training specifics
TL;DR: For one batch element (problem) : (this is one transition of (image at time ) → (ground truth image at ))
- At each spatial chunk , treat the corresponding features from the generated futures and the one real future as points in feature space.
- Use their kernel similarities to assign each generated point an arrow toward the real point and away from the generated/no-action cloud.
- Train the U-Net so its generated features moves by that arrow.
- Average these local losses over particles and spatial locations, then combine the independent losses across the batch.
My raw unedited summary: We take one spot on the image, the feature latents of this same patch for all generated samples and the positive sample + kernel, use those points + kernel which weights the attraction/repulsion based on feature-space proximity to form a vector field function that pulls the generated → true point & pushes generated points away from each other / no action, and then apply that vector to each of the generated points to show the displacement that would occur in one drift step (weighted by some ), and then do MSE on the actual particle - (particle + drift update). And then we sum up the MSEs across all (average? 1/ N_neg?) and do this for all spots. And then do this over all problems in batch .
One training step
From the paper:
When training on a batch of videos, we perform this step (Algorithm 1) independently for each video. Since every video contains a unique sequence of history observations and actions, the model must compute distinct independent conditional drifting fields. Within each of these fields, the drift is calculated using a single positive sample (the ground-truth future frames) and negative samples (the model's generated future frames). The total loss is the sum of the individual losses in the batch.
- 🔑 Walking through these steps in more detail: Suppose the batch contains different training videos.
- Batch element has its own condition: and one ground-truth feature , generated futures .
- Because different videos generally have different scenes, histories, actions, and correct futures, the field for video is constructed only from: It does not use the positive or generated samples belonging to another batch element . So at the broadest level:
- Then the full batch contains: → these are the aforementioned " distinct, independent conditional drifting fields."
- Independent in the sense that only uses samples conditioned on .
- ❓ Why must the drifting fields be separate?
- Imagine batch element 1 is = "kitchen scene, move gripper right" and batch element 2 is = "table scene, move gripper left"
- 💡 It would make no sense for particle generated for the first scene to be attracted toward the ground-truth future from the second scene.
- 🔖 So the drift for condition 1 uses: and the drift for condition 2 uses: → that is conditional drifting!
- ❓ How does this fit with our analysis in Section #Feature space drifting?

- 🔑 Note that one conditional vector field is a collection of local feature-space fields:


Normalization
To ensure that the drifting field is insensitive to the raw magnitudes and dimensionalities of samples in the feature spaces, the paper applies two normalizations:
- Feature normalization so that the kernel takes on a reasonable range of values regardless of the samples' dimensionality
- Divide samples by their average pairwise distance
- Then compute the kernel as:
- Normalize the drifting field by its magnitude so that multiple drifting fields can be summed together
Multi-temperature aggregation
After applying normalizations (#Normalization), they aggregate the drifting field across multiple kernel temperatures :
Motion weighting
[Read into more.]
Feature extractor
On real-robot datasets, they compute the drifting loss in (i) the feature space of DINOv3 and (ii) the VAE latent space. The total loss is formed by summing these two components.
- DINOv3: grid of -dim. tokens, so we compute separate drifting losses on each of the spatial locations and take their weighted mean to form the overall DINOv3 drifting loss
- VAE-latent: grid of -dim. tokens, so we compute separate drifting losses on each of the spatial locations and take their weighted mean to form the overall latent drifting loss
Self-forcing
Model training of DriftWorld occurs in 2 stages:
- Condition DriftWorld on the ground-truth history frames
- Initialize from stage 1 checkpoint^ and train by letting DriftWorld generate autoregressively, taking its own generated frames (with gradient detached) as input. Each of the generated negative samples continues its own rollout.
Post-training on on failure demonstrations
For the Robomimic Lift and Can tasks, DriftWorld is initially trained on the multi-human dataset, which contains only successful demonstrations → i.e. the model is trained on a biased distribution with overly optimistic estimates of policy success.
- 🔑 They post-train the models (DriftWorld + baselines) on a dataset with a large percentage of failure demonstrations, which is created by rolling out early checkpoints of a diffusion policy.
- This enables the models to accurately simulate failures (since a good world model should simulate what actually would happen, which can consist of success and failure).
Data
| Task | Number of trajectories |
|---|---|
| Push-T | 500 expert demonstrations + random-exploration trajectories (does not say number) |
| RT-1 | 87,212 |
| Language Table | 442,226 |
| Robomimic | 700 trajectories for each of Lift, Can, and Square, so total |
| Note that one trajectory yields many training windows: from one long video they can sample many tuples of the form: so the actual number of training examples seen by SGD is much larger than the raw trajectory count. |