فاز 8 · درس 13

آموزش Flow Matching و Rectified Flows: نسل جدید مدل‌های زایشی سریع

نوع
ساختنی
زمان
حدود 45 دقیقه
زبان‌ها
Python
پیش‌نیاز
فاز 8 · درس 06 (DDPM)، فاز 1 · حساب دیفرانسیل و انتگرال
نموداری مقایسه‌ای که در یک سمت مسیری پرپیچ‌وخم و منحنی از ابر نویز به یک تصویر واضح و در سمت دیگر یک بردار مستقیم با پیکان‌های موازی را نشان می‌دهد
فهرست مطالب
  1. صورت مسئله
  2. مفاهیم پایه
  3. جریان خط مستقیم
  4. نمونه‌گیری
  5. جریان تصحیح‌شده (لیو، 2022)
  6. چرا این روش در سال 2024 برنده‌ی حوزه‌ی تصویر شد
  7. فلو مچینگ در برابر DDPM؛ ارتباط ریاضی دقیق
  8. پیاده‌سازی
  9. گام 1: تابع زیان آموزش
  10. گام 2: استنتاج چندگامه
  11. گام 3: مقایسه‌ی تعداد گام‌ها
  12. دام‌ها
  13. کاربردها
  14. تحویل پروژه
  15. تمرین‌ها
  16. اصطلاحات کلیدی
  17. یادداشت محیط عملیاتی: Flux.1-schnell اوج سرعت در فلو مچینگ است
  18. برای مطالعه‌ی بیشتر

مدل‌های سنتی دیفیوژن مانند DDPM برای تولید یک تصویر ناچارند مسیری خمیده و تصادفی را در ده‌ها یا صدها گام طی کنند. این تعداد بالای گام‌ها در زمان استنتاج، گلوگاه بزرگی برای تأخیر و هزینه‌های محاسباتی ایجاد می‌کند؛ مشکلی که معماری‌های مدرن سال 2024 به بعد مانند Stable Diffusion 3 و Flux.1 را به سمت تکنیک‌های تطبیق جریان یا فلو مچینگ (Flow Matching) سوق داد.

فلو مچینگ با تعریف درونیابی مستقیم بین نویز و داده، نیاز به شبیه‌سازی‌های سنگین حین آموزش را حذف می‌کند و به کمک روش‌هایی مانند جریان تصحیح‌شده (Rectified Flow)، امکان استنتاج با کیفیت بالا را تنها در 2 تا 4 گام اولر فراهم می‌سازد. در این درس، مبانی نظری، تفاوت جبری آن با دیفیوژن استاندارد و نحوه پیاده‌سازی عملی آن را بررسی می‌کنید.

مدل‌های دیفیوژن (Diffusion Models) به 20 تا 50 گام نمونه‌گیری نیاز دارند، چون مسیری منحنی را از نوفه (noise) تا داده طی می‌کنند. تطبیق جریان یا فلو مچینگ (Flow matching؛ لیپمن و همکاران، 2023) و جریان تصحیح‌شده (Rectified Flow؛ لیو و همکاران، 2022) مسیرهایی مستقیم را آموزش دادند. مسیرهای مستقیم‌تر یعنی گام‌های کمتر و استنتاج سریع‌تر. در سال 2024، مدل‌های Stable Diffusion 3، Flux.1 و AudioCraft 2 همگی به فلو مچینگ مهاجرت کردند.

صورت مسئله

فرآیند معکوس در مدل‌های DDPM یک پیمایش تصادفیِ 1000 گامه از N(0,I)\mathcal{N}(0, I) به سمت توزیع داده است. مدل DDIM این مسیر را به 20 تا 50 گام قطعی کاهش داد. شما گام‌های کمتری می‌خواهید؛ در حالت ایده‌آل فقط یک گام. مانع اصلی این است که معادله دیفرانسیل معمولی (ODE) حاکم بر فرآیند معکوس، یک معادله‌ی سفت (stiff) است و مسیر انحنا دارد.

اگر بتوانید مدل را طوری آموزش دهید که مسیر حرکت از نوفه تا داده یک خط مستقیم باشد، یک گام اولر (Euler step) ساده از t=1t=1 به t=0t=0 کفایت می‌کند. فلو مچینگ دقیقاً همین را می‌سازد: یک درونیابی خط مستقیم میان x1∼N(0,I)x_1 \sim \mathcal{N}(0, I) و x0∼datax_0 \sim \text{data} تعریف کنید، یک میدان برداری (vector field) با نماد vθ(x,t)v_\theta(x, t) را برای انطباق با مشتق زمانی آن آموزش دهید و در زمان استنتاج، از آن انتگرال بگیرید.

