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

不用負樣本也行:BYOL、SimSiam、SwAV 與 DINO

完全不用負樣本,也能學到好特徵嗎?BYOL、SimSiam、SwAV 與 DINO 說可以——只要你看懂它們共同對抗的敵人:表徵崩塌。

表徵崩塌:最大的陷阱

本篇所有內容都圍繞同一個敵人,所以我們先把它說清楚。表徵崩塌是一種毫無用處的平庸解:編碼器學會把每一張輸入影像都對映到同一個常數向量。想像一個偷懶的學生,面對一份只問「這兩張照片是不是同一個場景?」的考卷。如果標準答案永遠是「是」,那麼不管看不看圖、只要每題都寫「是」的學生,照樣能拿滿分——他什麼都沒學到。崩塌的網路正是這種學生:它發現自己根本不需要描述這個世界,就能滿足訓練目標。

為什麼這個陷阱之前沒有困擾我們?因為本軌道前幾篇所教的方法,本來就「免費」避開了它。在對比學習(以及它放大版的表親 MoCo)裡,損失函數同時做兩件事:把同一張影像的兩個增強視角拉近,同時把這張影像從許多負樣本(其他不相關的影像)推遠。這些負樣本提供了持續向外的壓力。如果網路想把一切都塌縮到同一點,那麼「推遠」這一項就會爆炸,因為每個負樣本都會疊在錨點正上方。排斥力讓崩塌變得代價高昂,所以最佳化器永遠不會走那條路。

因此本篇的核心問題說起來簡單、想起來卻很深:除了排斥力之外,還有什麼機制能阻止網路塌縮成常數? BYOL、SimSiam、SwAV 與 DINO 是四個各不相同卻同樣巧妙的答案。每認識一個方法,請在心裡記一筆帳:每種方法都必須在某處繳交「防崩塌稅」——唯一的問題是,它把這筆錢藏在哪裡。

BYOL:自我拔靴的潛在表徵

BYOL(Bootstrap Your Own Latent,自我拔靴的潛在表徵)是 2020 年真正震撼整個領域的結果。它完全不用負樣本——它的損失永遠只說「讓這兩個視角達成一致」——卻不會崩塌,而且表現追平甚至超越對比方法。有一陣子大家以為裡面藏了個 bug,其實沒有。BYOL 之所以成立,靠的是一個精心設計的「不對稱」,而看懂這個不對稱,正是本篇的核心。

BYOL 同時運行兩個網路。線上網路(參數 θ)是我們真正去訓練的那一個。目標網路(參數 ξ)則是線上網路的一份緩慢移動的副本——它的權重是 θ 的指數移動平均(EMA),永遠不由梯度下降更新。兩個網路都含有一個編碼器和一個投影器。關鍵的轉折在第三個零件:線上網路在頂端多接了一個小型 MLP,稱為預測器(記為 q_θ),而目標網路沒有這個東西。給定同一張影像的兩個增強視角,線上端編碼視角 1,然後去預測目標端對視角 2 會輸出什麼;目標端只負責編碼視角 2、原地不動。這正是在沒有任何負樣本的情況下,驅動增強不變性(跨視角一致)的引擎。

\begin{aligned} \mathcal{L}_{\theta,\xi} &= 2 - 2\cdot\frac{\big\langle q_\theta(z_\theta),\; \mathrm{sg}(z'_\xi)\big\rangle}{\lVert q_\theta(z_\theta)\rVert_2 \,\cdot\, \lVert \mathrm{sg}(z'_\xi)\rVert_2} \\[6pt] \xi &\leftarrow \tau\,\xi + (1-\tau)\,\theta \end{aligned}

BYOL 損失(上)與目標網路的 EMA 更新(下)。

我們逐一讀懂每個符號。z_θ 是線上網路對視角 1 的投影;z'_ξ目標網路對視角 2 的投影。q_θ(·) 是只屬於線上端的預測器——這就是關鍵的不對稱,目標端沒有的零件。⟨·,·⟩ 是內積(點積),再除以兩個範數 ‖·‖₂,這個分式就變成線上預測與目標投影之間的餘弦相似度sg(·)停止梯度(stop-gradient):意思是「算出這個值,但不讓任何梯度回流進它」,所以這一步把目標當成固定的球門柱。第二行是 EMA 更新:目標參數 ξ 朝線上參數 θ 漂移,其中 τ(通常約 0.99–0.999)是衰減係數——越接近 1,目標移動得越慢。現在帶一個具體直覺:餘弦相似度介於 −1 到 +1,當線上預測與目標方向完全一致時,分式為 1,損失為 2 − 2·1 = 0;正交時損失為 2 − 0 = 2;方向相反時為 2 − 2·(−1) = 4。網路得到獎勵的唯一理由,就是讓自己指向與目標相同的方向

