چیتشیت
بینایی خودنظارتی، CLIP و بازیابی
Self-Supervised Vision, CLIP and Retrieval
پیشآموزش بدون برچسب، همترازسازی تصویر و متن، دستهبندی صفر-نمونه، شکلدهی امبدینگها و جستجوی آنها. PyTorch.
فهرست مطالب
خانوادهها و مدلها
مفهومها- تقابلی (SimCLR, MoCo, CLIP)
- نزدیک کردن دو نما به هم. push کردن باقی دسته به دوردست.
- معلم-شاگرد (DINO, BYOL, iBOT)
- شاگرد با معلم مبتنی بر EMA مطابقت مییابد. بدون نمونههای منفی.
- پوشاندهشده (MAE, BEiT, SimMIM)
- ماسک کردن 75٪ پچها. بازسازی پیکسلها.
- CLIP
- برجهای تصویر و متن در یک فضا. 400 میلیون جفت وب، بدون برچسب.
- SigLIP
- سیگموئید بهازای هر جفت. بدون all-gather. آموزش بهتر با دستههای کوچک.
- ارزیابی خطی
- انکودر منجمد بههمراه یک لایهی خطی. سنجش کیفیت ویژگیها.
- Top-1 آزمون ارزیابی
- SimCLR حدود 71٪، DINO حدود 77٪، MAE حدود 76٪، DINOv2 حدود 86٪.
- بازیابی دستهبندی یا نمونه
- امبدینگهای آماده برای دستهبندی پاسخگو هستند. بازیابی نمونه به یادگیری متریک نیاز دارد.
دو برج CLIP
معماریفرمولها
مفهومها- InfoNCE
- $-\log \frac{\exp(\mathrm{sim}(z_i, z_j)/\tau)}{\sum_{k \ne i} \exp(\mathrm{sim}(z_i, z_k)/\tau)}$
- ماتریس CLIP
- $S_{ij} = \cos(f(x_i), g(y_j)) / \tau$. ابعاد N x N.
- تابع زیان (loss) مدل CLIP
- میانگین CE روی سطرها بهعلاوهی CE روی ستونها، تقسیم بر 2.
- SigLIP
- $\log(1 + \exp(-y_{ij} \, \mathrm{sim}_{ij}))$ بهازای هر جفت، با $y_{ij} = \pm 1$.
- EMA مدل DINO
- $\theta_t \leftarrow m \, \theta_t + (1 - m) \, \theta_s$
- زیان سهگانه
- $\max(0, \lVert f(a) - f(p) \rVert^2 - \lVert f(a) - f(n) \rVert^2 + \mathrm{margin})$
- کوسینوس و L2
- $\lVert a - b \rVert^2 = 2 - 2 \cos(a, b)$ برای بردارهای یکه.
- بازخوانی در K
- نسبت کوئریهایی که حداقل یک تطابق صحیح در K مورد برتر دارند.
ماسکگذاری InfoNCE و MAE
کدpython
def info_nce(z1, z2, tau=0.1): # z1 و z2 نرمالشده با L2
N, D = z1.shape
z = torch.cat([z1, z2], dim=0) # (2N, D)
sim = z @ z.T / tau # (2N, 2N)
mask = torch.eye(2 * N, dtype=torch.bool, device=z.device)
sim = sim.masked_fill(mask, float("-inf")) # بدون تطابق با خود
targets = torch.cat([torch.arange(N, 2 * N), torch.arange(0, N)]).to(z.device)
return F.cross_entropy(sim, targets)
num_patches = 196
visible, masked = random_mask_indices(num_patches, mask_ratio=0.75) # نگهداشتن 25٪
تابع زیان (loss) مدل CLIP و صفرشات
کدpython
sim = logit_scale * image_emb @ text_emb.T # (N, N)
targets = torch.arange(N, device=sim.device) # تطابق روی قطر
l_i = F.cross_entropy(sim, targets) # تصویر به متن
l_t = F.cross_entropy(sim.T, targets) # متن به تصویر
loss = (l_i + l_t) / 2 # مقداردهی تصادفی اولیه: نزدیک به log(N)
i = F.normalize(model.image_proj(image_feats), dim=-1)
t = F.normalize(model.text_proj(class_text_feats), dim=-1)
pred = (i @ t.T).argmax(dim=-1) # یک کلاس بهازای هر تصویر
زیان سهگانه و بازخوانی در K
کدpython
def triplet_loss(anchor, positive, negative, margin=0.2):
d_ap = F.pairwise_distance(anchor, positive, p=2)
d_an = F.pairwise_distance(anchor, negative, p=2)
return F.relu(d_ap - d_an + margin).mean()
pos_idx, neg_idx = semi_hard_negatives(emb, y) # دشوارترین مثبت، منفی نیمهدشوار
loss = triplet_loss(emb, emb[pos_idx], emb[neg_idx])
sim = query_emb @ gallery_emb.T # کوسینوس روی بردارهای یکه
_, top_k = sim.topk(k, dim=-1)
matches = (gallery_labels[top_k] == query_labels[:, None]).any(dim=-1)
matches.float().mean().item() # بازخوانی در K
دستهبندی صفر-نمونه
گامبهگام- پرامپتهانوشتن «a photo of a {class}» برای هر کلاس.
- گروهی (Ensemble)میانگینگیری از چندین قالب برای هر کلاس برای 1 تا 3 درصد بهبود top-1.
- برج متنانکود کردن پرامپتها.
Tدارای ابعاد (C, d) است. - برج تصویرانکود کردن تصویر.
Iدارای ابعاد (1, d) است. - نرمالسازییکهسازی طول هر دو طرف.
- امتیازدهیحاصل
I @ T.Tابعاد (1, C) را میدهد. - پیشبینیتابع argmax کلاس را مشخص میکند. در صورت کمتر بودن امتیاز top-1 از 0.2 هشدار دهید.
وظایف در کد
کار و کد| وظیفه | کد |
|---|---|
| تابع زیان تقابلی روی دو نما | info_nce(z1, z2, tau=0.1) |
| معلم DINO همراه با مرکززدایی (centring) | DinoHead().teacher(x, temp=0.04) |
| تابع زیان متقارن CLIP | clip_loss(i, t, logit_scale) |
| برچسبهای صفر-نمونه | zero_shot_classify(model, image_feats, class_text_feats, class_names) |
| استخراج نمونههای منفی نیمهدشوار | semi_hard_negatives(emb, labels, margin=0.2) |
| بازخوانی در K | recall_at_k(query_emb, gallery_emb, query_labels, gallery_labels, k=1) |
| InfoNCE متقارن در پایتون خالص | infonce_loss(S) |
| تابع زیان (loss) جفتی SigLIP | sigmoid_loss(S, bias=0.0) |
پیشفرضها و مقادیر عددی
پیشفرضها| تنظیم | پیشفرض | نکته |
|---|---|---|
SimCLR `tau` | 0.1 | مقدار کمتر تیزتر است، نیاز به منفیهای بیشتری دارد |
CLIP `tau` init | 0.07 | یادگیریشده. logit_scale از ln(1/0.07) شروع میشود |
SimCLR batch | 512-8192 | نمونههای منفی فراوان بهازای هر مثبت |
MAE `mask_ratio` | 0.75 | مدل BERT حدود 15٪ از توکنها را ماسک میکند |
MAE decoder | 8-layer, 512-dim | انکودر فقط پچهای دیدهشده را پردازش میکند |
DINO EMA m | 0.996 | معلم یک EMA از شاگرد است |
DINO teacher `temp` | 0.04 | پارامتر temp شاگرد برابر 0.1 |
Triplet `margin` | 0.2 | همان حاشیه (margin) برای استخراج نمونههای نیمهدشوار |
انتخاب اندیس FAISS
دستورها| دستور | عملکرد |
|---|---|
IndexFlatIP | ضرب داخلی دقیق. کوسینوس روی 100 هزار بردار |
IndexFlatL2 | فاصلهی L2 دقیق، جستجوی همهجانبه (brute force)، بدون آموزش |
IndexIVFFlat | سلولهای Kتایی، جستجوی نزدیکترینها. نیازمند آموزش. 10 میلیون |
IndexHNSW | اندیس گرافی. سریعترین برای تعداد بالای کوئری. اندیس بزرگ |
IndexIVFPQ | افزودن کوانتایزاسیون ضربی. بالای 100 میلیون بردار |
DINOv2 + FAISS | بازیابی بصری عمومی، آماده (off-the-shelf) |
CLIP + FAISS | کوئریها متن هستند |
Fine-tuned DINOv2 + FAISS | بازیابی نمونه، re-ID، تجارت الکترونیک |
عیبیابی
عیبیابیشکست InfoNCE در دستهی 32تایی
- علت
- تعداد بسیار کم منفیها
- راهحل
- دستهی 512 تا 8192 یا صف تکانه
DINO بردار ثابت برمیگرداند
- علت
- فروپاشی بازنمایی
- راهحل
- مرکززدایی و تیز کردن توزیع معلم
وظیفه پوشاندهشده بسیار ساده است
- علت
- نسبت ماسک بسیار پایین است
- راهحل
- ماسک کردن 75٪ پچها
بازخوانی در 10 بالا، بازخوانی در 1 پایین
- علت
- رتبهبندی دارای نویز
- راهحل
- فاینتیونینگ طولانیتر یا بازرتبهبندی
تغییر نزدیکترین همسایهها
- علت
- ترکیب شدن کوسینوس و L2
- راهحل
- تطابق با نحوهی آموزش امبدینگ
عدم موفقیت در جستجوی نمونه
- علت
- ویژگیهای آماده (off-the-shelf)
- راهحل
- فاینتیونینگ با یادگیری متریک
زیان سهگانه نزدیک به 0
- علت
- سهگانههای آسان
- راهحل
- استخراج نمونههای نیمهدشوار
کند بودن تابع زیان سافتمکس روی چند پردازنده گرافیکی
- علت
- عملیات All-gather امبدینگها
- راهحل
- استفاده از زیان سیگموئید
پرسشها
پرسش و پاسخ- چرا 75٪ برای MAE ولی 15٪ برای BERT؟
- پچهای تصویر آنتروپی پایینی دارند. همسایهها محتوای پیکسل را لو میدهند.
- مقدار InfoNCE روی جفتهای تصادفی؟
- حدود log(2N - 1). برای 16 جفت برابر 3.4 است.
- زیان CLIP در مقداردهی تصادفی اولیه؟
- نزدیک به log(N). برای N = 8 مقدار آن 2.08 است.
- ارزیابی خطی یا فاینتیونینگ؟
- فاینتیونینگ 2 تا 5 درصد امتیاز را بالا میبرد. آزمون ارزیابی فقط ویژگیها را میسنجد.
- امبدینگ DINOv2؟
- خروجی
outputs.last_hidden_state[:, 0]، توکن ردهبندی (CLS)، با 768 بعد. - صفرشات، آزمون ارزیابی یا فاینتیونینگ؟
- آزمون ارزیابی در همان دامنه صفرشات را شکست میدهد. فاینتیونینگ میتواند به انتقال صفرشات ضربه بزند.