جریان تصحیح‌شده (لیو، 2022) یک قدم فراتر می‌رود: با تکرار فرآیندی به نام جریان‌دهی مجدد (reflow)، مسیرها را صاف‌تر می‌کند تا ODE رفته‌رفته به رفتار خطی نزدیک‌تر شود. پس از دو بار تکرار reflow، یک نمونه‌گیر (sampler) دوگامه می‌تواند با کیفیت یک DDPM پنجاه‌گامه برابری کند.

مفاهیم پایه

فلو مچینگ: درونیابی خط مستقیم میان نوفه و داده

جریان خط مستقیم

تعریف می‌کنیم:

xt=t⋅x1+(1−t)⋅x0,t∈[0,1]x_t = t \cdot x_1 + (1 - t) \cdot x_0, \quad t \in [0, 1]

که در آن x0∼datax_0 \sim \text{data} و x1∼N(0,I)x_1 \sim \mathcal{N}(0, I) است. مشتق زمانی در امتداد این خط مستقیم همواره ثابت می‌ماند:

dxtdt=x1−x0\frac{dx_t}{dt} = x_1 - x_0

حال یک میدان برداری عصبی vθ(xt,t)v_\theta(x_t, t) تعریف می‌کنیم و آن را طوری آموزش می‌دهیم که بر این مشتق منطبق شود:

L=Ex0,x1,t∥vθ(xt,t)−(x1−x0)∥2L = \mathbb{E}_{x_0, x_1, t} \left\lVert v_\theta(x_t, t) - (x_1 - x_0) \right\rVert^2

این رابطه همان تابع زیان (loss) فلو مچینگ شرطی (Conditional flow matching؛ لیپمن، 2023) است. آموزش در این روش بدون شبیه‌سازی (simulation-free) انجام می‌شود؛ یعنی در طول آموزش هیچ نیازی به باز کردن گام‌به‌گام ODE ندارید. فقط کافی است (x0,x1,t)(x_0, x_1, t) را نمونه‌گیری کنید و رگرسیون را انجام دهید.

نمونه‌گیری

در زمان استنتاج، روی میدان برداری یادگرفته‌شده در جهت معکوس زمان انتگرال‌گیری کنید:

xt−Δt=xt−Δt⋅vθ(xt,t)x_{t-\Delta t} = x_t - \Delta t \cdot v_\theta(x_t, t)

از x1∼N(0,I)x_1 \sim \mathcal{N}(0, I) شروع کنید و با گام‌های اولر به سمت t=0t=0 پایین بیایید.

جریان تصحیح‌شده (لیو، 2022)

جریان خط مستقیم کار می‌کند، اما مسیرهای یادگرفته‌شده در عمل کاملاً مستقیم نیستند؛ این مسیرها خمیده می‌شوند چون ممکن است چندین x0x_0 مختلف به یک x1x_1 یکسان متصل شوند. مرحله‌ی reflow در جریان تصحیح‌شده این‌گونه عمل می‌کند:

  1. مدل جریان v1v_1 را با جفت‌های تصادفی آموزش دهید.
  2. با انتگرال‌گیری از v1v_1 از نقطه‌ی x1x_1 تا رسیدن به مقصد آن یعنی x0x_0، تعداد N جفت داده‌ی (x1,x0)(x_1, x_0) تولید کنید.
  3. مدل v2v_2 را روی این نمونه‌های جفت‌شده آموزش دهید. چون جفت‌ها اکنون «منطبق بر ODE» هستند، درونیاب خط مستقیم بین آن‌ها واقعاً صاف‌تر خواهد بود.
  4. این فرآیند را تکرار کنید.

در عمل، 2 بار تکرار reflow مسیر را به حالت تقریباً خطی می‌رساند و امکان استنتاج با 2 تا 4 گام را فراهم می‌سازد. مدل‌های SDXL-Turbo، SD3-Turbo و LCM همگی مدل‌هایی هستند که با تقطیر دانش (distillation) از فلو مچینگ ساخته شده‌اند.

چرا این روش در سال 2024 برنده‌ی حوزه‌ی تصویر شد

سه دلیل:

  1. آموزش بدون شبیه‌سازی: نیازی به باز کردن ODE در طول آموزش نیست و پیاده‌سازی آن بسیار ساده است.
  2. هندسه‌ی بهتر تابع زیان: مسیرهای مستقیم نسبت سیگنال به نوفه‌ی یکنواختی دارند؛ در حالی که تابع زیان ε در DDPM در لبه‌های بازه‌ی زمانی، SNR نامناسبی پیدا می‌کند.
  3. استنتاج سریع‌تر: 4 تا 8 گام با کیفیت SDXL-Turbo؛ 1 گام با تقطیر سازگاری (consistency distillation).

