Part of World Models Handbook
Explains how world models are pretrained on diverse data, post-trained with preference objectives.
Choose your expertise level to adjust how many terms are explained. Beginners see more tooltips, experts see fewer to maintain reading flow. Hover over underlined terms for instant definitions.
Article links
Make inline references clickable
Pretraining, Post-Training, Scaling, and Adaptation
Real-world models are rarely trained once on one task from one data source. They are built in stages. A large pretraining phase consumes heterogeneous data across environments, embodiments, and modalities. A post-training phase reshapes the model so its rollouts support the decisions an agent will make. An adaptation phase specializes the pretrained model to a particular robot, task, or user, often with only a small amount of new data. This chapter is about that pipeline.
Why use a pipeline at all? Training a separate model for every application repeats representation learning and prevents data sharing. Pretraining can amortize that cost when source and target systems share useful structure. Post-training then changes what the model is optimized to do, while adaptation fits the remaining target-specific differences. Keeping those operations conceptually separate also makes failures easier to diagnose.
Suppose a team has simulation, passive video, and a small amount of target-robot interaction. A staged workflow lets it test three separate questions: whether the broad mixture learns a transferable representation, whether a control-oriented objective improves decisions, and how much target data adaptation needs. Source diversity helps only when it contains structure relevant to the target, so each stage needs its own held-out evaluation.
The three stages have different objectives and different failure modes.
- Pretraining is a data-hungry, compute-hungry phase. Its job is to absorb broad structure: how objects move, how contact works, how different sensor modalities relate to one another. Its failure modes are data contamination, memorization of spurious correlations, and evaluation that rewards surface-level fit rather than transferable structure.
- Post-training is a preference-and-goal-driven phase. Its job is to shape a general predictor into a model whose rollouts are useful for control, not merely accurate on average. Its failure modes are reward hacking, distribution collapse, and loss of the very diversity that made the pretrained model valuable.
- Adaptation is a specialization phase. Its job is to make the model work on a specific target distribution with few samples. Its failure modes are overfitting, catastrophic forgetting, and negative transfer when the target is far from the pretraining distribution.
Each stage optimizes a different quantity. Pretraining minimizes average prediction error over a broad data mixture. Post-training minimizes a scalar downstream signal, such as reward, cost, or preference. Adaptation minimizes error on a narrow target distribution using few samples. These quantities can conflict: a model optimized for one stage may be suboptimal for another.
The stages are not always separated in practice. Some models are pretrained and adapted directly; others undergo reinforcement-learning post-training without later adaptation. The conceptual separation still matters because the objectives differ. A post-trained model can have worse held-out prediction error yet produce better closed-loop decisions, so both quantities need to be measured.
This chapter develops the vocabulary and design tradeoffs needed to reason about the pipeline. It covers scaling, task conditioning and adaptation, preference and control-oriented post-training, and transfer across embodiments. A worked implementation then pretrains a small task-conditioned dynamics model, adapts it to a new system with a few trajectories, and demonstrates a preference loss.
The material builds on Part VI: Learning World Models at Scale and prepares you for Part VII: Planning and Agency, where an optimizer consumes the model's predictions.
Scaling data, parameters, context, and compute
For autoregressive language models studied within a fixed model and data family, held-out loss often follows a smooth empirical trend with the number of model parameters and training tokens . This is not a theorem, and the fitted law does not automatically transfer to a different architecture, modality, or world-model objective. For world models, it is best treated as a budget-planning hypothesis to test with a small scaling ladder.
If a fitted law predicts loss within its measured range, it can compare candidate runs before paying for each full experiment. For example, it can test whether a fixed FLOP budget favors more parameters or more data. The fit makes the assumed tradeoff explicit; short runs near the proposed allocation must still verify it.
The shape of a scaling law
A useful form, closely related to the empirical language-model scaling laws studied by Kaplan et al. (2020), is a sum of power-law terms:
where:
- : the number of model parameters
- : the number of training tokens (or transitions)
- : a critical model size that sets the scale of the parameter term
- : a critical dataset size that sets the scale of the data term
- : the exponent governing how quickly the parameter term decays as the model grows
- : the exponent governing how quickly the data term decays as the dataset grows
- : the irreducible loss floor
Each term has a meaning.
- The parameter term is the fitted contribution that shrinks as the model grows. It may reflect limited model capacity, but the empirical decomposition does not identify a unique causal source of error.
- The data term is the fitted contribution that shrinks as the dataset grows. It may reflect finite-data effects, including estimation error and incomplete coverage.
- The floor is the asymptote of this fitted model. Its value depends on the data distribution, representation, model family, optimizer, and loss; it is not necessarily an intrinsic constant of the environment.
The separation is a diagnostic within the fitted regime. If the parameter-dependent contribution dominates, a larger model is one candidate intervention. If the data-dependent contribution dominates, more or better-covered data is one candidate. If measured loss is close to the fitted floor, simply extending the same scaling path is predicted to yield little improvement; changing the representation, data distribution, model family, or loss may move that floor. These are hypotheses for follow-up experiments, not causal conclusions supplied by the curve fit.
In Kaplan et al.'s fitted form, and . Exponents of that size imply slow improvement in each isolated term: a tenfold increase in the associated resource reduces that term by about 10 to 20%, and halving it requires a thousandfold to millionfold increase. Other fits use different definitions and exponents, so compare the predicted loss change rather than the raw exponent alone.
import matplotlib.pyplot as plt
import numpy as np
import torch
import torch.nn as nn
from scipy.optimize import minimize
rng = np.random.default_rng(0)
torch.manual_seed(0)The sum-of-power-laws form makes the two fitted contributions trade off. For a fixed compute budget (a common approximation for dense transformer training), you can choose a larger model trained on fewer tokens or a smaller model trained on more. Hoffmann et al. (2022) estimated approximately equal scaling of model size and training tokens in their studied language-model regime. Their 70-billion-parameter Chinchilla model used 1.4 trillion tokens, a ratio of about 20 tokens per parameter. That ratio describes one empirical regime and should not be treated as a universal constant; “too much” or “too little” data is meaningful only relative to a fixed compute budget and a validated scaling fit.
The Chinchilla result changed how language-model researchers reason about fixed-compute allocation: in those experiments, rebalancing compute toward more training tokens produced a smaller model with better loss than larger under-trained alternatives. Its durable lesson is methodological rather than numerical. Estimate the balance point for the architecture, data, and objective at hand instead of importing a token ratio from another setting.
For world models, the analogue of “tokens per parameter” is not obvious. A transition has different structure from a text token, adjacent transitions are dependent, and interaction data may be costly to collect. Here is the state at time , is the action, and is the next state. Collection cost and training FLOPs are separate constraints: an expensive transition does not by itself change the compute optimum, but it can make the data-optimal point infeasible. Applying scaling ideas responsibly therefore requires a domain-specific definition of , a coverage measure, and an explicit collection budget.
What is different for world models
The scaling picture for world models differs from language in several important ways.
Sequential dependence changes the meaning of data scale. Both text and interaction corpora contain dependent observations, but trajectories can exhibit especially strong temporal correlation and policy-dependent coverage. Adjacent transitions may add less information than transitions from distinct states, tasks, or embodiments. Consequently, raw transition count is an incomplete proxy for effective dataset size. A useful scaling study should report together with trajectory diversity, state-action coverage, and the data-collection policy.
Context length is a separate experimental axis. A longer history can expose information needed for partially observed or delayed dynamics, but it also changes memory cost, optimization, and the distribution of training windows. More context helps only when the additional history is informative and the model and dataset support it. For that reason, context length should be varied and measured alongside and , rather than assumed to translate directly into a particular planning horizon.
Action and embodiment coverage are additional axes. Beyond , , and , a world model must cover relevant action spaces, embodiments, and dynamics regimes. Diverse pretraining can improve transfer when the target shares structure with the source mixture, although diversity is not a substitute for target-relevant coverage. Scaling studies should therefore distinguish the number of transitions from the breadth and balance of environments that generated them.
Stochasticity and multimodality matter. Next-token prediction and next-state prediction can both be multimodal. For a proper probabilistic loss, irreducible uncertainty under the chosen observations and targets contributes to the attainable loss; for point losses, multimodality can instead produce averaged predictions. A fitted also absorbs representation and model misspecification. Distributional prediction, better observations, or a different target can therefore change the measured floor.
Emergence and the practical meaning of scaling
Scaling curves are usually plotted on log-log axes, where a single power-law term appears linear. Thresholded capability metrics can nevertheless show step-like jumps. For example, if a planning benchmark awards credit only after a rollout crosses a fixed success threshold, a smooth change in predictive quality can look discontinuous. Such a plot is evidence about the metric and experiment, not proof that planning ability itself appeared discontinuously.
The emergence picture is contested. Schaeffer et al. (2023) showed that some reported jumps can arise from nonlinear or discontinuous metrics applied to smoothly improving models. That result does not rule out every discontinuity. For world models, test both continuous quantities and task success across several scales before assigning a mechanism to an apparent threshold.
Compute budgets and the practical frontier
In practice, a pretraining run is constrained by a compute budget and a wall-clock budget. The standard prescription is:
- Estimate the scaling exponents on a small set of runs (the "scaling ladder").
- Fit the exponents , , , , .
- Choose and to minimize the predicted loss subject to .
- Spend the remaining budget on a longer run at the chosen .
The fitted exponents are only trustworthy within the range of the ladder. Extrapolating a power law fitted on to parameters out to parameters is an act of faith, not a calculation. Still, the exercise is useful because it forces you to state your assumptions explicitly and to notice when a proposed training run is far from the predicted frontier. Beyond that, the process is a mechanism for organizing disagreement. When two engineers propose different training runs, they can point at the fitted law and ask which run is closer to the frontier and which assumption is being challenged. That conversational clarity, more than the numerical prediction, is often the real return on investing in a scaling ladder before committing to a large run.
Task adaptation and instruction conditioning
Pretraining gives you a general model. Adaptation makes that model specific. The central question of adaptation is how to inject task information into a pretrained model without destroying what the pretraining learned. There are three broad families of answers: full fine-tuning, parameter-efficient fine-tuning, and conditioning. Each family represents a different bet about how much of the pretrained model needs to change for the target task, and each has different costs in memory, compute, and risk of forgetting.
Why adaptation is not just fine-tuning
The naive approach is to take a pretrained model and continue training it on data from the new task. This works, but it has two well-known problems.
Catastrophic forgetting. Target-only updates can reduce performance on previously learned tasks, especially when their data are absent during adaptation. The amount of forgetting depends on task similarity and the training protocol; it should be measured on retained source evaluations rather than inferred from target performance alone. Methods such as elastic weight consolidation were developed to reduce this failure mode.
Sample efficiency. Full fine-tuning exposes every weight to the target loss. With a small target dataset, this gives the optimizer many ways to fit idiosyncrasies rather than reusable structure. Whether overfitting occurs depends on the initialization, regularization, learning rate, and validation protocol, but early stopping and source-retention checks are especially important in this regime.
Both problems motivate restricting which parameters are updated. The natural question becomes: how much of the model needs to change? If the answer is "much less than all of it", then the two problems above collapse into a much smaller version of themselves.
Parameter-efficient adaptation
The idea behind parameter-efficient fine-tuning (PEFT) is to update a small number of parameters while keeping the pretrained backbone frozen. A widely used method is LoRA (Hu et al. 2021). For a frozen linear layer with weight matrix , LoRA adds a low-rank update:
where:
- : the frozen pretrained weight matrix
- : the adapted weight matrix
- : the input dimension of the frozen layer
- : the output dimension of the frozen layer
- : the first trainable low-rank factor
- : the second trainable low-rank factor
- : the rank of the update
- : a scaling constant
- : the low-rank update added to the frozen weights
Only and are updated. The forward pass becomes
where:
- : the output of the adapted linear layer
- : the input vector to the linear layer
- : the frozen pretrained transformation
- : the low-rank adaptation applied to the input
LoRA assumes that a useful weight update can be represented at low rank. Hu et al. (2021) found this parameterization effective for adapting large language models, but it is not guaranteed for every layer or domain. A physical system may vary along only a few latent factors, such as mass or damping, yet a nonlinear network can still require a higher-rank weight change to represent their effect. Rank is therefore an empirical capacity choice, not a consequence of the physical parameter count.
Other PEFT methods include:
- Adapters: small bottleneck MLPs inserted between frozen layers.
- Prefix and prompt tuning: learnable vectors prepended to the input or to attention keys and values.
- Bias-only tuning: updating only the bias terms.
- IA and related methods: scaling the activations of frozen weights by learned vectors.
Each has different tradeoffs in expressiveness, memory, and inference latency. LoRA is a common default because it adds no inference latency when merged back into . Adapters are easy to stack and interpret, prefix tuning avoids touching the weight matrices entirely, and bias-only tuning is the cheapest of all but also the least expressive. In practice, the choice between them is often dominated by the deployment constraints: if you need to serve dozens of adapted variants from a single base model, LoRA's ability to merge into the base weights or sit as a small sidecar is usually decisive.
Instruction conditioning
A complementary approach is to condition the model on task information rather than modifying its weights. This is what language models do when they are prompted. The model is unchanged, but the input carries a description of what to do. Conditioning is appealing because it can be applied without any gradient updates at all, provided the pretrained model has learned to interpret the conditioning signal during pretraining.
For world models, instruction conditioning comes in several flavors.
- Task identifiers. A learned embedding per task, concatenated to the model's input. This is the simplest form, and it is what our worked example uses.
- Natural language instructions. A text description such as "this robot has a soft gripper and a heavy base", encoded and used as a conditioning vector. This can describe a new task without fitting a task ID, provided pretraining taught the model how those descriptions relate to dynamics.
- Goal specifications. A target state, a set of constraints, or a reward function, passed to the model as input. This is the foundation of goal-conditioned policies and goal-conditioned world models.
- Demonstrations. A few example transitions in the context window. This is in-context learning, and it is the most flexible form of adaptation because it requires no weight updates at all.
Instruction conditioning shifts work into pretraining. The model must see enough paired descriptions and dynamics to learn how the signal should affect predictions. If the signal omits a task-relevant distinction, two different systems become indistinguishable to the predictor. Conversely, a high-capacity descriptor is useful only when the data identify how each part should be used; otherwise the model may ignore it or fit spurious correlations. Generalization to a newly described task must be measured rather than assumed.
Task conditioning changes the model's input. Task adaptation changes the model's weights. Conditioning is cheap at adaptation time but requires the model to have been trained to interpret the signal. Adaptation can fit new structure but risks forgetting and needs target data. The two can be combined: a pretrained model receives a task descriptor, with a small adapter added when the descriptor alone is insufficient.
Meta-learning and the few-shot limit
Another approach is meta-learning: training an initialization so that a small number of gradient steps can adapt it to a task. The classic formulation is MAML (Finn et al. 2017), which optimizes the initialization through one or more task-specific gradient updates. For world models, this directly targets a regime where interaction data is scarce, provided the meta-training task distribution represents the deployment tasks.
Meta-learning depends on the distribution of tasks used during meta-training. A target outside that distribution can erase its advantage over ordinary fine-tuning. Original MAML differentiates through the inner adaptation step, while first-order variants approximate or omit those second-order terms. The general lesson is that rapid adaptation is itself learned under a task distribution and must be evaluated under the shifts expected at deployment.
Preference and control-oriented post-training
Pretraining gives you a model that predicts the world. Post-training gives you a model that predicts the world in a way that is useful. The difference is subtle but has practical consequences. A pretrained model optimizes average prediction error. A post-trained model optimizes whatever the downstream decision-maker cares about. These are rarely the same objective, and the gap between them is what post-training exists to close.
The mismatch between prediction and control
Consider a world model used inside a model predictive controller. The controller samples action sequences, rolls them out under the model, and picks the sequence that minimizes a cost. The model must rank candidate sequences well near the optimum, not merely minimize average one-step error. Correlated model bias is especially dangerous because an optimizer can repeatedly exploit it. Zero-mean noise may average out under repeated sampling, but it can still harm ranking when samples are few or costs are nonlinear.
This is the same mismatch that motivates the decision-aware learning literature and the model-based RL objectives we discussed in Part II: Inference, Decisions, and Control. The point here is that post-training is the stage where you close that mismatch, by optimizing the model against a decision-relevant signal. Recognizing which quantity the downstream controller is sensitive to, and shaping the model's loss accordingly, is the central design question of post-training. Sometimes this means reweighting the loss; sometimes it means adding an entirely new term; sometimes it means training against a preference signal that is only available through comparison. All of these techniques are ways of pushing the model's errors into regions the planner does not care about.
Supervised fine-tuning and instruction tuning
A post-training pipeline can begin with supervised fine-tuning (SFT) on curated data. For a world model, SFT data might be:
- High-quality trajectories from expert demonstrations.
- Transitions from tasks that resemble the target deployment.
- Synthetic rollouts from a trusted simulator.
- Instruction-conditioned examples, where the model learns to map a task description to the right dynamics.
Plain output-likelihood SFT teaches the conditional distribution represented by its examples. It does not explicitly express a pairwise preference between two plausible outputs unless the training format includes that comparison. Preference data adds this supervision, although curated demonstrations can encode some of the same behavior indirectly.
Reinforcement learning from human feedback
To teach preferences, one pipeline is reinforcement learning from human feedback (RLHF), demonstrated for complex behaviors by Christiano et al. (2017) and later applied to instruction-following language models by Ouyang et al. (2022). The pipeline has three stages.
- Collect comparisons. Show a human two candidate model outputs (two rollouts, two predicted futures, two action sequences) and ask which is better.
- Fit a reward model. Train a scalar function that predicts the human preference.
- Optimize the policy against the reward model. Use reinforcement learning (typically PPO) to update the model so it produces outputs the reward model likes.
For a generative world model, compared outputs could be trajectories or predicted futures, and “better” must be defined for the deployment. Human comparisons can supply that label. Automatic signals such as task success, controller cost, or constraint violations instead create proxy-feedback preference data; they are not human feedback merely because the same optimization template is used. Either source can be misspecified, so held-out closed-loop evaluation remains necessary.
Direct preference optimization
RLHF requires fitting a reward model and then running an RL optimization loop. Direct Preference Optimization (DPO, Rafailov et al. 2023) shows that, under its reward-model and KL-regularized policy assumptions, you can optimize the corresponding preference objective without fitting an explicit reward model.
Given a preferred output and a rejected output for the same input , and a reference model (usually the SFT model), the DPO loss is
where:
- : the DPO loss for policy parameters
- : the parameters of the policy being trained
- : the expectation under the data distribution over conditioning input , preferred output , and rejected output
- : the conditioning input (for example, a task description or state history)
- : the preferred (winning) output
- : the rejected (losing) output
- : the logistic sigmoid function
- : a temperature-like parameter controlling the strength of the implicit KL penalty
- : the probability of output under the current policy given conditioning input
- : the probability of output under the frozen reference model given conditioning input
The ratio compares how much more the current model prefers the winning output than the reference does. The same ratio for does this for the losing output. The difference between these log-ratios is scaled by and passed through a sigmoid, so the loss is small when the model already prefers .
The intuition is that DPO increases the relative log-probability of preferred outputs over rejected ones, while a KL-like penalty (implicit in the reference model) keeps the policy from drifting too far from the pretrained model. The parameter controls the strength of that penalty. A small imposes a weak implicit KL penalty and lets the model separate winning from losing outputs more aggressively; a large imposes a stronger penalty and keeps the policy closer to the reference model. In practice, is one of the most consequential hyperparameters in a DPO training run, and it is worth tuning as carefully as the learning rate.
DPO avoids a separately fitted reward model and can be implemented with a supervised-style loop. Applying it to world-model outputs requires a normalized conditional likelihood, or an explicitly justified surrogate, for each compared sequence. Preference pairs might come from expert and baseline rollouts or human comparisons; how they are labeled determines what the model will learn.
Control-oriented objectives
The most direct form of post-training is to optimize the model against the actual control objective. Several variants exist.
- Value-aware training. Train the model so that the value function computed from its rollouts matches the true value. This makes the model useful for policy optimization even if its per-step predictions are imperfect.
- Cost-aware training. Weight the prediction loss by the sensitivity of the downstream cost to prediction error. Regions where the planner is sensitive get more weight.
- Adversarial and robust training. Train the model to be accurate on the worst-case action sequence, not the average one. This reduces model exploitation, where the planner finds a sequence that looks good under the model but fails in reality.
- Constraint-aware training. Penalize predictions that violate known physical or safety constraints, even when the data does not contain such violations.
All of these objectives treat the model as a component of a decision system. Closed-loop performance is therefore the primary test of decision usefulness, while open-loop prediction metrics remain valuable diagnostics for calibration, coverage, and failure analysis. A model with worse average prediction error can still produce better decisions if its errors are better aligned with the planner's sensitivities.
Process versus outcome supervision
A final distinction that matters for post-training is process versus outcome supervision.
- Outcome supervision labels the final result. It can be easy or difficult to collect depending on the task, and it leaves ambiguity about which intermediate decisions caused the outcome.
- Process supervision labels intermediate predictions or decisions. When reliable intermediate targets are observable, it can provide denser credit assignment, but collecting or validating those targets may be costly.
For world models, an observed transition supplies a next-observation target, so logged trajectories can provide dense supervised signals. Those signals are not free: interaction may be expensive, sensors may be partial or noisy, and the observed next state need not reveal the latent state a planner requires. Dense one-step supervision also does not remove the evaluation mismatch: a model can predict one step well and still accumulate harmful rollout error.
Transfer across embodiments and domains
An additional scaling problem in world modeling is transfer: making a model trained on one robot or simulator work under a different embodiment or domain. This section covers the main strategies and their conditions.
What makes transfer hard
A world model trained on one embodiment has implicitly learned that embodiment's dynamics. The learned dynamics are a function of the robot's mass distribution, actuator limits, sensor noise, and contact properties. When you move to a new embodiment, some of these change dramatically and some stay the same. The model must distinguish the two. Because the model has no way of knowing in advance which aspects of dynamics are shared and which are specific to the training embodiment, it has to learn that distinction from data. This is what makes transfer both possible (because there is shared structure) and hard (because separating shared from specific is not trivial).
The general problem is a distribution shift over the joint distribution of states, actions, and transitions. There are three qualitatively different cases.
- Observation-distribution shift. The physical dynamics stay fixed, but the distribution or encoding of observations changes. A new sensor-noise process is one example. If only the input marginal changes while the predictive conditional remains fixed, this is the narrower statistical case usually called covariate shift.
- Dynamics shift. The transition function changes but the state and action spaces do not. Example: a robot with the same body but a different payload. Adaptation requires updating the dynamics.
- Structural shift. The state space, action space, or morphology changes. Example: moving from a wheeled robot to a quadruped. Adaptation requires reinterpreting the state and action representations, which is qualitatively harder.
The cases suggest different interventions, but their difficulty is empirical. An observation shift may be handled by recalibration when the underlying state remains recoverable. A dynamics shift may suit a compact adapter or task descriptor when the source representation already spans the target variation. Structural shift usually requires explicit interface alignment or architectures that support heterogeneous inputs and outputs.
Cross-embodiment learning
The Open X-Embodiment collaboration pooled data from 22 robot embodiments. Its RT-X experiments reported positive transfer from cross-embodiment co-training on several evaluated robots, while also documenting cases where co-training hurt particular tasks. This is evidence that a shared mixture can help, not a guarantee for an unseen platform.
For cross-embodiment learning to work, three things need to be aligned.
- State representation. Different robots report different state vectors. The model must map them into a common space, either by hand-designed normalization or by a learned encoder.
- Action space. A robot arm has a different action space than a mobile base. Common strategies include using a shared low-level action interface, learning a latent action space, or conditioning the model on an embodiment descriptor so it can interpret actions differently per embodiment.
- Observation space. Camera images are easier to place in a common tensor format than robot-specific proprioception, although viewpoint, calibration, and appearance still vary. Proprioceptive inputs require their own alignment or embodiment-specific encoding.
The action-space question connects directly to the latent action material from Part VI: Learning World Models at Scale. A learned latent action space is one way to share structure across heterogeneous interfaces. Its success depends on paired behavior that identifies comparable effects; different embodiments need not admit the same latent control axes. A standardized low-level interface or embodiment-specific decoder may be more reliable when such correspondence is weak.
Domain randomization and sim-to-real
When the target domain is the real world and the source domain is a simulator, domain randomization samples simulator parameters such as masses, friction, sensor noise, or appearance during training so that deployment may fall within the trained distribution (Tobin et al. 2017).
Domain randomization is more likely to transfer when:
- The randomization covers the true parameters.
- The model has enough capacity to represent the whole randomized family.
- The task is robust to the specific realization of the parameters.
Parameter randomization cannot cover structural errors that are absent from the simulator family—for example, a contact mode the simulator never represents. Real-world adaptation can correct residual error that the chosen model class can express, but it does not guarantee recovery from arbitrary simulator misspecification. The simulator ranges and the amount of real data should therefore be validated against deployment behavior.
The role of embodiment descriptors
A simple and effective technique for cross-embodiment transfer is to condition the model on a compact description of the embodiment. This is the same idea as task conditioning, but the conditioning signal is specifically about the robot.
Embodiment descriptors can be:
- Hand-designed. Mass, dimensions, degrees of freedom, actuator types.
- Learned. A small embedding trained per embodiment, shared across tasks.
- Inferred. Estimated from a few transitions using an encoder, so that a brand-new robot can be described without any explicit metadata.
Inferred descriptors avoid requiring complete metadata: an encoder maps a short history of transitions to a latent system representation. This is a form of latent system identification. The inferred factors are identifiable only to the extent that the observed actions excite the relevant dynamics and the history contains enough information. They may absorb nuisance correlations or miss hidden factors, so calibration on held-out interventions remains important.
Negative transfer and how to avoid it
Transfer is not always positive. When source representations or priors are poorly matched to the target, a pretrained model can perform worse than a target-only baseline under the same adaptation budget. The outcome depends on initialization, optimizer, regularization, and data, so it is not necessarily slower than scratch at every point; the comparison must be measured on the target protocol.
The main defenses against negative transfer are:
- Data mixing. Train on source and target together, with a mixing ratio that reflects the importance of each.
- Rehearsal. Keep a small buffer of source data and replay it during target adaptation.
- Elastic weight consolidation. Penalize changes to parameters that were important for the source task.
- Conditioning. Give the model enough task information that it can choose to ignore the source prior when the target demands it.
These defenses address different failure modes. Rehearsal preserves measured source behavior, conditioning separates task-specific regimes when the descriptor is informative, and regularization limits selected parameter changes. Their value depends on the target-data budget and the kind of shift, so a target-only baseline and source-retention evaluation should accompany the choice.
Worked Example: Pretraining and Adapting a Family of Dynamics Models
Let's make the pipeline concrete with a small example. We will work with a family of one-dimensional driven damped point masses. Each "embodiment" is defined by a mass and a damping coefficient , and the state is a two-vector with position and velocity. The transition, using semi-implicit Euler with step size , is
where:
- : the position at time step
- : the velocity at time step
- : the action (force) applied at time step
- : the mass of the point mass
- : the damping coefficient
- : the integration step size
- : the velocity after the update
- : the position after the update
Different pairs behave differently. In the absence of applied force, velocity decays at a rate set by . Because the update contains no restoring force proportional to position, these systems are not oscillators. Our goal is to build a single model that can predict the family and then adapt it to a new parameter pair from a small target dataset.
The pipeline has three stages.
- Pretrain a task-conditioned model on four embodiments. The model sees the state, the action, and a task identifier, and predicts the next state.
- Adapt to a fifth, held-out embodiment using a small number of trajectories. We compare three adaptation strategies: doing nothing (zero-shot, using the mean of the training task embeddings), training only a new task embedding while freezing the network, and full fine-tuning.
- Compare against training a fresh model from scratch on the same small amount of target data.
This example is small enough to run in a few seconds on a CPU, but it captures the essential tradeoffs. The pretrained model has seen many dynamics regimes, so its internal representation is already close to what the new embodiment needs. The from-scratch model has to learn everything from a handful of samples, and it will do poorly. The embedding-only adaptation gets most of the benefit at a fraction of the parameter cost of full fine-tuning.
The scaling-law experiment from the next section gives you the tools to reason about how this picture changes as the pretraining dataset grows. The DPO example at the end shows how to shape the model's outputs with a preference signal, which is the post-training half of the story.
Code Implementation
Let's build the pipeline end to end. We start with a scaling-law fit, then move to the embodiment experiment, then finish with parameter-efficient adaptation and preference-based post-training.
Fitting a scaling law from measurements
We start by generating synthetic loss measurements from a known scaling law, then fitting the exponents back. This mirrors the practical workflow: you measure loss at a small ladder of points and fit a power law to extrapolate. The points are chosen to span multiple orders of magnitude in both axes, since a power law can only be identified if the fit data covers enough dynamic range.
# Synthetic measurements of loss at a grid of (N, D) points.
N_sizes = np.logspace(5, 11, 9)
D_sizes = np.logspace(6, 12, 9)
# Ground-truth constants, Kaplan-style for language.
alpha_N_true, alpha_D_true = 0.076, 0.095
Nc_true, Dc_true = 8.8e13, 5.4e13
L_inf_true = 1.69
N_grid, D_grid = np.meshgrid(N_sizes, D_sizes, indexing="ij")
L_true = (
(Nc_true / N_grid) ** alpha_N_true
+ (Dc_true / D_grid) ** alpha_D_true
+ L_inf_true
)
# Add realistic multiplicative noise to simulate measurement variability.
# A clean 1% noise makes the measured points sit almost exactly on the fitted
# line, which is too clean to be instructive; 3% gives visibly scattered
# measurements while still letting the power law be recovered.
L_obs = L_true * np.exp(rng.normal(0, 0.03, size=L_true.shape))Now we fit the five parameters of the scaling law. We work in log space to keep the optimization well-conditioned.
def fit_loss(params, N, D, L_obs):
log_Nc, log_Dc, log_alpha_N, log_alpha_D, log_Linf = params
Nc, Dc, alpha_N, alpha_D, L_inf = np.exp(params)
L_pred = (Nc / N) ** alpha_N + (Dc / D) ** alpha_D + L_inf
return np.mean((np.log(L_pred) - np.log(L_obs)) ** 2)
x0 = np.log(np.array([1e14, 1e14, 0.1, 0.1, 1.7]))
res = minimize(fit_loss, x0, args=(N_grid, D_grid, L_obs), method="Nelder-Mead")
if not res.success:
raise RuntimeError(f"Scaling-law fit failed: {res.message}")
Nc_hat, Dc_hat, alpha_N_hat, alpha_D_hat, L_inf_hat = np.exp(res.x)Fitted alpha_N = 0.072 (true 0.076) Fitted alpha_D = 0.089 (true 0.095) Fitted L_inf = 1.484 (true 1.69)
Because these synthetic observations were generated from the same functional form, the fitted exponents should be close to their known values. This checks the fitting code; it does not show that a nine-by-nine ladder is sufficient for an unknown real system.

