Skip to the lesson
FixTheRobot Home / VLA / Phase 11 / 11.2

VLA · Phase 11 · Advanced Research Directions

11.2 — VLA Fine-Tuning and Data Efficiency

Getting good behaviour from less robot data.

  • Roadmap phase 11
  • Advanced Research Directions
  • About 14 minutes to read

Robot data is the scarce resource. This lesson shows four ways to need less of it, each with a small experiment you can run and change.

Claims about papers, models and textbooks carry numbered references, listed with what each one is cited for in the References. Code marked “Toy model” is our own illustration, not the cited system.

Learning objectives

After this lesson, you should be able to:

  • Compute the parameter saving of low-rank adaptation.
  • Show how noisy copies regularise a small-data fit.
  • Compare targeted and random demonstration collection.
  • List other data sources and their gaps.
  1. Start from the closest pretrained model
  2. Adapt few parameters
  3. Augment with realistic variation
  4. Collect demonstrations where the data is thin
  5. Measure before collecting more
Data efficiency.

The one-sentence idea

Spend scarce data where it counts.

Less to learn, more from each example, better-chosen examples.

Data is the bottleneck

The data behind robot models is costly: RT-1's dataset took 13 robots 17 months to collect,[1] and even a strong adaptation result, such as Gemini Robotics learning new short tasks from as few as 100 demonstrations, costs hours of operator time (lesson 10.2).[2] So research on data efficiency asks: how do we get good behaviour from less robot data? The main levers, each with a small experiment below: adapt only a few parameters, augment the data you have, choose which data to collect, and use other data sources.

Lever 1: change fewer parameters

Low-rank adaptation freezes the pretrained weights and adds small trainable low-rank matrices to the Transformer layers. Against GPT-3 175B fine-tuned with Adam, the LoRA authors report about 10,000 times fewer trainable parameters and about 3 times less GPU memory, with quality on par or better, and no additional inference latency.[3] OpenVLA's authors likewise report fine-tuning on consumer GPUs via low-rank adaptation without a hit to downstream success rate.[4] Fewer trainable parameters also means less capacity to memorise a small dataset. The parameter arithmetic, as in lesson 6.1, for a stack of layers:

layers, d, r = 32, 4096, 8                     # an example stack: 32 matrices of 4096 x 4096, rank 8
full = layers * d * d
lora = layers * 2 * d * r
print(f"full fine-tuning of these matrices: {full:,} trainable parameters")
print(f"low-rank adaptation (rank {r}):       {lora:,} trainable parameters")
print(f"ratio: {full / lora:,.0f} times fewer")

Output:

full fine-tuning of these matrices: 536,870,912 trainable parameters
low-rank adaptation (rank 8):       2,097,152 trainable parameters
ratio: 256 times fewer

Toy model. An example size, not a particular model. The ratio d / (2r) does not depend on the number of layers.

The ratio is d/(2r), 256 here. Larger models with the same rank give larger ratios, which is how the paper reaches 10,000× on a 175B model.

Lever 2: make each demonstration count more with augmentation

Augmentation creates modified copies of demonstrations (shifted crops, colour jitter, lighting changes) that the policy should treat the same way. It teaches the model what does not matter. Consider 15 demonstrations that were all recorded under the same lighting: a model cannot tell lighting from content, and when the lights change at test time it fails (lesson 3.5). In the toy below, a “lighting” direction is added to every input; the action depends only on the underlying scene. We add copies of each demonstration with random lighting and refit:

import numpy as np
rng = np.random.default_rng(0)

d, k, n = 30, 3, 15                                         # input size, hidden scene numbers, demonstrations
mix = rng.normal(size=(k, d))                               # how the scene shows up in the input
light = rng.normal(size=d); light /= np.linalg.norm(light)  # the direction in which lighting changes the input
w = np.array([1.0, -1.0, 0.5])                              # how the action depends on the scene

def data(count, light_sd):
    scene = rng.normal(size=(count, k))
    L = rng.normal(0, light_sd, count)
    X = scene @ mix + 2.0 * np.outer(L, light) + rng.normal(0, 0.1, (count, d))
    return X, scene @ w + rng.normal(0, 0.1, count)