فلو مچینگ در برابر DDPM؛ ارتباط ریاضی دقیق

فلو مچینگ با یک مسیر شرطی گوسی، در واقع همان دیفیوژن با یک برنامه‌ی نوفه‌ی مشخص است. برنامه‌ی xt=α(t)x0+σ(t)x1x_t = \alpha(t) x_0 + \sigma(t) x_1 را انتخاب کنید تا فلو مچینگ دقیقاً دیفیوژنِ بازفرمول‌بندی‌شده به شیوه‌ی استراتونوویچ (Stratonovich) همراه با v=α′⋅x0−σ′⋅x1v = \alpha' \cdot x_0 - \sigma' \cdot x_1 را بازتولید کند. این دو برای مسیرهای گوسی از نظر جبری کاملاً معادل‌اند.

ارزش افزوده‌ی فلو مچینگ: شفافیتِ متغیر هدف (یک بردار سرعت ساده)، یک تابع زیان تمیزتر و اجازه‌ی آزمایش با درونیاب‌های غیرگوسی.

جریان نرمال‌سازی (NORMALIZING FLOW)پارامتر جریان را بکشید
NORMALIZING FLOWA normalizing flow maps a simple base density (grey Gaussian) through an invertible function to a complex target (blue). Because the map is invertible, the change-of-variables formula gives the exact density: divide by the absolute Jacobian determinant, or in logs, subtract log|det J|. Where the map stretches space the density thins; where it compresses, the density piles up — and because everything is exact, the flow can be trained by maximum likelihood.grey = base Gaussian p(z) · blue = pushed-forward density p(x)
یک جریان نرمال‌سازی (Normalizing Flow)، یک چگالی پایه ساده (گوسی خاکستری) را از طریق یک تابع وارون‌پذیر به یک توزیع هدف پیچیده (آبی) نگاشت می‌کند. از آنجا که این نگاشت وارون‌پذیر است، فرمول تغییر متغیر چگالی دقیق را به دست می‌دهد: تقسیم بر قدر مطلق دترمینان ژاکوبی، یا در مقیاس لگاریتمی، تفریق log|det J|. هر جا که نگاشت فضا را کش می‌آورد، چگالی رقیق‌تر می‌شود و هر جا که آن را فشرده می‌کند، چگالی متراکم‌تر می‌گردد — و از آنجا که همه چیز دقیق است، می‌توان جریان را مستقیماً با بیشینه‌سازی درست‌نمایی آموزش داد.

پیاده‌سازی

فایل code/main.py فلو مچینگ تک‌بعدی را روی یک مدل آمیخته‌ی گوسی دومودی پیاده‌سازی می‌کند. میدان برداری vθ(x,t)v_\theta(x, t) یک MLP کوچک است که با متغیر هدفِ خط مستقیم آموزش می‌بیند. در مرحله‌ی استنتاج، با 1، 2، 4 و 20 گام اولر انتگرال‌گیری کنید و کیفیت نمونه‌ها را بسنجید.

گام 1: تابع زیان آموزش

def train_step(x0, net, rng, lr):
    x1 = rng.gauss(0, 1)
    t = rng.random()
    x_t = t * x1 + (1 - t) * x0
    target = x1 - x0
    pred = net_forward(x_t, t)
    loss = (pred - target) ** 2
    # انتشار به عقب + به‌روزرسانی

گام 2: استنتاج چندگامه

def sample(net, num_steps):
    x = rng.gauss(0, 1)
    for i in range(num_steps):
        t = 1.0 - i / num_steps
        dt = 1.0 / num_steps
        x -= dt * net_forward(x, t)
    return x

گام 3: مقایسه‌ی تعداد گام‌ها

انتظار داشته باشید که نمونه‌گیر 4 گامه با کیفیت 20 گامه برابری کند؛ دستاوردی بزرگ برای کاهش تاخیر (latency).

