وقتی میخواهید یک مدل زبانی بزرگ را به یک انکودر تصویر متصل کنید، با یک مانع ساختاری روبهرو میشوید: خروجی انکودر بینایی در یک فضای برداری کاملاً متفاوت با امبدینگهای مدل زبانی قرار دارد. این دو مدالیته زبان یکدیگر را نمیفهمند و بدون تغییر شکل این پایهها، امکان ترکیب متن و تصویر در یک معماری چندوجهی (Multimodal) وجود ندارد.
حل این مسئله نیازی به بازآموزی هزینهبر مدلهای بزرگ ندارد. با استفاده از یک پروجکشن دولایهی سبک (MLP Projector) و منجمد نگهداشتن انکودر تصویر و مدل زبانی، میتوان تنها با چند مگابایت وزن اضافه، فضای این دو را روی هم منطبق کرد. این همان فرمول پایهای است که مدلهایی مثل LLaVA و BLIP-2 بر پایهی آن ساخته شدهاند.
این روش سبک محاسباتی بسیار پایینی دارد؛ نیازی به اجارهی سرورهای ابری گرانقیمت یا دسترسی به GPUهای ردهبالا نیست و پیادهسازی و آموزش آن بهراحتی روی پردازندهی سیستم شخصی یا تراشههای اپل سیلیکون اجرا میشود.
یک انکودر بینایی توکنهای تصویر تولید میکند و یک دکودر متن، توکنهای متنی میگیرد. این دو در فضاهای برداری متفاوتی تعریف شدهاند. یک پروجکتور دولایهی کوچک از نوع پرسپترون چندلایه (MLP) توکنهای تصویر را به فضای امبدینگ (Embedding) متن تصویر میکند و یک تابع زیان (Loss) همترازی کسینوسی در برابر شرح تصویر متناظر، این دو فضا را با هم سازگار میسازد. این پروجکشن کوچکترین جزء یک مدل بینایی-زبان (VLM) است، اما بیشترین اهمیت را در انتقال دانش دارد.
اهداف یادگیری
- ساخت یک پروجکشن دولایهی MLP برای نگاشت ویژگیهای تصویر به فضای امبدینگ متن.
- ساخت یک جدول ساختگی امبدینگ متن بدون توکنایزر پیشآموزشدیده یا پیکرهی واقعی.
- محاسبهی تابع زیان همترازی کسینوسی میان توکنهای تصویر پروجکتشده و امبدینگِ شرح تصویر متناظر.
- آموزش پروجکتور بهتنهایی، در حالی که انکودر بینایی و جدول متن کاملاً منجمد (Frozen) هستند.
صورت مسئله
فرض کنید یک انکودر بینایی (از درسهای 58 و 59) دارید که توکنهایی با بُعد vision_hidden = 768 تحویل میدهد. میخواهید یک دکودر متن با بُعد امبدینگ text_hidden = 512 روی آن سوار کنید (هر عدد دیگری هم ممکن بود). دکودر انتظار توکنهایی متناسب با متن دارد؛ توکنهای تصویر ساختار متنی ندارند و در پایهای (Basis) تعریف شدهاند که انکودر صرفاً حین پیشآموزشِ بینایی یاد گرفته است و هیچ ارتباطی با بردارهای کلمهی دکودر ندارند.
یک پروجکشن دولایهی MLP (لایه خطی، GELU و لایه خطی) این شکاف را پر میکند. این ماژول بهقدری کوچک است (حدود 768 * 1024 + 1024 * 512 = 1.3M پارامتر) که ظرف چند دقیقه روی یک GPU آموزش میبیند؛ علاوه بر این، تنها قطعهای است که باید حین مرحلهی همترازی آموزش ببیند. انکودر بینایی منجمد میماند، جدول امبدینگ متن هم منجمد میماند و فقط پروجکشن تغییر میکند. این همان فرمولی است که LLaVA در سال 2023 عرضه کرد، BLIP-2 در قالب Q-Former بازتعریفش نمود و از آن زمان به بعد، هر VLM با وزنهای باز بهنحوی از آن بهره برده است.
مبانی نظری
تجمیع قبل از پروجکشن
انکودر بینایی 197 توکن خروجی میدهد. در سمت متن، فقط یک امبدینگ واحد در سطح کل شرح تصویر داریم. برای همتراز کردن آنها به ازای هر نمونه، به یک بردار واحد در سطح تصویر نیاز دارید. تجمیع بر اساس توکن CLS سادهترین روش است: اولین توکن انکودر را برمیدارید و تصویر میکنید. میانگینگیری روی تمام 197 توکن گزینهی دیگری است که SigLIP از آن استفاده میکند. هر دو روش، 197 بردار را به یک بردار فشرده میکنند.
چرا دولایه و نه یک لایه؟
یک تصویر کردن خطی (Linear projection) تکلایه میتواند فضا را بچرخاند و مقیاسش را تغییر دهد، اما اگر دو فضا انحنای ناسازگاری داشته باشند، نمیتواند پایهی آنها را اصلاح کند. قراردادن GELU میان دو لایهی خطی، یک خمش غیرخطی به پروجکشن میدهد؛ این ویژگی از نظر تجربی برای همتراز کردن ویژگیهای سبک CLIP با امبدینگهای مدل زبانی کافی است. پروجکشنهای عمیقتر (مثلاً استفاده از GLU در LLaVA-NeXT یا پشتهای از لایههای اتنشن در Qwen-VL) گونههای توسعهیافته هستند؛ اما MLP دولایه خط مبنای (Baseline) استاندارد است و دقیقاً همان سازوکاری است که زیر پوستهی سر پروجکشنِ (Projection head) Q-Former در BLIP-2 کار میکند.
| لایه | ابعاد | پارامترها |
|---|---|---|
| fc1 | (vision_hidden, projection_hidden) |
768 * 1024 + 1024 |
| فعالساز | GELU | 0 |
| fc2 | (projection_hidden, text_hidden) |
1024 * 512 + 512 |
حدود 1.3 میلیون پارامتر برای یک سر پروجکشن با ابعاد 768 -> 1024 -> 512.
تابع زیان همترازی کسینوسی
همترازی به این معنا نیست که image_emb == text_emb باشد؛ همترازی یعنی image_emb در فضای مشترک، همجهت با text_emb باشد. تابع زیان کسینوسی برابر با 1 - cos_sim(image, text) است و بازهای بین 0 (همراستای کامل) تا 2 (کاملاً در خلاف جهت) دارد. آموزش، این مقدار را به ازای هر جفت به سمت صفر میبرد. در درس 62 این موضوع را برای یک دستهی مقابلهای (InfoNCE) تعمیم میدهیم؛ جایی که هر تصویر باید نسبت به هر شرح دیگری در دسته، به شرح خودش نزدیکتر باشد. در این درس از نسخهی جفتی استفاده میکنیم تا پویایی آموزش بهخوبی دیده شود.
ترفند انکودر منجمد
انکودر بینایی 86 میلیون پارامتر دارد. جدول متن هم شامل چند میلیون پارامتر دیگر است. آموزش همهی آنها روی یک پیکرهی ساختگی اصلاً شدنی نیست. منجمد کردن هر دو یعنی 1.3 میلیون پارامترِ پروجکشن تنها متغیرهای تغییرپذیرند و چند صد گام روی جفتهای ساختگی برای کاهش تابع زیان کفایت میکند. فرم عملیاتی همهی مدلهای VLM مبتنی بر تطبیقدهنده (Adapter) دقیقاً همین است: بخشهای سنگین منجمد میمانند و رابط (Bridge) سبک آموزش میبیند.
پیادهسازی
فایل code/main.py این موارد را پیادهسازی میکند:
- کلاس
MLPProjector(in_dim, hidden_dim, out_dim): یک MLP دولایهی خطی با فعالساز GELU. - کلاس
MockTextEmbedding(vocab_size, dim): یک جدول امبدینگ منجمد با مقداردهی اولیهی قطعی از طریق seed. - تابع
make_pair(seed, vocab_size): تولید یک نمونهی جفتشدهی ساختگی از (تصویر، شرح). شرحها دنبالههای کوتاهی از شناسهها هستند و امبدینگ شرح از میانگینگیری روی امبدینگ توکنها به دست میآید. - تابع
cosine_alignment_loss(image_emb, text_emb): هدف بهینهسازی1 - cos_simبه ازای هر جفت. - یک حلقهی آموزش که پروجکشن را برای 200 گام روی 32 جفت ساختگی (بهصورت چرخشی) با انکودر بینایی و جدول متنِ منجمد اجرا میکند و تابع زیان را هر 25 گام یکبار نشان میدهد.
برای اجرا:
python3 code/main.py
خروجی: گزارشهای آموزش نشان میدهند که مقدار زیان اولیه از حدود 1.07 به نزدیکی 0.80 در 200 گام میرسد؛ این نشان میدهد که پروجکشن بهتنهایی میتواند توکنهای تصویر را به سمت فضای متن بکشد. در پایان، شباهت کسینوسی (Cosine Similarity) به ازای هر جفت نیز چاپ میشود.
استفاده از ابزارهای واقعی
همین الگو در همهی مدلهای VLM با وزنهای باز دیده میشود:
- LLaVA 1.5: پروجکشن دولایهی GELU MLP از بعد پنهان CLIP-ViT-L به بعد امبدینگ LLaMA. انکودر بینایی منجمد، LLM منجمد، آموزش فقط روی پروجکشن (سپس خروج LLM از انجماد در فاز دوم).
- BLIP-2: مدل Q-Former تعداد 32 توکن پرسمانِ یادگرفتنی را از طریق کراساتنشن (Cross-Attention) با توکنهای تصویر پردازش میکند و سپس به بعد امبدینگ LLM تصویر مینماید. سر پروجکشن در انتهای Q-Former دقیقاً معادل همان MLP این درس است.
- MiniGPT-4: یک پروجکشن خطی تکلایه از خروجی Q-Former در BLIP-2 به بعد امبدینگ Vicuna.
- Qwen-VL: یک تطبیقدهندهی کراساتنشن با چند لایه، که قطعهی پایانی آن باز هم یک پروجکشن به بعد امبدینگ مدل زبانی است.
ظاهر کار تغییر میکند اما نقش ثابت است: تجمیع توکنهای تصویر، تصویر کردن به بعد امبدینگ متن، آموزش مستقل پروجکتور.
تستها
فایل code/test_main.py این بخشها را پوشش میدهد:
- تطابق ابعاد خروجی پروجکتور با پارامتر تنظیمی
out_dim - صفر بودن پارامترهای دارای
requires_gradدر جدول منجمد امبدینگ متن - صفر بودن زیان کسینوسی برای بردارهای یکسان و رسیدن به عدد 2 برای بردارهای کاملاً متضاد
- برقراری جریان گرادیان (Gradient) در پروجکتور پس از یک گام رو به عقب (Backward Pass)
- کاهش زیان در حلقهی آموزش بین گام 0 تا گام 200
اجرای آنها:
python3 -m unittest code/test_main.py
تمرینها
-
تجمیع با توکن CLS را با میانگینگیری روی 196 توکن وصلهای (Patch tokens) جایگزین کنید و زیان نهایی را بعد از 200 گام بسنجید. میانگینگیری معمولاً روی دادههای ساختگی سریعتر یاد میگیرد؛ اما CLS روی تصاویر طبیعی کارایی دادهای بهتری دارد.
-
یک پارامتر دمای اسکالرِ یادگرفتنی به زیان کسینوسی اضافه کنید (
cos / tau) و ببینید اگرtauبیش از حد کوچک (نویز در گرادیان) یا بیش از حد بزرگ باشد (توقف افت زیان در مقادیر بالا) چه اتفاقی میافتد. -
ساختار MLP دولایه را با یک لایهی خطی ساده جایگزین کنید و اختلاف زیان را بسنجید. غیرخطی بودن روی ویژگیهای تصاویر طبیعی اهمیت بیشتری دارد و روی دادههای ساختگی اثرش کمتر است.
-
یک جریمهی کوچک L2 روی وزنهای پروجکتور اضافه کنید و اثر آن را بر همترازی کسینوسی زیر نظر بگیرید (کسینوس نسبت به مقیاس پایدار (Invariant) است، بنابراین جریمه بیشتر راستاهای بلااستفاده را جمع میکند).
-
وزنهای پروجکتور را ذخیره کنید، سپس آنها را در کنار انکودر بینایی منجمد بارگذاری کرده و بدون گام رو به عقب یک دور استنتاج بگیرید. بررسی کنید که پروجکتور تنها دستسازهی (Artifact) جدیدی است که تحویل میدهید؛ انکودر هنگام استقرار باز هم گذر رو به جلوی (Forward pass) خود را اجرا خواهد کرد.
اصطلاحات کلیدی
| اصطلاح | معنا |
|---|---|
| همترازی مدالیته (Modality alignment) | فرایند قابل مقایسه کردن امبدینگهای تصویر و متن در یک فضای مشترک |
| سر پروجکشن (Projection head) | ماژول کوچکی (معمولاً یک MLP دولایه) که یک فضا را به فضای دیگر تصویر میکند |
| شباهت کسینوسی (Cosine similarity) | حاصل ضرب داخلی تقسیم بر حاصلضرب اندازههای L2 |
| انکودر منجمد (Frozen encoder) | مدل بینایی (یا متنی) که برای تمام پارامترهایش requires_grad=False تنظیم شده است |
| پیکرهی ساختگی (Mock corpus) | جفتهای دادهی ساختگی که نیاز به دانلود مجموعهداده در آموزش را برطرف میکنند |
برای مطالعهی بیشتر
- مقالهی LLaVA برای آموزش دومرحلهای (تصویر کردن و سپس خروج LM از حالت انجماد).
- مقالهی BLIP-2 برای بررسی ساختار Q-Former بهعنوان یک جایگزین پروجکشنِ یادگیرنده.
- گزارش فنی Qwen-VL برای بررسی تطبیقدهندههای کراساتنشن بهعنوان سرهای پروجکشن عمیقتر.
