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

不靠標註的學習:自監督的核心構想

看看機器如何僅憑原始影像就學會「看」——以及為何「藏起一部分資料再去預測」這個小把戲,能解鎖數十億張無標註圖片。

為什麼「標註」是瓶頸

現代的影像辨識建立在一個簡單卻昂貴的想法上:餵給神經網路數百萬張圖片,每張都貼上人工撰寫的標籤——消防車——讓它學會這個對應關係。其中最有名的資料集 ImageNet,收錄約 130 萬張影像、分成 1,000 個類別。製作它花了好幾年的心力,還動用了大批人工標註者一張接一張地點選。若你今天想要一個同等規模的全新標註資料集,得先準備好數百萬美元與好幾個月的工時,模型才有辦法開始訓練

經典的監督式分類:每張影像都必須先附上人工撰寫的標籤,網路才能從中學習。

一張貓的影像進入神經網路,輸出各類別的機率;旁邊標示著人工提供的正確答案標籤「貓」。

現在把它和網際網路免費提供的東西對照一下。人們每一天都把數十億張照片上傳到社群媒體、相片庫與公開網路上——而且完全沒有整齊的標籤。這正是驅動整個學程的痛點不對稱:標註資料稀少又昂貴,而原始、未標註的影像卻幾乎無窮無盡,而且基本上免費。這個夢想顯而易見:要是模型能從那數十億張沒標註的影像學習,而不是只靠那數百萬張有標註的,會怎麼樣?

有一個線索能說明這個夢想是務實的——想想人類的小孩。早在任何大人教會他「狗」這個字之前,嬰兒就已經摸索出大量關於視覺世界如何構成的知識:物體會以相連的整體一起移動、臉孔有兩隻眼睛在鼻子上方、光通常從上方來、東西愈遠看起來愈小。沒有人遞給孩子一份標準答案。世界本身的結構就是老師。孩子觀察、默默預測接下來會發生什麼,並在被驚訝到時被現實糾正。

說得直白些,自監督學習就是讓資料自己批改自己作業的藝術。這篇導讀會把這句一行字的構想化為精確的內容:如何製造這樣的任務、我們真正希望模型最後帶走什麼、以及如何衡量它是否成功。讀完之後,你將擁有看懂本學程其餘部分所需的完整詞彙。

監督式 vs 自監督:學習訊號從哪來

我們把差異講精確,因為整個領域就是繞著這個樞紐轉的。在一般的監督式學習裡,每個訓練樣本都是一組配對:一張輸入影像,加上一個由人寫下的目標。你給網路看一張照片,它猜「狗」,你把這個猜測跟人工標籤「貓」比對,兩者的落差——也就是損失——就是用來推動網路權重的訊號。這個學習訊號,可以說字面意義上就是被烤進每一個樣本裡的人力。

自監督學習完全保留這套機制,只改一件事:目標從哪裡來。我們不付錢請人寫答案,而是製造一個正確答案早已包含在資料裡的任務。經典手法是把影像的一部分藏起來或加以變換,再要求網路還原我們藏掉的東西。把照片挖掉一個方塊,要模型補回來。把彩色圖片轉成灰階,要它預測原本的顏色。把影像旋轉,問它轉了多少。在每一種情況裡,那張原始、未經改動的影像就是標準答案——而且不花一毛錢。

# Supervised: the target comes from a human annotator
for image, human_label in labeled_dataset:
    prediction = network(image)
    loss = cross_entropy(prediction, human_label)   # answer written by a person
    loss.backward(); optimizer.step()

# Self-supervised: the target is manufactured from the data itself
for image in unlabeled_dataset:
    view, target = make_pretext_task(image)   # e.g. rotate image; target = rotation angle
    prediction = network(view)
    loss = cross_entropy(prediction, target)        # answer written by the data
    loss.backward(); optimizer.step()
相同的迴圈、相同的損失、相同的最佳化器——唯一的差別在於 `target`(目標)的來源。

我們發明的這個自製謎題——「預測旋轉角度」、「把洞補起來」——有個名字:前置任務(pretext task)。pretext 這個詞是刻意帶點貶意的。它暗示這個任務只是個幌子、一個藉口,目的是逼網路死盯著影像看。我們其實一點也不在意模型是否成為世界級的旋轉偵測器,或拼回打散碎片的冠軍。

