| name | self-eval-t2i |
| title | Self-Evaluation Unlocks Any-Step T2I Generation |
| version | 0.0.2 |
| engine | skillxiv-v0.0.2-claude-opus-4.6 |
| license | MIT |
| url | https://arxiv.org/abs/2512.22374 |
| keywords | ["text-to-image","diffusion","training","few-step","self-supervised"] |
| description | Train text-to-image models from scratch for any inference step count via self-evaluation mechanism. Model evaluates its own generated samples using current score estimates as dynamic self-teacher, enabling global distribution matching without external teachers—achieving few-step quality equivalent to many-step models at all budgets. |
Overview
Self-E addresses a fundamental limitation in text-to-image generation: achieving high quality at any inference budget requires either many steps or external teacher models. This framework enables from-scratch training where models teach themselves through self-evaluation, eliminating teacher dependence.
Core Technique
The key insight is that models can evaluate their own samples by leveraging internal score estimation during training.
Self-Evaluation Mechanism:
The model generates samples and evaluates them using its current learned score function.
class SelfEvaluatingGenerator:
def __init__(self, flow_model):
self.model = flow_model
self.optimizer = torch.optim.Adam(self.model.parameters())
def training_step_with_self_evaluation(self, x_t, x_0, prompt):
"""
Two complementary training objectives:
1. Flow matching: local supervision via data
2. Self-evaluation: global supervision from own scores
"""
flow_loss = self.model.flow_matching_loss(x_t, x_0, prompt)
self.eval()
with torch.no_grad():
x_gen_1 = self.model.sample(x_T=torch.randn_like(x_0), t=1.0)
x_gen_2 = self.model.sample(x_T=torch.randn_like(x_0), t=0.5)
score_1 = .model.score_estimate(x_gen_1, prompt)
score_2 = .model.score_estimate(x_gen_2, prompt)
.train()
self_eval_loss = .classifier_free_guidance_loss(
x_gen_1, x_gen_2, score_1, score_2, prompt
)
total_loss = flow_loss + * self_eval_loss
total_loss.backward()
.optimizer.step()
{: flow_loss, : self_eval_loss}