
CLIP 多模態對齊:讓文字與影像住進同一個空間 - 用一句話搜出「沒戴安全帽的人」
傳統偵測器想搜「沒戴安全帽的人」,得先定義類別、標一堆框、訓練一個專用模型。CLIP 換了個玩法:把 4 億組圖文配對丟進兩座編碼器,逼影像與文字住進同一個向量空間——從此打字就能搜圖,不需為每個新概念重訓。本篇在筆電 CPU 上從零手刻 mini-CLIP,實測驚喜與誠實並存:文字搜圖連「訓練時沒配過的組合」都命中 (P@5=1.00);但反過來要模型幫沒見過的組合命名時,它卻把概念「抹散」了——一堂關於組合式零樣本能到哪裡的實驗課。
WRITTEN BY

- Name
- Harry Chang
核心貢獻者
Alec Radford、Jong Wook Kim 等 OpenAI 團隊(共同作者包含首席科學家 Ilya Sutskever,見 Day 29)於 2021 年發表 CLIP《Learning Transferable Visual Models From Natural Language Supervision》。核心洞見顛覆直覺:不要再請人標「這是貓」了,直接拿網路上現成的 4 億組「圖片 + 說明文字」當監督訊號。訓練完的模型會一項驚人能力——零樣本 (zero-shot):不必為新任務訓練,把類別寫成一句話,它就能分類、就能用文字搜圖。CLIP 後來成了 DALL·E、Stable Diffusion、SAM 等一票多模態系統的視覺地基。
為什麼要讓文字和影像對齊?
Day 46 的自監督讓模型「不靠標籤」學到好特徵,但它仍活在單一模態裡:學完影像特徵,下游要用時還是得有人定義「哪些類別、各給幾張標籤」。
工安現場的痛點更直接:你想在監視器畫面裡找出「沒戴安全帽的人」。傳統路線要先定義一個 helmet-less 類別、標一大堆框、訓練一個專用偵測器;明天主管改口要找「沒穿反光背心的人」,整個流程再跑一次。
CLIP 把提問方式整個換掉:它學的是「影像」與「文字」之間的對應。只要把影像和描述它的句子,雙雙映射到同一個向量空間,讓配對的圖文靠近、不配對的遠離——訓練完之後,任何一句話都能當成查詢。想找什麼,打字就好,不必為每個新概念重訓模型。這就是「開放詞彙 (open-vocabulary)」的威力。
1. 資料集來源
資料集:合成形狀資料集(顏色 × 形狀)
備註:CLIP 的 4 億圖文對無法在筆電上重現,所以這裡用純 numpy 自己畫一個可控的代理資料集:3 種顏色 × 3 種形狀 = 9 個概念,每個概念配一句
a photo of a {顏色} {形狀}。它小到 CPU 幾分鐘跑完,又剛好能演出 CLIP 的靈魂——組合式泛化。
實驗設計:刻意留一個「沒配過的組合」
- 圖文配對:每張圖搭一句模板描述,文字用詞袋 (bag-of-words) 編碼(把句子當一組單字)。
- 關鍵伏筆:訓練時完全抽掉「紅色三角形」這組配對——但模型仍會從別的紅色物件學到「紅」、從別的三角形學到「三角形」。測試時再問它「紅色三角形」,看它能不能把兩個學過的字組起來。這正是「沒戴安全帽的人」這種沒有專門訓練過的組合查詢的縮影。
- 評估:①影像→文字的零樣本分類;②文字→影像的檢索 (P@5)。
2. 原理
2.1 兩座塔,一個空間
CLIP 的骨架是雙編碼器 (dual encoder):一座塔看影像、一座塔看文字,各自把輸入壓成一個向量,再強迫它們住進同一個空間(都做 L2 正規化,放到同一個單位球面上比較)。
2.2 對稱對比損失:對角線要最亮
一個批次有 N 組圖文對。把 N 個影像向量與 N 個文字向量兩兩算相似度,得到一個 N×N 矩陣——對角線是正確配對(第 i 張圖配第 i 句話),其餘 N²−N 格都是不該配的組合。訓練目標:把對角線拉到最高、其他壓低。
- 為什麼「對稱」:既要「給圖找對的文字」( 的每一列),也要「給文字找對的圖」( 的每一列),兩個方向的交叉熵各算一次再平均。
- 溫度 可學:控制相似度的銳利程度,CLIP 讓它跟著訓練自動調(本篇最後學到約 0.066)。
2.3 零樣本的魔法:把類別寫成一句話
訓練完後,分類不需要再訓練任何分類器:想分「貓 vs 狗」,就把 a photo of a cat、a photo of a dog 丟進文字塔,再看影像向量離哪句話近。想搜圖,就把查詢句子編碼,去影像向量庫裡找最近鄰——這一步跟 Day 45 門禁的檢索一模一樣,只是查詢從「一張臉」換成「一句話」。
3. 實戰
Python 程式碼實作
# 兩座編碼器,都把輸出 L2 正規化到同一個空間
class ImageEncoder(nn.Module): # 小 CNN -> 64 維
def forward(self, x): return F.normalize(self.net(x), dim=1)
class TextEncoder(nn.Module): # 詞袋 -> MLP -> 64 維
def forward(self, x): return F.normalize(self.net(x), dim=1)
logit_scale = nn.Parameter(torch.tensor(np.log(1 / 0.07))) # 可學溫度,同 CLIP
# 對稱 InfoNCE:對角線是正確配對
for it in range(1500):
imgs, caps = train_batch() # 每個「已見概念」抽一張圖 + 它的句子
ie, te = img_enc(imgs), txt_enc(caps) # (B,64) 影像向量 / 文字向量
logits = logit_scale.exp() * ie @ te.t() # (B,B) 相似度矩陣
labels = torch.arange(len(imgs)) # 正確配對就在對角線
loss = (F.cross_entropy(logits, labels) +
F.cross_entropy(logits.t(), labels)) / 2 # 圖->文 與 文->圖 各一次
opt.zero_grad(); loss.backward(); opt.step()
# 零樣本檢索:文字查詢 -> 影像向量庫最近鄰
sims = txt_enc(query_bow) @ image_bank.t()
topk = sims.argsort(descending=True)[:5]
程式碼重點:
- 兩座塔輸出同維度、同做 L2 正規化——這是「住進同一個空間」的關鍵,少了它圖文根本不能比。
- 批次組成刻意每個概念一張圖:讓對角線是唯一正解、其餘都是乾淨的負樣本,對比訊號才不會被同概念的重複配對污染。
- 溫度設成可學參數:跟 CLIP 一樣,讓模型自己決定相似度要多銳利。
4. 模型評估
資料長這樣(9 個概念,紅色三角形被抽走)