為什麼不在意?因為前置任務只是達成目的的手段。我們真正追求的,是網路為了解開這個謎題而在過程中被迫學會的一切——對物體、部件、紋理與佈局的豐富內在理解。謎題是鷹架;理解才是獎品。下一節我們就會把這份獎品講精確,而在第 4 節,我們會親眼看到一個巧妙的前置任務是如何逼出真正的理解。

「表徵」到底是什麼?

本學程的一切都繞著一個對象打轉,所以我們要小心地定義它。表徵(也叫嵌入,embedding)是一串緊湊的數字——一個向量——用來代表一張影像。產生它的元件叫編碼器(encoder):一個神經網路,吞下一張雜亂、高維度的影像(一張 224×224 的彩色照片是超過 15 萬個原始像素數值),把它壓縮成一個短向量,也許 2,048 個數字長。研究如何學出好編碼器,正是表徵學習

z = f_\theta(x)

編碼器映射:一張影像 x 變成一個嵌入向量 z。

把它讀成「表徵 z 就是編碼器 f(帶有參數 θ)從影像 x 算出來的東西」。逐個符號來看:x 是輸入影像——字面上就是一格一格的像素值。f_θ 是編碼器,一個神經網路;下標 θ(theta)代表它所有可學習的權重,也就是訓練時被調整的那數百萬個數字。z 是輸出,也就是嵌入向量——比方說一個落在 2,048 維空間裡的點。這裡沒有要解的代數;這條式子只是替每個部件貼上精確的名牌。整個 SSL 的遊戲,就是找到一組權重 θ,讓這個映射把影像變成有用的點。

編碼器把一張高維度的影像逐層收斂,化為一個緊湊的特徵向量 z。

一張示意圖:影像通過層層堆疊的神經網路,逐步縮小成一個簡短的數字向量。

是什麼讓某個 z「有用」、另一個沒用?想想把一本 400 頁的小說濃縮成五個關鍵字。一份偷懶的摘要(「書、書頁、文字、墨水、封面」)技術上是在描述它,卻完全沒告訴你它在講什麼。一份好的摘要(「孤兒、魔法、友情、寄宿學校、勇氣」)抓住了精髓,因此兩本摘要相近的小說,真的就是相似的故事。好的表徵對影像做的也是同一件事:它把影像在向量空間裡安排好,使得語意相似的影像彼此靠近、不同的影像彼此遠離。如果每張狗的照片都聚在某一區、每輛卡車都聚在另一區,那麼對任何建立在其上的東西來說,分辨狗與卡車就變得易如反掌。

前置任務:答案免費的巧妙謎題

早期的自監督視覺仰賴人工設計的前置任務,其中有四個成了經典。旋轉:把每張影像旋轉 0°、90°、180° 或 270°,問網路它是哪一種。拼圖:把影像切成一格格碎片、打散,要網路還原原本的排列。上色:把影像剝成灰階,要網路預測它原本的顏色。修補(inpainting):刪掉一塊區域,要網路用合理的內容把洞填起來。這四種任務的答案都是免費的——謎題是你出的,所以你早就握有解答。

我們慢慢走一遍旋轉任務,因為它展示了那個魔法。假設我遞給網路一張旋轉了 90° 的影像,它必須回答「旋轉了 90°」。它到底怎麼可能知道?唯有靠理解內容。它必須知道天空該在上、地面該在下,臉孔通常是正立的,樹是往上長的,印刷文字是由左讀到右的。一個已經把這些內化的網路,能直接從畫面讀出方向;一個只看到一團團無意義色塊的網路則辦不到。於是「這張轉了多少?」這個看似無害的問題,暗中逼著模型去學會物體結構——而這純粹是解謎的副產品

同樣那些影像變換——旋轉、裁切、灰階、塗除——正是用來製造「答案免費」前置任務的工具。

一張原始影像旁邊放著數個變換後的版本:旋轉、裁切、轉成灰階、以及挖掉一塊的版本。