دام‌ها

  • پارامترسازی زمان: فلو مچینگ از t∈[0,1]t \in [0, 1] استفاده می‌کند که در آن t=0t=0 نشان‌دهنده‌ی داده و t=1t=1 نشان‌دهنده‌ی نوفه است. DDPM از t∈[0,T]t \in [0, T] استفاده می‌کند که t=0t=0 داده و t=Tt=T نوفه است. جهت یکی است اما مقیاس‌ها تفاوت دارند. مقاله‌ها مدام این را اشتباه می‌گیرند.
  • انتخاب برنامه‌ی زمانی: خط مستقیمِ جریان تصحیح‌شده، برنامه‌ی استاندارد فلو مچینگ است؛ اما می‌توانید برای پوشش بهتر مقیاس‌ها، از نمونه‌گیری زمانی کسینوسی یا لاجیت-نرمال استفاده کنید (کاری که SD3 انجام می‌دهد).
  • هزینه‌ی reflow: ساخت دیتاست جفت‌شده برای reflow، به ازای هر نمونه نیازمند یک دور استنتاج کامل است. فقط زمانی به سراغ reflow بروید که واقعاً به استنتاج 1 یا 2 گامه نیاز دارید.
  • راهنمایی بدون طبقه‌بند (Classifier-free guidance) همچنان اعمال می‌شود: کافی است در ترکیب خطی، ϵ\epsilon را با vv جایگزین کنید: vcfg=(1+w)vcond−wvuncondv_{\text{cfg}} = (1+w) v_{\text{cond}} - w v_{\text{uncond}}.

کاربردها

کاربرد ابزارهای استاندارد 2026
تبدیل متن به تصویر، بالاترین کیفیت فلو مچینگ: SD3، Flux.1-dev
تبدیل متن به تصویر، 1 تا 4 گام فلو مچینگ تقطیرشده: Flux.1-schnell، SD3-Turbo، SDXL-Turbo
استنتاج بلادرنگ تقطیر سازگاری از پایه‌ی فلو مچینگ (LCM، PCM)
تولید صوت فلو مچینگ: Stable Audio 2.5، AudioCraft 2
تولید ویدیو ترکیب فلو مچینگ با دیفیوژن (Sora، Veo، Stable Video)
علوم پایه و فیزیک (مسیر ذرات، مولکول‌ها) فلو مچینگ + میدان برداری هم‌وردا (equivariant)

هر وقت در مقالات سال‌های 2025 و 2026 عبارت «سریع‌تر از دیفیوژن» را دیدید، تقریباً همیشه با فلو مچینگ + تقطیر دانش طرف هستید.

تحویل پروژه

فایل outputs/skill-fm-tuner.md را ذخیره کنید. این مهارت مشخصات مدلی از جنس دیفیوژن را می‌گیرد و آن را به کانفیگ آموزش فلو مچینگ تبدیل می‌کند: انتخاب برنامه‌ی زمانی، توزیع نمونه‌گیری زمان (یکنواخت / لاجیت-نرمال)، بهینه‌ساز، برنامه‌ی reflow، تعداد گام‌های هدف و شیوه‌نامه‌ی ارزیابی.

تمرین‌ها

  1. ساده. اسکریپت code/main.py را اجرا کنید و خطای میانگین مربعات (MSE) نمونه‌گیری 1 گامه و 20 گامه را نسبت به توزیع واقعی داده بسنجید.
  2. متوسط. نمونه‌گیری یکنواخت tt را به لاجیت-نرمال تغییر دهید (این کار نمونه‌گیری را روی مقادیر میانی t متمرکز می‌کند). آیا کیفیت مدل بهتر می‌شود؟
  3. سخت. یک مرحله reflow را پیاده‌سازی کنید: با حل عددی اولین مدل، جفت‌های (x0,x1)(x_0, x_1) را بسازید، مدل دوم را روی این جفت‌ها آموزش دهید و کیفیت نمونه‌گیری 1 گامه را مقایسه کنید.

اصطلاحات کلیدی

اصطلاح در گفت‌وگوها معنای فنی دقیق
فلو مچینگ (Flow matching) «دیفیوژن با خط مستقیم» آموزش vθ(x,t)v_\theta(x, t) برای انطباق با x1−x0x_1 - x_0 در امتداد یک درونیاب.
جریان تصحیح‌شده (Rectified flow) «جریان‌دهی مجدد (Reflow)» فرآیندی تکرارشونده که جریان‌های یادگرفته‌شده را صاف می‌کند.
میدان سرعت (Velocity field) «v_θ» خروجی مدل؛ جهتی که باید xtx_t را در امتداد آن حرکت داد.
درونیاب خط مستقیم (Straight-line interpolant) «مسیر» رابطه‌ی xt=(1−t)⋅x0+t⋅x1x_t = (1-t) \cdot x_0 + t \cdot x_1؛ مشتق هدفِ بدیهی.
نمونه‌گیر اولر (Euler sampler) «حل‌کننده‌ی ODE مرتبه اول» ساده‌ترین انتگرال‌گیر؛ وقتی مسیرها مستقیم باشند عالی کار می‌کند.
t لاجیت-نرمال (Logit-normal t) «نمونه‌گیری SD3» متمرکز کردن نمونه‌گیری tt به سمت مقادیر میانی؛ جایی که گرادیان‌ها قوی‌ترین هستند.
تقطیر سازگاری (Consistency distillation) «نمونه‌گیر 1 گامه» آموزش یک مدل دانش‌آموز برای نگاشت مستقیم هر xtx_t به x0x_0.
CFG با سرعت (CFG with velocity) «v-CFG» استفاده از رابطه‌ی vcfg=(1+w)vcond−wvuncondv_{\text{cfg}} = (1+w) v_{\text{cond}} - w v_{\text{uncond}}؛ همان ترفند قبلی با متغیری جدید.