def fit(X, y, lam=1e-3): return np.linalg.solve(X.T @ X + lam * np.eye(d), X.T @ y)
def test_error(weights):
    X, y = data(5000, light_sd=3.0)                         # test: the lighting varies a lot
    return float(np.mean((X @ weights - y) ** 2))

plain, augmented = [], []
for _ in range(40):                                         # many random small datasets
    X, y = data(n, light_sd=0.0)                            # all demonstrations recorded under the same lighting
    plain.append(test_error(fit(X, y)))
    Xa = np.vstack([X + 2.0 * np.outer(rng.normal(0, 3.0, len(X)), light) for _ in range(30)])   # copies with random lighting
    augmented.append(test_error(fit(Xa, np.tile(y, 30))))
print("trained on the 15 demonstrations only:       test error", round(float(np.mean(plain)), 3))
print("trained with random-lighting copies as well:  test error", round(float(np.mean(augmented)), 3))

Output:

trained on the 15 demonstrations only:       test error 1.464
trained with random-lighting copies as well:  test error 0.024

Toy model. A linear model with a lighting direction added by hand. Real augmentations act on images, and must reflect the variation the robot will really meet.

The augmented fit ignores lighting because it saw it vary without the action changing; the plain fit may have used it. An augmentation that breaks the task, such as flipping an image when left and right matter, would hurt, so choose augmentations that change nothing about the correct action.

Lever 3: choose which demonstrations to collect

Demonstrations are not equal. Another demonstration of something the data already covers adds little; one in an uncovered region adds a lot (lesson 5.1 showed this with goal variety). A simple strategy places the next demonstration where the current data is sparsest. Compare with picking random places, for a policy that is a nearest-neighbour lookup over the task space:

import numpy as np
rng = np.random.default_rng(0)

def target(x): return np.sin(3 * x)                                  # what the demonstrator would do at position x
grid = np.linspace(0, 2, 400)

def test_error(xs):
    xs = np.array(xs); ys = target(xs)
    pred = np.array([ys[np.argmin(np.abs(xs - g))] for g in grid])    # nearest-neighbour policy
    return float(np.mean(np.abs(pred - target(grid))))

def sparse_choice(xs):
    gaps = [(np.min(np.abs(np.array(xs) - g)), g) for g in grid]       # the position farthest from any collected demo
    return max(gaps)[1]

random_err, targeted_err = [], []
for trial in range(30):
    start = list(rng.uniform(0, 2, 3))
    r, t = list(start), list(start)
    for _ in range(9):
        r.append(rng.uniform(0, 2)); t.append(sparse_choice(t))
    random_err.append(test_error(r)); targeted_err.append(test_error(t))
print("12 demonstrations, error with random positions:   ", round(float(np.mean(random_err)), 3))
print("12 demonstrations, error with positions in gaps:  ", round(float(np.mean(targeted_err)), 3))

Output:

12 demonstrations, error with random positions:    0.147
12 demonstrations, error with positions in gaps:   0.087

Spreading demonstrations out gives lower error for the same count. In practice “where the data is sparse” is judged on task variations (objects, positions, lighting), and where a trained policy fails (lesson 7.6) is a good guide to what to collect next, which is the logic behind DAgger-style correction data (lesson 3.3).[5]

Lever 4: use other data

Robot data can be supplemented: web data via co-training or pretrained parts (lesson 5.4), data pooled from other robots (lesson 5.3, with harmonisation), human videos and synthetic data in the humanoid models (lesson 10.1),[6] and simulation (lesson 7.7). Each has its own gaps: web data teaches knowledge, not motion; other robots' data needs a shared action layout (lesson 6.5); synthetic data inherits the reality gap.[7] The practical rule: get the pretrained model closest to your task, adapt with few parameters, augment sensibly, collect the demonstrations that fill gaps, and measure the improvement (lesson 8.2) before collecting more.

Common misconceptions

Misconception 1 “More demonstrations always help equally.”

Correction Demonstrations in uncovered regions help most.

Misconception 2 “Augmentation is free.”

Correction A wrong augmentation (flipping when left/right matters) hurts.

