Skip to content

E39: with FPO++'s full square fine-tuning, FPO lifts the clone on every seed - short of the bar at 4.8M steps - #95

Merged
tactino merged 4 commits into
mainfrom
exp/e39-square-fpo-plus-plus
Sep 28, 2026
Merged

tactino merged 4 commits into
mainfrom
exp/e39-square-fpo-plus-plus

Conversation

@tactino

@tactino tactino commented Sep 28, 2026

Copy link
Copy Markdown
Member

Stacked on #91 (FPO++'s optimizer, clipping, advantage and Huber options), whose commit this branch contains: merge #91 first.

E39 was pre-registered at 5c6ccd7, after a three-iteration pilot. It runs E37's fpo-square again, this time with FPO++'s square fine-tuning in full rather than only its loss. Same clone, three seeds, 100 iterations of 48,000 steps (4.8M), on guangzhao.

seed start end (91-100) gain 50-episode eval, final (E37's)
0 0.495 0.787 +0.292 0.80 (0.24)
1 0.524 0.684 +0.160 0.64 (0.30)
2 0.518 0.711 +0.193 0.64 (0.42)

The clone itself evaluates at 0.50.

  • P1, V1, and V2 (the critic learns) hold. Explained variance was 0.44–0.48 by iterations 11–20 and 0.66–0.68 at the end.
  • P2 is falsified: 1 of 3 seeds is past +0.2, and the other two are at +0.16 and +0.19. fpo-policy · FPO · square stays "runs" by the rule.
  • What E37 recorded as a fall is gone. Every seed rose through the whole run, and it has not levelled off. FPO++'s own square runs are 8M steps, where E39 ran 4.8M.

The settings were added together, so FINDINGS does not claim which one did the work. The E37 fall was our defect: the platform ran FPO without the rest of the fine-tuning it was published with.

…er CFM loss, as options

E37 ran FPO++'s policy loss on square from a behaviour-cloned start and the
policy fell from 0.50 to 0.24-0.42 over fifty evaluation episodes, while its
randomly initialised critic never fit the returns. FPO++'s square fine-tuning
(amazon-far/fpo-control, manipulation_experiments/finetune_online_rl.py) has
more than the loss, and this adds the rest, each off by default:

  critic_learning_rate, adam_eps, weight_decay, actor_adam_beta2
      two AdamW groups (FPO++: actor 1e-5 betas (0.9, 0.99), critic 1e-4,
      eps 1e-5, weight decay 1e-6); left at their defaults, FPO's one Adam.
      During a critic warmup the actor's group gets no gradient at all, so
      weight decay cannot move it.
  max_grad_norm
      the actor's and the critic's gradients clipped separately (FPO++: 25);
      their pre-clip maxima are logged.
  normalize_advantage_per_minibatch
      as FPO++ does, instead of over the buffer.
  cfm_loss_huber_delta
      FPO++'s Huber on the flow-matching error, d^2 within delta and
      2 delta |d| - delta^2 beyond (FPO++: 1).

FPO's learn step now also reports the critic's explained variance, which
DPPO always has and E37 could not read.
… clone on every seed, 1 of 3 past +0.2 at 4.8M steps
@tactino
tactino merged commit e2c82ae into main Sep 28, 2026
3 checks passed
@tactino
tactino deleted the exp/e39-square-fpo-plus-plus branch September 28, 2026 19:23
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant