---
license: apache-2.0
datasets:
- yuvalkirstain/pickapic_v1
language:
- en
pipeline_tag: text-to-image
---
# Step-aware Preference Optimization: Aligning Preference with Denoising Performance at Each Step
![]() |
![]() |
![]() |
![]() |
Recently, Direct Preference Optimization (DPO) has extended its success from aligning large language models (LLMs) to aligning text-to-image diffusion models with human preferences. Unlike most existing DPO methods that assume all diffusion steps share a consistent preference order with the final generated images, we argue that this assumption neglects step-specific denoising performance and that preference labels should be tailored to each step's contribution.
To address this limitation, we propose Step-aware Preference Optimization (SPO), a novel post-training approach that independently evaluates and adjusts the denoising performance at each step, using a step-aware preference model and a step-wise resampler to ensure accurate step-aware supervision. Specifically, at each denoising step, we sample a pool of images, find a suitable win-lose pair, and, most importantly, randomly select a single image from the pool to initialize the next denoising step. This step-wise resampler process ensures the next win-lose image pair comes from the same image, making the win-lose comparison independent of the previous step. To assess the preferences at each step, we train a separate step-aware preference model that can be applied to both noisy and clean images.
Our experiments with Stable Diffusion v1.5 and SDXL demonstrate that SPO significantly outperforms the latest Diffusion-DPO in aligning generated images with complex, detailed prompts and enhancing aesthetics, while also achieving more than 20× times faster in training efficiency. Code and model: https://rockeycoss.github.io/spo.github.io/
## Model Description This model is fine-tuned from [stable-diffusion-xl-base-1.0](https://huggingface.co/stabilityai/stable-diffusion-xl-base-1.0). It has been trained on 4,000 prompts for 10 epochs. ## A quick example ```python from diffusers import StableDiffusionXLPipeline, UNet2DConditionModel import torch # load pipeline inference_dtype = torch.float16 pipe = StableDiffusionXLPipeline.from_pretrained( "SPO-Diffusion-Models/SPO-SDXL_4k-p_10ep", torch_dtype=inference_dtype, ) vae = AutoencoderKL.from_pretrained( 'madebyollin/sdxl-vae-fp16-fix', torch_dtype=inference_dtype, ) pipe.vae = vae pipe.to('cuda') generator=torch.Generator(device='cuda').manual_seed(42) image = pipe( prompt='a child and a penguin sitting in front of the moon', guidance_scale=5.0, generator=generator, output_type='pil', ).images[0] image.save('moon.png') ``` ## Citation If you find our work or codebase useful, please consider giving us a star and citing our work. ``` ```