بسیاری از معماریهای اولیهی مدلهای بینایی-زبانی مانند BLIP-2، تنها برای پردازش یک تصویر در ابتدای پرامپت طراحی شده بودند. اما سناریوهای دنیای واقعی اغلب نیازمند ترکیب آزادانهی متن و چند تصویر در یک توالی هستند؛ مثل مقایسهی چند سند، پردازش فریمهای ویدیو یا ارائهی نمونههای حلشده در پرامپت برای هدایت خروجی مدل.
مدل فلامینگو (Flamingo) ساختار متفاوتی را ارائه داد: بهجای دستکاری مستقیم در جریان ورودی مدل زبانی، لایههای کراساتنشن گیتدار را لابهلای لایههای مدل زبانی منجمد تزریق کرد. این ترفند ساده با تکیه بر فرمول تانژانت هایپربولیک، تضمین میکند که توانایی تحلیل متنی مدل در آغاز آموزش دستنخورده باقی بماند و سپس ویژگیهای بینایی استخراجشده توسط بازنمونهگیر پرسویر وارد جریان محاسبات شوند.
درک معماری Flamingo پایهی مفهومی تمام سیستمهای پردازش ورودی درهمتنیده مانند Gemini و سری مدلهای Idefics است. در این درس با جزئیات پیادهسازی این گیتها، مدیریت ماسک توجه چندتصویری و استراتژیهای جلوگیری از تخریب وزنهای مدل زبانی آشنا میشوید.
مدل فلامینگو (Flamingo) دیپمایند در سال 2022 دو نوآوری مهم داشت که پیش از آن سابقه نداشت. نخست نشان داد یک مدل واحد میتواند توالیهای دلخواه و درهمتنیدهای از تصویر، ویدیو و متن را پردازش کند. دوم اثبات کرد مدلهای بینایی-زبانی (VLM) توانایی یادگیری درونمتنی (in-context learning) دارند؛ یعنی اگر یک پرامپت چندشات (few-shot) شامل سه جفت نمونه (تصویر، کپشن) به مدل بدهید، بدون نیاز به هیچ گام گرادیانی، برای تصویری جدید کپشن مینویسد. سازوکار این کار، لایههای کراساتنشن گیتدار (gated cross-attention) است؛ لایههایی که میان لایههای موجود یک مدل زبانی بزرگ (LLM) منجمد تزریق شدهاند و گیت tanh یادگیرندهای دارند که مقدار اولیهاش صفر است تا توانایی پردازش متن مدل زبانی در لحظهی راهاندازی دستنخورده بماند. در این درس با بازنمونهگیر پرسویر (Perceiver resampler) و معماری کراساتنشن گیتدار فلامینگو آشنا میشویم؛ همان تباری که ورودیهای درهمتنیدهی Gemini و توکنهای تصویری Idefics2 از آن سرچشمه میگیرند.
اهداف یادگیری
- توضیح اینکه چگونه کراساتنشن گیتدار با تکیه بر فرمول tanh(gate) = 0، توانایی متنی مدل زبانی منجمد را در گام اول حفظ میکند.
- بررسی گامبهگام بازنمونهگیر پرسویر: تبدیل N پچ تصویری به K کوئری پنهان (latent) ثابت از طریق کراساتنشن.
- شرح نحوهی مدیریت توالیهای درهمتنیدهی تصویر و متن در فلامینگو با ماسک علّی متناسب با جایگاه تصاویر.
- پیادهسازی ساختار پرامپت چندشات چندوجهی (سه نمونه تصویر-کپشن به همراه یک تصویر پرسش نهایی).
صورت مسئله
مدل BLIP-2 تعداد 32 توکن تصویری را مستقیماً به لایهی ورودی مدل زبانی منجمد تزریق میکند. این رویکرد برای یک تصویر در هر پرامپت جواب میدهد؛ اما اگر بخواهید چندین تصویر را در لابهلای متن بگنجانید چه؟ مثلاً ساختاری شبیه به این: «تصویر A اینجاست، برایش کپشن بنویس؛ تصویر B اینجاست، برایش کپشن بنویس؛ حالا تصویر C اینجاست، برایش کپشن بنویس». در چنین حالتی خوداتنشن (self-attention) مدل زبانی باید توکنهای تصویر و متن را در یک جریان مشترک پردازش کند، و اینکه کدام موقعیتها بتوانند به کدام تصاویر اتنشن داشته باشند حسابی پیچیده و دردسرساز میشود.
پاسخ فلامینگو به این مسئله مشخص است: اصلاً به جریان ورودی مدل زبانی دست نزنید! در عوض، لایههای کراساتنشن اضافی را بین بلوکهای موجود مدل زبانی قرار دهید. توکنهای متنی مثل همیشه از خوداتنشن علّی مدل زبانی عبور میکنند؛ اما بین هر چند بلوک، این توکنهای متن از طریق یک لایهی گیتدار جدید به ویژگیهای تصویر نیز کراساتنشن میزنند. از آنجا که مقدار اولیهی گیت صفر تنظیم شده، این لایههای جدید در گام اول عملاً هیچ اثری ندارند (no-op) و رفتار مدل دقیقاً مانند مدل زبانی ازپیشآموزشدیده میماند. با پیشرفت آموزش، گیت باز میشود و جریان اطلاعات تصویری راه میافتد.
دومین مسئلهای که فلامینگو حل کرد: چگونه تعداد متغیری از تصاویر (صفر، یک یا چند تصویر) را در پرامپت مدیریت کنیم؟ با بازنمونهگیر پرسویر؛ یک ماژول کراساتنشن کوچک که هر تعداد پچ تصویری در ورودی باشد دریافت میکند و برای هر تصویر، تعداد ثابتی توکن نهفتهی تصویری تحویل میدهد. با افزایش تعداد تصاویر، تعداد کل توکنها بالا میرود، اما هر توکن متنی فقط توکنهای پنهان یک تصویر را میخواند؛ در نتیجه ابعاد ماتریسی که هر توکن متن در فرایند کراساتنشن میبیند، صرفنظر از تعداد تصاویر داخل پرامپت، همیشه ثابت میماند.
مفاهیم پایه
مدل زبانی منجمد
فلامینگو بر پایهی مدل زبانی منجمد Chinchilla 70B ساخته شده است. تمام 70 میلیارد وزن این مدل دستنخورده باقی میمانند و خوداتنشن متنی و FFNهای موجود طبق روال عادی کار میکنند.
بازنمونهگیر پرسویر
برای هر تصویر داخل پرامپت، مدل ViT تعداد توکن پچ تولید میکند. بازنمونهگیر پرسویر دارای بردار پنهان ثابت و یادگیرنده است (فلامینگو از استفاده میکند). هر بلوک بازنمونهگیر از دو مرحله تشکیل میشود:
- کراساتنشن: بردارهای پنهان روی توکن پچ اتنشن میزنند (Q از بردارهای پنهان، و K/V از پچها میآیند).
- خوداتنشن بههمراه FFN در میان خود بردارهای پنهان.
پس از 6 بلوک بازنمونهگیر، خروجی بدون توجه به تعداد پچهای اولیه، همیشه توکن تصویری با بُعد 1024 است. یعنی یک تصویر 224x224 (شامل 196 پچ) و یک تصویر 480x480 (شامل 900 پچ)، هر دو در نهایت با 64 توکن بازنمونهگیر خارج میشوند.
برای ویدیو، این بازنمونهگیر در امتداد زمان اعمال میشود: پچهای هر فریم 64 متغیر پنهان میسازند و یک کدگذاری مکانی (positional encoding) زمانی به مدل اجازه میدهد را از تشخیص دهد. کل ویدیو در نهایت به توکن تصویری تبدیل میشود.
کراساتنشن گیتدار
بین هر لایه از لایههای مدل زبانی منجمد (فلامینگو از استفاده میکند)، یک بلوک کراساتنشن گیتدار جدید اضافه میشود:
x_after_llm_block = llm_block(x_before)
cross = cross_attn(x_after, resampler_output)
gated = tanh(alpha) * cross + x_after
x_before_next_block = gated
- پارامتر
alphaیک اسکالر یادگیرنده با مقدار اولیهی صفر است. - از آنجا که
tanh(0) = 0است، در لحظهی راهاندازی سهم branch گیتدار دقیقاً صفر خواهد بود. - با فاصلهگرفتن
alphaاز صفر، اثر کراساتنشن بهآرامی و پیوسته افزایش مییابد. - اتصال باقیمانده (residual connection) تضمین میکند که حتی در صورت باز شدن کامل گیت، بازنمایی متنی مدل زبانی رونویسی و تخریب نمیشود؛ بلکه اطلاعات بینایی صرفاً روی آن سوار میشود.
این مهمترین تصمیم معماری در طراحی فلامینگو است: شرطیسازی (conditioning) بصری بهصورت جمعپذیر، گیتدار و در لحظهی آغازین برابر با صفر تعریف شده است. بنابراین مدل فلامینگو در گام 0 آموزش، برای ورودیهای کاملاً متنی دقیقاً همان عملکرد بینقص Chinchilla 70B را ارائه میدهد.
کراساتنشن ماسکشده برای ورودیهای درهمتنیده
در پرامپتی مانند «<تصویر A> کپشن A <تصویر B> کپشن B <تصویر C> ؟»، هر توکن متنی تنها باید تصاویری را ببیند که در توالی قبل از آن آمدهاند. ماسک کراساتنشن این قاعده را اعمال میکند: توکن متن در موقعیت t تنها به توکنهای بازنمونهگیر تصویر i_t اتنشن دارد؛ یعنی آخرین تصویرِ پیش از موقعیت t، و توکنهای تمام تصاویر دیگر ماسک میشوند. هر دو رویکرد «دیدن فقط آخرین تصویر قبلی» یا «دیدن تمام تصاویر قبلی» قابلاستفادهاند؛ ولی فلامینگو گزینهی اول را انتخاب کرد.
یادگیری چندشات درونمتنی
پرامپت فلامینگو چنین ساختاری دارد:
<image1> A photo of a cat. <image2> A photo of a dog. <image3> A photo of a
مدل با دیدن الگوی تکمیل توالی، خروجی «bird» (یا هر چیزی که تصویر 3 نشان میدهد) را تولید میکند؛ بدون اینکه حتی یک گام گرادیان برداشته شود. قابلیت یادگیری درونمتنی مدل زبانی منجمد از دل لایههای کراساتنشن گیتدار بدون افت منتقل میشود؛ این نکتهی کلیدی مقاله و دلیل اهمیت آن است.
دادههای آموزشی
فلامینگو روی سه مجموعهداده آموزش دید:
- وب بزرگ چندوجهی (M3W): شامل 43 میلیون صفحهی وب با تصاویر و متنهای درهمتنیده که ترتیب خوانش (reading order) آنها بازسازی شده بود.
- جفتهای تصویر-متن: مجموعهی ALIGN (شامل 1.8 میلیارد جفت) بهعلاوهی LTIP (شامل 312 میلیون جفت)؛ در مجموع حدود 2.1 میلیارد جفت داده.
- جفتهای ویدیو-متن (VTP): شامل 27 میلیون کلیپ ویدیویی کوتاه.
مجموعهی OBELICS در سال 2023 یک بازتولید آزاد از همین مجموعهی درهمتنیدهی وب بود که مدلهای Idefics ،Idefics2 و اغلب مدلهای متنباز «شبیه به فلامینگو» روی آن آموزش دیدهاند.
مدلهای OpenFlamingo و Otter
پروژهی OpenFlamingo (2023) بازتولید آزاد همین معماری است. ساختار آن کاملاً یکسان است (بازنمونهگیر پرسویر + کراساتنشن گیتدار روی مدل منجمد LLaMA یا MPT) و چکپوینتهایی در ابعاد 3B، 4B و 9B ارائه داد. کیفیت آن البته به دلیل کوچکتر بودن مدل زبانی پایه و دادههای کمتر، از فلامینگو عقبتر است.
مدل Otter (2023) بر پایهی OpenFlamingo و با فاینتیون دستوری روی مجموعهی MIMIC-IT (دادههای دستورالعمل چندوجهی) توسعه یافت و نشان داد کراساتنشن گیتدار برای پیروی از دستورها هم بهخوبی کار میکند.
مدلهای متأثر از فلامینگو
- خانوادهی Idefics / Idefics2 / Idefics3: تبار کراساتنشن گیتدار در Hugging Face که به مرور سادهتر شد (در Idefics2 بازنمونهگیر حذف شد و توکنهای پچ مستقیم همراه با پولینگ تطبیقی جایگزین شدند).
- گذار از فلامینگو به Chameleon: تا سال 2024 تیمهای زیادی به سمت فیوژن اولیه (early-fusion) رفتند (درس 12.11)؛ با این حال کراساتنشن گیتدار به سبک فلامینگو همچنان در محیطهای پروداکشن که انجماد بکبون (backbone) الزامی است کاربرد دارد.
- ورودی درهمتنیدهی Gemini: از نظر مفهومی انعطاف ورودیهای درهمتنیده را از فلامینگو به ارث برده، هرچند سازوکار دقیق آن اختصاصی است.
مقایسهی BLIP-2 و فلامینگو
| BLIP-2 | Flamingo | |
|---|---|---|
| پل تصویری | ماژول Q-Former یکبار در ورودی | کراساتنشن گیتدار در هر M لایه |
| توکنهای تصویری | 32 توکن به ازای هر تصویر | 64 توکن به ازای هر تصویر در هر لایهی کراساتنشن |
| مدل زبانی منجمد | بله | بله |
| چندشات درونمتنی | ضعیف | قوی — هستهی اصلی مقاله |
| ورودیهای درهمتنیده | بدون پشتیبانی پیشفرض | بله، هدف اصلی طراحی |
| دادههای آموزشی | 130 میلیون جفت داده | حدود 2.1 میلیارد جفت + 27 میلیون کلیپ ویدیو + 43 میلیون صفحهی درهمتنیده |
| تعداد پارامترهای آموزشدیده | 188 میلیون | حدود 10 میلیارد (لایههای کراساتنشن) |
| محاسبات | چند روز روی 8 پردازندهی A100 | چند هفته روی هزاران TPUv4 |
اگر دنبال VQA تکتصویری و کمهزینه هستید، BLIP-2 را انتخاب کنید. اگر استدلال چندتصویری، چندشات یا ورودیهای درهمتنیده میخواهید، سراغ فلامینگو یا Idefics2 بروید.
پیادهسازی عملی
در فایل code/main.py موارد زیر را پیادهسازی کردهایم:
- یک بازنمونهگیر پرسویر روی 36 توکن پچ ساختگی با 8 متغیر پنهان یادگیرنده (کراساتنشن به زبان پایتون خالص).
- یک گام کراساتنشن گیتدار با مقدار
alpha = 0(خروجی دقیقاً برابر ورودی است و مدل زبانی تغییر نمیکند) و سپسalpha = 2.0که سهم بصری را با ورودی ترکیب میکند. - یک ابزار ساخت ماسک درهمتنیده که ماتریس اتنشن دوبعدی را برای توالی «(تصویر 1) (متن 1) (تصویر 2) (متن 2)» تولید میکند.
خروجی کاربردی
خروجی این درس فایل outputs/skill-gated-bridge-diagnostic.md است. این گزارش با بررسی کانفیگ یک VLM متنباز (وجود بازنمونهگیر، تناوب لایههای کراساتنشن و ساختار گیت)، ردپای فلامینگو را در آن ردیابی میکند و استراتژی انجماد وزنها را توضیح میدهد. چنین تشخیصی برای ریشهیابی اینکه چرا فاینتیون باعث افت عملکرد متنی مدل شده بسیار مفید است (پاسخ معمولاً این است: گیت بیش از حد سریع باز شده است).
تمرینها
-
تعداد پارامترهای بصری Flamingo-9B را محاسبه کنید: 9B برای مدل زبانی + 1.4B لایههای کراساتنشن گیتدار + 64M بازنمونهگیر. چه درصدی از کل پارامترها در فرایند آموزش بهروزرسانی میشوند؟
-
اتصال باقیماندهی گیتدار
y = tanh(alpha) * cross + xرا در PyTorch پیاده کنید. عملاً نشان دهید که باalpha=0، خروجیyدر لحظهی اولیهسازی دقیقاً برابر باxاست. -
بخش 3.2 مقالهی OpenFlamingo (arXiv:2308.01390) را بخوانید که توضیح میدهد چگونه چند تصویر داخل یک بچ را با تعداد متغیر تصاویر مدیریت میکنند. استراتژی پدینگ (حاشیهگذاری) را شرح دهید.
-
چرا ماسک کراساتنشن فلامینگو به هر توکن متن فقط اجازهی دیدن نزدیکترین تصویر قبل از خود را میدهد، نه تمام تصاویر پیشین؟ بخش 2.4 مقالهی فلامینگو را بخوانید و موازنهی این انتخاب طراحی را تحلیل کنید.
-
یادگیری چندشات درونمتنی: برای یک مدل جدید از خانوادهی فلامینگو، پرامپتی با 4 نمونه از تبدیل «تصویر ← رنگ سوژهی اصلی» بنویسید. روند مورد انتظار تغییر دقت را با تغییر تعداد نمونهها از 0 تا 8 توصیف کنید.
اصطلاحات کلیدی
| اصطلاح | در گفتگوها چه میگویند؟ | معنای واقعی چیست؟ |
|---|---|---|
| بازنمونهگیر پرسویر | «کراساتنشن با متغیرهای پنهان ثابت» | ماژولی که از تعداد متغیری پچ ورودی، تعداد ثابت K توکن تولید میکند |
| کراساتنشن گیتدار | «پل گیتدار tanh» | لایهی باقیماندهی y = tanh(alpha)*cross + x با پارامتر یادگیرندهی alpha و مقدار اولیهی 0 |
| ورودی درهمتنیده | «توالی ترکیبی» | فرمت پرامپتی که در آن متن و تصاویر بر اساس ترتیب خوانش آزادانه ترکیب میشوند |
| مدل زبانی منجمد | «بدون گرادیان در LLM» | وزنهای مدل زبانی ثابتاند و بهروزرسانی نمیشوند؛ فقط بازنمونهگیر و لایههای کراساتنشن آموزش میبینند |
| چندشات | «نمونههای درونمتنی» | دادن چند جفت (تصویر، پاسخ) داخل پرامپت؛ مدل بدون نیاز به فاینتیون تعمیم میدهد |
| OBELICS | «مجموعهدادهی درهمتنیدهی وب» | مجموعهدادهی آزاد شامل 141 میلیون صفحهی وب با تصاویر و متن در ترتیب خوانش |
| Chinchilla | «پایهی منجمد 70 میلیاردی» | مدل زبانی منجمد فلامینگو برگرفته از مقالهی Chinchilla دیپمایند |
| برنامهی زمانی گیت (Gate schedule) | «نحوهی تغییر alpha» | نرخ باز شدن گیت لایههای کراساتنشن در طول فرآیند آموزش |
| تناوب کراساتنشن | «هر M لایه یکبار» | فاصلهی درج بلوکهای کراساتنشن گیتدار در مدل زبانی؛ در فلامینگو برابر است |
| OpenFlamingo | «بازتولید بازمتن» | چکپوینتهای آزاد تیم MosaicML/LAION با مقیاس 3 تا 9 میلیارد پارامتر با معماری دقیقاً یکسان با فلامینگو |
برای مطالعهی بیشتر
- مقالهی اصلی فلامینگو: Alayrac et al. — Flamingo (arXiv:2204.14198).
- بازتولید متنباز: Awadalla et al. — OpenFlamingo (arXiv:2308.01390).
- مجموعهدادهی وب درهمتنیده: Laurençon et al. — OBELICS (arXiv:2306.16527).
- معماری عمومی پرسویر: Jaegle et al. — Perceiver IO (arXiv:2107.14795).
- مدل دستورپذیر Otter: Li et al. — Otter (arXiv:2305.03726).
- سادهسازی مدرن رویکرد فلامینگو: Laurençon et al. — Idefics2 (arXiv:2405.02246).