# BYOL: one optimization step (PyTorch-style pseudocode)
# f_o, g_o, q_o : online encoder, projector, PREDICTOR (all trained)
# f_t, g_t      : target encoder, projector (NO gradient; EMA of online)
# tau           : EMA decay for the target, e.g. 0.996

for x in loader:                       # x: a batch of images
    v1, v2 = aug(x), aug(x)            # two random augmented views

    # ----- online branch: encode -> project -> PREDICT -----
    z1 = q_o(g_o(f_o(v1)))            # online prediction for view 1
    z2 = q_o(g_o(f_o(v2)))           # online prediction for view 2

    # ----- target branch: encode -> project, then STOP-GRADIENT -----
    with torch.no_grad():            # sg(): no gradient enters the target
        t1 = g_t(f_t(v1))            # target projection of view 1
        t2 = g_t(f_t(v2))           # target projection of view 2

    # symmetric loss: each online view predicts the OTHER target view
    loss = D(z1, t2) + D(z2, t1)     # D(a,b) = 2 - 2 * cosine(a, b)
    loss.backward()                  # gradients update ONLY the online net
    opt.step(); opt.zero_grad()

    # target params are an EMA of online params (NOT gradient descent)
    for p_t, p_o in zip(target_params, online_params):
        p_t.data = tau * p_t.data + (1 - tau) * p_o.data
程式碼版的 BYOL:注意線上端的預測器、目標端的 no_grad,以及最後的 EMA 更新——三項防崩塌零件具體落實在程式裡。

SimSiam:把防崩塌機制攤開來看

SimSiam(Simple Siamese,簡單孿生網路)這個實驗,把 BYOL 的謎團變成了一個乾淨的答案。它問:BYOL 的三項材料裡,哪些是真正必需的?然後把設計剝到只剩骨架。SimSiam 徹底丟掉 EMA 目標——兩個分支其實就是同一個網路、共享權重。它同樣不用負樣本,和 BYOL 一樣。它保留的只有兩樣東西:預測器 MLP 與停止梯度。令人驚訝的是,它仍然不會崩塌,仍然學到很強的特徵。這讓 SimSiam 成為整個文獻中最乾淨的消融實驗,也是本篇的概念性回報。

停止梯度的心智模型是這樣的。在每一步,SimSiam 取其中一個分支並把它凍結——「就這次更新而言,你是固定的老師;我去擬合你,但不改變你。」另一個分支則必須移動去匹配它。接著角色互換(下面的損失是對稱的,所以兩個方向都會發生)。因為任一瞬間總有一側是被凍結的老師,網路就不是在最佳化一個「大家一起變成常數」可被平滑下降抵達的單一目標——停止梯度切斷了那個原本會把兩側一起拉向同一平庸點的回饋迴路。

\mathcal{L} = \tfrac{1}{2}\,D\big(p_1,\, \mathrm{sg}(z_2)\big) + \tfrac{1}{2}\,D\big(p_2,\, \mathrm{sg}(z_1)\big), \qquad D(p, z) = -\,\frac{p \cdot z}{\lVert p\rVert_2\,\lVert z\rVert_2}

對稱的 SimSiam 損失;D 是負餘弦相似度。

逐一讀符號:z₁z₂ 是兩個增強視角的投影(由共享的編碼器+投影器產生)。p₁ = h(z₁)p₂ = h(z₂) 是把預測器 MLP h 接在上面後的輸出——注意預測器位於預測那一側,正是 BYOL 的不對稱,即使權重是共享的。sg(·) 是停止梯度,套用在這一項中扮演目標的那一側。D(p, z)負餘弦相似度,所以最小化 D 就是最大化對齊。具體地說,第一項裡 p₁ 試圖匹配被切斷梯度的 z₂,第二項裡 p₂ 試圖匹配被切斷梯度的 z₁;½ + ½ 只是把兩個對稱方向取平均。要記住的重點是:這裡完全沒有 EMA、也沒有負樣本,所以唯一能防止崩塌的,就只剩預測器與停止梯度。

