10 Diffusion Models
🚧 Հինգ դասախոսության սլայդերը պատրաստ են (L27-L31)։ Տեսանյութերը դեռ չեն ձայնագրվել։ Գործնականը (ներքևում) պատրաստ է՝ ամբողջական walkthrough-ով և սովորեցված մոդելով։
🎲 Random
TBD
📚 Նյութը
Հինգ դասախոսություն (սլայդերը ml/ch10_diffusion/ պանակում)։ Գլուխը շարունակում է L23 (VAE)-ի ավարտը՝ ինչու են VAE-ի նմուշները մշուշոտ, և ինչն է դրանից լավը։
- L27 — Diffusion I: the forward process: գեներացիան որպես sampling, աղմուկի ավելացման պրոցեսը, variance exploding vs variance preserving, փակ բանաձևը \(q(x_t \mid x_0)\), noise schedule-ները։ PDF
- L28 — Diffusion II: the loss: maximum likelihood → ELBO → KL-ների գումար → L2 → աղմուկի կանխատեսում․ DDPM-ի կորստի ֆունկցիայի ամբողջական արտածում, և ինչու է դա ընդամենը MSE։ PDF
- L29 — Diffusion III: sampling: DDPM sampler-ը, score/vector field-ի պատկերացումը, ինչու է sampler-ը ամեն քայլում նոր աղմուկ ավելացնում, DDIM, և FID։ PDF
- L30 — Diffusion IV: conditioning and guidance: CLIP-ի ընդհանուր տարածությունը, contrastive learning, cross-attention-ով տեքստի ներմուծում, և classifier-free guidance — պատճառը, որ prompt-երն աշխատում են։ PDF
- L31 — Diffusion V: latent diffusion, video, and cost: Stable Diffusion-ի latent տարածությունը (այսինքն՝ L22/L23-ի autoencoder-ը), flow matching, տեսանյութի մոդելները, և իրական արժեքը՝ և՛ հաշվողական, և՛ էթիկական։ PDF
Գլխի հիմնական միտքը մեկ նախադասությամբ․ երբ բաշխումը հնարավոր չէ ուղղակի մոդելավորել, գտի՛ր պրոցես, որը այն քայլ առ քայլ քանդում է քո վերահսկողությամբ, և սովորի՛ր այդ պրոցեսը հակառակ ուղղությամբ վազեցնել։
Բոլոր գծապատկերները գեներացվում են Python-ով (py_src/ → fig/)։ L28-ի և L29-ի թվային արդյունքները՝ MNIST-ի նման 8×8 թվանշանների վրա իրական DDPM-ից, որը սովորեցվել է լոկալ (py_src/digits_ddpm.py)։
Լրացուցիչ դիտելու համար (animated, անգլերեն)․
- But how do AI images and videos actually work? — Welch Labs / 3Blue1Brown — ինտուիցիան․ spiral-ը, vector field-ը, guidance-ը
- Diffusion Models: DDPM | Generative AI Animated — Deepia — արտածումը՝ քայլ առ քայլ, PyTorch-ի իրականացումով
Հիմնական հոդվածները․
| Հոդված | Ինչի մասին է |
|---|---|
| Sohl-Dickstein et al. 2015 | diffusion մոդելների ծագումը |
| Ho, Jain & Abbeel 2020 (DDPM) | L27-L29-ի հիմքը |
| Song et al. 2020 (DDIM) | դետերմինիստիկ, արագ sampling |
| Radford et al. 2021 (CLIP) | տեքստ-պատկեր ընդհանուր տարածություն |
| Ho & Salimans 2022 (CFG) | classifier-free guidance |
| Rombach et al. 2022 (Latent Diffusion) | Stable Diffusion |
🏡 Տնային
Գործնական — գրել ՊԱՆԻՐ ձեռքով 🧀🧀
Diffusion մոդել՝ զրոյից։ Ոչ մի ներմուծված ֆունկցիա իրական աշխատանքը չի անում — forward պրոցեսը, կորստի ֆունկցիան, ուսուցման ցիկլը և երկու sampler-ն էլ գրված են տեղում։
Ամբողջական walkthrough (կատարված, բոլոր արդյունքներով)։ panir_diffusion_solution.ipynb (download) · view on GitHub
Մաս 1 — շարժիչը, 8×8 թվանշանների վրա (արագ, առանց ներբեռնման, L27–L29)
- noise schedule-ը և ինչու է \(\sqrt{\bar\alpha_T}\)-ը պետք է փոքր լինի (այս գլուխը հենց այդ bug-ի վրա ընկել է)
- \(q(x_t \mid x_0)\)-ի փակ բանաձևը՝ ստուգված քայլ-առ-քայլ աղմկոտացման դիմաց
- կորստի ֆունկցիան — L28-ի ամբողջ արտածումից հետո ընդամենը MSE աղմուկի վրա
- DDPM sampler-ը, հետո մեկ տողի ջնջում․ առանց \(\sqrt{\beta_t}z\) անդամի նմուշների ցրվածությունը փլուզվում է 0.4407 → 0.0389
- DDIM — նույն կշիռները, չափված 24× ավելի արագ
Մաս 2 — ՊԱՆԻՐ (իրական հայերեն ձեռագիր, 24×24, L29–L30)
- 4,481 տառ, 5 դաս (Պ Ա Ն Ի Ր) Mashtots հավաքածուից․ մեկ 1.2 MB
.npz, ոչ մի Kaggle-ի հաշիվ պետք չէ - class-conditional մոդել՝ null token-ով, ուստի classifier-free guidance-ը նույն ցանցից է
- ինչ արեց ուսուցումը՝ նույն սերմով նույն բառը ամեն 1000 քայլում (աղմուկից → տառեր)
- բառի գրելը, ապա չափելը, թե ինչու այն մարդու գրած չի թվում
Տառերի և չափողականության նախադիտում (self-contained HTML)․ mashtots_letters.html
Երկու մակարդակով UNet-ը (24 → 12 → 6) 7.03M պարամետրով տվել է անընթեռնելի բեկորներ, իսկ մեկ մակարդակով 1.50M-անոցը՝ ընթեռնելի տառեր և ավելի լավ loss (0.0269 vs 0.038)։ Պատճառը նույնն է, ինչ crop-to-ink-ինը․ գծերը 1–2 պիքսել լայնություն ունեն։ Երկու անգամ կիսելուց հետո խորը շերտերում տառն արդեն ջնջված է, և ոչ մի քանակի պարամետր այն հետ չի բերում։ Մանրամասները՝ DECISIONS.md #8։
Գլխի վերջին միտքը՝ ամեն տառ գեներացվում է անկախ․ \(p(\text{բառ}) = \prod_i p(\text{տառ}_i \mid y_i)\)։ Իսկական ձեռագիր բառը մեկ ձեռքից է — նույն գրիչը, նույն թեքությունը։ Մոդելը այդ կապը պարզապես չունի, և հենց դա է պատճառը, որ պատկերային մոդելները տեքստ «գրելիս» տառանման, բայց ոչ տառ նշաններ են տալիս։