這揭示了前置任務設計的黃金法則:好的前置任務,是無法用廉價、低階的捷徑解決的任務。只要網路能在不理解內容的情況下破解謎題,它就會這麼做——然後你會得到一堆垃圾特徵。拼圖就是一則警世故事:如果你讓碎片彼此相連,模型就能靠比對邊緣紋理或邊界上微小的色彩暈邊把它們拼回去——就像玩真的拼圖時靠摸切口形狀作弊,而不是看圖案。解法是讓碎片之間留下空隙,捷徑因此消失,只有真正的理解能存活下來。

如何衡量好壞:線性評估協定

一個合理的質疑:如果預訓練從頭到尾沒碰過任何一個標籤,我們究竟怎麼知道它學到的表徵好不好?我們需要一把尺。標準的那把尺叫線性評估協定,它優雅得令人讚嘆——是一道乾淨的四步驟流程,本學程幾乎每一篇論文都會回報這個數字。

  1. 用你的自監督前置任務,在未標註的資料上預訓練編碼器。
  2. 凍結編碼器——鎖住每一個權重 θ,讓它再也不能改變。
  3. 在凍結的編碼器之上,只訓練一個全新的線性分類器,並使用一份有標註的資料集。
  4. 在保留的測試影像上量測這個分類器的準確率。這個數字,就是你表徵的分數。
線性探針只能畫出平直的邊界。唯有當編碼器早已把各類別擺成整齊、線性可分的群集時,它才能把類別分開。

一張散點圖:兩團不同顏色的點被一條直線俐落地分開,與另一組任何直線都無法分開、彼此糾纏的群集形成對比。

\hat{y} = \mathrm{softmax}(Wz + b)

線性探針:在凍結的表徵 z 之上,加一層可訓練的線性層。

線性探針就是這一條式子,所以我們把每個部件都點名一遍。z 是預訓練編碼器替一張影像產生的、被凍結的表徵——它是固定的,探針改不了它。W 是那個唯一可訓練的線性層(也就是「探針」)的權重矩陣;b 是它的偏置向量;`Wz + b` 合起來,不過是把 z 各分量的加權和再加上一個偏移量,替每個類別算出一個原始分數。接著 softmax 把這些原始分數壓成一組相加為 1 的正數——也就是一個機率分布。ŷ(y-hat)就是這個對各類別的預測分布,例如「88% 狗、9% 貓、3% 卡車」。現在來到重點,也是為什麼探針刻意要用線性的原因:線性層只能在嵌入空間裡切出平直的邊界——它自身幾乎沒有任何能力。所以,如果凍結的編碼器加上這個孱弱的層仍能準確分類,那麼編碼器一定早就做完了苦工,把影像安排成各類別線性可分的樣子。這,正是我們所謂「好的表徵」的意思。

前路一覽:自監督的幾大家族

你現在已經握有看懂本學程其餘部分所需的每一個概念。現代的自監督視覺分成三大家族,後面的四篇導讀會一個一個帶你走過。這裡先給你一張地圖,讓整段旅程感覺是有意安排的,而不是一場花招的遊行。

對比方法(第 2、3 篇導讀)會替同一張影像做出兩個不同的視角——比方說兩個隨機裁切——並訓練編碼器在嵌入空間裡把這兩者拉在一起,同時把其他影像推開。「推開」需要大量稱為負例(negatives)的比對樣本,而要供應足夠多的負例,背後得下出乎意料多的工程功夫。這就是對比學習,以及那些把它擴展到海量負例的方法的故事。

免負例方法(第 4 篇導讀)提出一個尷尬的問題:我們能不能在沒有任何負例可推開的情況下,仍然把相符的視角拉在一起?危險在於崩塌(collapse)——編碼器作弊,把每一張影像都映射到同一個常數向量,這樣所有視角都輕而易舉地「一致」,卻什麼也沒學到。這個家族借用蒸餾與分群的技巧來主動防止崩塌,包含廣為人知的 BYOL、SimSiam、SwAV 與 DINO 等方法。

遮罩影像建模(第 5 篇導讀)回到了這篇導讀裡最古老的那個想法——把資料的一部分藏起來再去預測它——但這次是以完整的現代火力。它遮掉影像的大片區塊,訓練網路去重建消失的內容,直接呼應了 BERT 透過填補被挖空的字詞來學會語言的方式。這就是遮罩影像建模,把樸實的「預測缺失的那一塊」這道配方,帶到它在視覺領域最強大形態的方法。