JOVANA
Explore Library Glossary Getting Started Three Levels Fields How it works Mission
Join the mission
All guides

對比學習:InfoNCE、SimCLR、MoCo

把同一事物的兩個視角拉近、把其他一切推遠——以及讓它奏效的、出人意料地深刻的理論。

對比的核心想法

取一張影像,套用兩種隨機增強(裁切、色彩抖動、模糊),就得到兩個視角。它們逐像素看起來不同,卻描繪同一個場景,所以它們的表徵應該靠近——這是一個正樣本對(positive pair)。批次中任何其他影像都是負樣本(negative):它的表徵應該離得遠。對比學習就是同時優化這兩個願望。深刻之處在於:負樣本正是防止崩塌的關鍵——如果只把正樣本拉近,模型會樂得把一切都映射到同一點。

对比学习用嵌入向量之间的相似度(点积/余弦)来衡量两个视图是否一致。

两个向量及其夹角;点积等于模长之积乘以夹角的余弦。

InfoNCE:目標函數與其意涵

主力損失是 InfoNCE(又稱 NT-Xent)。對一個錨點視角,你計算它與唯一正樣本以及 K 個負樣本的相似度,除以一個溫度(temperature)τ,再套用 softmax:損失是分配給正樣本的負對數機率。最小化它,等價於分類出 K+1 個候選中哪一個才是真正的夥伴。關鍵在於:InfoNCE 是兩個視角間互資訊(mutual information)的一個下界——所以對比學習在形式上,就是在最大化一個視角能告訴你多少關於另一個視角的資訊。

\mathcal{L}_{\text{InfoNCE}} = -\log \frac{\exp\!\big(\mathrm{sim}(z_i, z_i^{+})/\tau\big)}{\displaystyle\sum_{k=0}^{K}\exp\!\big(\mathrm{sim}(z_i, z_k)/\tau\big)}

InfoNCE(NT-Xent)损失:带温度缩放的 softmax,把唯一的正样本拉近、把 K 个负样本推开。

z1, z2 = proj(f(view1)), proj(f(view2))   # L2-normalized
logits = (z1 @ z2.T) / tau                  # cosine sims, scaled
labels = arange(batch)                      # positive is the diagonal
loss = cross_entropy(logits, labels)        # InfoNCE / NT-Xent
四行寫完 InfoNCE:正樣本是對角線上相配的列;每個非對角元素都是負樣本。

溫度 τ 的重要性遠超新手的想像。較小的 τ 會讓 softmax 變尖銳,把梯度集中在最難的負樣本——也就是離錨點最近的那些——這能加速學習,卻可能過度懲罰語意相近的影像。同一套 InfoNCE 機制最早是為序列而生,叫做對比預測編碼(contrastive predictive coding, CPC),它預測的是未來的潛在狀態,而非增強視角。

SimCLR:簡單,卻渴求大批次

SimCLR把對比學習剝到只剩本質,並證明它能與監督式預訓練分庭抗禮。它的三課是:(1)增強的組合方式至關重要,尤其是隨機裁切搭配色彩失真;(2)在骨幹與損失之間加一個非線性的投影頭(projection head),能大幅改善你要保留的特徵(你探測的是骨幹,不是投影頭);(3)負樣本來自批次中其他影像、不費分文,因此你需要一個很大的批次——數以千計——才有足夠多的難負樣本。

MoCo:把負樣本與批次大小解耦

需要 4096 的批次大小,是多數實驗室付不起的硬體稅。動量對比(Momentum Contrast, MoCo)用兩個想法解決它。第一,一個佇列(queue):保存一個滾動緩衝區,存放數以千計最近看過的嵌入做為負樣本,把負樣本數量與當前批次解耦。第二,一個動量編碼器(momentum encoder):鍵(key)由查詢編碼器的緩慢移動指數平均來編碼,所以即使模型在更新,佇列中的嵌入仍保持一致。少了動量編碼器,佇列中的舊鍵會過時,訓練便會失穩。

k = momentum_encoder(view2)             # no gradient through keys
for p_q, p_k in zip(q_enc.params, k_enc.params):
    p_k.data = m * p_k.data + (1 - m) * p_q.data   # m ~ 0.999
logits = cat([q @ k.T, q @ queue.T]) / tau
queue = enqueue_dequeue(queue, k)       # FIFO buffer of negatives
MoCo:FIFO 佇列供應負樣本;動量平均的編碼器讓它們保持一致。

好的對比嵌入長什麼樣子

一套釐清概念的理論,把對比目標分解成單位超球面上兩個可量測的性質:對齊性與均勻性(alignment and uniformity)。對齊性要求正樣本對落在相近處;均勻性要求整組嵌入均勻散開,以保留最大資訊量。崩塌正是均勻性的失效。這對指標給了你一個獨立於任何下游標籤的診斷工具:你可以在訓練中觀察對齊性與均勻性,判斷模型是在學習,還是在悄悄崩塌。

\begin{aligned}\mathcal{L}_{\text{align}} &= \mathbb{E}_{(x,x^{+})}\big\lVert f(x)-f(x^{+})\big\rVert_2^2,\\[2pt] \mathcal{L}_{\text{uniform}} &= \log\,\mathbb{E}_{x,y}\;e^{-t\lVert f(x)-f(y)\rVert_2^2}.\end{aligned}

好的嵌入要在对齐(正样本对靠近)与均匀(特征在单位超球面上均匀分布)之间取得平衡。