High-Resolution Image Synthesis with Latent Diffusion Models
Compress images with an autoencoder, run the diffusion model on the small code, decode once at the end.
A frozen autoencoder turns a 256 × 256 color image into a 32 × 32 × 4 grid of numbers that decodes back almost unchanged. The diffusion model trains and samples on that grid, 48 times fewer numbers than the pixels, and takes text or class labels through cross-attention.
Explaining the paperHigh-Resolution Image Synthesis with Latent Diffusion ModelsThe 2021 paper behind Stable Diffusion. Most of its models train on a single A100, match or beat pixel-space diffusion models that took several times the compute, and its cross-attention conditioning is the mechanism Stable Diffusion kept.
What pixel-space diffusion costs
A diffusion model generates an image by starting from Gaussian noise and removing a little of it at a time. A single network, a U-Net called , is trained to look at a noisy image and predict the noise in it; sampling calls that network once per step, for tens to hundreds of steps. The mechanics are in the DDPM explainer. By 2021 these models produced the best images on class-conditional ImageNet, with none of the training instability of GANs.
They were also expensive, because every call of the network runs on the full image. A 256 × 256 RGB image is 196,608 numbers. Training runs the network on one noised copy of each image per step, over millions of steps; sampling runs it 25 to 1000 times per image. The paper quotes the numbers for ADM, the strongest pixel-space model of the time (the Diffusion Models Beat GANs paper): 150 to 1000 V100-days to train, and about five days on one A100 to draw the 50,000 samples used to compute an FID score.
Latent Diffusion, by Robin Rombach, Andreas Blattmann and colleagues at LMU Munich, Heidelberg University and Runway ML, removes most of that cost with two stages:
- Train an autoencoder once. Its encoder maps an image to a much smaller grid of numbers, the latent, and its decoder maps the latent back to an image that looks the same.
- Freeze it, and train an ordinary diffusion model on latents instead of pixels. To generate, run the whole denoising loop on a latent and decode once at the end.
The rest of the page covers why the compression costs so little quality, how the autoencoder is trained, how far to compress, how text gets in, and what the resulting models score.
Where an image spends its bits
The case for two stages starts from a measurement on an ordinary pixel-space diffusion model. DDPM showed that a trained diffusion model can be run as a lossy compressor: send the image to a receiver a few bits at a time, in the order the denoising steps would reveal it, and after each step measure how far the receiver's best reconstruction is from the original. The paper's Figure 2 plots that measurement for DDPM's CIFAR-10 model. The horizontal axis is the rate, bits per pixel-channel received so far. The vertical axis is the distortion, the root-mean-square error of the reconstruction on the 0 to 255 pixel scale.
The curve falls from about 88 to about 9 within the first 0.2 bits per dimension, then flattens. A CIFAR-10 image has 32 × 32 × 3 = 3,072 dimensions, so those first 0.2 bits per dimension are about 77 bytes. Reaching the final error of 0.95 takes 1.78 bits per dimension, about 684 bytes. Close to 90% of the code therefore goes to moving the error from about 9 intensity levels to under 1. DDPM calls this detail imperceptible; in its words, more than half of the lossless code length describes imperceptible distortions.
The LDM authors name the two parts of the curve. The steep part is semantic compression: the bits that decide what is in the picture, its layout and objects. The flat tail is perceptual compression: bits that only fix pixel-level detail. A pixel-space diffusion model learns both with one network, and pays full price for the second part on every one of its 196,608 inputs. Drag the rate and watch where the error stops changing:
The paper builds its method on that split: a separate, cheaper model handles the perceptual compression once, producing a representation that has dropped the imperceptible detail. The diffusion model then only has to learn the semantic part, and it runs on a smaller input.
Stage one: the autoencoder
An autoencoder is an encoder and a decoder trained together so that the decoder's output matches the encoder's input. In the paper's notation the image is , with height , width and three color channels, and the latent is :
The encoder shrinks each side by the downsampling factor , a power of two. For a 256 × 256 image, gives a 64 × 64 latent and a 32 × 32 one. The channel count is small: the text-to-image model uses a 32 × 32 × 4 latent, 4,096 numbers against the image's 196,608, and the ImageNet model a 64 × 64 × 3 one, 12,288 numbers. The network that runs on it does its work per spatial position, so the count that matters most for cost is : 1,024 positions at against 65,536 in pixel space, 64 times fewer.
The latent keeps the image's two-dimensional layout. Position (i, j) of describes roughly an patch around pixel (, ). The paper credits this layout for letting mild compression work. Earlier two-stage generators, VQGAN and OpenAI's DALL-E, also compressed images first, but then modeled the codes with an autoregressive Transformer, which reads the grid as a one-dimensional sequence and predicts one code at a time. Transformer cost grows with sequence length, so those methods compressed hard (VQGAN at , DALL-E at ) and paid in reconstruction quality. LDM's denoiser is a convolutional U-Net, which is built for 2D grids and handles a 64 × 64 input cheaply, so the autoencoder can compress gently.
The paper's Figure 1 puts numbers on the difference, reconstructing ImageNet validation images: its autoencoder reaches PSNR 27.4 dB and reconstruction FID 0.58; DALL-E's autoencoder 22.8 dB and 32.01; VQGAN at 19.9 dB and 4.98. PSNR measures per-pixel fidelity in decibels (higher is better; 27.4 dB is an average error of about 11 intensity levels out of 255). Reconstruction FID compares the statistics of reconstructed and real images in a pretrained network's feature space (lower is better; 0 means indistinguishable by that measure). Pick and the regularizer below (KL or VQ, two ways of keeping the latent's values in check: a small penalty pulling it toward a standard Gaussian, or snapping each latent vector to a learned codebook; the next section describes both); every number in the header is a row of the paper's Table 8:
Reconstruction quality falls steadily with : VQ PSNR goes 30.85, 27.43, 23.07, 20.83 and 17.45 dB for = 2 to 32, and reconstruction FID climbs from 0.16 to 31.83. The drop tracks how many numbers the latent keeps. The KL model at with 64 channels holds 8 × 8 × 64 = 4,096 values, the same count as the models, and reconstructs at FID 2.04, far better than the 16-channel models (7.3 KL, 31.83 VQ). The spatial grid is still 8 × 8, though, and the U-Net's cost and its convolutional structure depend on that grid. The paper's conditional diffusion models all use 3 or 4 channels at = 4 or 8.
Training the autoencoder
An autoencoder trained only to minimize squared pixel error produces blurry reconstructions. When several sharp textures are consistent with the latent, the output that minimizes expected squared error is their average, and the average of many textures is smooth. LDM uses the first-stage recipe of VQGAN instead, which adds two terms that penalize blur.
The first is a perceptual loss, LPIPS: pass both the original and the reconstruction through a pretrained image network and compare their intermediate features instead of their pixels. Two images with the same content and slightly shifted texture score as similar, which matches human judgment much better than pixel distance. The second is a patch-based adversarial loss: a small discriminator network, the PatchGAN from the pix2pix paper, looks at local patches and outputs, for each one, how likely it is to come from a real image. The autoencoder is trained to make its reconstructions score as real. A blurry patch is easy to tell from a real one, so this term pushes the decoder toward sharp, realistic texture. The paper describes the effect as keeping reconstructions on the image manifold (the set of images that look like real photographs).
The full objective, from the paper's appendix, is a min-max game between the autoencoder and the discriminator :
is the reconstruction loss (in the code, an L1 pixel term plus LPIPS). The discriminator, maximizing, raises on real images and lowers its score on reconstructions; the autoencoder, minimizing, gets the reconstruction scored as real, which is what the term rewards. is a regularizer on the latent.
The regularizer is there because without it nothing fixes the latent's scale: the encoder could output values of any size, spread arbitrarily, and the paper wants to avoid "arbitrarily high-variance latent spaces" before training a second model on them. The paper tries two options:
- KL-reg. makes the encoder output a mean and a variance for every latent value, as in a variational autoencoder, and adds the VAE's KL-divergence penalty pulling that Gaussian toward a standard normal, with a weight of about . A VAE normally weights this term around 1, which trades reconstruction quality for a latent that looks Gaussian. At the penalty barely affects reconstruction and only discourages extreme values. During diffusion training the code draws from that Gaussian rather than taking its mean.
- VQ-reg. uses vector quantization, from VQ-VAE: each latent vector is replaced by its nearest entry in a learned codebook of vectors (8,192 or 16,384 in the models used here). LDM takes before the quantization step and treats quantization as the first layer of the decoder. The paper calls this a VQGAN with the quantization layer absorbed by the decoder. The diffusion model sees continuous latents; they get snapped to the codebook only on the way out.
VQ autoencoders reconstruct slightly worse than KL ones at the same (Table 8), but the paper reports that LDMs trained on VQ latents sometimes produce better samples. It uses VQ for the ImageNet, super-resolution and inpainting models and KL for the text-to-image model.
Setting the latent’s scale
With a KL weight of , nothing forces the latent's standard deviation to 1, and the diffusion model's noise schedule assumes data with a standard deviation near 1. The forward process mixes signal and noise as
where falls from nearly 1 at to nearly 0 at , and is the standard deviation of the latent. The signal-to-noise ratio (SNR) at each step scales with . If the latents are five times larger than the schedule assumes, every step carries 25 times more signal relative to noise than designed, and the last step, which sampling starts from, is not close to pure noise.
The KL latents come out much larger than that, so the paper rescales them before diffusion: it estimates one standard deviation over all values of the first training batch and divides by it. The text-to-image config in the official code stores the result as scale_factor: 0.18215, which corresponds to a raw standard deviation of about 1/0.18215 = 5.49 for its KL latents. With the paper's schedule (1,000 steps, from 0.00085 to 0.012), a unit-scale latent drops below SNR 1 at step 355 and keeps a signal of standard deviation 0.068 at step 1000. Unscaled, the SNR stays above 1 until step 817 and 0.375 of signal survives the last step. Slide the latent's standard deviation and watch the crossing point and the thumbnails:
The VQ latents already have a variance close to 1 and are not rescaled. The paper reports that the SNR significantly affects results when a model trained on 256 × 256 crops is run convolutionally on larger images (its Figure 15 compares KL latents with and without the rescale, and VQ latents, for semantic-map-to-image synthesis). At sampling time the code divides the final latent by the same factor before decoding.
Stage two: diffusion on the latent
With the autoencoder trained and frozen, the second stage is a standard diffusion model. The pixel-space training loss from DDPM samples an image , a step uniformly from 1 to , and noise ; builds the noised image ; and regresses the network's output on the noise:
Latent Diffusion trains the same loss on encoded images:
The only change is . Because the noising process has no learned parameters, is computed on the fly from during training. The network is still a time-conditional U-Net built mostly from 2D convolutions, now with a 4-channel 32 × 32 input and output instead of a 3-channel 256 × 256 one. Here is one training step of the text-to-image model with the shapes written out (the conditioning input c is covered two sections down):
# One training step of the text-to-image LDM (Eq. 3). Shapes for 256x256 images.
x = images # [B, 3, 256, 256]
with no_grad():
z = 0.18215 * E(x) # [B, 4, 32, 32] frozen encoder, then rescale
c = tau(tokenize(captions)) # [B, 77, 1280] text transformer, trained
t = randint(1, 1000, size=B) # one diffusion step per example
eps = randn_like(z) # the noise the network must predict
z_t = sqrt(abar[t]) * z + sqrt(1 - abar[t]) * eps
loss = mse(eps, eps_theta(z_t, t, c))
loss.backward() # gradients reach eps_theta and tau, not E or DSampling reverses this: start from Gaussian noise of the latent's shape, run the U-Net for every denoising step, and call the decoder once. The paper samples with DDIM, a deterministic sampler that skips most of the 1,000 training steps (see the DDIM explainer); its tables use between 50 and 500 steps.
# Sampling: the whole loop runs on a [4, 32, 32] tensor; D runs once at the end.
c = tau(tokenize(prompt)) # [1, 77, 1280]
uc = tau(tokenize("")) # empty prompt = "no condition"
z = randn(1, 4, 32, 32)
for t in ddim_steps: # e.g. 250 steps (tables), 200 (Figure 5)
e_u = eps_theta(z, t, uc)
e_c = eps_theta(z, t, c)
e = e_u + s * (e_c - e_u) # classifier-free guidance, s = 1.5 or 10
z = ddim_update(z, e, t)
x = D(z / 0.18215) # [1, 3, 256, 256], one decoder passFigure 4 shows the whole system. The encoder and decoder sit in pixel space and each run once per image; the denoising loop, and conditioning y, live entirely in the latent:
Two savings follow. Training and sampling both run the expensive network on 16 to 64 times fewer spatial positions (at = 4 and 8), and the autoencoder is reusable: it is trained once, on OpenImages, and then serves several diffusion models. The super-resolution model, for example, reuses the same VQ autoencoder as the ImageNet experiments.
How much to compress
The downsampling factor sets both savings and losses. At there is no autoencoder, and LDM-1 is pixel-space diffusion. As grows, each step gets cheaper, but the autoencoder discards more, and nothing the diffusion model learns can put back what the decoder cannot reconstruct.
The paper measures the trade on class-conditional ImageNet. It trains six LDMs with = 1, 2, 4, 8, 16 and 32, each with the same number of parameters, for the same 2 million steps, each on a single A100, and tracks FID (the distance between generated and real image statistics, lower is better, here on 5,000 samples) as training goes. Two patterns show up. Small factors, = 1 and 2, improve slowly, because the diffusion model is still doing the perceptual compression itself. Large factors stall: is at FID about 95 after 400,000 steps and still near 87 after 2 million, since its autoencoder has already thrown away detail the samples need. After 2 million steps the FID gap between and is 38. Play the training run or scrub it; the right panel is a vertical cut through the curves at the chosen step:
The paper's own reading is that = 4 to 16 "strike a good balance between efficiency and perceptually faithful results", and, after also comparing sampling speed against FID for 10 to 200 DDIM steps (its Figure 7), that "LDM-4 and -8 offer the best conditions for achieving high-quality synthesis results". A larger factor always samples faster: with 10 DDIM steps, produces about 23 samples per second against about 3 for pixel space. For complex data such as ImageNet the paper recommends the gentler ; its text-to-image model uses .
Conditioning through cross-attention
A diffusion model can model a conditional distribution by giving the denoiser the condition as an extra input, . For a class label that input can be a learned vector. A sentence does not fit the U-Net's grid: it is a sequence of tokens with no spatial position, of varying length. Adding one summary vector of the prompt to every grid position would lose which words matter where. The paper feeds it in with cross-attention, the attention layer a Transformer decoder uses to read its encoder's output, which lets every grid position pick out the tokens relevant to it.
First a domain-specific encoder turns the condition into a sequence of vectors, . For text, is a Transformer over the tokenized prompt; for ImageNet classes it is a learned embedding. Then, at several resolutions inside the U-Net, the feature map is flattened into rows, , and attends to the condition:
The queries come from the image features and the keys and values from the condition. Row of scores grid position against every token; the softmax turns each row into weights that sum to 1; multiplying by gives each position a weighted mix of token values, which is added back to that position's features. In the text-to-image model the prompt is padded to 77 BERT tokens and encoded to width 1280, so is 77 × 1280. At the U-Net's first level the feature map is 32 × 32 with 320 channels, so is 1,024 × 320 and the attention matrix is 1,024 × 77: one distribution over the prompt for each latent position, computed in 8 heads. The same layers sit at the 16 × 16 and 8 × 8 levels. In the code each of these blocks runs self-attention over the image positions first, then the cross-attention, then a feed-forward layer. Hover over the grid to pick a position and see its attention over the prompt:
The condition encoder and the denoiser train together, end to end, with the latent loss extended by :
In the text-to-image model, is 32 Transformer layers trained from scratch through this loss; no pretrained language model is involved beyond the BERT tokenizer. When the condition is itself an image-shaped grid (a low-resolution image for super-resolution, a masked image for inpainting, a semantic map), the paper skips attention and concatenates a resized copy of the condition to as extra input channels, since the positions already line up.
Classifier-free guidance
The guided benchmark numbers in Tables 2 and 3 use classifier-free guidance, from Ho and Salimans. (The appendix also reports LDM-8-G models steered by a separately trained classifier at classifier scale 10, and super-resolution samples guided by the low-resolution input.) The model is trained to make two predictions: with the condition, and with a null condition that stands for "no prompt" (the recipe drops the condition for a random fraction of training examples). The released sampling script uses the empty prompt as the null condition. At each sampling step both predictions are computed at the same and combined:
The difference in parentheses is the part of the prediction that the prompt changes. At the prompt is ignored; at the output is the plain conditional prediction; above 1 the step moves further in the prompt's direction than the conditional model alone would. In Ho and Salimans's notation the same formula has .
The noise prediction is, up to a factor, the score of the noised latents, meaning the gradient of their log-density: , with the same as in the forward process above. A weighted sum of scores, , is the gradient of , so the guided prediction is the score of . By Bayes' rule , so that density equals : for it is the conditional distribution reweighted toward points where the condition is more likely than it is on average. The figure shows this on a two-class toy, with the guidance arithmetic on the left:
The paper's ImageNet numbers show the same trade. The unguided LDM-4 has FID 10.56, precision 0.71 and recall 0.62 (precision measures how many samples look like real images, recall how much of the real distribution the samples cover). At : FID 3.95, precision 0.81, recall 0.55. At : FID 3.60, precision 0.87, recall 0.48. The benchmark tables use ; the text-to-image samples in the paper's Figure 5 use , which gives vivid, on-prompt images at a much larger loss of variety. Guidance also costs a second network call per step, which lowers the ImageNet model's sampling rate from 0.7 to 0.4 samples per second (Table 18).
Results and compute
Class-conditional ImageNet 256 × 256 (Table 3). LDM-4 scores FID 10.56 with 400M parameters, against 10.94 for ADM with 554M. With classifier-free guidance at , LDM-4-G scores 3.60; ADM with classifier guidance (ADM-G, which needs a separately trained noisy-image classifier and steers by its gradient) scores 4.59 with 608M parameters. Compute differs more than parameter count. Table 18 of the paper converts its single-A100 training to 271 V100-days, against 916 for ADM (962 for ADM-G, counting its classifier), and measures sampling at 0.7 samples per second against ADM's 0.12, both with 250 steps. 271 V100-days at the paper's 2.2× A100 conversion is about 123 days on one A100.
Unconditional synthesis (Table 1). On CelebA-HQ faces at 256 × 256, LDM-4 sets a new state-of-the-art FID of 5.11 with 500 DDIM steps, better than previous likelihood-based models and GANs. On LSUN Churches, FFHQ and LSUN Bedrooms it trails the best GANs; on Bedrooms it scores 2.95 against ADM's 1.90 with about half the parameters.
Text-to-image on MS-COCO (Table 2). The 1.45B-parameter LDM-KL-8, trained on LAION-400M, scores FID 23.31 unguided and 12.63 with guidance at . The paper calls this on par with GLIDE (6B parameters, FID 12.24) and Make-A-Scene (4B, 11.84), both slightly better on FID with three to four times the parameters.
Inpainting (Tables 6 and 7). With parameter counts held equal, the latent model trains an epoch in 7.66 hours against 20.66 for the pixel-space one and reaches FID 15.21 against 24.74 after six epochs: at least 2.7 times faster and 1.6 times better in FID. A larger fine-tuned version sets a new state-of-the-art FID on Places inpainting. Table 15 lists the inpainting model as trained on eight V100s; every other conditional model there trains on a single A100.
Super-resolution (Table 5). Conditioning on the low-resolution image by concatenation, LDM-SR beats SR3 on FID (2.8 against 5.2, with FID features from the validation split) while SR3 has the better Inception Score, and a plain regression model has the highest PSNR of all, a metric that rewards blur.
Limits, and Stable Diffusion
The paper lists two limits. Sampling is still a sequential loop of network calls and slower than a GAN's single forward pass. And the decoder caps accuracy: even at , reconstructions are off by about 11 intensity levels on average, which can bottleneck tasks that need exact pixels. The authors expect their super-resolution models are already somewhat limited by it.
The paper's text-to-image model became the starting point for Stable Diffusion, released by the same group with Stability AI and Runway in 2022. Stable Diffusion keeps the design described here (an autoencoder with a 4-channel latent, the 0.18215 scale factor and the same noise schedule, a U-Net with cross-attention, classifier-free guidance) and replaces the from-scratch text Transformer with a frozen, pretrained CLIP ViT-L/14 text encoder. Its first release has an 860M-parameter U-Net and a 123M-parameter text encoder, trained on 512 × 512 images from a subset of LAION-5B. Later work changed the denoiser rather than the latent: DiT replaces the U-Net with a Transformer over patches of the same kind of autoencoder latent.
Questions you might still have
Is Latent Diffusion the same thing as Stable Diffusion?
No. This paper’s text-to-image model is a 1.45B-parameter LDM trained on LAION-400M, with prompts encoded by a Transformer trained from scratch on BERT tokens. Stable Diffusion, released the following year, is a latent diffusion model of the same design trained at larger scale, conditioned on a frozen, pretrained CLIP ViT-L/14 text encoder. The architecture and the autoencoder idea come from this paper; the text encoder and the training data differ.
If the autoencoder throws detail away, why are the samples not blurry?
Its decoder is trained with a perceptual loss and a patch discriminator, not only a per-pixel error, so it outputs sharp, plausible texture instead of the blurred average of all textures that fit. At f = 4 the VQ autoencoder reconstructs ImageNet validation images at PSNR 27.4 dB and reconstruction FID 0.58. What it loses is exact pixel values, which matters for tasks that are scored on them, such as super-resolution.
Why not compress harder and make the diffusion even cheaper?
Past about f = 16 the autoencoder deletes content the eye does notice. In the paper’s sweep the f = 32 model stalls near FID 90 on ImageNet while f = 4, 8 and 16 finish between about 31 and 37 after 2M steps. f = 16 is at the edge: close to 4 and 8 on that sweep, with a visibly worse reconstruction (PSNR 20.8 dB against 23.1 at f = 8). The paper settles on 4 and 8.
In the cross-attention, does the query come from the image or the text?
From the image. The query is a linear projection of the U-Net’s flattened feature map φ(z_t), one row per spatial position; the keys and values are projections of the encoded prompt τθ(y), one row per token. Each image position therefore gets its own softmax over the prompt tokens and pulls in a weighted sum of their values.
Is the autoencoder trained together with the diffusion model?
No. It is trained first, on its own, and frozen. The diffusion model then trains on latents that the frozen encoder produces. The paper contrasts this with LSGM, which learns the encoder and a score-based prior jointly and has to balance reconstruction against the prior; with a fixed autoencoder that balance is not needed and the regularization can be tiny (a KL weight of about 10⁻⁶).
Why not train the diffusion model on a downsampled 32 × 32 image instead?
A 32 × 32 × 3 thumbnail has 3,072 numbers, fewer than the 4,096 of the f = 8 latent, but plain downsampling throws away texture and fine edges, and upsampling cannot recover them. The autoencoder is trained so that its decoder can rebuild a sharp 256 × 256 image from the latent (PSNR 23 to 24 dB at f = 8 in Table 8), so the latent keeps what the image needs at full resolution in a grid the U-Net can process cheaply.
Why does guidance run the network twice per step?
The guided noise prediction is built from two predictions at the same noisy latent and step: one conditioned on the prompt, one on the empty prompt. The formula extrapolates from the second toward the first. Both come from the same network, so the extra cost is a second forward pass per step (the paper’s ImageNet model drops from 0.7 to 0.4 samples per second with guidance).
Footnotes & further reading
- The paper: Rombach, Blattmann, Lorenz, Esser, Ommer, High-Resolution Image Synthesis with Latent Diffusion Models (CVPR 2022). Official code.
- The diffusion model and the rate-distortion curve: Ho, Jain, Abbeel, Denoising Diffusion Probabilistic Models (2020), Sec. 4.3 and Figure 5, and our DDPM explainer.
- The first-stage lineage: Esser, Rombach, Ommer, Taming Transformers for High-Resolution Image Synthesis (VQGAN, 2021), building on van den Oord, Vinyals, Kavukcuoglu, Neural Discrete Representation Learning (VQ-VAE, 2017). DALL-E's autoencoder: Ramesh et al., Zero-Shot Text-to-Image Generation (2021).
- The first-stage losses: Zhang, Isola, Efros, Shechtman, Wang, The Unreasonable Effectiveness of Deep Features as a Perceptual Metric (LPIPS), and Isola, Zhu, Zhou, Efros, Image-to-Image Translation with Conditional Adversarial Networks (pix2pix and the PatchGAN discriminator).
- Guidance: Ho, Salimans, Classifier-Free Diffusion Guidance (NeurIPS 2021 workshop; their equals this page's ), and the classifier-guided predecessor, Dhariwal, Nichol, Diffusion Models Beat GANs on Image Synthesis (ADM, 2021). Our explainers: classifier-free guidance and ADM.
- The later release built on this architecture: CompVis/stable-diffusion, a latent diffusion model conditioned on a frozen CLIP ViT-L/14 text encoder.
How could this explainer be improved? Found an error, or something unclear? I read every message.