چیتشیت
معماریهای مدل زبانی-تصویری (VLM)
Vision-Language Model Architectures
ViT، رابط، LLM. تصویرساز، Q-Former، پرسویر، کراساتنشن گیتدار، مراحل آموزش و اعداد دستورالعمل.
فهرست مطالب
الگوی ViT-MLP-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)
- سهم خروجیهایی با اطمینان متنی بالا و شباهت تصویر-متن پایین.
سه مرحلهی آموزش
گامبهگام- همترازیانجماد ViT و LLM. آموزش صرفاً تصویرساز روی جفتهای تصویر-کپشن.
- مرحلهی 1 LLaVA558 هزار جفت تصویر-کپشن، تابع زیان (loss) مدل زبانی روی کپشن، در چند ساعت.
- پیشآموزشخروج همهچیز از انجماد. آموزش روی بیش از 500 میلیون جفت تصویر-متن درهمآمیخته.
- تنظیم با دستورالعملفاینتیون روی سهگانههای (تصویر، پرسش، پاسخ).
- مرحلهی 2 LLaVAآموزش تصویرساز و LLM روی 158 هزار نوبت گفتوگوی دستورالعمل تصویری.
وظایف در کد
کار و کد| وظیفه | کد |
|---|---|
| ساخت یک تصویرساز | Projector(vit_dim=768, llm_dim=4096, hidden=4096) |
| استک کردن اعماق ViT | deepstack_features(per_layer_features) |
| اندازهگیری CMER | cross_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 queries | 32 | 188 میلیون پارامتر آموزشدیده در BLIP-2 |
Perceiver latents K | 64 | پس از 6 بلوک بازنمونهگیر |
Gated block every M layers | 4 | Flamingo، مقدار اولیهی آلفا 0 |
LLaVA tokens per image | 576 | شبکهی 24x24، تصویرساز MLP با ساختار 1024 → 4096 → 4096 |
AnyRes tokens per image | 2880 | تایلهای 336x336 به همراه یک تصویر بندانگشتی |
Token sweet spot | 576-1024 | 64 برای OCR بسیار کم است |
Dynamic resolution | min 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 ایجاد کرد.