Paper · 2026-01-05 · cs.RO
CycleVLA: Proactive Self-Correcting Vision-Language-Action Models via Subtask Backtracking and Minimum Bayes Risk Decoding
Author-reported: CycleVLA adds subtask-progress and stop outputs to a VLA. At about 90% progress a VLM decides whether to move on or backtrack, and the retry uses MBR-selected action chunks. On LIBERO-Plus the pi0.5 backbone rises from 65.0 to 86.0 average success. On a real arm the average is 91%.
Vision-language-action modelAction chunkingTask decompositionDecoding strategiesrobot-manipulationvision-language-actionfailure-recoverytest-time-scalingminimum-bayes-risk
arXivPDFCodeMarkdown15 min read
AI-compiled by claude-haiku-5-5 on 2026-10-19, not yet reviewed by a human. Every claim cites its source; check it when a detail matters.
In plain words
A robot policy that reads camera images and an instruction, then outputs motions, often fails in a predictable place: where one step of a task ends and the next begins. A peg is slightly off before it jams, or a teapot handle misses the hook. Most existing fixes notice the failure only after it has happened.
CycleVLA tries to act earlier. The policy is taught to say when a step is nearly done, and a separate vision-language model looks at the scene at that moment and decides whether to keep going or to go back to an earlier step. If it goes back, the robot tries that step again. Instead of taking one action sample, it draws several and keeps the one that agrees most with the others, on the idea that consensus tends to be a safe choice.
The paper tests this on two simulated robot benchmarks and on a real arm with three tasks. The results are the authors' own. The real-robot tests use one arm and three tasks, so they do not show how well the method works elsewhere.
TL;DR
- The policy gets two extra outputs: a stop signal and a progress value per subtask §4.1.
- When progress reaches a threshold, a VLM either moves on or backtracks to an earlier subtask §4.2.
- The retry draws several action chunks and keeps the consensus one, selected with Minimum Bayes Risk (MBR) decoding §4.2 eq. 4.
- Author-reported: higher success on LIBERO and LIBERO-Plus, and about 80% of injected failures corrected on a real robot §5.2 §6.2.
- The official code is MIT-licensed, but it is a fork of OpenVLA-OFT and two of its dependencies are not included. See
## Paper vs code.
Problem
Most robot failure detection runs after the failure §1§2. Correction is often a retrospective residual policy §2. Closest prior work is PAINT, which needs a human, and Bellman-Guided Retrials, which does not target generalist policies §2. The paper argues that many failures happen at subtask transitions, and that progress near completion gives an early signal §1§4. Existing VLAs lack mechanisms for stopping or estimating progress, which the paper treats as a key gap §1.
Test-time scaling has been shown for LLMs, and related work applies it to VLAs through learned scorers and sampled actions, such as RoboMonkey, Rover and V-GPS §2. The authors assume that imitation-trained policies put their successful behaviours in dense regions of the output space, so consensus selection should help §1.
Method
The method has two parts. Section 4.1 trains the VLA to predict subtask stop and progress. Section 4.2 runs the inference loop with a VLM check and MBR retries. The loop is summarised in alg. 1 and fig. 3.
Preliminaries
The policy maps the observation and a language goal to a chunk of H future actions, predicted in one forward pass §3. Actions are 7-dimensional end-effector deltas: three translations, three rotations and a gripper state \gamma_t \in \{0,1\} §3. The policy must support stochastic sampling, so that N different chunks can be drawn from the same observation §3.
Subtask-decomposed data §4.1
- An LLM splits each task into subtasks from a short list of verbs such as move, rotate, open and close §4.1 app. F.
- Per-step gripper states (open, close, idle) and movement primitives are read from the robot's proprioception, using differences over a sliding window of 4 steps §4.1 app. B.1.
- If the number of LLM subtasks equals the number of gripper segments, each subtask takes the timestamps of one segment. Otherwise an LLM infers the boundaries from the movement-primitive sequence, with no gaps allowed §4.1.
Extended action space §4.1
The 7-dimensional action becomes 9-dimensional:
a_t = [\Delta x_t, \Delta y_t, \Delta z_t, \Delta u_t, \Delta v_t, \Delta w_t, \gamma_t, s_t, p_t]^\top \in \mathbb{R}^9
§4.1. The stop signal s_t \in \{0,1\} marks subtask end. The progress signal p_t \in [0,1] is discretised in bins of 0.1 over the normalised time inside the subtask §4.1. Both are predicted as scalar outputs in the same head as the actions §4.1. In the main setting, the final step of each subtask gets 8 times its usual weight in training §4.1 tab. 8 tab. 10.
Inference loop §4.2 alg. 1
# CycleVLA inference loop [alg. 1]
# Input: task, policy, vlm, retry cap R, horizon H, samples N, timeout
# Output: episode success or failure
def run_episode(task, policy, vlm, retry_cap, timeout):
# Split the task into an ordered list of subtasks, via the VLM [§4.2]
subtasks = vlm.decompose(task) # list of K subtask strings
current = 0 # index of the active subtask
phase = IN_PROGRESS # or COMPLETE
queue = [] # actions waiting to run
retries = [0] * len(subtasks) # backtracks used per subtask
t = 0
while current < len(subtasks) and t < timeout:
# Get a new chunk from the policy when the queue is empty [§4.2]
obs = env.observe()
if not queue:
queue = policy.sample_chunk(obs, subtasks[current])
# Run the next action and read its stop and progress outputs [§4.1]
action, stop, progress = split(queue.pop(0))
env.step(action)
t += 1
if env.succeeded():
return SUCCESS
# While in progress, ask the VLM once progress is confirmed high [§4.2]
if phase == IN_PROGRESS and confirmed(progress, tau_p):
# The VLM picks the next subtask or an earlier one [§4.2]
target, decision = vlm.check(obs, subtasks[current], subtasks)
if decision == BACKTRACK and retries[target] < retry_cap:
retries[target] += 1
# Rewind to the start of the target subtask [§4.2] [app. E]
env.rewind_to_start_of(target)
obs = env.observe()
# Draw N chunks and run the MBR-selected one [§4.2] [eq. 4]
queue = mbr_select(policy.sample_chunks(obs, subtasks[target]))
current = target
else:
phase = COMPLETE
# Once complete, a confirmed stop moves to the next subtask [§4.1]
elif phase == COMPLETE and confirmed(stop, 1):
current += 1
phase = IN_PROGRESS
queue = []
return FAILURETwo details are not in the algorithm box. The VLM is queried with synchronised
third-person and wrist images, the current subtask and the subtask list §4.2.
A backtrack target must be the earliest subtask that restores the missing
precondition §4.2 app. G. The confirmed test is described in app. D:
a signal counts when it occurs on two consecutive steps, or when it recurs after
at least two low steps.
MBR selection §4.2 eq. 1 eq. 4
After a backtrack, the policy draws N hypotheses from the same observation and the active subtask §4.2. Each hypothesis is turned into a path by summing its translation deltas and rotation deltas, giving a feature vector of length 6H §4.2 app. C. The selected chunk is the one with the smallest average distance to all the others eq. 4:
a^{\mathrm{MBR}}_{t:t+H-1} = \operatorname*{argmin}_{a^{(i)} \in \mathcal{A}} \frac{1}{N} \sum_{j=1}^{N} d\!\left(\phi(a^{(i)}), \phi(a^{(j)})\right)
eq. 4. The paper uses L_2 for d with N = 8 §5.1 app. C.
# MBR selection over N sampled chunks [eq. 4]
# Input: hypotheses, a list of N action chunks of shape (H, 9)
# Output: the chunk to execute
def mbr_select(hypotheses):
# Turn each chunk into a path of summed deltas, shape (N, 6H) [§4.2]
paths = [to_path(chunk) for chunk in hypotheses]
# For each candidate, average its distance to every candidate [eq. 4]
risks = []
for candidate in paths:
distances = [l2(candidate, other) for other in paths]
risks.append(sum(distances) / len(paths))
# The candidate with the lowest average distance wins [eq. 4]
return hypotheses[argmin(risks)]Stop-and-progress confirmation app. D
Progress and stop signals can be noisy. The paper's rule counts a high signal (progress \geq \tau_p or s_t = 1) as confirmed when either of these holds:
c_{\text{consec}} \geq 2 \quad \text{or} \quad (\texttt{first\_seen} \land c_{\text{gap}} \geq 2)
app. D. Here c_{\text{consec}} counts consecutive high signals, and
c_{\text{gap}} counts low steps since the last high one. The official code
applies this rule only to some suites run_libero_eval_decomposed_progress_mbr.py. See ## Paper vs code.
VLM prompt app. G
The VLM receives the task, the subtask list and the current subtask, plus the
two camera views. It must return one of two decisions, transit or backtrack,
with the subtask to continue from, and short evidence lines. The decision rule
defaults to transit and allows backtrack only on clear visual evidence of
failure. It is also told to catch wrong-object or wrong-subtask engagement app. G.
The full prompt text is in app. G; it is not repeated here.
Hyperparameters
Values come from the paper's tables. "Not stated" means the paper does not say.
| Name | Value | Where | Notes |
|---|---|---|---|
| Backbones | \pi_{0.5} and OpenVLA-OFT with diffusion head (OFT-Diff) | §5.1 §6.1 | Real robot uses \pi_{0.5} §6.1 |
| Failure-predictor VLM | GPT-5.2, temperature 1.0 | §5.1 | Ablation uses LLaMA-3.2-11B §5.4 |
| Decomposition LLM | GPT-4.1, temperature 0.2 | §5.1 app. B | |
| Progress threshold \tau_p | 0.9 | §5.1 app. D | VLM queried when reached |
| Retries per subtask R | 3 | app. D alg. 1 | Then the subtask is forced to complete |
| MBR samples N | 8 | §5.1 app. C | Sweep 4 to 64 in tab. 4 |
| MBR distance | L_2 | §5.1 tab. 5 | |
| Open-loop steps (OFT-Diff) | 8 of 8 | tab. 8 | |
| Open-loop steps (\pi_{0.5}) | 5 of 10 | tab. 10 | |
| Translation threshold, LIBERO | 0.02 | app. B.1 | Per-trajectory grid of ±0.01, 50 steps |
| Rotation threshold, LIBERO | 0.0075 | app. B.1 | |
| Gripper threshold, LIBERO | 0.03 | app. B.1 | Voting over 0.028, 0.03, 0.032 app. B.2 |
| Sliding window | 4 timesteps | app. B.1 | |
| Downsampling | stride \lceil T/100 \rceil for T > 100 | app. B.3 | |
| Real-robot control rate | 20 Hz | app. E | |
| Real-robot gripper threshold | 6.0 cm (default), 8.25 cm (teapot) | app. E | Gripper is binarised at deployment |
| Real-robot trials | 15 per setting | §6.2 |
OFT-Diff training (LIBERO) tab. 8
| Hyperparameter | Value |
|---|---|
| Pretrained checkpoint | openvla-7b |
| GPUs | 4 × A100 (40 GB) |
| Learning rate | 5e-4, decayed to 5e-5 after 335K steps |
| Effective batch size | 64 (2 per GPU, gradient accumulation 8) |
| Training steps | 500K |
| Diffusion steps | 50 (train and inference) |
| Input images | 1 third-person, 1 wrist, 224 × 224 px |
| Observation history | none |
| LoRA rank | 32 |
| Action chunk | 8 steps, all executed open-loop |
| Action dimensions | 9 (7 robot, 1 stop, 1 progress) |
| Proprioception | yes |
| FiLM | no |
| Trainable parameters | 313M (111M LoRA, 185M action head, 17M proprio projector) |
| Last-action oversampling | 8× |
| Augmentation | random crop at scale 0.9; brightness 0.2; contrast 0.8 to 1.2; saturation 0.8 to 1.2; hue 0.05 |
\pi_{0.5} fine-tuning (LIBERO and real robot) tab. 10
| Hyperparameter | Value |
|---|---|
| Pretrained checkpoint | pi05_libero |
| GPUs | 8 × A100 (40 GB) |
| Finetuning | full, about 3.2B parameters |
| Optimiser | AdamW, β1 0.9, β2 0.95, ε 1e-8, weight decay 1e-10, gradient-norm clip 1.0 |
| Learning rate | 5e-5, after 10K linear warm-up steps (constant afterwards) |
| Effective batch size | 128 (16 per GPU, FSDP) |
| Training steps | 30K |
| Denoising steps at inference | 10 (flow matching) |
| Action chunk | 10 predicted, 5 executed open-loop |
| Action dimensions | 9 |
| Proprioception | yes, continuous |
| EMA decay | 0.999 |
| Last-action oversampling | 8× |
| Augmentation | non-wrist: 95% random crop resized back, ±5° rotation, colour jitter (brightness 0.3, contrast 0.4, saturation 0.5); wrist: colour jitter only |
Subtask decomposition app. B
Movement labels are the ECoT primitives: move forward/backward, left/right and up/down; tilt up/down; rotate clockwise/counter-clockwise; open or close the gripper; and stop when nothing is detected app. B.1. The LIBERO thresholds are given above. The per-trajectory translation grid minimises 1.0 \times N_{\text{overlaps}} + 2.5 \times N_{\text{stops}} app. B.1. An idle gripper segment is removed when it is shorter than the two neighbouring consistent segments combined app. B.2.
Results
All numbers are author-reported. Each setting is described in the text cited.
LIBERO-Plus under seven perturbations tab. 1
Success rates (%). Columns are the perturbation dimensions. Average in the last column.
| Method | Camera | Robot | Language | Light | Background | Noise | Layout | Average |
|---|---|---|---|---|---|---|---|---|
| OpenVLA | 0.8 | 3.5 | 23.0 | 8.1 | 34.8 | 15.2 | 28.5 | 16.3 |
| UniVLA | 1.8 | 46.2 | 69.6 | 69.0 | 81.0 | 21.2 | 31.9 | 45.8 |
| OpenVLA-OFT-Diff (single policy, authors' training) | 40.3 | 40.0 | 79.2 | 77.9 | 79.6 | 68.1 | 71.6 | 65.2 |
| \pi_0 | 13.8 | 6.0 | 58.8 | 85.0 | 81.4 | 79.0 | 68.9 | 56.1 |
| \pi_0-FAST | 65.1 | 21.6 | 61.0 | 73.2 | 73.2 | 74.4 | 68.8 | 62.5 |
| WorldVLA | 0.1 | 27.9 | 41.6 | 43.7 | 17.1 | 10.9 | 38.0 | 25.6 |
| \pi_{0.5} | 53.0 | 50.3 | 65.7 | 83.1 | 77.3 | 53.2 | 72.7 | 65.0 |
| CycleVLA (OFT-Diff) | 46.7 | 41.7 | 91.1 | 85.8 | 84.6 | 77.2 | 81.2 | 72.6 (+7.4) |
| CycleVLA (\pi_{0.5}) | 74.2 | 72.9 | 96.7 | 96.5 | 91.3 | 86.1 | 84.5 | 86.0 (+21.0) |
The "+" figures are gains over the backbone tab. 1. The LIBERO-Plus models are the LIBERO-trained ones, evaluated without further training §5.2.
LIBERO tab. 2
Success rates (%) per suite, trained jointly on all four suites §5.2.
| Method | Spatial | Object | Goal | Long | Average |
|---|---|---|---|---|---|
| Diffusion Policy | 78.3 | 82.5 | 68.3 | 50.5 | 72.4 |
| Octo-Base | 78.9 | 85.7 | 84.6 | 51.1 | 75.1 |
| OpenVLA | 84.7 | 88.4 | 79.2 | 53.7 | 76.5 |
| TraceVLA | 84.6 | 85.2 | 75.1 | 54.1 | 74.8 |
| SpatialVLA | 88.2 | 89.9 | 78.6 | 55.5 | 78.1 |
| CoT-VLA | 87.5 | 91.6 | 87.6 | 69.0 | 81.1 |
| ThinkAct | 88.3 | 91.4 | 87.1 | 70.9 | 84.4 |
| GR00T N1 | 94.4 | 97.6 | 93.0 | 90.6 | 93.9 |
| OpenVLA-OFT-Diff (authors' training) | 91.7 | 92.2 | 90.9 | 88.4 | 90.8 |
| \pi_{0.5} | 98.8 | 98.2 | 98.0 | 92.4 | 96.9 |
| CycleVLA (OFT-Diff) | 97.6 | 98.1 | 91.7 | 93.6 | 95.3 (+4.5) |
| CycleVLA (\pi_{0.5}) | 99.6 | 99.3 | 97.5 | 97.6 | 98.5 (+1.6) |
The caption says every policy in tab. 2 is supervised-finetuned, with no RL post-training tab. 2.
Under-trained checkpoints tab. 3
Average success (%) on LIBERO, without and with failure correction (FC) §5.2.
| Checkpoint | Spatial | Object | Goal | Long | Average |
|---|---|---|---|---|---|
| 200K steps, w/o FC | 84.7 | 82.0 | 63.6 | 62.3 | 73.2 |
| 200K steps, w/ FC | 89.1 | 90.2 | 74.2 | 66.5 | 80.0 (+6.8) |
| 350K steps, w/o FC | 88.4 | 93.8 | 72.6 | 77.9 | 83.2 |
| 350K steps, w/ FC | 94.8 | 97.5 | 79.4 | 85.3 | 89.2 (+6.0) |
| 500K steps, w/o FC | 91.1 | 95.3 | 86.5 | 84.4 | 89.3 |
| 500K steps, w/ FC | 97.6 | 98.1 | 91.7 | 93.6 | 95.3 (+6.0) |
The paper says the corrected 200K and 350K checkpoints approach the uncorrected 350K and 500K ones §5.2.
MBR as test-time scaling tab. 4 tab. 5
tab. 4 gives the estimated success probability P_{\text{succ}} eq. 5 over hypothesis counts N. It is computed offline from recorded rollouts, not from closed-loop MBR runs §5.3. Random means one hypothesis is drawn at random.
| Checkpoint | Base w/o FC | N=4 random | N=4 MBR | N=8 random | N=8 MBR | N=16 random | N=16 MBR | N=32 random | N=32 MBR | N=64 random | N=64 MBR |
|---|---|---|---|---|---|---|---|---|---|---|---|
| 200K | 73.2 | 72.9 | 78.2 | 71.7 | 78.5 | 71.9 | 81.2 | 72.2 | 79.7 | 72.3 | 79.7 |
| 350K | 83.2 | 80.5 | 88.0 | 80.3 | 90.2 | 80.2 | 91.3 | 80.4 | 92.3 | 80.7 | 92.2 |
| 500K | 89.3 | 90.8 | 94.1 | 90.2 | 95.5 | 91.1 | 95.7 | 90.7 | 95.7 | 90.4 | 95.6 |
The paper reports most of the gain by N = 8 and a plateau from N = 16 on §5.3.
Distance metric at N = 8 tab. 5:
| Checkpoint | w/o FC | Random | MBR-L_1 | MBR-L_2 | MBR-L_\infty | MBR-cos | MBR-r |
|---|---|---|---|---|---|---|---|
| 200K | 73.2 | 71.7 | 78.7 | 78.5 | 77.8 | 74.1 | 73.5 |
| 350K | 83.2 | 80.3 | 89.7 | 90.2 | 88.2 | 87.5 | 86.9 |
| 500K | 89.3 | 90.2 | 94.7 | 95.5 | 94.3 | 94.4 | 94.8 |
L_2 is best at every checkpoint in tab. 5. The paper attributes this to rotation deltas being sparse and translations dense §5.3.
Ablation on LIBERO tab. 6
| Variant | Success (%) |
|---|---|
| CycleVLA (main) | 95.3 |
| w/o MBR (random retry selection) | 92.5 |
| Alternative VLM (LLaMA-3.2-11B) | 92.8 |
| w/o stop signal and last-action oversampling | 91.1 |
| Always-on MBR (upper bound) | 96.9 |
| Predicted failure ends episode (lower bound) | 79.7 |
Always-on MBR takes about 2.2 times the inference time of the main method §5.4. Ending the episode on a predicted failure costs about 10% §5.4. The paper calls this VLM sycophancy: when asked whether failure is likely, the VLM tends to agree §5.4.
Runtime tab. 9
Seconds, from the table caption. The paper does not say whether these are per episode or averages app. D.
| GPU | VLM | Action rollout | Action sampling | MBR | Backtrack | Total |
|---|---|---|---|---|---|---|
| A10 | 12.9 (6.0%) | 147.6 (68.6%) | 47.9 (22.2%) | 0.003 (<0.1%) | 6.9 (3.2%) | 215.3 |
| A100 | 15.3 (19.9%) | 44.7 (58.1%) | 11.9 (15.5%) | 0.002 (<0.1%) | 5.0 (6.5%) | 76.9 |
The paper says the added parts cost about 30% on top of the base rollout app. D.
Subtask decomposition quality tab. 7
Human check of LLM boundaries on 40 demonstrations, five annotators app. B.5. Mean absolute error 5.7 steps (Spatial 4.2, Object 3.5, Goal 8.0, Long 7.2). Relative error 3.8% on average. Goal is hardest, which the authors link to weak gripper cues and heavy rotation app. B.5.
Real robot (AgileX PiPER) §6.2 fig. 8
Three tasks, 15 trials each, with 100 demonstrations per task §6.1 app. E.
- Natural failures, CycleVLA vs baseline without correction: teapot hanging 0.87 vs 0.73; fruit sorting 0.93 vs 0.87; cookware packing 0.93 vs 0.80 §6.2.
- Stress tests inject one error per trial. Average correction is about 80% §6.2.
- Under target displacement, teapot hanging falls to 0.67 §6.2.
- Per-cell values for the stress tests appear only in fig. 8 and are not stated in the text.
The author-reported average of 91% in the abstract matches the natural-failure numbers above.
Paper vs code
Code: github.com/dannymcy/cyclevla_code at commit
f3d0d7c1b3fa2d48a6b2e24feb260e3f66da2e17, linked from the authors' project
page [https://dannymcy.github.io/cyclevla/]. Checked on the cloned repository.
- MBR selection rule. Paper: plain average-distance argmin eq. 4 app. C.
Code default: the r-NN density variant. It picks the point with the smallest
distance to its rth neighbour, with r = \max(2, \min(4, \lfloor\sqrt{N}\rfloor)),
which is r = 2 at N = 8. It takes the medoid of that pocket and ranks by a
robust-normalised score, then executes the top chunk
run_libero_eval_decomposed_progress_mbr.py
run_libero_eval_decomposed_progress_mbr.py
run_libero_eval_openpi_cyclevla.py.
The plain average-distance rule exists in code as
MBR_vanilla/mbr_vanilla, and it is off by default run_libero_eval_decomposed_progress_mbr.py run_libero_eval_openpi_cyclevla.py. The visible appendix text calls the selected chunk the medoid of the hypothesis set app. C, which fits the plain rule. The density pocket appears only in commented-out text app. C. The paper does not say which rule produced tab. 4 and tab. 5. - Stop and progress confirmation. Paper: one rule for all tasks app. D.
Code: the robust rule (two consecutive or recurring highs) runs only for
libero_goalandlibero_10. For Spatial and Object, the code counts highs cumulatively and fires at the second one run_libero_eval_decomposed_progress_mbr.py run_libero_eval_decomposed_progress_mbr.py. - VLM model. Paper: GPT-5.2 at temperature 1.0 §5.1. The OFT script uses
gpt-5.2run_libero_eval_decomposed_progress_mbr.py. The openpi (\pi_{0.5}) script defaults togpt-5.5run_libero_eval_openpi_cyclevla.py. The paper does not name a VLM for the \pi_{0.5} runs. - Rollouts per task. Paper: 50 rollouts per task §5.2. Code default is 10, and its comment still says "(50)" run_libero_eval_decomposed_progress_mbr.py. The launch script also passes 10 run_libero_eval_decomposed_progress_mbr.sh.
- Backtrack mechanism in simulation. Paper: restore the configuration by reverse-executing recorded delta actions, with object states kept §4.2. Code: the simulator replays the recorded robot states in reverse, restoring only robot joint positions, velocities and mocap pose, and keeps the current object positions run_libero_eval_decomposed_progress_mbr.py run_libero_eval_decomposed_progress_mbr.py. The robot slots are hard-coded to 9 DOF in that function. Real-robot joint replay matches the paper app. E.
- Progress threshold in other scripts. Paper and both main scripts use 0.9 §5.1. The ablation script uses 0.95, which matches the paper's ablation description run_libero_eval_decomposed_progress_transit_ablation_8-dim.py.
- Decomposition thresholds. The code's thresholds of 0.02, 0.0075 and 0.03 match the paper decompose_traj.py.
- Licence file. The repository's
LICENSEfile is MIT. Its copyright line names Kim, Finn and Liang (2025), the authors of OpenVLA-OFT, from which this code descends. Thecode_licensefield above is taken from that file. It covers this repository only. - Missing dependencies.
.gitmodulespoints toopenpiandrlds_dataset_builderforks, and both directories are empty in the shallow clone. The \pi_{0.5} path therefore cannot run from this repository alone.
Pitfalls
- Ambiguous progress output. The paper says progress is discretised in bins of 0.1 §4.1, but also says it is predicted as a scalar in the action head §4.1. Treat it as a regressed scalar, with bins used for targets.
- Oversampling. The simulation setting oversamples the last action step by 8× tab. 8. The real-robot data repeats the last frame 8 times, with s_t = 1 and p_t = 1.0 app. E. The paper does not say how progress labels are set for the simulation repeats.
- Extra VLM context. The code adds 32 identical copies of the current frame to the VLM's inputs when it runs a check run_libero_eval_decomposed_progress_mbr.py. The paper does not mention this.
- Chunk features. The paper says deltas are accumulated. The code composes rotations by multiplication and converts back to Euler angles at each step run_libero_eval_decomposed_progress_mbr.py. The openpi version also pads short chunks with zeros run_libero_eval_openpi_cyclevla.py. The paper does not state either choice.
- Seeds versus stochastic sampling. OFT draws N chunks by changing the diffusion noise seed. The openpi version calls the server N times on the same observation. Equivalence is not tested in the paper.
- Cost. Each backtrack adds N = 8 policy forward passes, and each VLM check adds latency. The VLM's share of runtime rises from 6.0% on the A10 to 19.9% on the A100, but action rollout is still the largest share on both GPUs tab. 9.
- Reversibility. The paper says backtracking assumes reversible robot states and does not reset objects §7 §4.2. Irreversible events, such as a cup that has been knocked over, can make the retry impossible.
- Retry cap. After R = 3 retries the subtask is forced to complete. The paper does not say how often this happens app. D.
- Real-robot gripper. Training uses a continuous gripper value. Deployment binarises it at 6.0 cm, or 8.25 cm for teapot hanging app. E. Results could depend on this threshold, and the paper does not report sensitivity to it.
- Checkpoints. The shipped launch script evaluates only the 500K checkpoint. The 200K and 350K rows of tab. 3 cannot be reproduced from it.
- Figure and table numbers follow source order. They were not checked against a compiled PDF.
Lineage
- Builds on: VLA backbones \pi_{0.5} and OpenVLA-OFT, with OpenVLA-OFT's diffusion head §5.1. Subtask-decomposition primitives follow ECoT app. B.1.
- Backtracking follows Bellman-Guided Retrials §2 §4.2. PAINT is the closest prior work with human intervention §2.
- MBR decoding is taken from LLM work on minimum-Bayes-risk selection §2 §4.2.
- Compared against: RoboMonkey and Rover, which score sampled actions with learned models §2. The paper does not compare with these in its tables.
- Superseded by: not known from content on this wiki.
Source and license
Adapted from “CycleVLA: Proactive Self-Correcting Vision-Language-Action Models via Subtask Backtracking and Minimum Bayes Risk Decoding” by Chenyang Ma, Kai Lu, Guangyu Yang, Jiuming Liu, Shitong Xu, Bill Byrne, Ioannis Havoutis, Niki Trigoni, Andrew Markham (arXiv:2601.02295), used under CC BY 4.0. Changes: condensed and restructured for implementation, with tables, equations and algorithms taken from the paper and its code, each cited to its source. Not affiliated with or endorsed by the authors. Code citations refer to https://github.com/dannymcy/cyclevla_code at commit f3d0d7c1b3fa (MIT). Any quoted code is shown under that license.