چیت‌شیت

بینایی خودنظارتی، CLIP و بازیابی

Self-Supervised Vision, CLIP and Retrieval

پیش‌آموزش بدون برچسب، هم‌ترازسازی تصویر و متن، دسته‌بندی صفر-نمونه، شکل‌دهی امبدینگ‌ها و جستجوی آن‌ها. PyTorch.

  • ۱۲ بخش
  • ۴ درس مرتبط
  • کد و دستورها عیناً از دوره‌ی اصلی
فهرست مطالب
  1. خانواده‌ها و مدل‌ها
  2. دو برج CLIP
  3. فرمول‌ها
  4. ماسک‌گذاری InfoNCE و MAE
  5. تابع زیان (loss) مدل CLIP و صفرشات
  6. زیان سه‌گانه و بازخوانی در K
  7. دسته‌بندی صفر-نمونه
  8. وظایف در کد
  9. پیش‌فرض‌ها و مقادیر عددی
  10. انتخاب اندیس FAISS
  11. عیب‌یابی
  12. پرسش‌ها

خانواده‌ها و مدل‌ها

مفهوم‌ها
تقابلی (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

معماری
اهداف قطریتصویردسته‌ی Nتاییانکودر تصویرViT یا ResNetنرمال‌سازی L2(N, D)کپشنN کپشنانکودر متنترنسفورمرنرمال‌سازی L2(N, D)شباهت SN x N، روی tauCE متقارن(i2t + t2i) / 2

فرمول‌ها

مفهوم‌ها
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

دسته‌بندی صفر-نمونه

گام‌به‌گام
  1. پرامپت‌هانوشتن «a photo of a {class}» برای هر کلاس.
  2. گروهی (Ensemble)میانگین‌گیری از چندین قالب برای هر کلاس برای 1 تا 3 درصد بهبود top-1.
  3. برج متنانکود کردن پرامپت‌ها. T دارای ابعاد (C, d) است.
  4. برج تصویرانکود کردن تصویر. I دارای ابعاد (1, d) است.
  5. نرمال‌سازییکه‌سازی طول هر دو طرف.
  6. امتیازدهیحاصل I @ T.T ابعاد (1, C) را می‌دهد.
  7. پیش‌بینیتابع argmax کلاس را مشخص می‌کند. در صورت کمتر بودن امتیاز top-1 از 0.2 هشدار دهید.

وظایف در کد

کار و کد
وظیفهکد
تابع زیان تقابلی روی دو نماinfo_nce(z1, z2, tau=0.1)
معلم DINO همراه با مرکززدایی (centring)DinoHead().teacher(x, temp=0.04)
تابع زیان متقارن CLIPclip_loss(i, t, logit_scale)
برچسب‌های صفر-نمونهzero_shot_classify(model, image_feats, class_text_feats, class_names)
استخراج نمونه‌های منفی نیمه‌دشوارsemi_hard_negatives(emb, labels, margin=0.2)
بازخوانی در Krecall_at_k(query_emb, gallery_emb, query_labels, gallery_labels, k=1)
InfoNCE متقارن در پایتون خالصinfonce_loss(S)
تابع زیان (loss) جفتی SigLIPsigmoid_loss(S, bias=0.0)

پیش‌فرض‌ها و مقادیر عددی

پیش‌فرض‌ها
تنظیمپیش‌فرضنکته
SimCLR `tau`0.1مقدار کمتر تیزتر است، نیاز به منفی‌های بیشتری دارد
CLIP `tau` init0.07یادگیری‌شده. logit_scale از ln(1/0.07) شروع می‌شود
SimCLR batch512-8192نمونه‌های منفی فراوان به‌ازای هر مثبت
MAE `mask_ratio`0.75مدل BERT حدود 15٪ از توکن‌ها را ماسک می‌کند
MAE decoder8-layer, 512-dimانکودر فقط پچ‌های دیده‌شده را پردازش می‌کند
DINO EMA m0.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 بعد.
صفرشات، آزمون ارزیابی یا فاین‌تیونینگ؟
آزمون ارزیابی در همان دامنه صفرشات را شکست می‌دهد. فاین‌تیونینگ می‌تواند به انتقال صفرشات ضربه بزند.