Misconception 3 “Low-rank adaptation is a hack.”

Correction It is reported to match full fine-tuning quality in several settings.

Engineering takeaways

  1. d/(2r) fewer parameters.
  2. Augmentation regularises.
  3. Fill gaps.
  4. Use other data with care.

Make every demonstration count.

Knowledge check

Try each question first, then reveal the explanation.

Question 1

d = 2048 and r = 4. How many times fewer parameters with low-rank adaptation?

Explanation

256. d / (2r).

Question 2

Why add copies of demonstrations with random lighting?

Explanation

So the policy learns that lighting does not change the correct action.

Question 3

Where should the next demonstration be collected?

Explanation

Where the data is thin or where the policy fails.

References

Numbered notes in the text, like [1], point here. Each entry says what it is cited for and how that was checked. Papers and books can be revised or misread, so follow the links before relying on a detail. Code marked “Toy model” is our own illustration of an idea, not the code of the cited system.

  1. Brohan, A., et al. (2022). RT-1: Robotics Transformer for real-world control at scale. arXiv:2212.06817

    Cited for:

    • Trained on about 130,000 episodes covering more than 700 tasks, collected by 13 robots over 17 months. Checked against the authors’ own blog post.
  2. Gemini Robotics Team, Google DeepMind (2025). Gemini Robotics: Bringing AI into the physical world. arXiv. arXiv:2503.20020

    Cited for:

    • With further fine-tuning the model can take on long-horizon, highly dexterous tasks, learn new short-horizon tasks from as few as 100 demonstrations and adapt to new robot embodiments; the authors also discuss safety considerations. Checked against the paper’s abstract.
  3. Hu, E. J., et al. (2021). LoRA: Low-rank adaptation of large language models. arXiv. arXiv:2106.09685

    Cited for:

    • Freezes the pretrained weights and adds small trainable low-rank matrices to the Transformer layers; against GPT-3 175B fine-tuned with Adam it is reported to cut trainable parameters about 10,000 times and GPU memory about 3 times while performing on par or better in quality, with no additional inference latency. Checked against the paper’s abstract.
  4. Kim, M. J., et al. (2024). OpenVLA: An open-source vision-language-action model. Conference on Robot Learning (CoRL) 2024. arXiv:2406.09246

    Cited for:

    • OpenVLA can be fine-tuned on consumer GPUs via modern low-rank adaptation methods and served efficiently via quantization without a hit to downstream success rate. Checked against the paper’s abstract.
  5. Ross, S., Gordon, G. and Bagnell, J. A. (2011). A reduction of imitation learning and structured prediction to no-regret online learning. AISTATS 2011, pp. 627–635 / arXiv. arXiv:1011.0686

    Cited for:

    • Proposes an iterative algorithm that trains a single deterministic policy and obtains a policy that performs well on the state distribution that the policy itself induces. Checked against the paper’s abstract.
  6. NVIDIA (Bjorck, J., et al.) (2025). GR00T N1: An open foundation model for generalist humanoid robots. arXiv. arXiv:2503.14734

    Cited for:

    • Trained on a heterogeneous mix of real-robot trajectories, human videos and synthetically generated datasets; evaluated on simulation benchmarks across several robot embodiments and deployed on the Fourier GR-1 humanoid for language-conditioned bimanual manipulation; the GR00T-N1-2B checkpoint, training data and simulation benchmarks are public. Checked against the paper’s abstract.
  7. Zhao, W., Queralta, J. P. and Westerlund, T. (2020). Sim-to-real transfer in deep reinforcement learning for robotics: a survey. IEEE Symposium Series on Computational Intelligence (SSCI) 2020. arXiv:2009.13303 · doi:10.1109/SSCI47803.2020.9308468

    Cited for:

    • Policies trained in simulation can perform worse on real hardware because simulated and real environments differ (the reality gap); the survey covers domain randomization, domain adaptation, imitation learning, meta-learning and knowledge distillation as responses. Checked against the paper’s abstract.

What’s next

Next: transferring one policy across robots with different bodies.

Next lesson

11.3 — Cross-embodiment transfer

Reusing one policy across robots with different bodies.

Back to the VLA roadmap