The measured points follow the fitted trend with visible scatter, as expected from the multiplicative noise added above. In real experiments the scatter can be larger and the exponents are estimated with less confidence.
The three terms in the fitted law answer different questions, and their relative size tells you which lever to pull. Splitting the fit at the largest dataset size makes the crossover visible.
# Decompose the fitted scaling law at the largest dataset size.
D_ref = float(D_sizes[-1])
param_term = (Nc_hat / N_sizes) ** alpha_N_hat
data_term = np.full_like(param_term, (Dc_hat / D_ref) ** alpha_D_hat)
floor_term = np.full_like(param_term, L_inf_hat)
When the parameter term sits above the others, growing the model is the intervention this fitted decomposition favors. Once it drops below the data term or floor, extra parameters buy little within the model, and data or a reformulated prediction target becomes the next candidate experiment.
We can do the same thing for the data axis. Now we fix the model size and vary .

The two plots illustrate how a fitted law can compare allocations inside the measured regime. Choosing a compute-optimal allocation then requires minimizing that fitted loss along a fixed-compute constraint; a ratio borrowed from another experiment is only a reference allocation.
The compute constraint is easiest to see in space. Each fixed budget traces a hyperbola. The line below is an illustrative Chinchilla-style allocation rule; it is not the optimum of this synthetic fitted law.
# Allocations where each compute contour intersects the illustrative D = 20N ray.
D_per_param = 20.0
C_budgets = np.array([1e20, 1e21, 1e22, 1e23])
N_ratio = np.sqrt(C_budgets / (6.0 * D_per_param))
D_ratio = D_per_param * N_ratio
Moving along the ray gives a sequence of allocations with a fixed data-to-parameter ratio. To locate this chapter's fitted optimum, you would instead minimize the fitted loss separately along each compute contour and confirm the answer with runs near that point.
A family of embodiments to pretrain and adapt
Now let's build the embodiment family. We define a rollout function for a driven damped point mass, then a dataset builder that stacks transitions across parameter settings.
def transition(state, action, mass, damping, dt=0.1):
x, v = state
v_next = v + dt * (-damping / mass * v) + dt * action / mass
x_next = x + dt * v_next
return np.array([x_next, v_next], dtype=np.float32)
def rollout(mass, damping, n_steps, rng, dt=0.1):
state = np.array([1.0, 0.0], dtype=np.float32)
states = [state.copy()]
actions = []
for _ in range(n_steps):
a = float(rng.normal(0.0, 1.0))
state = transition(state, a, mass, damping, dt)
states.append(state.copy())
actions.append(a)
return np.array(states, dtype=np.float32), np.array(
actions, dtype=np.float32
)Next we define a dataset builder that produces aligned arrays of states, actions, next-states, and task identifiers.
def build_dataset(embodiments, n_traj, n_steps, rng):
S, A, Y, E = [], [], [], []
for i, (m, d) in enumerate(embodiments):
for _ in range(n_traj):
states, actions = rollout(m, d, n_steps, rng)
S.append(states[:-1])
A.append(actions[:, None])
Y.append(states[1:])
E.append(np.full(len(actions), i, dtype=np.int64))
return (
np.stack(S).astype(np.float32), # (n_traj, n_steps, 2)
np.stack(A).astype(np.float32), # (n_traj, n_steps, 1)
np.stack(Y).astype(np.float32), # (n_traj, n_steps, 2)
np.stack(E), # (n_traj, n_steps)
)We split the embodiments into four training systems and one held-out target system.
data_rng = np.random.default_rng(7)
# Choose training embodiments that share the driven damped-system
# structure with the target but differ enough in (m, b) that zero-shot
# transfer is useful but imperfect, leaving room for adaptation to help.
# The target is not adjacent to any single training embodiment.
train_embodiments = np.array(
[
[1.0, 0.3],
[2.0, 1.0],
[0.5, 0.15],
[1.6, 0.5],
]
)
test_embodiment = np.array([[1.2, 0.8]])
# Pretraining data: many trajectories from each training embodiment.
S_tr_traj, A_tr_traj, Y_tr_traj, E_tr_traj = build_dataset(
train_embodiments, n_traj=20, n_steps=30, rng=data_rng
)
S_tr = S_tr_traj.reshape(-1, S_tr_traj.shape[-1])
A_tr = A_tr_traj.reshape(-1, A_tr_traj.shape[-1])
Y_tr = Y_tr_traj.reshape(-1, Y_tr_traj.shape[-1])
E_tr = E_tr_traj.reshape(-1)
# Held-out evaluation data: separate trajectories from the target embodiment.
S_te_traj, A_te_traj, Y_te_traj, _ = build_dataset(
test_embodiment, n_traj=5, n_steps=30, rng=data_rng
)
S_te = S_te_traj.reshape(-1, S_te_traj.shape[-1])
A_te = A_te_traj.reshape(-1, A_te_traj.shape[-1])
Y_te = Y_te_traj.reshape(-1, Y_te_traj.shape[-1])
# Small adaptation dataset: just two short trajectories from the target embodiment.
S_ft_traj, A_ft_traj, Y_ft_traj, _ = build_dataset(
test_embodiment, n_traj=2, n_steps=20, rng=data_rng
)
S_ft = S_ft_traj.reshape(-1, S_ft_traj.shape[-1])
A_ft = A_ft_traj.reshape(-1, A_ft_traj.shape[-1])
Y_ft = Y_ft_traj.reshape(-1, Y_ft_traj.shape[-1])
E_ft = np.full(len(S_ft), 4, dtype=np.int64)The key contrast is between the pretraining data (four embodiments, 80 trajectories) and the adaptation data (one embodiment, two trajectories). The pretrained model has seen a lot of dynamics; the adaptation data is tiny.
Pretraining a task-conditioned dynamics model
We now define a task-conditioned dynamics model. The network takes a state, an action, and a task embedding, and predicts the next state.
class TaskEmbedding(nn.Module):
"""A list containing one trainable embedding vector per task."""
def __init__(self, n_tasks, emb_dim):
super().__init__()
self.emb_dim = emb_dim
self.embs = nn.ParameterList(
[nn.Parameter(torch.randn(emb_dim) * 0.1) for _ in range(n_tasks)]
)
def forward(self, task_id):
return torch.stack([self.embs[int(i)] for i in task_id], dim=0)
class DynamicsModel(nn.Module):
def __init__(self, emb_dim=8, hidden=64):
super().__init__()
self.hidden = hidden
self.net = nn.Sequential(
nn.Linear(3 + emb_dim, hidden),
nn.ReLU(),
nn.Linear(hidden, hidden),
nn.ReLU(),
nn.Linear(hidden, 2),
)
def forward(self, s, a, e):
return self.net(torch.cat([s, a, e], dim=-1))We use a ParameterList rather than a single nn.Embedding tensor so that we can freeze individual task embeddings during adaptation. The training function accepts an explicit list of parameters to update, so we can choose between embedding-only and full fine-tuning.
def train(model, embs, S, A, Y, E, epochs, lr, params=None):
S_t = torch.from_numpy(S)
A_t = torch.from_numpy(A)
Y_t = torch.from_numpy(Y)
E_t = torch.from_numpy(E)
if params is None:
params = list(model.parameters()) + list(embs.parameters())
opt = torch.optim.Adam([p for p in params if p.requires_grad], lr=lr)
loss = None
for _ in range(epochs):
opt.zero_grad()
e = embs(E_t)
pred = model(S_t, A_t, e)
loss = ((pred - Y_t) ** 2).mean()
loss.backward()
opt.step()
return float(loss.item())Now we pretrain on four embodiments.
embs = TaskEmbedding(n_tasks=4, emb_dim=8)
model = DynamicsModel(emb_dim=8, hidden=64)
pretrain_loss = train(model, embs, S_tr, A_tr, Y_tr, E_tr, epochs=500, lr=2e-3)Final pretraining MSE: 0.00008
The pretrained model has learned a shared dynamics representation plus four task embeddings. Now we adapt.
Adapting to a new embodiment
We evaluate five strategies on the held-out embodiment:
- Persistence baseline: predict . This is the trivial baseline that any model must beat.
- Zero-shot: use the pretrained network with the mean of the training embeddings. This represents the case where you have no target data at all.
- Embedding-only adaptation: freeze the network and the four training embeddings, and fit a single new embedding to the two target trajectories.
- Full fine-tuning: unfreeze everything and continue training on the target data.
- From scratch: train a fresh model with a single embedding on the target data alone.
Let's compute each.
def evaluate_with_emb(model, S, A, Y, e):
S_t = torch.from_numpy(S)
A_t = torch.from_numpy(A)
Y_t = torch.from_numpy(Y)
e_batch = e.unsqueeze(0).expand(len(S), -1)
with torch.no_grad():
pred = model(S_t, A_t, e_batch)
return float(((pred - Y_t) ** 2).mean())
# Persistence baseline.
persistence_mse = float(
((torch.from_numpy(S_te) - torch.from_numpy(Y_te)) ** 2).mean()
)
# Zero-shot: pretrained model with the mean task embedding.
mean_emb = torch.stack([embs.embs[i] for i in range(4)]).mean(dim=0)
zeroshot_mse = evaluate_with_emb(model, S_te, A_te, Y_te, mean_emb)Now embedding-only adaptation. We build a new embedding module with five entries, copy over the pretrained ones, and freeze everything except the new embedding.
embs_adapt = TaskEmbedding(n_tasks=5, emb_dim=8)
for p in model.parameters():
p.requires_grad_(False)
with torch.no_grad():
for i in range(4):
embs_adapt.embs[i].copy_(embs.embs[i])
embs_adapt.embs[4].copy_(mean_emb)
for i in range(4):
embs_adapt.embs[i].requires_grad_(False)
_ = train(
model,
embs_adapt,
S_ft,
A_ft,
Y_ft,
E_ft,
epochs=600,
lr=5e-3,
params=[embs_adapt.embs[4]],
)
embed_mse = evaluate_with_emb(model, S_te, A_te, Y_te, embs_adapt.embs[4])Now full fine-tuning. We copy the pretrained network, initialize a fifth embedding, and update the network plus that target embedding. The four stored source embeddings are not used by the target-only batch, so we freeze them rather than counting parameters that receive no gradient.
embs_full = TaskEmbedding(n_tasks=5, emb_dim=8)
with torch.no_grad():
for i in range(4):
embs_full.embs[i].copy_(embs.embs[i])
embs_full.embs[i].requires_grad_(False)
embs_full.embs[4].copy_(mean_emb)
model_full = DynamicsModel(emb_dim=8, hidden=64)
model_full.load_state_dict(model.state_dict())
_ = train(model_full, embs_full, S_ft, A_ft, Y_ft, E_ft, epochs=400, lr=1e-3)
full_mse = evaluate_with_emb(model_full, S_te, A_te, Y_te, embs_full.embs[4])Finally, from-scratch training with a single task embedding and no pretraining.
embs_scratch = TaskEmbedding(n_tasks=1, emb_dim=8)
model_scratch = DynamicsModel(emb_dim=8, hidden=64)
E_scratch = np.zeros(len(S_ft), dtype=np.int64)
_ = train(
model_scratch,
embs_scratch,
S_ft,
A_ft,
Y_ft,
E_scratch,
epochs=400,
lr=1e-2,
)
scratch_mse = evaluate_with_emb(
model_scratch, S_te, A_te, Y_te, embs_scratch.embs[0]
)Let's collect the results.
Persistence baseline : 0.00368 Zero-shot (no target) : 0.00034 Embedding-only adapt : 0.00006 Full fine-tune : 0.00004 From scratch : 0.00103
In this fixed-seed toy run, persistence has the highest one-step MSE. Zero-shot transfer improves on it, and fitting eight embedding values improves further. Full fine-tuning achieves a similar error scale, while the target-only model has less data from which to learn the shared dynamics. These are outcomes of one controlled example, not estimates of average method performance.
Let's visualize the comparison.

