Behavioral cloning mystery
-
Seohong Park
August 2026
I've recently started working in robotics, where I've had the chance to train many behavioral cloning (BC) and reinforcement learning (RL) policies on real robot data. My impression so far is: real-world demonstration data is very different from the data in existing simulated RL benchmarks (e.g., D4RL, OGBench, etc.). In particular, I've noticed that there are many mysterious phenomena that appear with real robot data, which are not easily observed in many standard BC and RL benchmarks.
These mysteries really confused me, so I decided to properly study them. Unfortunately, it's really difficult to investigate this in the real world, because nothing is fully reproducible in robotics. In the real world, results depend on everything, including lighting conditions, background, reset distribution, robot temperature, and so on. This means that even when you suspect that something weird is happening, you can't be 100% sure whether it's actually a thing or just noise.
To do proper science, I believe it's important to reproduce them in a controlled benchmark. So I scripted policies for simulated manipulation tasks to generate data that mimic the properties as human demonstrations. After lots of iterations, I was able to successfully reproduce many of the mysteries that I wanted to study in this benchmark.
In this blog post, I'll discuss these mysteries, especially the BC-related ones, based on concrete evidence that I reproduced in the simulated benchmark. I'll also discuss the potential causes and implications of these phenomena, and share my perspectives on them.
The setup
Here are some of the tasks I made for this study. These are standard robotic manipulation tasks, such as block stacking, the Tower of Hanoi, and bowling.
block-quadruple block
hanoi-triple hanoi
bowling
I then scripted policies to generate human-like data. Of course, perfectly mimicking human demonstrations is impossible (it's equivalent to solving robotics...). However, what is possible is to mimic the properties of human demonstrations. It turned out that this was enough to reproduce many of the peculiar phenomena that happen with real robot data.
The key property of human demonstrations is that they are very narrowly distributed, highly temporally correlated (non-Markovian), and "smoothly" random.
First, I matched the task and action space configurations to real robot data. I used 7-DoF joint velocity control at 50Hz with a standard action normalization scheme. The controller's speed was tuned to roughly match the distribution of human demonstrations.
For the scripted policies, I used random piecewise Hermite splines as the backbone. This ensures that the generated trajectories are smoothly random and temporally correlated. On top of that, I randomized lots of things, including control points, grasping angles/directions, contact points, motion speed, gripper yaw/roll/pitch, and much more. I also let the policy occasionally make mistakes and recover from them.
Tuning all these design choices and hyperparameters was a rather painful process, but after many iterations, I was able to get reasonably diverse demonstration data that have human-like properties. This was the hardest part of this project!
To illustrate how the new benchmark is different from our previous one (OGBench), I made a video comparison below.
Previous benchmark (OGBench) More rule-based, 20Hz (video is 100fps).
New benchmark More demo-like, 50Hz (video is 100fps).
As you can see, the new data is more natural, diverse, and similar to real human demonstrations in terms of both speed and motion (although not perfect).
Moreover, the new benchmark supports MJWarp, which is basically GPU-accelerated MuJoCo. This means that we can do infinite-data(!) training, by continuously generating fresh demo data on the fly, training the agent using the data exactly once, re-generating new data, and so on. This enables us to study the "true limit" (or "scalability") of different BC and RL algorithms under infinite data.
For behavioral cloning, I used standard flow matching to train a length-25 action chunking policy: \(\pi(a_{t:t+24} \mid s_t)\). Since everything is state-based, the policy is simply modeled by an MLP (but it's a huge MLP; see below!). A bit surprisingly, I found that many of the mysteries can be reproduced even in this state-based setting, without having to go to VLAs. This means that these phenomena are due to the properties of the data rather than the model architecture.
The mysteries
Now I'll discuss four behavioral cloning mysteries. To reiterate, the results below are my "reproductions" of real-world phenomena in sim, meaning that they're not limited to these specific sim environments.
Disclaimer: I don't claim that any of these mysteries are novel! Many of them are probably already known to practitioners in robotics. The goal of this blog post is to show that these "folkloric" phenomena are real and reproducible, and to discuss their implications.
Mystery 1: Overfitting is... not bad?
The first mystery is that overfitting is often beneficial in behavioral cloning. This is what I found most counterintuitive. One might think that overfitting is bad and should be avoided. It turns out that it's often the opposite: in many cases, overfitting is not necessarily harmful; it's sometimes even helpful.
Here's the result. The plots above are from flow BC on a block pick-and-place task with 10K episodes. You can see that performance simply gets better (and then stabilizes) as we train more and more, even when the validation flow loss keeps growing.
Even more confusingly, I found that in some cases, using a larger dataset can hurt(!) performance. The plots above show that 10K datasets are better than 50K datasets on the same task. These datasets are sampled from the same distribution, and the results are averaged over 4 random seeds with 4 independently sampled datasets each, so it's not just a random fluke! This indicates that overfitting is sometimes even desirable, for some reason.
I think there are several possible hypotheses. They're all related to the fundamental distribution shift issue in behavioral cloning (the "DAgger" issue). This is in fact the central theme of this blog post.
One hypothesis is that, by overfitting to the dataset trajectories, the agent can exactly follow the "nearest-neighbor" segment from the dataset at test time. This could minimize distribution shift and eventually lead to better performance.
This kind of memorization might not necessarily be a bad thing, as long as this "search" is based on learned representations, which may still generalize. One might even argue that LLMs are fuzzy nearest-neighbor searchers too, in some sense.
Another hypothesis is that this is a quirk of the flow-matching loss, which does not necessarily correlate with the actual performance of the policy. Indeed, if we use a different metric, such as the MSE between generated and target actions, we see a slightly different trend. The plot above shows that even when the validation flow loss keeps going up, the validation action MSE is stable (see also this paper). While this metric still doesn't perfectly correlate with performance, it suggests that the flow loss might not be the best metric to look at.
By the way, an even better metric would be the MSE (or similar distributional metrics) between the generated and target actions under the test-time state distribution induced by the policy, as opposed to the dataset state distribution. They are often very different, and the former is generally (much) more relevant to the actual performance of the policy. Unfortunately, this metric is generally inaccessible as we don't have target labels for the test-time states...
Mystery 2: Open-loop is better than closed-loop
The second mystery is that open-loop control is essential in behavioral cloning. For those who are not familiar with the terminology, here's the definition:
- Open-loop policy \(\pi(a_{t:t+24} \mid s_t)\) is a policy that generates a chunk of actions, and blindly executes the full chunk without replanning while executing it.
- Closed-loop policy \(\pi(a_t \mid s_t)\) is a policy that simply generates and executes a single action at each timestep.
Of course, if we ignore practical issues like latency, closed-loop policies should be strictly better than open-loop policies because they're more reactive. Right?
Well, it turns out that a pure closed-loop policy doesn't work at all! Importantly, this is under the infinite data setting: the policies are trained on a stream of freshly generated data. So the closed-loop policy is not failing due to data scarcity or overfitting issues.
Open-loop policy
Closed-loop policy
Here are the videos. Honestly I was (and still am) surprised by how bad the closed-loop policy is, even on this very simple task with infinite data. It doesn't even touch the cube! And yes, I double-checked the code.
Again, I suspect that the central cause is the distribution shift problem in behavioral cloning. Closed-loop policies have two main issues.
First, the shorter the horizon is, the more often we need to query the policy, meaning that there is a higher chance of compounding errors. This is especially true for stochastic flow policies. Of course, the longer the action-chunk length is, the harder it is to learn the policy, so there is a trade-off. The results suggest that the sweet spot might be somewhere around 25 steps for this task.
The second issue is more subtle but potentially more important. Even when the environment is fully Markovian, the dataset is not, due to temporal correlations. So there is an expressivity mismatch between the closed-loop policy and the data-generating policy. As a result, the closed-loop policy learns a "Markovianized" behavior, which leads to potentially severe distribution shift at test time, and eventually to poor performance.
I knew you'd click on this! Due to the difference in expressivity between open-loop and closed-loop policies, a better comparison would be between an open-loop policy \(\pi(a_{t:t+24} \mid s_t)\) and a history-conditioned closed-loop policy \(\pi(a_t \mid s_{t-24:t})\). They have the same degree of non-Markovianity.
Here's the result with history-conditioned open-loop and closed-loop policies.
Well, history conditioning doesn't help! In fact, history-conditioned policies are even worse than their non-history counterparts. Recall that this is with "infinite" data, so it's not because of overfitting. And the history-conditioned policies have lower flow losses and MSEs, meaning that they do fit the dataset better. But this doesn't translate to better performance at test time.
History-conditioned policies being worse than non-history-conditioned ones is a pretty well-known phenomenon in robotics. There are two possible explanations. One hypothesis is that it's due to causal confusion: the history-conditioned policy might learn to "cheat" by simply outputting the previous action, which is often highly (yet spuriously) correlated with the next action. Another hypothesis is that history-conditioned policies are more susceptible to test-time distribution shift, as they simply have a larger input space. I don't have a definitive answer yet, but it's worth noting that this issue happens even in this very simple task with infinite data.
Mystery 3: Policies should be very large
Here's a question: how large do you think a policy should be to learn the pick-and-place behavior in the videos above? Recall that everything is state-based. Initially, I thought that a [512, 512, 512]-sized MLP would be more than enough. After all, the task is simple and fixed (it's not goal-conditioned), and the state space has only 37 dimensions.
I was completely wrong.
It turns out that we need at least [4096]*8-sized(!) residual MLPs to learn this task well. And 8192-dimensional MLPs further improve the performance! This is almost a billion-scale (0.5B) model. Personally, I've never seen such large MLPs being used in state-based single-task environments before. For example, previous benchmarks like D4RL and OGBench typically require much smaller MLPs ([1024]*4 at most).
Honestly, I don't have a great answer for this mystery. I still find it a bit hard to believe that we need such a large model for this simple, fixed, state-based task. Maybe behavioral cloning is just really hard. This would imply that we may need a very large "action expert" in VLAs, even with perfect perception and task understanding. Or maybe the current way of doing flow behavioral cloning, or at least the way I implemented it, is just inefficient. Though I found that other approaches like autoregressive tokenized action prediction also require similarly large models.
Mystery 4: Features matter even with infinite data
Given infinite data and compute, one might think that we don't need to worry about manual feature engineering, as the model will autonomously learn the right features from data. This is part of the Bitter Lesson.
It turns out that this is not necessarily the case in behavioral cloning.
The plot above compares two input features, which only differ by scaling:
- Handcrafted means that I manually choose the scale of each state dimension.
- Standardized means that each state dimension is standardized to the same range.
They both contain exactly the same information. Indeed, their flow losses and MSEs are almost identical, as expected. However, their actual performance is clearly different. Recall that this is again under the "infinite" data setting with a sufficiently large model, so it's not due to overfitting or underfitting.
For this mystery, I think I have a pretty confident answer. The main cause is, again, distribution shift.
Even when two policies have identical train-time metrics, they could generalize differently to unseen states at test time. This test-time generalization is eventually what matters in behavioral cloning. For example, in manipulation tasks, policies that focus on the object would generalize better than those that focus on internal joint angles.
The plot above supports this point. I additionally compared two variants of standardized features, where I applied an additional scaling to the \(xyz\) coordinates of the object and gripper by 0.1 and 10. As before, all four variants have exactly the same train-time metrics! However, policies that focus more on the object position (by scaling it up) achieve significantly better performance. Although I didn't measure generalization metrics under the test-time distribution in this experiment, I'm pretty sure that such metrics will clearly reveal the difference, as I've previously seen.
Closing thoughts
In this post, I discussed four real-world behavioral cloning "mysteries" based on their reproductions in sim environments. I'd like to conclude by sharing a few of my perspectives on these phenomena, and what they might mean for VLAs and large-scale robotic control.
1. As we've seen throughout this post, the fundamental cause behind these mysteries is test-time distribution shift. Interestingly, autoregressive LLMs don't seem to suffer from this issue as much, even though they should have the same problem in principle. Why?
Here's my hot take: I think this test-time distribution shift is actually an impossible problem. That is, the only solution is to avoid this problem, by scaling data to the degree that everything becomes "in-distribution" at test time. This explains why LLMs don't suffer as much from this issue: since they're trained on internet-scale data, they build a very robust internal representation, so that any text is virtually in-distribution in the representation space at test time. This also explains why we can simply use the training loss as a good proxy for performance in LLMs. So, as we scale up data and models in VLAs to the level of LLMs, many of these mysteries might eventually disappear!
2. Another major cause behind these phenomena is the expressivity mismatch between non-Markovian data distributions and (chunked) Markovian policies. I think this is a huge blocker for scalable robotic control, as it imposes a strong and incorrect inductive bias on the policy.
There seem to be two potential solutions to this issue. One is to use fully history-conditioned, autoregressive policies. Another is to use hierarchical policies that first output a detailed plan that kills off multimodality, so that the low-level policy can be more Markovian. Of course, these solutions are non-trivial and are research topics in themselves, but I think we'll eventually need to close this expressivity gap to further scale up robotics.
I only discussed behavioral cloning mysteries in this blog post. However, there are many more intriguing phenomena related to reinforcement learning that only emerge with real robot data too. In fact, as an RL researcher, studying these RL mysteries was the main motivation for me to create this new benchmark. I think these RL mysteries deserve a separate blog post or even a paper. Hopefully I can write and share them in the future!
I'm actively working on this! My current plan is to release an official version of the benchmark by this October, so please stay tuned.
Acknowledgments
I'd like to thank Kyle Stachowicz, Sergey Levine, Srinath Mahankali, and Kevin Black for helpful discussions and feedback on this post.