Epsilon Scaling (PPM)
A tiny knob against exposure drift
- model
- MODEL
This is a one-slider node that nudges a subtle, systematic problem in diffusion sampling. If your generations come out slightly over-cooked - contrast a touch too high, highlights a little blown, that "everything's been through an Instagram filter" look - epsilon scaling is one of the levers that pushes back. It's a small correction, and that's the point.
The problem it addresses
SD1.5 and SDXL are epsilon-prediction models: at each step they predict the noise in the current noisy image, and the sampler subtracts a bit of it to walk back toward a clean picture. There's a known quirk called exposure bias - during training the model only ever sees images with the "correct" amount of noise, but during sampling its own small errors compound step to step, so the noise estimate drifts and the result skews toward over-saturation and excess contrast.
Epsilon scaling counters this by scaling the predicted noise by a small factor each step. Nudge the epsilon down a hair and you partially cancel the accumulated drift, which in practice reads as calmer, less blown-out images. It's a model patch - no retraining, no new weights, just a tweak to what the sampler does with the model's output.
The one input that matters
- model (MODEL) in, patched MODEL out.
- scaling_factor (default 1.005) - the whole node. Values live in a tight band (the slider allows 0.5–1.5, but you'll never go near the ends). The useful range is a whisker either side of 1.0.
Read it like this: 1.0 is off (no change). Slightly above 1.0 scales the noise estimate up a touch; slightly below pulls it down. The default of 1.005 is deliberately gentle - this is a fine-tuning knob, not a sledgehammer. Move it in tiny increments (1.002, 1.008, 1.01) and compare. If you're yanking it to 1.3 to see an effect, something else is wrong with your setup.
Install
No models or heavy deps:
- ComfyUI Manager: search "ComfyUI-ppm", install, restart.
- Manual:
cd ComfyUI/custom_nodes && git clone https://github.com/pamparamm/ComfyUI-ppm, then restart.
What ppm's version adds, and where the honesty is
ComfyUI already ships a stock Epsilon Scaling node. What pamparamm's version brings - and the README is refreshingly blunt about this - is "a hacky (and mathematically incorrect) support for v-pred ZSNR models." So if you're running a v-prediction model with zero-terminal-SNR (increasingly common on newer anime finetunes), the stock node doesn't really apply and this one gives you something, with the explicit caveat that the something isn't rigorously correct. Treat it as "worth trying if your v-pred outputs are blowing out," not as a guaranteed fix. On plain epsilon models (SD1.5, SDXL) it's the normal, well-behaved technique.
Honest take
This is a power-user micro-optimization, and you should treat it that way. Most people never need it - if your images look fine, leave it alone; adding it changes nothing you'll like. It earns its place when you've got a checkpoint that consistently over-saturates and you've already tried the obvious fixes (lower CFG, better negatives). Then a 1.005–1.01 scaling can take the edge off without touching your prompt or sampler.
It's also worth knowing this is one of several tools aimed at the same overexposure family - CFG++ samplers (also in this pack) and dynamic-thresholding nodes attack the blown-highlights problem from other angles, and CFG++ in particular is the bigger hammer for overexposure. Don't stack all of them blindly; pick the one that fixes your specific symptom and A/B it against a clean render.
Pack rule, as always: if it errors after an update, delete and re-add the node.
Inputs (2)
| Name | Type | Default | Description |
|---|---|---|---|
| model | MODEL | — | |
| scaling_factor | FLOAT | 1.0050.5–1.5 | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| MODEL | MODEL | — |