The bar chart shows the tradeoff for this seed. Embedding-only adaptation uses eight trainable values and reaches the same order of one-step error as full fine-tuning. The comparison should be repeated across seeds and target systems before drawing a general performance conclusion.
Parameter-efficient adaptation with LoRA
Embedding-only adaptation is a special case of PEFT: it updates a small number of parameters. A more general version is LoRA, which we can apply to the network's linear layers. Let's implement a minimal LoRA wrapper.
class LoRALinear(nn.Module):
def __init__(self, base, rank=4, alpha=8.0):
super().__init__()
self.base = base
for p in self.base.parameters():
p.requires_grad = False
self.A = nn.Parameter(torch.zeros(rank, base.in_features))
self.B = nn.Parameter(torch.zeros(base.out_features, rank))
nn.init.normal_(self.A, std=0.01)
self.scale = alpha / rank
def forward(self, x):
return self.base(x) + self.scale * (x @ self.A.T @ self.B.T)We can wrap the first linear layer of the pretrained network. Only the LoRA matrices are trainable, so the number of updated parameters is tiny.
model_lora = DynamicsModel(emb_dim=8, hidden=64)
model_lora.load_state_dict(model.state_dict())
for p in model_lora.parameters():
p.requires_grad_(False)
# Replace the first linear layer with a LoRA-wrapped version.
model_lora.net[0] = LoRALinear(model_lora.net[0], rank=4, alpha=8.0)
lora_params = list(model_lora.net[0].parameters())
n_lora_trainable = sum(p.numel() for p in lora_params if p.requires_grad)We now adapt the LoRA parameters and a new task embedding on the target data. Everything else stays frozen.
embs_lora = TaskEmbedding(n_tasks=5, emb_dim=8)
with torch.no_grad():
for i in range(4):
embs_lora.embs[i].copy_(embs.embs[i])
embs_lora.embs[i].requires_grad_(False)
embs_lora.embs[4].copy_(mean_emb)
_ = train(
model_lora,
embs_lora,
S_ft,
A_ft,
Y_ft,
E_ft,
epochs=400,
lr=1e-2,
params=lora_params + [embs_lora.embs[4]],
)
lora_mse = evaluate_with_emb(model_lora, S_te, A_te, Y_te, embs_lora.embs[4])Trainable parameters in LoRA setup: 308 LoRA adaptation MSE: 0.00003
The accuracy numbers do not show how differently the three adaptation strategies spend parameters. Counting trainable parameters makes that contrast explicit.
# Count trainable parameters for each adaptation strategy.
full_ft_params = sum(
p.numel()
for p in list(model_full.parameters()) + list(embs_full.parameters())
if p.requires_grad
)
embed_only_params = embs_lora.emb_dim
lora_trainable_params = n_lora_trainable + embs_lora.emb_dim
iso_strategies = ["Embedding-only", "LoRA", "Full fine-tune"]
iso_params = [embed_only_params, lora_trainable_params, full_ft_params]
For this seed, the three strategies land within a small range of one-step error but use very different trainable parameter counts. A frozen-backbone design can store many small adapted variants without duplicating the backbone.
In this example, LoRA reaches the same order of error as full fine-tuning while updating only a few hundred parameters. The adapter is smaller than a full model copy. Whether accuracy remains comparable is task- and rank-dependent.
Preference-based post-training with a DPO-style objective
Finally, let's look at the post-training half. We want to shape the model so it prefers useful rollouts over harmful ones, using a preference signal. We will use the DPO loss as a conceptual demonstration.
The DPO loss takes log-probabilities of preferred and rejected outputs under the current model and a reference model, and increases the margin between them.
import torch.nn.functional as F
def dpo_loss(logp_w, logp_l, ref_logp_w, ref_logp_l, beta=0.1):
"""DPO loss for a batch of (preferred, rejected) pairs.
logp_w, logp_l: log-probabilities under the current model
ref_logp_w, ref_logp_l: log-probabilities under the reference model
"""
logits = beta * ((logp_w - ref_logp_w) - (logp_l - ref_logp_l))
return -F.logsigmoid(logits).mean()To use this loss with a deterministic world model, we need a likelihood. The simplest approach is to interpret the model's output as the mean of a Gaussian with fixed variance , so that the log-likelihood of a target given a prediction is
where:
- : the target next state or transition
- : the model's predicted next state or transition
- : the fixed variance of the Gaussian likelihood
- : a constant that does not depend on
This likelihood supplies a sequence score that a preference objective can compare. The preference label still comes from a human, expert, or explicit proxy; it does not follow from prediction accuracy. Let's simulate the loss using synthetic values shaped like log-probabilities.
# Synthetic log-probs: the current model prefers y_w but is close to the reference.
torch.manual_seed(0)
n_pairs = 64
ref_logp_w = torch.randn(n_pairs) * 0.5
ref_logp_l = torch.randn(n_pairs) * 0.5
logp_w = ref_logp_w + 0.3 + torch.randn(n_pairs) * 0.05
logp_l = ref_logp_l - 0.2 + torch.randn(n_pairs) * 0.05
dpo_value = dpo_loss(logp_w, logp_l, ref_logp_w, ref_logp_l, beta=0.5)DPO loss on synthetic batch: 0.5775
A low batch DPO loss means the current model's preferred-versus-rejected log-ratio margin is large relative to the reference. In a real loop, the compared trajectories must be sampled and labeled under a documented protocol. The reference ratios arise from the KL-regularized derivation, but they do not guarantee safety or robustness: biased preference data, poor coverage, or an inappropriate can still move the model in an undesirable direction.
The shape of the DPO objective is worth seeing directly. Sweeping the log-ratio margin for several values of traces a family of sigmoid curves. Larger values make the loss change more sharply with the margin and saturate sooner.
# Sweep the DPO margin for several betas so the effect of beta on how
# aggressively the loss saturates is visible, as the prose claims.
margin_grid = np.linspace(-3.0, 5.0, 200)
margin_t = torch.tensor(margin_grid, dtype=torch.float32)
betas_demo = [0.05, 0.1, 0.5, 1.0]
dpo_curves = {b: -F.logsigmoid(b * margin_t).numpy() for b in betas_demo}
At a zero margin every curve passes through . As the margin grows, the loss approaches zero. Larger makes the loss and its gradient transition more sharply as a function of this fixed margin; the resulting parameter update also depends on how the margin itself changes with the model parameters.
Key Parameters
The key parameters for the task-conditioned dynamics model and its adaptation are:
- emb_dim: Dimensionality of each task embedding. Larger embeddings can describe more distinct dynamics regimes but add parameters and increase overfitting risk on small adaptation datasets.
- hidden: Width of the hidden layers in the dynamics network. This sets the capacity of the shared dynamics representation that all tasks reuse.
- epochs: Number of optimization passes over the training data. More passes can reduce training loss, but held-out error may worsen on a small target dataset, so select this value with validation data.
- lr: Learning rate for Adam. The example tunes different values for each stage; dataset size alone does not determine which stage should use the larger rate.
- rank and alpha (LoRA): The rank sets how many trainable parameters the low-rank update adds, and alpha scales that update relative to the frozen weights.
- beta (DPO): The temperature-like parameter that controls the strength of the implicit KL penalty keeping the policy near the reference model.
Limitations & Impact
The pretraining, post-training, and adaptation pipeline is powerful, but each stage has limitations that are easy to overlook when you read only the success stories.
Scaling laws are descriptive, not prescriptive. The exponents you fit on a small ladder may not extrapolate. They depend on architecture, tokenizer, data distribution, and optimizer. A scaling law fitted on text does not transfer to trajectories, and a law fitted on one family of robots may not transfer to another. Treating a fitted exponent as ground truth leads to badly miscalibrated budgets. The most useful role of scaling laws is not to predict the exact loss of a -parameter run, but to force you to state your assumptions and to notice when a proposed run is far off the frontier.
Post-training can reduce generality. Optimizing a narrow control objective can worsen performance on other prediction distributions. Retaining the pretrained checkpoint, evaluating source tasks, and applying explicit regularization are practical safeguards. DPO is derived from a KL-regularized objective, but finite preference data and optimization do not by themselves guarantee a bound on diversity or out-of-domain behavior.
Adaptation is constrained by the conditioning signal and backbone. A descriptor must distinguish target-relevant regimes, and the pretrained network must know how to use it. Fitting a new embedding can sometimes interpolate or recombine learned behavior, but it cannot guarantee representation of an arbitrary new dynamics family. Natural language expands the descriptor vocabulary without removing this identifiability and coverage requirement.
Negative transfer is possible. A source-trained initialization can underperform a target-only model under the same target-data and optimization budget. Include a target-only baseline and report the adaptation protocol, source retention, and uncertainty across seeds; otherwise a transfer claim has no controlled counterfactual.
Evaluation depends on the decision system. A lower open-loop prediction error need not imply a better controller, and no single planner-independent scalar captures every decision consequence. Report both diagnostic prediction metrics and closed-loop results with the actual planner, horizon, and cost. Cross-paper comparisons are fragile when those components differ.
Compute and data are not the only constraints. Scaling a world model requires not just GPUs and tokens but also access to diverse environments, reliable simulators, and the engineering infrastructure to run long experiments. The scaling curves hide the enormous cost of data collection and curation, which we covered in Part VI: Learning World Models at Scale. A team without access to this infrastructure can still benefit from the conceptual pipeline, but the specific numbers in any scaling law will not apply.
Stage-specific diagnosis. Pretraining can amortize representation learning across targets; post-training changes the objective; adaptation specializes the resulting model. This decomposition provides useful diagnostic questions: is the shared representation inadequate, is the conditioning signal uninformative, is the post-training objective misaligned, or is target data insufficient? The stages can interact, so the diagnosis still requires ablations and stage-specific evaluation.
Summary
This chapter developed the three-stage pipeline that underlies modern world-model training.
- Pretraining scales data, parameters, context, and compute to build a broad representation. Empirical scaling laws can describe loss within a measured regime; their fitted floor depends on the observations, targets, model family, and loss as well as irreducible uncertainty. Context, action-space coverage, and embodiment diversity are additional experimental axes.
- Task adaptation and instruction conditioning inject task-specific information without destroying the pretrained representation. Full fine-tuning risks forgetting and sample inefficiency; parameter-efficient methods like LoRA update a small number of parameters; conditioning is cheap at adaptation time but requires the model to have been trained to interpret the signal. Meta-learning targets the few-shot regime directly but is sensitive to task distribution shift.
- Preference and control-oriented post-training shapes a general predictor for planning. RLHF and DPO use preference data; control-oriented objectives weight errors by downstream consequences; process labels can provide denser credit when reliable intermediate targets are observable. A post-trained model can be worse on average prediction error and better in a particular closed loop.
- Transfer across embodiments and domains uses cross-embodiment training, domain randomization, embodiment descriptors, adapters, and rehearsal. Because source training can cause negative transfer, compare it with a target-only baseline under the same evaluation protocol.
The worked example applied the pipeline to driven damped point masses. In one fixed-seed run, pretraining plus embedding-only adaptation outperformed target-only training, and LoRA reached the same order of one-step error as full fine-tuning while updating fewer parameters. The DPO section then showed how relative sequence likelihoods enter a preference objective.
The pipeline prepares you for the planning and agency material in Part VII: Planning and Agency, where a planner queries the model built here. The next chapter turns to sampling-based planning and model predictive control.
Quiz
Ready to test your understanding? Take this quick quiz to reinforce what you've learned about pretraining, post-training, scaling, and adaptation in world-model pipelines.
Pretraining, Post-Training, Scaling, and Adaptation
Reference
Citation details
Cite or share this article.
Continue with the full handbook
This chapter is part of World Models Handbook. Use the handbook page to browse the complete table of contents and continue reading in sequence.
Explore World Models HandbookStay up to date
Get articles, book updates, and news delivered to your inbox.
No spam, unsubscribe anytime.
Join the community
Sign in to remove popups, track your reading progress, and join the discussion.

Comments
No comments yet. Be the first to share your thoughts!