یادداشت محیط عملیاتی: Flux.1-schnell اوج سرعت در فلو مچینگ است

برگ برنده‌ی فلو مچینگ در محیط عملیاتی، Flux.1-schnell است؛ یک ترنسفورمر دیفیوژن (DiT) مبتنی بر فلو مچینگ که به 1 تا 4 گام استنتاج تقطیر شده، در حالی که کیفیت در سطح Flux-dev را حفظ می‌کند. نوت‌بوک نیلز با عنوان «اجرای Flux روی سیستمی با 8 گیگابایت حافظه»، دستورالعمل مرجع استقرار است: کدگذاری با T5 و CLIP، نوفه‌زدایی با MMDiT کوانتایزشده (در 4 گام برای schnell در مقایسه با 50 گام برای dev) و دیکود با VAE. حساب‌وکتاب هزینه‌ها:

نسخه گام‌ها تاخیر روی L4 در ابعاد 1024² مجموع محاسبات تئوری (FLOPs نسبی)
Flux.1-dev (خام) 50 حدود 15 ثانیه 1.0×
Flux.1-schnell 4 حدود 1.2 ثانیه 0.08× (12 برابر سریع‌تر)
SDXL-base 30 حدود 4 ثانیه 0.25×
SDXL-Lightning دوگامه 2 حدود 0.3 ثانیه 0.03×

قاعده‌ی محیط عملیاتی: پایه‌ی فلو مچینگ + تقطیر دانش = استاندارد پیش‌فرض سال 2026 برای تبدیل سریع متن به تصویر. همه‌ی شرکت‌های مطرح این ترکیب را عرضه می‌کنند: SD3-Turbo (ترکیب SD3 + جریان + تقطیر)، Flux-schnell (ترکیب Flux-dev + صاف‌سازی با جریان تصحیح‌شده) و CogView-4-Flash. پایه‌های دیفیوژن خالص فقط برای چک‌پوینت‌های قدیمی باقی مانده‌اند.

برای مطالعه‌ی بیشتر

سؤالات متداول

تفاوت کلیدی فلو مچینگ (Flow Matching) با مدل‌های دیفیوژن سنتی چیست؟

در فلو مچینگ، مسیر تبدیل نویز به داده به جای یک مسیر تصادفی و خمیده، یک درونیابی مستقیم است. همچنین آموزش آن بدون نیاز به باز کردن گام‌به‌گام ODE انجام می‌شود و هدف مدل، برازش مستقیم یک میدان سرعت (velocity field) ثابت است.

فرآیند جریان‌دهی مجدد (Reflow) در Rectified Flow چگونه کار می‌کند؟

با نمونه‌گیری از مدل آموزش‌دیده‌ی فعلی و ساخت جفت‌های منطبق بر ODE میان نویز و داده، مدل در دور دوم روی این جفت‌ها آموزش می‌بیند تا مسیرها کاملاً صاف شوند و استنتاج در 1 تا 4 گام ممکن شود.

چرا مدل‌هایی مثل Flux.1-schnell و SD3 از فلو مچینگ استفاده می‌کنند؟

به دلیل مسیرهای مستقیم‌تر و هندسه‌ی یکنواخت‌تر تابع زیان نسبت به دیفیوژن، که باعث می‌شود بتوان با روش‌های تقطیر، بدون افت چشمگیر کیفیت تصاویر، خروجی را در کمتر از 4 گام تولید کرد.

ما رو توی گوگل بیشتر ببین

با افزودن نکست ادمین به «منابع ترجیحی» گوگل، درس‌ها و مطالب ما را در بخش اخبار برتر جستجو بیشتر می‌بینید.