چیت‌شیت

معماری‌های مدل زبانی-تصویری (VLM)

Vision-Language Model Architectures

‏ViT، رابط، LLM. تصویرساز، Q-Former، پرسویر، کراس‌اتنشن گیت‌دار، مراحل آموزش و اعداد دستورالعمل.

  • ۱۱ بخش
  • ۷ درس مرتبط
  • کد و دستورها عیناً از دوره‌ی اصلی
فهرست مطالب
  1. الگوی ViT-MLP-LLM
  2. سازوکارهای رابط (Bridge)
  3. سه مرحله‌ی آموزش
  4. وظایف در کد
  5. Merge توکن‌های تصویر درون متن
  6. آموزش صرفاً تصویر
  7. اعداد رابط
  8. عیب‌یابی
  9. اختصارات
  10. پرسش‌ها
  11. دستورالعمل پیش‌فرض open-VLM

الگوی ViT-MLP-LLM

معماری
(N, d_vit)(N, d_llm)تصویرH x W x 3انکودر تصویر‏CLIP-L، SigLIP، DINOv3تصویرساز‏MLP دو تا 4 لایه یا Q-Formerپرامپت متنیتوکنایزر LLMتوکن‌های متن (M, d_llm)درهم‌آمیزی (interleave) یا الحاقتوکن‌های تصویر در فضای LLMمدل رمزگشای LLMپاسخ متنی را تولید می‌کند

سازوکارهای رابط (Bridge)

مفهوم‌ها
تصویرساز MLP
لایه‌ی Linear، سپس GELU، سپس Linear. نگاشت (N_patches, d_vit) به (N_patches, d_llm).
کیو-فورمر (Q-Former)
تعداد 32 پرس‌وجوی یادگیرنده به پچ‌های منجمد ViT کراس‌اتنشن می‌زنند. خروجی 32 توکن تصویری است.
بازنمونه‌گیر پرسویر
تعداد K = 64 متغیر پنهان یادگیرنده. هر تعداد پچ در قالب 64 توکن خارج می‌شود.
کراس‌اتنشن گیت‌دار
$y = \tanh(\alpha) \cdot \mathrm{cross} + x$. مقدار اولیه آلفا 0 است.
کراس‌اتنشن
پرس‌وجو (Q) از جریان متن می‌آید. کلید (K) و مقدار (V) از جریان تصویر می‌آیند.
تابع زیان (loss) هم‌ترازی کسینوسی
$1 - \cos(\mathrm{image}, \mathrm{text})$. مقدار 0 یعنی هم‌تراز، 2 یعنی در جهت عکس.
استک عمیق (DeepStack)
ویژگی‌ها را از چندین عمق ViT روی هم می‌چیند، نه فقط لایه‌ی آخر.
نرخ خطای چندوجهی (CMER)
سهم خروجی‌هایی با اطمینان متنی بالا و شباهت تصویر-متن پایین.

سه مرحله‌ی آموزش

گام‌به‌گام
  1. هم‌ترازیانجماد ViT و LLM. آموزش صرفاً تصویرساز روی جفت‌های تصویر-کپشن.
  2. مرحله‌ی 1 LLaVA558 هزار جفت تصویر-کپشن، تابع زیان (loss) مدل زبانی روی کپشن، در چند ساعت.
  3. پیش‌آموزشخروج همه‌چیز از انجماد. آموزش روی بیش از 500 میلیون جفت تصویر-متن درهم‌آمیخته.
  4. تنظیم با دستورالعملفاین‌تیون روی سه‌گانه‌های (تصویر، پرسش، پاسخ).
  5. مرحله‌ی 2 LLaVAآموزش تصویرساز و LLM روی 158 هزار نوبت گفت‌وگوی دستورالعمل تصویری.

وظایف در کد

کار و کد
وظیفهکد
ساخت یک تصویرسازProjector(vit_dim=768, llm_dim=4096, hidden=4096)
استک کردن اعماق ViTdeepstack_features(per_layer_features)
اندازه‌گیری CMERcross_modal_error_rate(image_emb, text_emb, text_confidence)
بازنمونه‌گیری پچ‌ها به متغیرهای پنهان ثابتperceiver_resampler(patches, num_latents=8, num_blocks=2)
گام گیت‌دار، گیت بستهgated_cross_attention_step(text_hidden, visual, alpha=0.0)
یک تصویر به ازای هر توکن متنیinterleaved_mask(seq)
پرامپت LLaVA با 576 توکنbuild_llava_prompt(system, user, image_tokens=576)
ماسک خوداتنشنcausal_mask(length)

Merge توکن‌های تصویر درون متن

کد
python
vision_tokens = self.vit(image)                           # (B, N_patches, d_vit)
vision_embeds = self.projector(vision_tokens)             # (B, N_patches, d_llm)
text_embeds = self.llm.get_input_embeddings()(input_ids)  # (B, M, d_llm)
out = text_embeds.clone()                                 # ابتدا کپی، سپس پر کردن
for b in range(input_ids.size(0)):                        # یک نمونه در هر نوبت
    positions = (input_ids[b] == self.image_token_id).nonzero(as_tuple=True)[0]
    out[b, positions] = vision_embeds[b]                  # جایگاه‌های <image> تصویر دریافت می‌کنند

آموزش صرفاً تصویر

کد
python
cfg = AlignConfig()        # 768 -> 1024 -> 512، 200 گام
encoder = VisionEncoder(encoder_cfg).eval()
freeze(encoder)            # requires_grad_(False)
projector = MLPProjector(cfg.vision_hidden, cfg.projection_hidden, cfg.text_hidden)
with torch.no_grad():
    _, cls = encoder(img)  # پولینگ CLS، بدون گرادیان‌های انکودر
    text_emb = text(ids)   # ‏MockTextEmbedding منجمد
