Method
🚫 The Multi-Reward Alignment Tax
Most multi-reward RL methods collapse N reward signals into a single weighted scalar before
each policy update — e.g. linear scalarization (GRPO-Sum), reward-product aggregation (GRPO-Product),
or advantage-space normalization (GDPO). Because rewards differ in scale, distribution, and
calibration, composing them in reward space forces conflicting preferences to
compete within the same gradient step, yielding a compromise policy that under-optimizes every
objective — an effect the paper calls the multi-reward alignment tax.
🔀 Policy-Space Decomposition
PRISM instead composes preferences after optimization, in policy
space. Starting from a KL-regularized one-step improvement objective augmented with a
shared "union of failures" penalty, the optimal policy factorizes exactly into:
Reward-Specific Positive Policies (π⁺ₖ)
One positive policy per reward k, trained independently with GRPO to encourage
behaviors preferred by that reward. Each reward drives updates through its own
dedicated branch, avoiding gradient interference with other objectives.
Global Negative Policy (π⁻)
A single negative policy trained to capture the union of all reward-specific failure
modes via a soft-conjunction advantage, so a severe violation of any one objective is
enough to trigger suppression — without attributing failures to individual rewards.
Crucially, the definitions of π⁺ₖ and π⁻ do not depend on the merge coefficients used to
combine them — training and composition are fully decoupled.
🎛️ Logit-Level Policy Composition
Because all sub-policies share the same reference policy and context, taking logarithms turns the
product-of-experts composition into a simple weighted sum of logits:
z* = Σₖ αₖ · z⁺ₖ − γ · z⁻
The merge weights {α₁, …, α_N, γ} form an explicit, interpretable interface for
preference trade-offs, freely adjustable at inference time without retraining.
Parallel-batch mixture sampling. Query, per-branch prefix, and shared context are stacked along the
batch dimension and processed by the shared backbone in one forward pass; per-branch logits are
combined and the sampled token is broadcast back to all branches.
⚙️ Efficient Implementation
- Prefix-conditioned shared backbone: all N+1 sub-policies reuse one language
model, distinguished only by lightweight learnable prefix embeddings — avoiding an (N+1)× blow-up
in parameters.
- Backbone-preserving asymmetric updates: the shared backbone is updated only
through positive branches (stop-gradient on the negative branch), keeping the backbone aligned
with high-quality behavior while the negative prefix still learns a catch-all failure
representation.
- Parallel-batch mixture sampling: all N+1 branches are decoded in a single
batched forward pass by stacking them along the batch dimension, so per-token latency stays close
to that of a single policy despite memory/FLOPs scaling linearly with N+1.