ULPT: tuning a soft prompt in two dimensions

Fine-tuning a modern language model is expensive. So a lot of recent work asks a cheaper question: instead of updating billions of weights, can we just learn a small “nudge” that steers a frozen model toward our task?

Prompt tuning is one of the tidiest answers. Rather than writing a prompt in words, you prepend a handful of learned vectors — “soft” prompt tokens — to the input and train only those. The model stays frozen; the soft prompt carries the task. It works surprisingly well, and you only store a tiny prompt per task instead of a whole model.

But there’s a hidden tax, and that tax is what ULPT (Wu et al., 2026) goes after.

The hidden tax: the model picks your dimension

Here’s the catch with soft prompts. Each prompt vector has to live in the model’s hidden dimension — the width the model uses internally, often several thousand numbers wide. So even a “small” soft prompt of, say, 10 tokens isn’t 10 numbers; it’s 10 × d, where d might be 2048 or 4096.

You didn’t choose that width. The model did. Your parameter budget is dictated by the architecture, not by how much steering your task actually needs — and that puts a floor on how cheap prompt tuning can get.

Vanilla prompt tuning learns full-width prompt vectors; ULPT learns tiny low-dimensional vectors expanded by a frozen random matrix, for about 98% fewer trainable parameters.

Vanilla prompt tuning trains the full width; ULPT trains a tiny vector and expands it for free.

The idea: tune small, project up

ULPT’s move is almost cheeky in its simplicity. Optimize the prompt in a tiny space — as few as two dimensions — and use a fixed random matrix to blow it back up to the width the model expects.

Concretely, for each soft-prompt position you learn a tiny vector z (think 2D). A frozen random matrix R up-projects z into the full d-dimensional embedding the model consumes. You only ever train the little z vectors. The random matrix is generated once and never updated — it costs nothing to learn and nothing to store (you can regenerate it from a seed).

A tiny trainable vector z is up-projected by a frozen random matrix into a full-width prompt embedding fed to a frozen language model; only z is learned.

Only the little vector is learned; the random projection and the model stay fixed.

Why does a random matrix work?

This is the part that feels like it shouldn’t work, but does. A random projection doesn’t need to be “trained” to be useful — random high-dimensional maps tend to preserve the structure of whatever you feed through them. The fixed matrix acts like a rich, pre-laid set of directions in the model’s embedding space, and the handful of trainable coordinates in z just decide how to mix them.

In other words, the expressive width still comes from the model’s full dimension — you simply don’t have to pay for it in trainable parameters. The learning happens in a two-dimensional knob box; the random matrix turns those knobs into a full-width signal.

Does it actually work?

Yes, and by a comfortable margin on the metric that matters here. ULPT reaches roughly a 98% reduction in trainable parameters compared to vanilla prompt tuning while preserving performance.

And it’s not a one-task fluke. Across more than 20 NLP tasks, ULPT consistently outperforms recent parameter-efficient tuning methods while using significantly fewer parameters. That combination — competitive accuracy at a fraction of the parameter cost — is exactly what you want if you plan to host many task-specific customizations of the same backbone.

Spend your budget on length, not width

There’s a result here I find especially telling. Fix the parameter budget — say you’re allowed a certain number of trainable values, full stop — and ask how best to spend it. You could buy a short prompt of full-width vectors, or a long prompt of low-dimensional ones. ULPT shows the long, low-dimensional prompt wins, and not by a little.

With the same parameter budget, a short full-width prompt uses few high-dimensional positions while a long low-dimensional prompt uses many positions; the long low-dimensional prompt reaches higher task performance.

Same budget either way — but spending it on more low-dim positions beats fewer full-width ones.

It’s an intuitive trade once you say it out loud: with the same budget, would you rather have a few very precise steering vectors or many coarser ones? It turns out more positions to steer from matters more than more precision per position. The model benefits from a longer soft prompt it can attend to, and ULPT’s cheap-per-token design is what makes that length affordable in the first place. Width was the expensive luxury; length is where the budget is better spent.

Why I think this matters

If you want to serve a model that behaves differently for hundreds or thousands of customers or tasks, the bottleneck isn’t really inference — it’s storage and management of all those adaptations. ULPT shrinks each adaptation to a few numbers per prompt position, which makes “a model plus a giant library of cheap task tweaks” genuinely practical.

The deeper takeaway I keep coming back to: the dimensionality of what you tune doesn’t have to equal the dimensionality of what the model uses. A fixed random map cleanly decouples the two — and once you see that, a lot of parameter budget turns out to be optional.

The full method, ablations, and per-task numbers are in the paper.

References

2026

  1. EACL
    ulpt.png
    Ultra-Low-Dimensional Prompt Tuning via Random Projection
    Zijun Wu, Yongchang Hao , and Lili Mou
    In Conference of the European Chapter of the Association for Computational Linguistics , 2026