image_emb = projector(cls)
loss = cosine_alignment_loss(image_emb, text_emb)

اعداد رابط

پیش‌فرض‌ها
تنظیمپیش‌فرضنکته
Q-Former queries32188 میلیون پارامتر آموزش‌دیده در BLIP-2
Perceiver latents K64پس از 6 بلوک بازنمونه‌گیر
Gated block every M layers4‏Flamingo، مقدار اولیه‌ی آلفا 0
LLaVA tokens per image576شبکه‌ی 24x24، تصویرساز MLP با ساختار 1024 → 4096 → 4096
AnyRes tokens per image2880تایل‌های 336x336 به همراه یک تصویر بندانگشتی
Token sweet spot576-102464 برای OCR بسیار کم است
Dynamic resolutionmin 256, max 1280پیکسل در ضلع بزرگ‌تر

عیب‌یابی

عیب‌یابی
  • خطای ValueError روی توکن‌های تصویر

    علت
    تعداد نگه‌دارنده‌ها (placeholder) با پچ‌ها هم‌خوانی ندارد
    راه‌حل
    پیش‌از‌پد کردن (pre-pad) هر نمونه به تعداد یکسان
  • تشخیص مطمئن اما نادرست اشیا

    علت
    12٪ از جفت‌های خزش‌شده فاقد ارجاع‌دهی مکانی (grounding) هستند
    راه‌حل
    ردیابی CMER، هدایت موارد با CMER بالا برای بررسی
  • تشخیص نادرست بالا، پایین و شمارش

    علت
    مدل‌های VLM در آزمون‌های فضایی امتیاز 50-60٪ می‌گیرند
    راه‌حل
    استفاده از مدل تخمین وضعیت (pose)، عمق یا تشخیص شیء
  • افت مهارت متنی پس از تیونینگ

    علت
    گیت بیش از حد سریع باز شده است
    راه‌حل
    شروع آلفا از 0، بررسی زمان‌بندی (schedule) گیت
  • ضعف در OCR

    علت
    تعداد بسیار کم توکن‌های تصویری
    راه‌حل
    استفاده از 576 تا 1024 توکن یا AnyRes
  • پر شدن سریع کانتکست

    علت
    576 توکن برای هر تصویر، بیشتر برای هر فریم
    راه‌حل
    استفاده از Q-Former با 32 توکن

اختصارات

اصطلاح‌ها
VLM
مدل زبانی-تصویری. انکودر تصویر به علاوه‌ی یک مدل زبانی کامل.
ITC
تقابلی تصویر-متن. تابع زیان (loss) سبک CLIP روی پرس‌وجوهای پول‌شده و توکن CLS متن.
ITM
تطبیق تصویر-متن. کلاسیفایر دودویی روی نمونه‌های منفی دشوار.
ITG
تولید متن با ارجاع تصویری. تابع زیان (loss) مدل زبانی علیتی (Causal LM) روی پرس‌وجوها.
CMER
نرخ خطای چندوجهی. شاخص کلیدی عملکرد در توهم مدل.
AnyRes
تقسیم تصویر با کیفیت بالا به تایل‌ها و الحاق توکن‌های آن‌ها به یکدیگر.

پرسش‌ها

پرسش و پاسخ
کیو-فورمر (Q-Former) یا MLP؟
اگر سهمیه‌ی توکن مهم است Q-Former؛ اگر کیفیت به ازای هر توکن مهم است MLP.
مدل BLIP-2 یا Flamingo؟
مدل BLIP-2 برای VQA تک‌تصویری مقرون‌به‌صرفه؛ Flamingo برای یادگیری چندشات و چندین تصویر.
چرا مقدار اولیه‌ی آلفا 0 است؟
در گام 0، مدل همان LLM پیش‌آموزش‌دیده روی متن است.
چرا کراس‌اتنشن ماسک ندارد؟
کل تصویر پیش از مشاهده‌ی هر متنی در دسترس و مرئی است.
چرا دو لایه، نه یکی؟
تابع GELU یک خمش غیرخطی ایجاد می‌کند. یک لایه‌ی خطی صرفاً ماتریس را می‌چرخاند و مقیاس می‌دهد.
کدام مؤلفه را اول بررسی و حذف (ablate) کنیم؟
تعداد توکن‌های تصویری توجیه‌کننده‌ی حدود 60٪ از واریانس است. انکودر حدود 20٪. اتصال‌دهنده حدود 5٪.

دستورالعمل پیش‌فرض open-VLM

نکته‌ها
  • انکودر: SigLIP 2 SO400m/14. برای بخش‌بندی یا ارجاع‌دهی مکانی از DINOv2 ViT-g/14 استفاده کنید.
  • اتصال‌دهنده: مدل MLP دو لایه روی توکن‌های وصله‌ای. استفاده نکردن از Q-Former مگر در صورت محدودیت توکن.
  • مدل زبانی: نسخه‌ی 7B برای بهینگی هزینه، 70B برای کیفیت بالاتر. ابعاد LLM سقف توانمندی را تعیین می‌کند.
  • داده‌ها: PixMo + ShareGPT4V + Cauldron. کپشن‌های متراکم انسانی تقطیر دانش را شکست می‌دهند.
  • آموزش فاز 1 در رزولوشن ثابت 384. افزایش تدریجی به وضوح پویا تا 1280 برای بهبود OCR.
  • پیش از اتصال‌دهنده، انکودر را تغییر دهید. ترجیح SigLIP بر CLIP بیش از 3 امتیاز در MMMU ایجاد کرد.