برای ساخت یک مدل چندحالتهی واقعی، مدل باید بتواند هم تصویر مرتبط با متن را بازیابی کند و هم در پاسخ به تصویر، متن تولید کند. مدلهایی مثل CLIP فقط رتبهبندی را بلدند و توانایی تولید کپشن ندارند؛ در مقابل، مدلهای صرفاً مولد بدون سر بازیابی اختصاصی نمیتوانند متن و تصویر را در فضایی یکپارچه رتبهبندی کنند. راهکار مدرن این چالش، پیشآموزش چندهدفه است.
در این درس یاد میگیرید که چگونه تابع زیان کنتراستیو InfoNCE را با تابع زیان مدلسازی زبان (LM) در یک حلقهی آموزشی واحد ترکیب کنید. با این ترکیب، انکودر و پروجکتور از دو سیگنال مکمل یاد میگیرند و خروجی نهایی هم توانایی تولید متن را دارد و هم جفتهای متناظر را در فضای برداری مشترک همتراز میکند.
پیادهسازی این درس کاملاً متکی به یک مجموعهدادهی ساختگی در حافظه است و به دانلود دیتاستهای حجیم نیاز ندارد. همچنین به دلیل سبک بودن معماری، تمام مراحل روی CPU یا شتابدهندههای محلی قابل اجرا است و نیازی به کارت گرافیکهای ابری نخواهید داشت.
انکودر، پروجکتور و دیکودر به هم متصل شدهاند. حالا وقت آن است که آنها را با هم آموزش دهیم. دو هدف یادگیری مدل را هدایت میکنند: یک تابع زیان کنتراستیو (Contrastive loss) تصویر-متن (InfoNCE) که جفتهای متناظر را در فضای امبدینگ مشترک به هم نزدیک میکند، و یک تابع زیان مدلسازی زبان که از دیکودر میخواهد برای هر تصویر یک کپشن بنویسد. ترکیب این دو به شبکه یاد میدهد که هم تصویر مناسب برای یک کپشن را پیدا کند و هم برای تصویر کپشن بنویسد.
اهداف یادگیری
- پیادهسازی تابع زیان کنتراستیو InfoNCE روی یک بچ از جفتهای تصویر-کپشن.
- ترکیب تابع زیان کنتراستیو با تابع زیان مدلسازی زبان خودبازگشتی (Autoregressive).
- ساخت یک پیکرهی ساختگی 200 جفتی از تصویر-کپشن بدون نیاز به دانلود هیچ دیتاست واقعی.
- اجرای یک حلقهی آموزش آزمایشی 50 مرحلهای و مشاهدهی کاهش هر دو تابع زیان.
صورت مسئله
یک مدل بینایی-زبان به دو مهارت نیاز دارد. باید بتواند رتبهبندی (Rank) کند: با گرفتن یک کپشن، تصویر درست را از میان گزینههای پرتعداد پیدا کند. همچنین باید بتواند تولید کند: با دیدن یک تصویر، برایش کپشن بنویسد. اگر مدل را فقط روی یکی از این مهارتها پیشآموزش دهید، نصف یک سیستم را خواهید داشت. CLIP رتبهبندی را بینقص انجام داد ولی توانایی کپشننویسی ندارد. GPT-4V کپشن مینویسد، اما برای رتبهبندی از یک سر بازیابی جداگانه کمک میگیرد. پیشآموزش چندهدفه امکان میدهد هر دو قابلیت را در یک گذر به دست آورید.
بخش رتبهبندی بر عهدهی InfoNCE است. برای یک بچ شامل N جفت، مدل N جفت متناظر را مثبت و N^2 - N جفت نامتناظر را منفی در نظر میگیرد؛ سپس روی ماتریس شباهت (N, N) حاصل، تابع زیان آنتروپی متقاطع (Cross-Entropy) را اعمال میکند. تابع زیان LM بخش تولید را مدیریت میکند: پیشبینی استاندارد توکن بعدی (Next-Token Prediction) شرطیشده روی تصویر. هر دو تابع زیان مشتقپذیرند و در وزنهای انکودر و پروجکتور سهیم هستند؛ دیکودر صرفاً با تابع زیان LM آموزش میبیند.
مفاهیم کلیدی
شرح InfoNCE در یک پاراگراف
امبدینگهای N تصویر را در قالب سطرها و امبدینگهای N متن را هم در سطرها بچینید. هر دو را با نرم L2 نرمالسازی کنید. ماتریس N x N را بهصورت S = I T^T / tau حساب کنید که در آن tau دمای یادگیریپذیر است. درایههای روی قطر اصلی جفتهای متناظر هستند و درایههای غیرقطری نمونههای منفیاند. آنتروپی متقاطع را به گونهای اعمال کنید که هدفِ argmax روی قطر اصلی باشد: سطر i باید بیشترین مقدار خود را در ستون i داشته باشد. همین کار را بهصورت متقارن روی ستونها هم انجام دهید. مقدار نهایی میانگین این دو حالت است. این همان تابع زیان CLIP در هشت خط کد است.
اهمیت پارامتر دما
دمای tau تعیین میکند خروجی سافتمکس (Softmax) چقدر تیز و متمرکز باشد. اگر خیلی کوچک باشد (مثلاً tau = 0.01)، گرادیان فقط از سختترین نمونهی منفی دشوار (Hard Negative) میآید و آموزش پر از نویز میشود. اگر بیش از حد بزرگ باشد، سافتمکس مسطح شده و گرادیان محو میشود. CLIP پارامتر tau را در طول آموزش یاد میگیرد؛ این دموی آموزشی هم دقیقاً همین کار را میکند.
تابع زیان مدلسازی زبان
دیکودر توکنهای حافظهی تصویر را از طریق کراساتنشن (Cross-Attention) دریافت کرده و در هر موقعیت، توکن متنی بعدی را پیشبینی میکند. تابع زیان، همان آنتروپی متقاطع استاندارد نسبت به هدف موقعیت بعدی است. موقعیتهای پدینگ (Padding) با ماسکگذاری از محاسبهی تابع زیان کنار گذاشته میشوند.
ترکیب توابع زیان
فرمول کلی بهصورت total = contrastive + lm_weight * lm است که در آن lm_weight یک عدد اسکالر است (اغلب 1.0). گرادیانهای این دو تابع زیان بهطور مشترک به انکودر و پروجکتور برمیگردند؛ دیکودر تنها از تابع زیان LM گرادیان دریافت میکند. این همان دستورالعمل چندوظیفهای است که CoCa و BLIP با وزندهیهای مختلف به کار میبرند. مدل SigLIP فقط عبارت کنتراستیو را نگه میدارد و بهجای سافتمکس، تابع زیان جفتی سیگموئیدی میگذارد.
| مؤلفه | سطح زیان (Loss surface) | بخشهای تحت تأثیر |
|---|---|---|
| InfoNCE | رتبهبندی جفتها در فضای مشترک | انکودر + پروجکتور + سر متن |
| LM | پیشبینی توکن شرطیشده روی تصویر | انکودر + پروجکتور + دیکودر |
| ترکیبی | چندوظیفهای | کل ساختار مدل |
چرا 50 گام برای این دموی آموزشی کافی است
پیکرهی ساختگی ما یک مجموعهی 200 جفتی تصادفی از تصاویر و شناسههای کپشن است. پس از 50 گام بهینهسازی SGD با اندازهی بچ 16، هر دو تابع زیان بهوضوح افت میکنند؛ هرچند مقادیر مطلق آنها بالاتر از نتیجهی مدلی با دادههای واقعی باقی میماند. هدف این دمو تأیید سلامت مسیر گرادیان از ابتدا تا انتها است و اینکه مطمئن شویم افزودن تابع زیان LM پایداری هدف کنتراستیو را به هم نمیریزد.
پیادهسازی
فایل code/main.py شامل بخشهای زیر است:
- کلاس
MultimodalModelکه یک انکودر کوچک ViT، پروجکتور MLP، یک انکودر متنی جمعوجور (میانگینگیری روی شناسههای امبدشده) و دیکودر مجهز به کراساتنشن درس 61 را با هم ترکیب میکند. - تابع
info_nce_loss(image_emb, text_emb, temperature)که تابع زیان کنتراستیو دوطرفهی مشابه CLIP را پیاده میکند. - تابع
lm_loss(logits, target_ids, padding_id)که آنتروپی متقاطع توکن بعدی را با اعمال ماسک پدینگ محاسبه میکند. - تابع
make_mock_corpus(seed, n_pairs)که 200 جفت تصویر و شناسهی کپشن قطعی برمیگرداند. - یک حلقهی آموزش 50 گامه با اندازهی بچ 16، بهینهساز Adam و پارامتر یادگیریپذیر log-temperature. مقادیر هر دو تابع زیان هر 5 مرحله یک بار چاپ میشوند.
اجرای برنامه:
python3 code/main.py
خروجی: تابع زیان کنتراستیو از حدود ln(16) = 2.77 به سمت 2.4 کاهش مییابد؛ تابع زیان LM نیز از خط مبنای (Baseline) توزیع یکنواخت تصادفی ln(512) ≈ 6.24 تا حدود 4.7 پایین میآید. کاهش هر دو تابع زیان ثابت میکند که گرادیانها در مسیر درست جریان دارند. مدلهای واقعی طی میلیونها مرحله آموزش میبینند، اما رفتار یادگیری دقیقاً همین است.
کاربرد در دنیای واقعی
این ترکیب تابع زیان در مدلهای زیر پیاده و عرضه شده است:
- مدل CLIP (سال 2021): فقط کنتراستیو تصویر-متن، همراه با یک آزمون ارزیابی (Probe) کپشننویسی جداگانه با انکودر فریزشده.
- مدل CoCa (سال 2022): ترکیب کنتراستیو تصویر-متن به اضافهی تابع زیان LM کپشننویسی در یک مدل واحد؛ دقیقاً همان ساختاری که در این درس پیاده کردیم.
- مدلهای BLIP (سال 2022) و BLIP-2: ترکیب سه تابع زیان کنتراستیو، LM و سر تطبیق تصویر-متن.
- مدل SigLIP (سال 2023): استفاده از تابع زیان جفتی سیگموئیدی بهجای InfoNCE؛ همان کارکرد کنتراستیو با فرمولی متفاوت.
- خانوادهی LLaVA: آموزش دومرحلهای که مرحلهی اولِ آن همترازسازی است (شباهت کسینوسی روی یک مدل زبانی فریزشده) و مرحلهی دوم تابع زیان LM را با یک مدل زبانی از فریز خارجشده اضافه میکند. درس 60 با مرحلهی اول همخوانی دارد و این درس متناظر با مرحلهی دوم است.
تستها
فایل code/test_main.py موارد زیر را میسنجد:
- تقارن تابع زیان InfoNCE روی سطرهای تصویر و متن
- خروج عدد 0 از تابع زیان InfoNCE در حالتی که ماتریس شباهت یک قطر کامل با مقادیر مثبت بزرگ باشد
- عملکرد درست تابع زیان LM در ماسک کردن موقعیتهای پدینگ
- اجرای بدون خطای گذر رو به جلو (forward pass) مدل و تولید هر دو تابع زیان
- کاهش زیان ترکیبی پس از یک حلقهی آموزش 5 گامه
اجرای تستها:
python3 -m unittest code/test_main.py
تمرینها
-
تابع زیان InfoNCE را با تابع زیان جفتی سیگموئیدی به سبک SigLIP جایگزین کنید و سرعت همگرایی را روی پیکرهی ساختگی مقایسه نمایید.
-
یک مرحلهی استخراج منفیهای دشوار (Hard-negative mining) اضافه کنید: در هر یکدرمیان بچها، سختترین جفت خارج از قطر بچ قبلی را انتخاب کرده و به آن اضافه کنید. مدل را آموزش دهید و ببینید آیا تابع زیان کنتراستیو سریعتر افت میکند یا خیر.
-
یک سر باینری تطبیق تصویر-متن روی امبدینگ مشترک بگذارید (درست/نادرست: آیا این دو با هم تطابق دارند؟) تا یک تابع زیان سوم داشته باشید و ساختار سهسر BLIP را بازسازی کنید.
-
بهجای پیکرهی ساختگی، توالی شناسههای کپشن را از یک زنجیرهی مارکوف بگیرید که ماتریس انتقال (Transition matrix) آن روی هش تصویر شرطی شده باشد. زیان کپشننویسی باید بیشتر افت کند، چرا که دادهها سیگنال واقعی و قابل یادگیری دارند.
-
مدل یکسانی را یک بار با
lm_weight = 0و بار دیگر باlm_weight = 1آموزش دهید. تابع زیان کنتراستیو را در هر دو مقایسه کنید؛ تابع زیان LM نباید به کیفیت هدف رتبهبندی ضربه بزند.
اصطلاحات کلیدی
| اصطلاح | مفهوم |
|---|---|
| InfoNCE | برآورد کنتراستیو نویز: آنتروپی متقاطع روی ماتریس شباهت |
| دما (Temperature) | عددی اسکالر که میزان تمرکز یا تیزی توزیع سافتمکس در تابع زیان کنتراستیو را کنترل میکند |
| نمونهی منفی دشوار (Hard negative) | جفتی خارج از قطر ماتریس که مدل را به اشتباه میاندازد و برای نمونهگیری بسیار مفید است |
| تابع زیان LM | آنتروپی متقاطع استاندارد برای پیشبینی توکن بعدی در سمت کپشننویسی |
| فضای امبدینگ مشترک (Joint embedding space) | فضای اشتراکی که بردارهای تصویر و متن پس از تصویر کردن در آن قرار میگیرند |
برای مطالعهی بیشتر
- مقالهی CLIP برای آشنایی با ایدهی اولیهی تابع زیان کنتراستیو.
- مقالهی CoCa برای بررسی ترکیب کنتراستیو و کپشننویسی در یک مدل.
- مقالهی SigLIP برای بررسی تابع زیان جفتی سیگموئیدی و علل مقیاسپذیری بهتر آن.