# SimSiam: the stop-gradient is the load-bearing line
# f : encoder + projector, SHARED by both views (no EMA, no target net)
# h : PREDICTOR MLP (the only asymmetry)
for x in loader:
    v1, v2 = aug(x), aug(x)            # two random augmented views
    z1, z2 = f(v1), f(v2)             # projections -> act as 'targets'
    p1, p2 = h(z1), h(z2)            # predictions

    # D(a,b) = -cosine(a,b); .detach() IS the stop-gradient sg()
    loss = 0.5 * D(p1, z2.detach()) + 0.5 * D(p2, z1.detach())
    loss.backward(); opt.step(); opt.zero_grad()

# Try it: remove BOTH .detach() calls -> the network collapses to a
# constant within a few steps (loss -> -1). That is the whole proof.
SimSiam:沒有負樣本、沒有 EMA——只有一個預測器和一個停止梯度。註解標出了那個揭示「停止梯度不可或缺」的實驗。

SwAV:交換聚類取代逐例比較

SwAV(Swapping Assignments between Views,視角間交換指派)採取一條與負樣本完全不同的逃生路線:線上聚類。SwAV 不是拿一張影像去和許多其他影像比較,而是拿每張影像去和一小組可學習的原型(prototypes)比較——可以把它們想成住在特徵空間裡的聚類中心。每個視角被柔性地指派到這些原型上,產生一個「碼」(code,柔性的聚類歸屬)。巧妙之處在於交換預測:SwAV 用另一個視角的特徵去預測這一個視角的碼。如果兩個視角真的是同一個物體,網路應該光看視角 2 就能猜出視角 1 的聚類指派——這就是增強不變性的訊號,只是改用聚類、而非逐對推遠來表達。

\mathcal{L} = \ell(z_t,\, q_s) + \ell(z_s,\, q_t), \qquad \ell(z,\, q) = -\sum_{k} q^{(k)} \,\log p^{(k)}(z), \qquad p^{(k)}(z) = \frac{\exp\!\big(z^{\top} c_k / \tau\big)}{\sum_{k'} \exp\!\big(z^{\top} c_{k'} / \tau\big)}

交換預測損失:用另一視角的特徵去預測這一視角的碼。

逐個符號:z_sz_t 是兩個視角(來源與目標)的(已正規化)特徵向量。q_sq_t 是它們的聚類指派——在各聚類上、近似 one-hot 的柔性向量。c_k第 k 個原型(聚類中心),一個可學習的向量;點積 z⊤c_k 衡量某特徵與該原型的對齊程度,再對所有 k 取 softmax(帶溫度 τ),就把這些分數變成跨聚類的機率分布 p(z)。而 ℓ(z, q) 就是一個交叉熵:−Σ_k q^{(k)} log p^{(k)}(z),當預測分布 p(z) 把機率質量放在碼 q 所說正確的聚類上時,它才會小。交換的結構 ℓ(z_t, q_s) + ℓ(z_s, q_t) 的意思是:視角 t 的特徵要能預測視角 s 的碼,反之亦然。具體地說,如果視角 s 的碼基本上是「第 7 號聚類」,損失就會推動視角 t 的特徵在 softmax 下也點亮第 7 號原型。

但等一下——如果我們只最小化這個式子,網路可以作弊:把每一張影像都送進同一個聚類,那麼每個碼都是「第 1 號聚類」,預測它毫無難度,損失趨近於零。這就是披著聚類外衣的崩塌。SwAV 用等分約束(equipartition constraint)擋住它:在計算碼 q(不是預測 p)時,它要求一個批次裡的影像必須大致均勻地分散到所有聚類上。這些碼由 Sinkhorn–Knopp 演算法產生——一個快速的迭代程序,反覆調整一個指派矩陣,直到它的列和與行和都符合目標邊際分布(這裡是大小相等的聚類)。因此,碼在構造上就被禁止塌縮到單一原型。

DINO:無標註的自我蒸餾

DINO(self-DIstillation with NO labels,無標註的自我蒸餾)把師生的想法推到極限,也是通往 Vision Transformer(ViT)時代的橋樑——DINO 正是自監督與 ViT 主幹最著名的相遇之處。它的架構呼應 BYOL,但重新詮釋成知識蒸餾:一個學生網路被訓練去匹配一個老師網路的輸出分布,而老師是學生的 EMA(所以它沒有標註、也沒有獨立訓練——它就是學生自己的緩慢平均)。關鍵在於,兩個網路最後都接一個跨 K 維的 softmax,所以這裡的「匹配」指的是匹配機率分布,而不只是對齊向量。

\min_{\theta_s}\; H\big(P_t(x),\, P_s(x)\big) = -\sum_{i=1}^{K} P_t^{(i)}(x)\,\log P_s^{(i)}(x), \qquad P_t(x) = \mathrm{softmax}\!\left(\frac{g_t(x) - c}{\tau_t}\right), \quad P_s(x) = \mathrm{softmax}\!\left(\frac{g_s(x)}{\tau_s}\right)

