{"id":465716,"date":"2025-07-02T21:00:10","date_gmt":"2025-07-02T21:00:10","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=465716"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=465716","title":{"rendered":"<span>\u0427\u0430\u0441\u0442\u044c 3: Diffusion Transformer (DiT) \u2014 Stable Diffusion 3 \u043a\u0430\u043a \u043e\u043d\u0430 \u0435\u0441\u0442\u044c<\/span>"},"content":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<h4>\u041e\u0431\u043e \u043c\u043d\u0435<\/h4>\n<p>\u041f\u0440\u0438\u0432\u0435\u0442, \u043c\u0435\u043d\u044f \u0437\u043e\u0432\u0443\u0442 \u0412\u0430\u0441\u0438\u043b\u0438\u0439 \u0422\u0435\u0445\u0438\u043d. \u0412 <a href=\"https:\/\/habr.com\/ru\/articles\/921608\/\" rel=\"noopener noreferrer nofollow\">\u043f\u0435\u0440\u0432\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435<\/a> \u043c\u044b \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u043b\u0438 ResNet, \u0432\u043e <a href=\"https:\/\/habr.com\/ru\/articles\/921608\/\" rel=\"noopener noreferrer nofollow\">\u0432\u0442\u043e\u0440\u043e\u0439<\/a> \u2014 ViT. \u0422\u0435\u043f\u0435\u0440\u044c \u043f\u043e\u0433\u0440\u0443\u0437\u0438\u043c\u0441\u044f \u0432 \u043c\u0438\u0440 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0439 \u0441 Diffusion Transformer (DiT) \u2014 \u0441\u0435\u0440\u0434\u0446\u0435\u043c Stable Diffusion 3.<\/p>\n<hr\/>\n<h4>\u041f\u0440\u043e\u043b\u043e\u0433: \u041e\u0442 \u0440\u0430\u0441\u043f\u043e\u0437\u043d\u0430\u0432\u0430\u043d\u0438\u044f \u043a \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044e<\/h4>\n<p>\u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u044c\u0442\u0435 \u043d\u0435\u0439\u0440\u043e\u0441\u0435\u0442\u044c \u043a\u0430\u043a \u0445\u0443\u0434\u043e\u0436\u043d\u0438\u043a\u0430. \u0420\u0430\u043d\u044c\u0448\u0435 \u043e\u043d\u0430 \u0442\u043e\u043b\u044c\u043a\u043e \u0430\u043d\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043b\u0430 \u043a\u0430\u0440\u0442\u0438\u043d\u044b (&#171;\u042d\u0442\u043e \u0412\u0430\u043d \u0413\u043e\u0433!&#187;). \u0422\u0435\u043f\u0435\u0440\u044c \u043e\u043d\u0430 \u0441\u043e\u0437\u0434\u0430\u0451\u0442 \u0448\u0435\u0434\u0435\u0432\u0440\u044b \u0432 \u0441\u0442\u0438\u043b\u0435 \u0412\u0430\u043d \u0413\u043e\u0433\u0430 \u0438 \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e!<\/p>\n<figure class=\"\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/\/post_images\/f35\/c91\/4eb\/f35c914eb0d0daa9b6a4231147d26585.png\" alt=\"\u0418\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0438\u0437 \u0441\u0442\u0430\u0442\u044c\u0438\" sizes=\"(max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/\/post_images\/f35\/c91\/4eb\/f35c914eb0d0daa9b6a4231147d26585.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/\/post_images\/f35\/c91\/4eb\/f35c914eb0d0daa9b6a4231147d26585.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u0418\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0438\u0437 \u0441\u0442\u0430\u0442\u044c\u0438<\/figcaption><\/div>\n<\/figure>\n<p><strong>\u041a\u043b\u044e\u0447\u0435\u0432\u044b\u0435 \u044d\u0442\u0430\u043f\u044b \u0440\u0430\u0431\u043e\u0442\u044b DiT<\/strong>:<\/p>\n<ol>\n<li>\n<p><strong>\u041e\u0431\u0443\u0447\u0435\u043d\u0438\u0435<\/strong>:<\/p>\n<ul>\n<li>\n<p>\u0421\u0436\u0438\u043c\u0430\u0435\u043c \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0432 \u043b\u0430\u0442\u0435\u043d\u0442\u043d\u043e\u0435 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u043e \u0447\u0435\u0440\u0435\u0437 VAE (256\u0445256\u04453 \u2192 32\u044532\u04454)<\/p>\n<\/li>\n<li>\n<p>\u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0448\u0443\u043c \u0437\u0430 1000 \u0448\u0430\u0433\u043e\u0432 (\u0447\u0442\u043e\u0431\u044b \u043c\u043e\u0434\u0435\u043b\u044c \u0443\u0447\u0438\u043b\u0430\u0441\u044c \u0443\u0434\u0430\u043b\u044f\u0442\u044c \u0448\u0443\u043c \u043f\u043e\u0441\u0442\u0435\u043f\u0435\u043d\u043d\u043e)<\/p>\n<\/li>\n<li>\n<p>DiT \u0443\u0447\u0438\u0442\u0441\u044f \u043f\u0440\u0435\u0434\u0441\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u0448\u0443\u043c \u043d\u0430 \u043a\u0430\u0436\u0434\u043e\u043c \u0448\u0430\u0433\u0435<\/p>\n<\/li>\n<\/ul>\n<\/li>\n<li>\n<p><strong>\u0413\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f (\u0438\u043d\u0444\u0435\u0440\u0435\u043d\u0441)<\/strong>:<\/p>\n<ul>\n<li>\n<p>\u041d\u0430\u0447\u0438\u043d\u0430\u0435\u043c \u0441 \u0447\u0438\u0441\u0442\u043e\u0433\u043e \u0448\u0443\u043c\u0430<\/p>\n<\/li>\n<li>\n<p>\u041f\u043e\u0441\u0442\u0435\u043f\u0435\u043d\u043d\u043e \u0443\u0434\u0430\u043b\u044f\u0435\u043c \u0448\u0443\u043c \u0437\u0430 1000 \u0448\u0430\u0433\u043e\u0432<\/p>\n<\/li>\n<li>\n<p>\u0414\u0435\u043a\u043e\u0434\u0438\u0440\u0443\u0435\u043c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0447\u0435\u0440\u0435\u0437 VAE<\/p>\n<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n<hr\/>\n<h4>\u041f\u0430\u0439\u043f\u043b\u0430\u0439\u043d \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044f \u0438 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438<\/h4>\n<h3>1. \u041f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 (VAE)<\/h3>\n<p><strong>VAE (Variational Autoencoder)<\/strong> \u0441\u0436\u0438\u043c\u0430\u0435\u0442 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435:<\/p>\n<pre><code class=\"python\"># \u0414\u043b\u044f \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f 256x256: original = (3, 256, 256) \u2192 latent = (4, 32, 32)  # \u0421\u0436\u0430\u0442\u0438\u0435 \u0432 64 \u0440\u0430\u0437\u0430 <\/code><\/pre>\n<p><em>\u0417\u0430\u0447\u0435\u043c?<\/em> DiT \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0441 <strong>32\u00d732\u00d74 \u043b\u0430\u0442\u0435\u043d\u0442\u043d\u044b\u043c\u0438 \u0432\u0435\u043a\u0442\u043e\u0440\u0430\u043c\u0438<\/strong> \u2014 \u044d\u043a\u043e\u043d\u043e\u043c\u0438\u044f \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0439!<\/p>\n<h3>2. \u041f\u0440\u044f\u043c\u043e\u0439 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 (\u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0448\u0443\u043c\u0430)<\/h3>\n<figure class=\"\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/\/post_images\/cd8\/044\/377\/cd804437747991f8b53541189d136fc9.jpg\" alt=\"\u041f\u0440\u043e\u0446\u0435\u0441\u0441 \u0437\u0430\u0448\u0443\u043c\u043b\u0435\u043d\u0438\u044f\" sizes=\"(max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/\/post_images\/cd8\/044\/377\/cd804437747991f8b53541189d136fc9.jpg 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/\/post_images\/cd8\/044\/377\/cd804437747991f8b53541189d136fc9.jpg 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u041f\u0440\u043e\u0446\u0435\u0441\u0441 \u0437\u0430\u0448\u0443\u043c\u043b\u0435\u043d\u0438\u044f<\/figcaption><\/div>\n<\/figure>\n<p><strong>1000 \u0448\u0430\u0433\u043e\u0432 \u043f\u043e\u0441\u0442\u0435\u043f\u0435\u043d\u043d\u043e\u0433\u043e \u0437\u0430\u0448\u0443\u043c\u043b\u0435\u043d\u0438\u044f \u043f\u043e \u0444\u043e\u0440\u043c\u0443\u043b\u0435<\/strong>: <\/p>\n<pre><code class=\"python\">def forward_diffusion(z0, t, T=1000):     alpha_t = cos((t\/T + 0.008) \/ 1.008 * \u03c0\/2)**2       noise = torch.randn_like(z0)  # \u0421\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u0439 \u0448\u0443\u043c     z_t = sqrt(alpha_t) * z0 + sqrt(1-alpha_t) * noise  # \u0417\u0430\u0448\u0443\u043c\u043b\u0435\u043d\u043d\u0430\u044f \u0432\u0435\u0440\u0441\u0438\u044f     return z_t, noise <\/code><\/pre>\n<p><em>\u0413\u0434\u0435<\/em>:<\/p>\n<ul>\n<li>\n<p><code>z0<\/code> \u2014 \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043b\u0430\u0442\u0435\u043d\u0442\u043d\u044b\u0439 \u0432\u0435\u043a\u0442\u043e\u0440 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f<\/p>\n<\/li>\n<li>\n<p><code>t<\/code> \u2014 \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u0448\u0430\u0433 (1-1000)<\/p>\n<\/li>\n<li>\n<p><code>noise<\/code> \u2014 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u043d\u044b\u0439 \u0448\u0443\u043c<\/p>\n<\/li>\n<\/ul>\n<h3>3. \u041e\u0431\u0440\u0430\u0442\u043d\u044b\u0439 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 (\u043e\u0431\u0443\u0447\u0435\u043d\u0438\u0435 DiT)<\/h3>\n<p><strong>\u041a\u043b\u044e\u0447\u0435\u0432\u044b\u0435 \u0448\u0430\u0433\u0438 \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044f<\/strong>:<\/p>\n<ol>\n<li>\n<p>\u0412\u044b\u0431\u0438\u0440\u0430\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u0439 \u0448\u0430\u0433 <code>t<\/code> (1-1000)<\/p>\n<\/li>\n<li>\n<p>\u0417\u0430\u0448\u0443\u043c\u043b\u044f\u0435\u043c \u043b\u0430\u0442\u0435\u043d\u0442\u043d\u044b\u0439 \u0432\u0435\u043a\u0442\u043e\u0440: <code>z_t, real_noise = forward_diffusion(z0, t)<\/code><\/p>\n<\/li>\n<li>\n<p>\u041f\u043e\u0434\u0430\u0435\u043c \u0432 DiT: <code>pred_noise = DiT(z_t, t, text_embed)<\/code> \u0438 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u043f\u0440\u0435\u0434\u0441\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u0439 \u0448\u0443\u043c<\/p>\n<\/li>\n<li>\n<p>\u0421\u0447\u0438\u0442\u0430\u0435\u043c MSE-\u043b\u043e\u0441\u0441: <code>loss = (real_noise - pred_noise).square().mean()<\/code><\/p>\n<\/li>\n<li>\n<p>\u041e\u0431\u043d\u043e\u0432\u043b\u044f\u0435\u043c \u0432\u0435\u0441\u0430 \u0447\u0435\u0440\u0435\u0437 backpropagation<\/p>\n<\/li>\n<\/ol>\n<p><strong>\u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435<\/strong>: DiT \u0443\u0447\u0438\u0442\u0441\u044f \u043f\u0440\u0435\u0434\u0441\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c <em>\u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u044c\u043d\u044b\u0439 \u0448\u0443\u043c<\/em>, \u0430 \u043d\u0435 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435!<\/p>\n<h3>4. \u0413\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0439 (\u0438\u043d\u0444\u0435\u0440\u0435\u043d\u0441)<\/h3>\n<p><strong>\u041f\u043e\u0448\u0430\u0433\u043e\u0432\u044b\u0439 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0434\u043b\u044f Stable Diffusion 3<\/strong>(\u043e\u0442\u043b\u0438\u0447\u0430\u0435\u0442\u0441\u044f \u043e\u0442 DiT \u0438\u0437 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u044c\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438 \u0442\u0435\u043c, \u0447\u0442\u043e \u043f\u043e\u0434\u0430\u0435\u0442\u0441\u044f \u044d\u043c\u0431\u0435\u0434\u0434\u0438\u043d\u0433 \u0442\u0435\u043a\u0441\u0442\u0430 \u0432\u043c\u0435\u0441\u0442\u043e \u043c\u0435\u0442\u043a\u0438 \u043a\u043b\u0430\u0441\u0441\u0430):<\/p>\n<pre><code class=\"python\">def generate(prompt, steps=1000):     # 1. \u0422\u0435\u043a\u0441\u0442\u043e\u0432\u044b\u0439 \u044d\u043c\u0431\u0435\u0434\u0434\u0438\u043d\u0433     text_embed = text_encoder(prompt)  # [1, 768]          # 2. \u041d\u0430\u0447\u0430\u043b\u044c\u043d\u044b\u0439 \u0448\u0443\u043c     z = torch.randn(1, 4, 32, 32)  # z_T          # 3. \u0418\u0442\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u043e\u0435 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0448\u0443\u043c\u0430     for t in range(steps, 0, -1):         # a) \u041f\u0440\u0435\u0434\u0441\u043a\u0430\u0437\u0430\u043d\u0438\u0435 \u0448\u0443\u043c\u0430 DiT         pred_noise = DiT(z, t, text_embed)                  # b) Classifier-Free Guidance (CFG) - \u0443\u0441\u0438\u043b\u0435\u043d\u0438\u0435 \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u0432\u043b\u0438\u044f\u043d\u0438\u044f         if cfg_scale &gt; 1.0:             uncond_embed = text_encoder(\"\")  # \u041f\u0443\u0441\u0442\u043e\u0439 \u043f\u0440\u043e\u043c\u043f\u0442             uncond_noise = DiT(z, t, uncond_embed)             pred_noise = uncond_noise + cfg_scale * (pred_noise - uncond_noise)                  # c) \u0424\u043e\u0440\u043c\u0443\u043b\u0430 \u043e\u0431\u0440\u0430\u0442\u043d\u043e\u0433\u043e \u0448\u0430\u0433\u0430 (DDIM)         alpha_t = cos((t\/steps + 0.008)\/1.008 * \u03c0\/2)**2         alpha_prev = cos(((t-1)\/steps + 0.008)\/1.008 * \u03c0\/2)**2         z = (z - (1 - alpha_t)\/sqrt(1 - alpha_t) * pred_noise) \/ sqrt(alpha_t)         z += sqrt(1 - alpha_prev) * torch.randn_like(z)  # \u0421\u0442\u043e\u0445\u0430\u0441\u0442\u0438\u0447\u043d\u043e\u0441\u0442\u044c              # 4. \u0414\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0447\u0435\u0440\u0435\u0437 VAE     return VAE.decode(z)  # [1, 3, 256, 256] <\/code><\/pre>\n<hr\/>\n<h4>DiT \u0432 \u0434\u0435\u0442\u0430\u043b\u044f\u0445: \u041e\u0442\u043b\u0438\u0447\u0438\u044f \u043e\u0442 ViT<\/h4>\n<h3>1. Patchify: \u0420\u0430\u0431\u043e\u0442\u0430 \u0441 \u043b\u0430\u0442\u0435\u043d\u0442\u0430\u043c\u0438<\/h3>\n<p>\u041c\u044b \u043d\u0430\u0440\u0435\u0437\u0430\u0435\u043c \u043d\u0430 \u043f\u0430\u0442\u0447\u0438 \u043d\u0435 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u044c\u043d\u043e\u0435 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435, \u0430 \u043b\u0430\u0442\u0435\u043d\u0442\u043d\u044b\u0439 \u0432\u0435\u043a\u0442\u043e\u0440<\/p>\n<pre><code class=\"python\"># \u0414\u043b\u044f \u043b\u0430\u0442\u0435\u043d\u0442\u0430 32x32x4 \u0441 \u043f\u0430\u0442\u0447\u0430\u043c\u0438 2x2: self.patch_embed = nn.Conv2d(4, dim, kernel_size=2, stride=2) # \u2192 [batch, 256, dim]  (16*16=256 \u043f\u0430\u0442\u0447\u0435\u0439) <\/code><\/pre>\n<p><em>\u0421\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 \u0441 ViT<\/em>: ViT \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0441 \u043f\u0438\u043a\u0441\u0435\u043b\u044f\u043c\u0438, DiT \u2014 \u0441 \u043b\u0430\u0442\u0435\u043d\u0442\u043d\u044b\u043c\u0438 \u0432\u0435\u043a\u0442\u043e\u0440\u0430\u043c\u0438.<\/p>\n<h3>2. Classifier-Free Guidance (CFG)<\/h3>\n<p><strong>\u041c\u0435\u0445\u0430\u043d\u0438\u0437\u043c \u0443\u0441\u0438\u043b\u0435\u043d\u0438\u044f \u0442\u0435\u043a\u0441\u0442\u0430<\/strong> \u043c\u044b \u0445\u043e\u0442\u0438\u043c, \u0447\u0442\u043e\u0431\u044b \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0438\u0437 \u0448\u0443\u043c\u0430 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0432\u043e\u0432\u0430\u043b\u043e \u0442\u0435\u043a\u0441\u0442\u0443, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u044b \u043f\u0435\u0440\u0435\u0434\u0430\u043b\u0438:<\/p>\n<pre><code class=\"python\">pred_noise = uncond_noise + guidance_scale * (text_noise - uncond_noise) <\/code><\/pre>\n<p><em>\u0413\u0434\u0435<\/em>:<\/p>\n<ul>\n<li>\n<p><code>uncond_noise<\/code> \u2014 \u043f\u0440\u0435\u0434\u0441\u043a\u0430\u0437\u0430\u043d\u0438\u0435 \u0434\u043b\u044f \u043f\u0443\u0441\u0442\u043e\u0433\u043e \u043f\u0440\u043e\u043c\u043f\u0442\u0430<\/p>\n<\/li>\n<li>\n<p><code>text_noise<\/code> \u2014 \u043f\u0440\u0435\u0434\u0441\u043a\u0430\u0437\u0430\u043d\u0438\u0435 \u0434\u043b\u044f \u0446\u0435\u043b\u0435\u0432\u043e\u0433\u043e \u043f\u0440\u043e\u043c\u043f\u0442\u0430<\/p>\n<\/li>\n<li>\n<p><code>guidance_scale<\/code> (7-10) \u2014 \u0441\u0438\u043b\u0430 \u0432\u043b\u0438\u044f\u043d\u0438\u044f \u0442\u0435\u043a\u0441\u0442\u0430<\/p>\n<\/li>\n<\/ul>\n<h3>3. Cross-Attention Block<\/h3>\n<p><strong>\u0412 SD3 (\u043d\u0435 \u0432 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u044c\u043d\u043e\u043c DiT)<\/strong>:<\/p>\n<pre><code class=\"python\">class CrossAttentionBlock(nn.Module):     def forward(self, x, text_emb):         # \u041f\u0440\u043e\u0435\u043a\u0446\u0438\u044f \u0442\u0435\u043a\u0441\u0442\u0430         q = self.wq(x)  # [batch, tokens, dim]         k = self.wk(text_emb)  # [batch, text_tokens, dim]         v = self.wv(text_emb)                  # Attention         attn = softmax(q @ k.transpose(-2,-1) \/ sqrt(dim))         return attn @ v  # \u0422\u0435\u043a\u0441\u0442-\u0443\u0441\u043b\u043e\u0432\u043d\u044b\u0435 \u043f\u0440\u0438\u0437\u043d\u0430\u043a\u0438 <\/code><\/pre>\n<p><em>\u0417\u0430\u0447\u0435\u043c?<\/em> \u0422\u043e\u0447\u043d\u0435\u0435 \u0441\u0432\u044f\u0437\u044b\u0432\u0430\u0435\u0442 \u0442\u0435\u043a\u0441\u0442 \u0438 \u0432\u0438\u0437\u0443\u0430\u043b\u044c\u043d\u044b\u0435 \u043f\u0430\u0442\u0447\u0438.<\/p>\n<h3>4. In-Context Conditioning<\/h3>\n<p><strong>\u041c\u0435\u0445\u0430\u043d\u0438\u0437\u043c \u0432 DiT-XL<\/strong>:<\/p>\n<ul>\n<li>\n<p>\u0412\u0432\u043e\u0434 \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u044b\u0445 \u0442\u043e\u043a\u0435\u043d\u043e\u0432 <strong>\u043a\u0430\u043a \u043f\u0430\u0442\u0447\u0435\u0439<\/strong><\/p>\n<\/li>\n<li>\n<p>\u041f\u0440\u0438\u043c\u0435\u0440: <code>[IMAGE_PATCH1, TEXT_TOKEN1, IMAGE_PATCH2, ...]<\/code><\/p>\n<\/li>\n<li>\n<p>\u041f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0441\u043c\u0435\u0448\u0438\u0432\u0430\u0442\u044c \u0442\u0435\u043a\u0441\u0442 \u0438 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u043d\u0430 \u0432\u0445\u043e\u0434\u0435<\/p>\n<\/li>\n<\/ul>\n<h3>5. AdaLN-Zero<\/h3>\n<p><strong>\u0423\u043b\u0443\u0447\u0448\u0435\u043d\u0438\u0435 \u0432 DiT-2<\/strong>:<\/p>\n<ul>\n<li>\n<p>\u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u03b3 \u0432 AdaLN <strong>\u043d\u0443\u043b\u044f\u043c\u0438<\/strong><\/p>\n<\/li>\n<li>\n<p>\u041f\u0435\u0440\u0432\u044b\u0435 \u0448\u0430\u0433\u0438 \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044f: AdaLN = Identity Function<\/p>\n<\/li>\n<li>\n<p>\u0421\u0442\u0430\u0431\u0438\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u0440\u0430\u043d\u043d\u0435\u0435 \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u0435<\/p>\n<\/li>\n<\/ul>\n<hr\/>\n<h4>\u0420\u0430\u0437\u0431\u0435\u0440\u0451\u043c \u043d\u0430 \u043f\u0440\u043e\u0441\u0442\u043e\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0435<\/h4>\n<h3>\u041e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u044c\u043d\u044b\u0439 DiT (\u043a\u043b\u0430\u0441\u0441-\u0443\u0441\u043b\u043e\u0432\u043d\u044b\u0439)<\/h3>\n<figure class=\"\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/\/post_images\/6d7\/9db\/9bf\/6d79db9bf6b6361ed0e4a523ea2683ce.jpg\" alt=\"Uncurated 512 \u00d7 512 DiT-XL\/2 samples. Classifier-free guidance scale = 2.0 Class label = \u201cpanda\u201d (388)\" sizes=\"(max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/\/post_images\/6d7\/9db\/9bf\/6d79db9bf6b6361ed0e4a523ea2683ce.jpg 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/\/post_images\/6d7\/9db\/9bf\/6d79db9bf6b6361ed0e4a523ea2683ce.jpg 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>Uncurated 512 \u00d7 512 DiT-XL\/2 samples. Classifier-free guidance scale = 2.0 Class label = \u201cpanda\u201d (388)<\/figcaption><\/div>\n<\/figure>\n<pre><code class=\"python\"># \u0413\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \"\u0441\u043e\u0431\u0430\u043a\u0438\" (\u043a\u043b\u0430\u0441\u0441 207) class_label = 207 z = torch.randn(1, 4, 32, 32)  # \u041d\u0430\u0447\u0430\u043b\u044c\u043d\u044b\u0439 \u0448\u0443\u043c  for t in range(1000, 0, -1):     pred_noise = DiT(z, t, class_label)  # \u041f\u0440\u044f\u043c\u043e\u0439 \u0432\u044b\u0437\u043e\u0432     z = update_step(z, pred_noise, t)  # \u041e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u043b\u0430\u0442\u0435\u043d\u0442\u0430 <\/code><\/pre>\n<p><em>\u041e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0438<\/em>:<\/p>\n<ul>\n<li>\n<p>\u041f\u0440\u043e\u0441\u0442\u043e\u0439 \u0432\u0432\u043e\u0434 \u043a\u043b\u0430\u0441\u0441\u0430 \u0432\u043c\u0435\u0441\u0442\u043e \u0442\u0435\u043a\u0441\u0442\u0430<\/p>\n<\/li>\n<li>\n<p>\u041d\u0435\u0442 CFG \u0438 Cross-Attention<\/p>\n<\/li>\n<\/ul>\n<h3>Stable Diffusion 3 (\u0442\u0435\u043a\u0441\u0442-\u0443\u0441\u043b\u043e\u0432\u043d\u044b\u0439)<\/h3>\n<pre><code class=\"python\">prompt = \"\u043f\u0443\u0434\u0435\u043b\u044c \u0432 \u0440\u043e\u0437\u043e\u0432\u043e\u0439 \u0448\u0430\u043f\u043e\u0447\u043a\u0435\" text_embed = text_encoder(prompt)  # [1, 768]  for t in range(1000, 0, -1):     # 1. \u041e\u0441\u043d\u043e\u0432\u043d\u043e\u0435 \u043f\u0440\u0435\u0434\u0441\u043a\u0430\u0437\u0430\u043d\u0438\u0435     pred_noise = DiT(z, t, text_embed)          # 2. Classifier-Free Guidance (\u0443\u0441\u0438\u043b\u0435\u043d\u0438\u0435 \u0442\u0435\u043a\u0441\u0442\u0430)     uncond_noise = DiT(z, t, text_encoder(\"\"))     pred_noise = uncond_noise + 7.5 * (pred_noise - uncond_noise)          # 3. Cross-Attention \u0432 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0431\u043b\u043e\u043a\u0430\u0445     # (\u0441\u043c. \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0443 \u043d\u0438\u0436\u0435) <\/code><\/pre>\n<p><em>\u041d\u043e\u0432\u043e\u0432\u0432\u0435\u0434\u0435\u043d\u0438\u044f SD3<\/em>(\u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e DiT):<\/p>\n<ul>\n<li>\n<p><strong>\u0422\u0435\u043a\u0441\u0442 \u0447\u0435\u0440\u0435\u0437 T5<\/strong> \u0432\u043c\u0435\u0441\u0442\u043e \u043a\u043b\u0430\u0441\u0441\u043e\u0432<\/p>\n<\/li>\n<li>\n<p><strong>CFG \u0441 \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u043e\u043c 7.5<\/strong> \u0434\u043b\u044f \u0442\u043e\u0447\u043d\u043e\u0433\u043e \u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u0440\u043e\u043c\u043f\u0442\u0443<\/p>\n<\/li>\n<\/ul>\n<hr\/>\n<h4>\u041e\u0446\u0435\u043d\u043a\u0430 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0430: \u041c\u0435\u0442\u0440\u0438\u043a\u0438<\/h4>\n<h3>1. FID (Fr\u00e9chet Inception Distance)<\/h3>\n<p><strong>\u041a\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442<\/strong>:<\/p>\n<ol>\n<li>\n<p>\u0411\u0435\u0440\u0435\u043c 50k \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u0445 \u0438 50k \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0439<\/p>\n<\/li>\n<li>\n<p>\u041f\u0440\u043e\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u0447\u0435\u0440\u0435\u0437 Inception-v3 (\u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u043f\u0440\u0438\u0437\u043d\u0430\u043a\u0438)<\/p>\n<\/li>\n<li>\n<p>\u0421\u0447\u0438\u0442\u0430\u0435\u043c &#171;\u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u0435&#187; \u043c\u0435\u0436\u0434\u0443 \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f\u043c\u0438:<\/p>\n<\/li>\n<\/ol>\n<pre><code>FID = ||\u03bc_real - \u03bc_gen||^2 + Tr(\u03a3_real + \u03a3_gen - 2(\u03a3_real \u03a3_gen)^{1\/2}) <\/code><\/pre>\n<p><strong>\u0418\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0430\u0446\u0438\u044f<\/strong>:<\/p>\n<ul>\n<li>\n<p>FID = 0 \u2014 \u0438\u0434\u0435\u0430\u043b\u044c\u043d\u043e\u0435 \u0441\u043e\u0432\u043f\u0430\u0434\u0435\u043d\u0438\u0435<\/p>\n<\/li>\n<li>\n<p>FID &lt; 5 \u2014 \u0444\u043e\u0442\u043e\u0440\u0435\u0430\u043b\u0438\u0441\u0442\u0438\u0447\u043d\u044b\u0435 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f<\/p>\n<\/li>\n<li>\n<p>DiT-XL: FID = 2.27 (ImageNet 256&#215;256)<\/p>\n<\/li>\n<\/ul>\n<h3>2. IS (Inception Score)<\/h3>\n<pre><code>IS = exp(E_x[KL(p(y|x) || p(y))]) <\/code><\/pre>\n<p><em>\u0413\u0434\u0435<\/em>:<\/p>\n<ul>\n<li>\n<p><code>p(y|x)<\/code> \u2014 \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u043a\u043b\u0430\u0441\u0441\u043e\u0432 \u0434\u043b\u044f \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f<\/p>\n<\/li>\n<li>\n<p><code>p(y)<\/code> \u2014 \u043e\u0431\u0449\u0435\u0435 \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u043a\u043b\u0430\u0441\u0441\u043e\u0432<\/p>\n<\/li>\n<li>\n<p>\u0412\u044b\u0441\u043e\u043a\u0438\u0439 IS = \u0440\u0430\u0437\u043d\u043e\u043e\u0431\u0440\u0430\u0437\u043d\u044b\u0435 \u0438 \u0443\u0437\u043d\u0430\u0432\u0430\u0435\u043c\u044b\u0435 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f<\/p>\n<\/li>\n<\/ul>\n<hr\/>\n<h4>\u041f\u043e\u0447\u0435\u043c\u0443 DiT \u2014 \u044d\u0442\u043e \u0431\u0443\u0434\u0443\u0449\u0435\u0435 Stable Diffusion?<\/h4>\n<h3>\u2705 \u041f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432\u0430 \u043f\u0435\u0440\u0435\u0434 U-Net:<\/h3>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<th>\n<p align=\"left\"><strong>\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440<\/strong><\/p>\n<\/th>\n<th>\n<p align=\"left\"><strong>U-Net (SD 2.1)<\/strong><\/p>\n<\/th>\n<th>\n<p align=\"left\"><strong>DiT (SD 3)<\/strong><\/p>\n<\/th>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">\u041a\u0430\u0447\u0435\u0441\u0442\u0432\u043e (FID)<\/p>\n<\/td>\n<td>\n<p align=\"left\">3.85<\/p>\n<\/td>\n<td>\n<p align=\"left\"><strong>2.27<\/strong><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">\u041c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u0443\u0435\u043c\u043e\u0441\u0442\u044c<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u041e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0430<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u041b\u0438\u043d\u0435\u0439\u043d\u044b\u0439 \u0440\u043e\u0441\u0442<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">\u0420\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u0435<\/p>\n<\/td>\n<td>\n<p align=\"left\">768&#215;768<\/p>\n<\/td>\n<td>\n<p align=\"left\"><strong>1024&#215;1024<\/strong><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">\u0422\u0435\u043a\u0441\u0442\u043e\u0432\u0430\u044f \u043f\u0440\u0438\u0432\u044f\u0437\u043a\u0430<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0421\u0440\u0435\u0434\u043d\u044f\u044f<\/p>\n<\/td>\n<td>\n<p align=\"left\"><strong>\u0422\u043e\u0447\u043d\u0430\u044f<\/strong><\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<h3>\u274c \u041e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f:<\/h3>\n<ol>\n<li>\n<p><strong>\u0420\u0435\u0441\u0443\u0440\u0441\u044b<\/strong>: \u041e\u0431\u0443\u0447\u0435\u043d\u0438\u0435 DiT-XL \u0442\u0440\u0435\u0431\u0443\u0435\u0442 500,000 GPU-hours<\/p>\n<\/li>\n<li>\n<p><strong>\u041f\u0430\u043c\u044f\u0442\u044c<\/strong>: \u0413\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f 1024px \u0442\u0440\u0435\u0431\u0443\u0435\u0442 48GB VRAM<\/p>\n<\/li>\n<\/ol>\n<hr\/>\n<h4>\u0424\u0438\u043b\u043e\u0441\u043e\u0444\u0441\u043a\u0438\u0439 \u0438\u0442\u043e\u0433<\/h4>\n<p>DiT \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u044f\u0435\u0442 \u0442\u0440\u0438 \u0440\u0435\u0432\u043e\u043b\u044e\u0446\u0438\u0438 \u0418\u0418:<\/p>\n<ol>\n<li>\n<p><strong>\u0421\u0436\u0430\u0442\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0445<\/strong> (VAE)<\/p>\n<\/li>\n<li>\n<p><strong>\u0422\u0440\u0430\u043d\u0441\u0444\u043e\u0440\u043c\u0435\u0440\u044b<\/strong> (ViT)<\/p>\n<\/li>\n<li>\n<p><strong>\u0414\u0438\u0444\u0444\u0443\u0437\u0438\u043e\u043d\u043d\u044b\u0435 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u044b<\/strong><\/p>\n<\/li>\n<\/ol>\n<hr\/>\n<h4>\u041f\u0440\u043e\u0432\u0435\u0440\u044c \u0441\u0435\u0431\u044f<\/h4>\n<ol>\n<li>\n<p>\u041f\u043e\u0447\u0435\u043c\u0443 DiT \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0441 32&#215;32, \u0430 \u043d\u0435 256&#215;256?<\/p>\n<\/li>\n<li>\n<p>\u041a\u0430\u043a Classifier-Free Guidance \u0443\u043b\u0443\u0447\u0448\u0430\u0435\u0442 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044e?<\/p>\n<\/li>\n<\/ol>\n<hr\/>\n<h4>\u0420\u0435\u0437\u044e\u043c\u0435<\/h4>\n<p><strong>Diffusion Transformer (DiT)<\/strong>:<\/p>\n<ul>\n<li>\n<p>\u0420\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0432 \u043b\u0430\u0442\u0435\u043d\u0442\u043d\u043e\u043c \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435 VAE (32x32x4)<\/p>\n<\/li>\n<li>\n<p>\u0417\u0430\u043c\u0435\u043d\u044f\u0435\u0442 U-Net \u043d\u0430 \u0442\u0440\u0430\u043d\u0441\u0444\u043e\u0440\u043c\u0435\u0440 \u0441 AdaLN<\/p>\n<\/li>\n<li>\n<p>\u041e\u0440\u0438\u0433\u0438\u043d\u0430\u043b: \u043a\u043b\u0430\u0441\u0441-\u0443\u0441\u043b\u043e\u0432\u043d\u0430\u044f \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f<\/p>\n<\/li>\n<\/ul>\n<p><strong>Stable Diffusion 3<\/strong>:<\/p>\n<ul>\n<li>\n<p>\u0422\u0435\u043a\u0441\u0442 \u0447\u0435\u0440\u0435\u0437 \u0442\u0435\u043a\u0441\u0442 \u044d\u043d\u043a\u043e\u0434\u0435\u0440 \u0438 Cross-Attention<\/p>\n<\/li>\n<li>\n<p>Classifier-Free Guidance \u0434\u043b\u044f \u0442\u043e\u0447\u043d\u043e\u0441\u0442\u0438<\/p>\n<\/li>\n<li>\n<p>\u041f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 1024px \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0439<\/p>\n<\/li>\n<li>\n<p>FID 2.27 \u2014 \u043d\u043e\u0432\u044b\u0439 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0430<\/p>\n<\/li>\n<\/ul>\n<p><strong>\u0421\u0441\u044b\u043b\u043a\u0438<\/strong>:<\/p>\n<ol>\n<li>\n<p><a href=\"https:\/\/arxiv.org\/abs\/2212.09748\" rel=\"noopener noreferrer nofollow\">\u041e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u0442\u0430\u0442\u044c\u044f DiT<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/arxiv.org\/abs\/2312.00001\" rel=\"noopener noreferrer nofollow\">Stable Diffusion 3<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/arxiv.org\/abs\/2207.12598\" rel=\"noopener noreferrer nofollow\">CFG \u0432 \u0434\u0438\u0444\u0444\u0443\u0437\u0438\u043e\u043d\u043d\u044b\u0445 \u043c\u043e\u0434\u0435\u043b\u044f\u0445<\/a><\/p>\n<\/li>\n<\/ol>\n<\/div>\n<\/div>\n<\/div>\n<p><!----><!----><\/div>\n<p><!----><!----><br \/> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/articles\/924410\/\"> https:\/\/habr.com\/ru\/articles\/924410\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<h4>\u041e\u0431\u043e \u043c\u043d\u0435<\/h4>\n<p>\u041f\u0440\u0438\u0432\u0435\u0442, \u043c\u0435\u043d\u044f \u0437\u043e\u0432\u0443\u0442 \u0412\u0430\u0441\u0438\u043b\u0438\u0439 \u0422\u0435\u0445\u0438\u043d. \u0412 <a href=\"https:\/\/habr.com\/ru\/articles\/921608\/\" rel=\"noopener noreferrer nofollow\">\u043f\u0435\u0440\u0432\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435<\/a> \u043c\u044b \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u043b\u0438 ResNet, \u0432\u043e <a href=\"https:\/\/habr.com\/ru\/articles\/921608\/\" rel=\"noopener noreferrer nofollow\">\u0432\u0442\u043e\u0440\u043e\u0439<\/a> \u2014 ViT. \u0422\u0435\u043f\u0435\u0440\u044c \u043f\u043e\u0433\u0440\u0443\u0437\u0438\u043c\u0441\u044f \u0432 \u043c\u0438\u0440 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0439 \u0441 Diffusion Transformer (DiT) \u2014 \u0441\u0435\u0440\u0434\u0446\u0435\u043c Stable Diffusion 3.<\/p>\n<hr\/>\n<h4>\u041f\u0440\u043e\u043b\u043e\u0433: \u041e\u0442 \u0440\u0430\u0441\u043f\u043e\u0437\u043d\u0430\u0432\u0430\u043d\u0438\u044f \u043a \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044e<\/h4>\n<p>\u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u044c\u0442\u0435 \u043d\u0435\u0439\u0440\u043e\u0441\u0435\u0442\u044c \u043a\u0430\u043a \u0445\u0443\u0434\u043e\u0436\u043d\u0438\u043a\u0430. \u0420\u0430\u043d\u044c\u0448\u0435 \u043e\u043d\u0430 \u0442\u043e\u043b\u044c\u043a\u043e \u0430\u043d\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043b\u0430 \u043a\u0430\u0440\u0442\u0438\u043d\u044b (&#171;\u042d\u0442\u043e \u0412\u0430\u043d \u0413\u043e\u0433!&#187;). \u0422\u0435\u043f\u0435\u0440\u044c \u043e\u043d\u0430 \u0441\u043e\u0437\u0434\u0430\u0451\u0442 \u0448\u0435\u0434\u0435\u0432\u0440\u044b \u0432 \u0441\u0442\u0438\u043b\u0435 \u0412\u0430\u043d \u0413\u043e\u0433\u0430 \u0438 \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e!<\/p>\n<figure class=\"\">\n<div><figcaption>\u0418\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0438\u0437 \u0441\u0442\u0430\u0442\u044c\u0438<\/figcaption><\/div>\n<\/figure>\n<p><strong>\u041a\u043b\u044e\u0447\u0435\u0432\u044b\u0435 \u044d\u0442\u0430\u043f\u044b \u0440\u0430\u0431\u043e\u0442\u044b DiT<\/strong>:<\/p>\n<ol>\n<li>\n<p><strong>\u041e\u0431\u0443\u0447\u0435\u043d\u0438\u0435<\/strong>:<\/p>\n<ul>\n<li>\n<p>\u0421\u0436\u0438\u043c\u0430\u0435\u043c \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0432 \u043b\u0430\u0442\u0435\u043d\u0442\u043d\u043e\u0435 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u043e \u0447\u0435\u0440\u0435\u0437 VAE (256\u0445256\u04453 \u2192 32\u044532\u04454)<\/p>\n<\/li>\n<li>\n<p>\u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0448\u0443\u043c \u0437\u0430 1000 \u0448\u0430\u0433\u043e\u0432 (\u0447\u0442\u043e\u0431\u044b \u043c\u043e\u0434\u0435\u043b\u044c \u0443\u0447\u0438\u043b\u0430\u0441\u044c \u0443\u0434\u0430\u043b\u044f\u0442\u044c \u0448\u0443\u043c \u043f\u043e\u0441\u0442\u0435\u043f\u0435\u043d\u043d\u043e)<\/p>\n<\/li>\n<li>\n<p>DiT \u0443\u0447\u0438\u0442\u0441\u044f \u043f\u0440\u0435\u0434\u0441\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u0448\u0443\u043c \u043d\u0430 \u043a\u0430\u0436\u0434\u043e\u043c \u0448\u0430\u0433\u0435<\/p>\n<\/li>\n<\/ul>\n<\/li>\n<li>\n<p><strong>\u0413\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f (\u0438\u043d\u0444\u0435\u0440\u0435\u043d\u0441)<\/strong>:<\/p>\n<ul>\n<li>\n<p>\u041d\u0430\u0447\u0438\u043d\u0430\u0435\u043c \u0441 \u0447\u0438\u0441\u0442\u043e\u0433\u043e \u0448\u0443\u043c\u0430<\/p>\n<\/li>\n<li>\n<p>\u041f\u043e\u0441\u0442\u0435\u043f\u0435\u043d\u043d\u043e \u0443\u0434\u0430\u043b\u044f\u0435\u043c \u0448\u0443\u043c \u0437\u0430 1000 \u0448\u0430\u0433\u043e\u0432<\/p>\n<\/li>\n<li>\n<p>\u0414\u0435\u043a\u043e\u0434\u0438\u0440\u0443\u0435\u043c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0447\u0435\u0440\u0435\u0437 VAE<\/p>\n<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n<hr\/>\n<h4>\u041f\u0430\u0439\u043f\u043b\u0430\u0439\u043d \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044f \u0438 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438<\/h4>\n<h3>1. \u041f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 (VAE)<\/h3>\n<p><strong>VAE (Variational Autoencoder)<\/strong> \u0441\u0436\u0438\u043c\u0430\u0435\u0442 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435:<\/p>\n<pre><code class=\"python\"># \u0414\u043b\u044f \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f 256x256: original = (3, 256, 256) \u2192 latent = (4, 32, 32)  # \u0421\u0436\u0430\u0442\u0438\u0435 \u0432 64 \u0440\u0430\u0437\u0430 <\/code><\/pre>\n<p><em>\u0417\u0430\u0447\u0435\u043c?<\/em> DiT \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0441 <strong>32\u00d732\u00d74 \u043b\u0430\u0442\u0435\u043d\u0442\u043d\u044b\u043c\u0438 \u0432\u0435\u043a\u0442\u043e\u0440\u0430\u043c\u0438<\/strong> \u2014 \u044d\u043a\u043e\u043d\u043e\u043c\u0438\u044f \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0439!<\/p>\n<h3>2. \u041f\u0440\u044f\u043c\u043e\u0439 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 (\u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0448\u0443\u043c\u0430)<\/h3>\n<figure class=\"\">\n<div><figcaption>\u041f\u0440\u043e\u0446\u0435\u0441\u0441 \u0437\u0430\u0448\u0443\u043c\u043b\u0435\u043d\u0438\u044f<\/figcaption><\/div>\n<\/figure>\n<p><strong>1000 \u0448\u0430\u0433\u043e\u0432 \u043f\u043e\u0441\u0442\u0435\u043f\u0435\u043d\u043d\u043e\u0433\u043e \u0437\u0430\u0448\u0443\u043c\u043b\u0435\u043d\u0438\u044f \u043f\u043e \u0444\u043e\u0440\u043c\u0443\u043b\u0435<\/strong>: <\/p>\n<pre><code class=\"python\">def forward_diffusion(z0, t, T=1000):     alpha_t = cos((t\/T + 0.008) \/ 1.008 * \u03c0\/2)**2       noise = torch.randn_like(z0)  # \u0421\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u0439 \u0448\u0443\u043c     z_t = sqrt(alpha_t) * z0 + sqrt(1-alpha_t) * noise  # \u0417\u0430\u0448\u0443\u043c\u043b\u0435\u043d\u043d\u0430\u044f \u0432\u0435\u0440\u0441\u0438\u044f     return z_t, noise <\/code><\/pre>\n<p><em>\u0413\u0434\u0435<\/em>:<\/p>\n<ul>\n<li>\n<p><code>z0<\/code> \u2014 \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043b\u0430\u0442\u0435\u043d\u0442\u043d\u044b\u0439 \u0432\u0435\u043a\u0442\u043e\u0440 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f<\/p>\n<\/li>\n<li>\n<p><code>t<\/code> \u2014 \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u0448\u0430\u0433 (1-1000)<\/p>\n<\/li>\n<li>\n<p><code>noise<\/code> \u2014 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u043d\u044b\u0439 \u0448\u0443\u043c<\/p>\n<\/li>\n<\/ul>\n<h3>3. \u041e\u0431\u0440\u0430\u0442\u043d\u044b\u0439 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 (\u043e\u0431\u0443\u0447\u0435\u043d\u0438\u0435 DiT)<\/h3>\n<p><strong>\u041a\u043b\u044e\u0447\u0435\u0432\u044b\u0435 \u0448\u0430\u0433\u0438 \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044f<\/strong>:<\/p>\n<ol>\n<li>\n<p>\u0412\u044b\u0431\u0438\u0440\u0430\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u0439 \u0448\u0430\u0433 <code>t<\/code> (1-1000)<\/p>\n<\/li>\n<li>\n<p>\u0417\u0430\u0448\u0443\u043c\u043b\u044f\u0435\u043c \u043b\u0430\u0442\u0435\u043d\u0442\u043d\u044b\u0439 \u0432\u0435\u043a\u0442\u043e\u0440: <code>z_t, real_noise = forward_diffusion(z0, t)<\/code><\/p>\n<\/li>\n<li>\n<p>\u041f\u043e\u0434\u0430\u0435\u043c \u0432 DiT: <code>pred_noise = DiT(z_t, t, text_embed)<\/code> \u0438 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u043f\u0440\u0435\u0434\u0441\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u0439 \u0448\u0443\u043c<\/p>\n<\/li>\n<li>\n<p>\u0421\u0447\u0438\u0442\u0430\u0435\u043c MSE-\u043b\u043e\u0441\u0441: <code>loss = (real_noise - pred_noise).square().mean()<\/code><\/p>\n<\/li>\n<li>\n<p>\u041e\u0431\u043d\u043e\u0432\u043b\u044f\u0435\u043c \u0432\u0435\u0441\u0430 \u0447\u0435\u0440\u0435\u0437 backpropagation<\/p>\n<\/li>\n<\/ol>\n<p><strong>\u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435<\/strong>: DiT \u0443\u0447\u0438\u0442\u0441\u044f \u043f\u0440\u0435\u0434\u0441\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c <em>\u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u044c\u043d\u044b\u0439 \u0448\u0443\u043c<\/em>, \u0430 \u043d\u0435 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435!<\/p>\n<h3>4. \u0413\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0439 (\u0438\u043d\u0444\u0435\u0440\u0435\u043d\u0441)<\/h3>\n<p><strong>\u041f\u043e\u0448\u0430\u0433\u043e\u0432\u044b\u0439 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0434\u043b\u044f Stable Diffusion 3<\/strong>(\u043e\u0442\u043b\u0438\u0447\u0430\u0435\u0442\u0441\u044f \u043e\u0442 DiT \u0438\u0437 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u044c\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438 \u0442\u0435\u043c, \u0447\u0442\u043e \u043f\u043e\u0434\u0430\u0435\u0442\u0441\u044f \u044d\u043c\u0431\u0435\u0434\u0434\u0438\u043d\u0433 \u0442\u0435\u043a\u0441\u0442\u0430 \u0432\u043c\u0435\u0441\u0442\u043e \u043c\u0435\u0442\u043a\u0438 \u043a\u043b\u0430\u0441\u0441\u0430):<\/p>\n<pre><code class=\"python\">def generate(prompt, steps=1000):     # 1. \u0422\u0435\u043a\u0441\u0442\u043e\u0432\u044b\u0439 \u044d\u043c\u0431\u0435\u0434\u0434\u0438\u043d\u0433     text_embed = text_encoder(prompt)  # [1, 768]          # 2. \u041d\u0430\u0447\u0430\u043b\u044c\u043d\u044b\u0439 \u0448\u0443\u043c     z = torch.randn(1, 4, 32, 32)  # z_T          # 3. \u0418\u0442\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u043e\u0435 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0448\u0443\u043c\u0430     for t in range(steps, 0, -1):         # a) \u041f\u0440\u0435\u0434\u0441\u043a\u0430\u0437\u0430\u043d\u0438\u0435 \u0448\u0443\u043c\u0430 DiT         pred_noise = DiT(z, t, text_embed)                  # b) Classifier-Free Guidance (CFG) - \u0443\u0441\u0438\u043b\u0435\u043d\u0438\u0435 \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u0432\u043b\u0438\u044f\u043d\u0438\u044f         if cfg_scale &gt; 1.0:             uncond_embed = text_encoder(\"\")  # \u041f\u0443\u0441\u0442\u043e\u0439 \u043f\u0440\u043e\u043c\u043f\u0442             uncond_noise = DiT(z, t, uncond_embed)             pred_noise = uncond_noise + cfg_scale * (pred_noise - uncond_noise)                  # c) \u0424\u043e\u0440\u043c\u0443\u043b\u0430 \u043e\u0431\u0440\u0430\u0442\u043d\u043e\u0433\u043e \u0448\u0430\u0433\u0430 (DDIM)         alpha_t = cos((t\/steps + 0.008)\/1.008 * \u03c0\/2)**2         alpha_prev = cos(((t-1)\/steps + 0.008)\/1.008 * \u03c0\/2)**2         z = (z - (1 - alpha_t)\/sqrt(1 - alpha_t) * pred_noise) \/ sqrt(alpha_t)         z += sqrt(1 - alpha_prev) * torch.randn_like(z)  # \u0421\u0442\u043e\u0445\u0430\u0441\u0442\u0438\u0447\u043d\u043e\u0441\u0442\u044c              # 4. \u0414\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0447\u0435\u0440\u0435\u0437 VAE     return VAE.decode(z)  # [1, 3, 256, 256] <\/code><\/pre>\n<hr\/>\n<h4>DiT \u0432 \u0434\u0435\u0442\u0430\u043b\u044f\u0445: \u041e\u0442\u043b\u0438\u0447\u0438\u044f \u043e\u0442 ViT<\/h4>\n<h3>1. Patchify: \u0420\u0430\u0431\u043e\u0442\u0430 \u0441 \u043b\u0430\u0442\u0435\u043d\u0442\u0430\u043c\u0438<\/h3>\n<p>\u041c\u044b \u043d\u0430\u0440\u0435\u0437\u0430\u0435\u043c \u043d\u0430 \u043f\u0430\u0442\u0447\u0438 \u043d\u0435 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u044c\u043d\u043e\u0435 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435, \u0430 \u043b\u0430\u0442\u0435\u043d\u0442\u043d\u044b\u0439 \u0432\u0435\u043a\u0442\u043e\u0440<\/p>\n<pre><code class=\"python\"># \u0414\u043b\u044f \u043b\u0430\u0442\u0435\u043d\u0442\u0430 32x32x4 \u0441 \u043f\u0430\u0442\u0447\u0430\u043c\u0438 2x2: self.patch_embed = nn.Conv2d(4, dim, kernel_size=2, stride=2) # \u2192 [batch, 256, dim]  (16*16=256 \u043f\u0430\u0442\u0447\u0435\u0439) <\/code><\/pre>\n<p><em>\u0421\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 \u0441 ViT<\/em>: ViT \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0441 \u043f\u0438\u043a\u0441\u0435\u043b\u044f\u043c\u0438, DiT \u2014 \u0441 \u043b\u0430\u0442\u0435\u043d\u0442\u043d\u044b\u043c\u0438 \u0432\u0435\u043a\u0442\u043e\u0440\u0430\u043c\u0438.<\/p>\n<h3>2. Classifier-Free Guidance (CFG)<\/h3>\n<p><strong>\u041c\u0435\u0445\u0430\u043d\u0438\u0437\u043c \u0443\u0441\u0438\u043b\u0435\u043d\u0438\u044f \u0442\u0435\u043a\u0441\u0442\u0430<\/strong> \u043c\u044b \u0445\u043e\u0442\u0438\u043c, \u0447\u0442\u043e\u0431\u044b \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0438\u0437 \u0448\u0443\u043c\u0430 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0432\u043e\u0432\u0430\u043b\u043e \u0442\u0435\u043a\u0441\u0442\u0443, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u044b \u043f\u0435\u0440\u0435\u0434\u0430\u043b\u0438:<\/p>\n<pre><code class=\"python\">pred_noise = uncond_noise + guidance_scale * (text_noise - uncond_noise) <\/code><\/pre>\n<p><em>\u0413\u0434\u0435<\/em>:<\/p>\n<ul>\n<li>\n<p><code>uncond_noise<\/code> \u2014 \u043f\u0440\u0435\u0434\u0441\u043a\u0430\u0437\u0430\u043d\u0438\u0435 \u0434\u043b\u044f \u043f\u0443\u0441\u0442\u043e\u0433\u043e \u043f\u0440\u043e\u043c\u043f\u0442\u0430<\/p>\n<\/li>\n<li>\n<p><code>text_noise<\/code> \u2014 \u043f\u0440\u0435\u0434\u0441\u043a\u0430\u0437\u0430\u043d\u0438\u0435 \u0434\u043b\u044f \u0446\u0435\u043b\u0435\u0432\u043e\u0433\u043e \u043f\u0440\u043e\u043c\u043f\u0442\u0430<\/p>\n<\/li>\n<li>\n<p><code>guidance_scale<\/code> (7-10) \u2014 \u0441\u0438\u043b\u0430 \u0432\u043b\u0438\u044f\u043d\u0438\u044f \u0442\u0435\u043a\u0441\u0442\u0430<\/p>\n<\/li>\n<\/ul>\n<h3>3. Cross-Attention Block<\/h3>\n<p><strong>\u0412 SD3 (\u043d\u0435 \u0432 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u044c\u043d\u043e\u043c DiT)<\/strong>:<\/p>\n<pre><code class=\"python\">class CrossAttentionBlock(nn.Module):     def forward(self, x, text_emb):         # \u041f\u0440\u043e\u0435\u043a\u0446\u0438\u044f \u0442\u0435\u043a\u0441\u0442\u0430         q = self.wq(x)  # [batch, tokens, dim]         k = self.wk(text_emb)  # [batch, text_tokens, dim]         v = self.wv(text_emb)                  # Attention         attn = softmax(q @ k.transpose(-2,-1) \/ sqrt(dim))         return attn @ v  # \u0422\u0435\u043a\u0441\u0442-\u0443\u0441\u043b\u043e\u0432\u043d\u044b\u0435 \u043f\u0440\u0438\u0437\u043d\u0430\u043a\u0438 <\/code><\/pre>\n<p><em>\u0417\u0430\u0447\u0435\u043c?<\/em> \u0422\u043e\u0447\u043d\u0435\u0435 \u0441\u0432\u044f\u0437\u044b\u0432\u0430\u0435\u0442 \u0442\u0435\u043a\u0441\u0442 \u0438 \u0432\u0438\u0437\u0443\u0430\u043b\u044c\u043d\u044b\u0435 \u043f\u0430\u0442\u0447\u0438.<\/p>\n<h3>4. In-Context Conditioning<\/h3>\n<p><strong>\u041c\u0435\u0445\u0430\u043d\u0438\u0437\u043c \u0432 DiT-XL<\/strong>:<\/p>\n<ul>\n<li>\n<p>\u0412\u0432\u043e\u0434 \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u044b\u0445 \u0442\u043e\u043a\u0435\u043d\u043e\u0432 <strong>\u043a\u0430\u043a \u043f\u0430\u0442\u0447\u0435\u0439<\/strong><\/p>\n<\/li>\n<li>\n<p>\u041f\u0440\u0438\u043c\u0435\u0440: <code>[IMAGE_PATCH1, TEXT_TOKEN1, IMAGE_PATCH2, ...]<\/code><\/p>\n<\/li>\n<li>\n<p>\u041f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0441\u043c\u0435\u0448\u0438\u0432\u0430\u0442\u044c \u0442\u0435\u043a\u0441\u0442 \u0438 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u043d\u0430 \u0432\u0445\u043e\u0434\u0435<\/p>\n<\/li>\n<\/ul>\n<h3>5. AdaLN-Zero<\/h3>\n<p><strong>\u0423\u043b\u0443\u0447\u0448\u0435\u043d\u0438\u0435 \u0432 DiT-2<\/strong>:<\/p>\n<ul>\n<li>\n<p>\u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u03b3 \u0432 AdaLN <strong>\u043d\u0443\u043b\u044f\u043c\u0438<\/strong><\/p>\n<\/li>\n<li>\n<p>\u041f\u0435\u0440\u0432\u044b\u0435 \u0448\u0430\u0433\u0438 \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044f: AdaLN = Identity Function<\/p>\n<\/li>\n<li>\n<p>\u0421\u0442\u0430\u0431\u0438\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u0440\u0430\u043d\u043d\u0435\u0435 \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u0435<\/p>\n<\/li>\n<\/ul>\n<hr\/>\n<h4>\u0420\u0430\u0437\u0431\u0435\u0440\u0451\u043c \u043d\u0430 \u043f\u0440\u043e\u0441\u0442\u043e\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0435<\/h4>\n<h3>\u041e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u044c\u043d\u044b\u0439 DiT (\u043a\u043b\u0430\u0441\u0441-\u0443\u0441\u043b\u043e\u0432\u043d\u044b\u0439)<\/h3>\n<figure class=\"\">\n<div><figcaption>Uncurated 512 \u00d7 512 DiT-XL\/2 samples. Classifier-free guidance scale = 2.0 Class label = \u201cpanda\u201d (388)<\/figcaption><\/div>\n<\/figure>\n<pre><code class=\"python\"># \u0413\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \"\u0441\u043e\u0431\u0430\u043a\u0438\" (\u043a\u043b\u0430\u0441\u0441 207) class_label = 207 z = torch.randn(1, 4, 32, 32)  # \u041d\u0430\u0447\u0430\u043b\u044c\u043d\u044b\u0439 \u0448\u0443\u043c  for t in range(1000, 0, -1):     pred_noise = DiT(z, t, class_label)  # \u041f\u0440\u044f\u043c\u043e\u0439 \u0432\u044b\u0437\u043e\u0432     z = update_step(z, pred_noise, t)  # \u041e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u043b\u0430\u0442\u0435\u043d\u0442\u0430 <\/code><\/pre>\n<p><em>\u041e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0438<\/em>:<\/p>\n<ul>\n<li>\n<p>\u041f\u0440\u043e\u0441\u0442\u043e\u0439 \u0432\u0432\u043e\u0434 \u043a\u043b\u0430\u0441\u0441\u0430 \u0432\u043c\u0435\u0441\u0442\u043e \u0442\u0435\u043a\u0441\u0442\u0430<\/p>\n<\/li>\n<li>\n<p>\u041d\u0435\u0442 CFG \u0438 Cross-Attention<\/p>\n<\/li>\n<\/ul>\n<h3>Stable Diffusion 3 (\u0442\u0435\u043a\u0441\u0442-\u0443\u0441\u043b\u043e\u0432\u043d\u044b\u0439)<\/h3>\n<pre><code class=\"python\">prompt = \"\u043f\u0443\u0434\u0435\u043b\u044c \u0432 \u0440\u043e\u0437\u043e\u0432\u043e\u0439 \u0448\u0430\u043f\u043e\u0447\u043a\u0435\" text_embed = text_encoder(prompt)  # [1, 768]  for t in range(1000, 0, -1):     # 1. \u041e\u0441\u043d\u043e\u0432\u043d\u043e\u0435 \u043f\u0440\u0435\u0434\u0441\u043a\u0430\u0437\u0430\u043d\u0438\u0435     pred_noise = DiT(z, t, text_embed)          # 2. Classifier-Free Guidance (\u0443\u0441\u0438\u043b\u0435\u043d\u0438\u0435 \u0442\u0435\u043a\u0441\u0442\u0430)     uncond_noise = DiT(z, t, text_encoder(\"\"))     pred_noise = uncond_noise + 7.5 * (pred_noise - uncond_noise)          # 3. Cross-Attention \u0432 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0431\u043b\u043e\u043a\u0430\u0445     # (\u0441\u043c. \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0443 \u043d\u0438\u0436\u0435) <\/code><\/pre>\n<p><em>\u041d\u043e\u0432\u043e\u0432\u0432\u0435\u0434\u0435\u043d\u0438\u044f SD3<\/em>(\u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e DiT):<\/p>\n<ul>\n<li>\n<p><strong>\u0422\u0435\u043a\u0441\u0442 \u0447\u0435\u0440\u0435\u0437 T5<\/strong> \u0432\u043c\u0435\u0441\u0442\u043e \u043a\u043b\u0430\u0441\u0441\u043e\u0432<\/p>\n<\/li>\n<li>\n<p><strong>CFG \u0441 \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u043e\u043c 7.5<\/strong> \u0434\u043b\u044f \u0442\u043e\u0447\u043d\u043e\u0433\u043e \u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u0440\u043e\u043c\u043f\u0442\u0443<\/p>\n<\/li>\n<\/ul>\n<hr\/>\n<h4>\u041e\u0446\u0435\u043d\u043a\u0430 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0430: \u041c\u0435\u0442\u0440\u0438\u043a\u0438<\/h4>\n<h3>1. FID (Fr\u00e9chet Inception Distance)<\/h3>\n<p><strong>\u041a\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442<\/strong>:<\/p>\n<ol>\n<li>\n<p>\u0411\u0435\u0440\u0435\u043c 50k \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u0445 \u0438 50k \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0439<\/p>\n<\/li>\n<li>\n<p>\u041f\u0440\u043e\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u0447\u0435\u0440\u0435\u0437 Inception-v3 (\u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u043f\u0440\u0438\u0437\u043d\u0430\u043a\u0438)<\/p>\n<\/li>\n<li>\n<p>\u0421\u0447\u0438\u0442\u0430\u0435\u043c &#171;\u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u0435&#187; \u043c\u0435\u0436\u0434\u0443 \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f\u043c\u0438:<\/p>\n<\/li>\n<\/ol>\n<pre><code>FID = ||\u03bc_real - \u03bc_gen||^2 + Tr(\u03a3_real + \u03a3_gen - 2(\u03a3_real \u03a3_gen)^{1\/2}) <\/code><\/pre>\n<p><strong>\u0418\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0430\u0446\u0438\u044f<\/strong>:<\/p>\n<ul>\n<li>\n<p>FID = 0 \u2014 \u0438\u0434\u0435\u0430\u043b\u044c\u043d\u043e\u0435 \u0441\u043e\u0432\u043f\u0430\u0434\u0435\u043d\u0438\u0435<\/p>\n<\/li>\n<li>\n<p>FID &lt; 5 \u2014 \u0444\u043e\u0442\u043e\u0440\u0435\u0430\u043b\u0438\u0441\u0442\u0438\u0447\u043d\u044b\u0435 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f<\/p>\n<\/li>\n<li>\n<p>DiT-XL: FID = 2.27 (ImageNet 256&#215;256)<\/p>\n<\/li>\n<\/ul>\n<h3>2. IS (Inception Score)<\/h3>\n<pre><code>IS = exp(E_x[KL(p(y|x) || p(y))]) <\/code><\/pre>\n<p><em>\u0413\u0434\u0435<\/em>:<\/p>\n<ul>\n<li>\n<p><code>p(y|x)<\/code> \u2014 \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u043a\u043b\u0430\u0441\u0441\u043e\u0432 \u0434\u043b\u044f \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f<\/p>\n<\/li>\n<li>\n<p><code>p(y)<\/code> \u2014 \u043e\u0431\u0449\u0435\u0435 \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u043a\u043b\u0430\u0441\u0441\u043e\u0432<\/p>\n<\/li>\n<li>\n<p>\u0412\u044b\u0441\u043e\u043a\u0438\u0439 IS = \u0440\u0430\u0437\u043d\u043e\u043e\u0431\u0440\u0430\u0437\u043d\u044b\u0435 \u0438 \u0443\u0437\u043d\u0430\u0432\u0430\u0435\u043c\u044b\u0435 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f<\/p>\n<\/li>\n<\/ul>\n<hr\/>\n<h4>\u041f\u043e\u0447\u0435\u043c\u0443 DiT \u2014 \u044d\u0442\u043e \u0431\u0443\u0434\u0443\u0449\u0435\u0435 Stable Diffusion?<\/h4>\n<h3>\u2705 \u041f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432\u0430 \u043f\u0435\u0440\u0435\u0434 U-Net:<\/h3>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<th>\n<p align=\"left\"><strong>\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440<\/strong><\/p>\n<\/th>\n<th>\n<p align=\"left\"><strong>U-Net (SD 2.1)<\/strong><\/p>\n<\/th>\n<th>\n<p align=\"left\"><strong>DiT (SD 3)<\/strong><\/p>\n<\/th>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">\u041a\u0430\u0447\u0435\u0441\u0442\u0432\u043e (FID)<\/p>\n<\/td>\n<td>\n<p align=\"left\">3.85<\/p>\n<\/td>\n<td>\n<p align=\"left\"><strong>2.27<\/strong><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">\u041c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u0443\u0435\u043c\u043e\u0441\u0442\u044c<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u041e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0430<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u041b\u0438\u043d\u0435\u0439\u043d\u044b\u0439 \u0440\u043e\u0441\u0442<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">\u0420\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u0435<\/p>\n<\/td>\n<td>\n<p align=\"left\">768&#215;768<\/p>\n<\/td>\n<td>\n<p align=\"left\"><strong>1024&#215;1024<\/strong><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">\u0422\u0435\u043a\u0441\u0442\u043e\u0432\u0430\u044f \u043f\u0440\u0438\u0432\u044f\u0437\u043a\u0430<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0421\u0440\u0435\u0434\u043d\u044f\u044f<\/p>\n<\/td>\n<td>\n<p align=\"left\"><strong>\u0422\u043e\u0447\u043d\u0430\u044f<\/strong><\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<h3>\u274c \u041e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f:<\/h3>\n<ol>\n<li>\n<p><strong>\u0420\u0435\u0441\u0443\u0440\u0441\u044b<\/strong>: \u041e\u0431\u0443\u0447\u0435\u043d\u0438\u0435 DiT-XL \u0442\u0440\u0435\u0431\u0443\u0435\u0442 500,000 GPU-hours<\/p>\n<\/li>\n<li>\n<p><strong>\u041f\u0430\u043c\u044f\u0442\u044c<\/strong>: \u0413\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f 1024px \u0442\u0440\u0435\u0431\u0443\u0435\u0442 48GB VRAM<\/p>\n<\/li>\n<\/ol>\n<hr\/>\n<h4>\u0424\u0438\u043b\u043e\u0441\u043e\u0444\u0441\u043a\u0438\u0439 \u0438\u0442\u043e\u0433<\/h4>\n<p>DiT \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u044f\u0435\u0442 \u0442\u0440\u0438 \u0440\u0435\u0432\u043e\u043b\u044e\u0446\u0438\u0438 \u0418\u0418:<\/p>\n<ol>\n<li>\n<p><strong>\u0421\u0436\u0430\u0442\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0445<\/strong> (VAE)<\/p>\n<\/li>\n<li>\n<p><strong>\u0422\u0440\u0430\u043d\u0441\u0444\u043e\u0440\u043c\u0435\u0440\u044b<\/strong> (ViT)<\/p>\n<\/li>\n<li>\n<p><strong>\u0414\u0438\u0444\u0444\u0443\u0437\u0438\u043e\u043d\u043d\u044b\u0435 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u044b<\/strong><\/p>\n<\/li>\n<\/ol>\n<hr\/>\n<h4>\u041f\u0440\u043e\u0432\u0435\u0440\u044c \u0441\u0435\u0431\u044f<\/h4>\n<ol>\n<li>\n<p>\u041f\u043e\u0447\u0435\u043c\u0443 DiT \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0441 32&#215;32, \u0430 \u043d\u0435 256&#215;256?<\/p>\n<\/li>\n<li>\n<p>\u041a\u0430\u043a Classifier-Free Guidance \u0443\u043b\u0443\u0447\u0448\u0430\u0435\u0442 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044e?<\/p>\n<\/li>\n<\/ol>\n<hr\/>\n<h4>\u0420\u0435\u0437\u044e\u043c\u0435<\/h4>\n<p><strong>Diffusion Transformer (DiT)<\/strong>:<\/p>\n<ul>\n<li>\n<p>\u0420\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0432 \u043b\u0430\u0442\u0435\u043d\u0442\u043d\u043e\u043c \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435 VAE (32x32x4)<\/p>\n<\/li>\n<li>\n<p>\u0417\u0430\u043c\u0435\u043d\u044f\u0435\u0442 U-Net \u043d\u0430 \u0442\u0440\u0430\u043d\u0441\u0444\u043e\u0440\u043c\u0435\u0440 \u0441 AdaLN<\/p>\n<\/li>\n<li>\n<p>\u041e\u0440\u0438\u0433\u0438\u043d\u0430\u043b: \u043a\u043b\u0430\u0441\u0441-\u0443\u0441\u043b\u043e\u0432\u043d\u0430\u044f \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f<\/p>\n<\/li>\n<\/ul>\n<p><strong>Stable Diffusion 3<\/strong>:<\/p>\n<ul>\n<li>\n<p>\u0422\u0435\u043a\u0441\u0442 \u0447\u0435\u0440\u0435\u0437 \u0442\u0435\u043a\u0441\u0442 \u044d\u043d\u043a\u043e\u0434\u0435\u0440 \u0438 Cross-Attention<\/p>\n<\/li>\n<li>\n<p>Classifier-Free Guidance \u0434\u043b\u044f \u0442\u043e\u0447\u043d\u043e\u0441\u0442\u0438<\/p>\n<\/li>\n<li>\n<p>\u041f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 1024px \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0439<\/p>\n<\/li>\n<li>\n<p>FID 2.27 \u2014 \u043d\u043e\u0432\u044b\u0439 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0430<\/p>\n<\/li>\n<\/ul>\n<p><strong>\u0421\u0441\u044b\u043b\u043a\u0438<\/strong>:<\/p>\n<ol>\n<li>\n<p><a href=\"https:\/\/arxiv.org\/abs\/2212.09748\" rel=\"noopener noreferrer nofollow\">\u041e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u0442\u0430\u0442\u044c\u044f DiT<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/arxiv.org\/abs\/2312.00001\" rel=\"noopener noreferrer nofollow\">Stable Diffusion 3<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/arxiv.org\/abs\/2207.12598\" rel=\"noopener noreferrer nofollow\">CFG \u0432 \u0434\u0438\u0444\u0444\u0443\u0437\u0438\u043e\u043d\u043d\u044b\u0445 \u043c\u043e\u0434\u0435\u043b\u044f\u0445<\/a><\/p>\n<\/li>\n<\/ol>\n<\/div>\n<\/div>\n<\/div>\n<p><!----><!----><\/div>\n<p><!----><!----><br \/> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/articles\/924410\/\"> https:\/\/habr.com\/ru\/articles\/924410\/<\/a><br \/><\/br><\/br><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-465716","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/465716","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=465716"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/465716\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=465716"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=465716"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=465716"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}