零樣本成績:一個漂亮、一個誠實
| 任務 | 已見概念 (8) | 未見組合「紅色三角形」 |
|---|---|---|
| 文字 → 影像 檢索 (P@5) | 100% | 100% |
| 影像 → 文字 零樣本分類 | 100% | 0% |
用文字搜圖:連沒配過的組合都命中

- 這就是「沒戴安全帽的人」的原型:打一句
a blue circle、a green square,前 5 名全部命中(綠框)。沒有為任何一個查詢訓練分類器——這是 CLIP 相對傳統偵測器最大的省事之處。 - 最下排是伏筆:
a red triangle這組訓練時從沒配過,模型卻照樣把 5 張紅色三角形全撈出來。它顯然把學過的「紅」和「三角形」組合起來,指向了對的影像群——這正是開放詞彙檢索的本事。
對齊矩陣:漂亮的對角線,與一條「抹散」的紅線

- 8 個已見概念的對角線是刺眼的亮黃色——配對的圖文緊緊相鄰,分類與檢索都零失誤。
- 紅框標出的「紅色三角形」(訓練沒配過)完全不同:它的那一列沒有尖銳的高峰,而是均勻地抹散在所有「紅色」概念和所有「三角形」概念上。模型知道它「有點紅、也有點三角」,卻沒有一個專屬的錨點。
誠實的打臉:檢索成功 ≠ 分類成功
同一個「紅色三角形」,為什麼文字搜圖 100%、影像命名 0%?因為這是兩個相反方向:
- 文字 → 影像(成功):在所有影像裡,紅色三角形的圖確實離「紅色三角形」這句話最近——所以撈得出來。
- 影像 → 文字(失敗):但拿一張紅色三角形的圖去比 9 句話時,它被自己身上的「紅」拉向了
紅色圓形/紅色方形,argmax 落到了見過的鄰居,而不是那個被抹散、沒有高峰的「紅色三角形」。
教訓:組合式零樣本是真的,但它柔軟、脆弱、且看方向。一個從沒被配對過的概念,不會憑空長出銳利的錨點——這也是為什麼真實 CLIP 需要 4 億對的海量資料,才能把無數屬性組合都「見」得夠密。
工安視角的解讀
- 開放詞彙就是彈性:今天找「沒戴安全帽」、明天找「沒穿反光背心」、後天找「有人跌倒」——CLIP 全都只要換一句查詢文字,不必為每個新需求重訓一個偵測器。
- 檢索優先、分類其次:上面的實驗說明,工安落地應以「用文字撈出可疑畫面」為主(這方向最穩),再由人工複核;別直接信任模型對罕見組合的「命名/信心分數」。
- 誠實提醒:本篇是 9 概念的玩具規模;真實 CLIP 的零樣本威力來自 4 億圖文對。但省下逐類標註、用自然語言下指令的核心價值,大小模型一致。
5. 總結
我們學習了 CLIP 多模態對齊:
- 換一種監督:不標「這是什麼」,而是拿現成的「圖 + 文字說明」當配對訊號,把影像與文字逼進同一個向量空間。
- 對稱對比損失:一個批次的 N×N 相似度矩陣,拉高對角(正確配對)、壓低其餘,圖→文與文→圖各算一次。
- 零樣本:類別寫成一句話就能分類、就能搜圖,天生支援開放詞彙——這是相對傳統偵測器最大的解放。
- 誠實結論:組合式零樣本真的存在(未配過的「紅色三角形」文字搜圖 P@5=100%),但它是柔軟且不對稱的(反向命名 0%);威力隨資料規模而放大。
- 工安啟示:一句話搜出「沒戴安全帽的人」是可行的,但要以檢索+人工複核的姿態落地。
下一篇把「零樣本」從辨識推向分割:不用標任何遮罩,就能把畫面裡的任意物件、任意危險區域圈出來?SAM (Segment Anything)——給一個點、一個框,甚至一句話,它就把邊界描出來。