DINO 的目標:讓學生的分布去匹配老師經過置中、銳化後的分布。

逐一看符號:g_s(x)g_t(x) 是學生與老師網路對輸入 x 的原始輸出(跨 K 維的 logits)。P_sP_t 是把這些 logits 經 softmax 轉成的機率分布。H(P_t, P_s) = −Σ_i P_t^{(i)} log P_s^{(i)}交叉熵,當學生分布 P_s 與老師分布 P_t 一致時最小。兩個防崩塌的旋鈕都藏在老師的 softmax 裡。c中心向量:在 softmax 之前從老師的 logits 裡減掉,它本身是近期老師輸出的 EMA。置中(centering)能阻止 K 維中的任何單一維度獨大——少了它,老師可能對每張影像都把全部機率灌進同一個分量(一種崩塌)。τ_tτ_s 是老師與學生的溫度,且 τ_t < τ_s,所以老師被銳化:除以很小的 τ_t 會讓老師的分布變得尖峰而自信,給學生一個清晰的模仿目標。老師上掛著停止梯度,而它的權重是學生的 EMA。

為什麼非要這個搭配?置中與銳化對抗的是相反的失效模式,而這個平衡正是整個訣竅。只銳化會傾向崩塌:尖峰的老師把學生推向某個獨大的維度,系統可能盤旋成「永遠預測第 1 個分量」。只置中則傾向另一個退化的極端:減掉移動平均會把分布壓平、趨近均勻,同樣毫無資訊。兩者並用,它們互相抵消對方的偏差——銳化讓輸出保持自信,置中讓它不至於集中到單一維度——於是老師的分布保持多樣而有意義。正是這個平衡(而非任何排斥力)構成了 DINO 的防崩塌機制。

用 DINO 訓練的 Vision Transformer:它的自注意力圖會自發地勾勒出前景物體——訓練過程中從未看過任何分割標註。

並排圖:左邊是一張動物照片,右邊是 ViT 的 [CLS] 詞元自注意力熱圖,明亮的注意力區域緊貼動物輪廓,背景為暗色。

統一觀點:用「不對稱」打敗崩塌

退一步看,整篇就「塌縮」(這種是好的塌縮)成單一原則。這四個方法都拿掉了負樣本,而每一個都必須在「負樣本原本用來防止表徵崩塌」的位置上,放進別的東西。這個別的東西,永遠是某種形式的不對稱或約束——架構或目標裡刻意製造的「破缺」,讓常數解變得無法抵達。「不用負樣本」從來不等於「不需要防崩塌機制」;它只是把那個機制搬到了別處

  1. BYOL——用 EMA 目標,加上只在線上端的預測器與停止梯度來繳防崩塌稅:線上網路追逐一個緩慢、略為領先的自己副本,因此無法靜止成常數。
  2. SimSiam——剝到最精簡:共享權重、無 EMA、無負樣本——只有一個預測器與一個停止梯度。移除停止梯度便立刻崩塌,證明這一塊是承重結構。
  3. SwAV——改用線上聚類,並以等分約束(Sinkhorn–Knopp)繳稅,禁止「全部塞進同一個聚類」這種退化答案。
  4. DINO——詮釋為自我蒸餾,並以老師端的置中加銳化來繳稅,讓兩種相反的崩塌模式互相平衡抵消。

注意這些反覆出現的形狀:只有一側有預測器、另一側沒有(架構的不對稱);停止梯度把某個分支變成固定老師(梯度流的不對稱);EMA 讓老師成為緩慢平均(時間上的不對稱);以及批次層級的平衡約束(全域的統計規則)。其中任何一項都足以打破崩塌所依賴的對稱性。崩塌需要兩個分支都能自由地一起滑向同一點;而每種方法都用不同的方式剝奪了這份自由。

到目前為止所有的方法——無論對比或非對比——都共用一個假設:學習訊號來自比較同一張圖片的整張影像視角,並訓練編碼器讓這些視角達成一致。下一篇將把這個假設整個翻轉。它不再比較兩個視角,而是用遮罩影像建模(masked image modeling)遮住單張影像的大片區塊,訓練網路去重建缺失的內容——借用了讓 BERT 改寫語言領域的那個訣竅。讀那篇時,請帶著本篇的這副眼鏡:問問崩塌(若有的話)可能從哪裡偷溜進來,以及現在是什麼東西扮演了本篇裡「不對稱」所扮演的角色。