
視覺大模型這幾年迭代得非常快從最早把圖像和文本拉到同一個語義空間的 CLIP到用 Sigmoid 損失把對比學(xué)習(xí)做得更干凈的 SigLIP再到現(xiàn)在動輒能看圖說話的 VLM視覺大語言模型這條演進(jìn)線其實回答了一個很樸素的問題一張圖到底是怎么被塞進(jìn)一個只會處理文字的大語言模型里的很多人第一次接觸 VLM 的時候腦子里會冒出一堆問號——圖像明明是像素矩陣語言模型吃的是 token 序列這兩者中間到底發(fā)生了什么視覺特征是怎么翻譯成模型能理解的東西的為什么有的方案要凍結(jié)視覺編碼器有的又要聯(lián)合訓(xùn)練我前后折騰過幾套本地部署的視覺問答流程也踩過不少坑這篇就把 CLIP、SigLIP 到 VLM 這條鏈路拆開講清楚從對比學(xué)習(xí)的原理到視覺特征如何對齊到文本空間再到它怎么接進(jìn)大語言模型盡量把每一步的為什么都說明白。不管你是剛聽說 CLIP 想搞懂它到底在干嘛還是已經(jīng)在做 VLM 微調(diào)想理清底層邏輯應(yīng)該都能從里面找到點有用的東西。1. 先把 CLIP 這件事講透它到底對齊了什么1.1 對比學(xué)習(xí)不是分類而是配對打分很多人第一次看 CLIP會下意識把它當(dāng)成一個圖像分類器覺得它輸出的就是這是貓還是狗。這個理解偏了。CLIP 的核心不是分類而是判斷一張圖和一段文字是不是一對。它的訓(xùn)練數(shù)據(jù)是海量的圖像文本配對比如一張狗的照片配上一只在草地上奔跑的金毛。訓(xùn)練目標(biāo)很簡單讓真正配對的圖文對在特征空間里靠得近讓不配對的離得遠(yuǎn)。具體怎么做的一個 batch 里假設(shè)有 N 個圖文對CLIP 會分別用圖像編碼器和文本編碼器把它們編碼成 N 個圖像向量和 N 個文本向量然后算一個 N×N 的相似度矩陣。對角線上的 N 個是真實配對正樣本其余 N2-N 個是錯配負(fù)樣本。訓(xùn)練就是讓對角線上的相似度盡量高非對角線盡量低。這就是所謂的InfoNCE 對比損失。這個設(shè)計的關(guān)鍵在于CLIP 從來不需要人工標(biāo)注這張圖是貓它只需要這張圖和這句話是一起的?;ヂ?lián)網(wǎng)上天然存在大量圖文共現(xiàn)的數(shù)據(jù)這讓 CLIP 能吃到幾乎無限規(guī)模的訓(xùn)練信號。這也是它泛化能力強(qiáng)的根本原因——它學(xué)到的不是某個固定類別的判別邊界而是一個圖文共享的語義空間。1.2 雙塔結(jié)構(gòu)圖像和文本各走各的路CLIP 是典型的雙塔dual-encoder結(jié)構(gòu)。圖像塔通常用 ViT 或者 ResNet文本塔用 Transformer。兩塔在訓(xùn)練時各自獨立編碼最后只在算相似度的時候才碰面。這個設(shè)計帶來一個非常實用的好處圖像特征可以預(yù)先算好緩存起來。做檢索的時候你不需要每次把圖片重新過一遍編碼器只要把文本編碼后去和緩存的圖像向量做點積就行速度極快。但雙塔也有代價。因為圖像和文本在編碼階段完全沒有交互模型沒法做細(xì)粒度的跨模態(tài)推理。比如你問圖中左邊那只貓是什么顏色CLIP 就很難精確回答因為它壓根沒有左邊這種空間關(guān)系的建模能力它只知道整張圖和整句話的全局相似度。這個局限恰恰是后來 VLM 要解決的問題。1.3 溫度系數(shù)與 logit 縮放一個容易被忽略的細(xì)節(jié)CLIP 的相似度計算里有個可學(xué)習(xí)的溫度系數(shù)temperature通常記作 τ。它作用在 softmax 之前控制相似度分布的尖銳程度。溫度低分布尖銳模型對正樣本的置信度要求高溫度高分布平緩梯度更柔和。CLIP 把這個溫度設(shè)成可學(xué)習(xí)參數(shù)讓模型自己在訓(xùn)練中找合適的尺度。這個細(xì)節(jié)在實際微調(diào)時很重要。我見過不少人微調(diào) CLIP 時直接固定溫度結(jié)果模型收斂得很別扭。原因是不同數(shù)據(jù)集的相似度數(shù)值范圍差別很大固定溫度會讓 softmax 要么飽和要么過于平坦。建議微調(diào)時保留溫度可學(xué)習(xí)或者至少根據(jù)你的數(shù)據(jù)規(guī)模重新初始化一個合理的值。2. SigLIP 改了什么從 softmax 到 sigmoid 的那一步2.1 softmax 對比損失的全局歸一化之痛CLIP 用的 softmax 對比損失有個隱含要求它需要在整個 batch 內(nèi)做歸一化。也就是說每個樣本的損失都依賴于 batch 里其他所有樣本。這帶來兩個實際問題。第一batch 必須足夠大。batch 小的時候負(fù)樣本太少對比信號弱模型學(xué)不好。CLIP 當(dāng)年用了三萬多的 batch size這個規(guī)模對絕大多數(shù)團(tuán)隊來說根本玩不起。第二多卡訓(xùn)練時通信開銷大。因為要跨卡做全局歸一化梯度同步和 all-gather 操作很重擴(kuò)展性受限。2.2 sigmoid 損失把多分類拆成多個二分類SigLIP 的思路很直接既然 softmax 需要全局歸一化那我干脆不用 softmax改用sigmoid。具體來說它不再把 N×N 的相似度矩陣當(dāng)成一個多分類問題每行選一個正確列而是把每個格子當(dāng)成一個獨立的二分類問題——這個圖文對是真配對還是假配對正樣本標(biāo)簽為 1負(fù)樣本標(biāo)簽為 0各自算 binary cross-entropy最后求和。這個改動看似小影響卻很大。因為每個格子的損失只依賴它自己不再需要跨樣本的全局歸一化。這意味著 batch 可以小很多多卡訓(xùn)練時也不用做昂貴的全局同步。SigLIP 論文里明確說了在小 batch 下它的表現(xiàn)明顯優(yōu)于 CLIP而且訓(xùn)練更穩(wěn)定。2.3 實際選型什么時候用 CLIP什么時候用 SigLIP從我自己的使用經(jīng)驗看選型主要看兩個維度算力規(guī)模和下游任務(wù)。維度CLIPSigLIP訓(xùn)練 batch 需求大數(shù)萬級小數(shù)千級即可多卡擴(kuò)展性一般需全局歸一化好無全局依賴小數(shù)據(jù)微調(diào)容易過擬合相對更穩(wěn)零樣本分類成熟生態(tài)全表現(xiàn)相當(dāng)或更好生態(tài)與工具鏈極豐富逐步完善如果你是要做零樣本分類、圖文檢索而且手頭有現(xiàn)成的 CLIP 權(quán)重和工具鏈直接用 CLIP 系列完全沒問題生態(tài)成熟省事。如果你要自己從頭訓(xùn)或者在小規(guī)模數(shù)據(jù)上微調(diào)SigLIP 的 sigmoid 損失會讓你省心很多尤其是 batch 上不去的時候?,F(xiàn)在不少開源 VLM 的視覺塔已經(jīng)默認(rèn)換成 SigLIP 了比如一些主流的開源多模態(tài)模型視覺編碼器用的就是 SigLIP 的變體。提示SigLIP 的 sigmoid 損失在實現(xiàn)時要注意正負(fù)樣本的平衡。如果負(fù)樣本遠(yuǎn)多于正樣本N×N 矩陣?yán)镞@是必然的直接求和會讓負(fù)樣本主導(dǎo)梯度。常見做法是對正負(fù)樣本的損失做加權(quán)或者用 focal 式的調(diào)制。3. 視覺特征怎么翻譯成語言模型能吃的 token3.1 投影層一座必須存在的橋CLIP 和 SigLIP 輸出的圖像特征是固定維度的向量序列比如 ViT-L/14 輸出的是 768 維。而大語言模型的輸入是詞嵌入維度可能是 4096。這兩者維度不一樣語義空間也不一樣。所以中間必須有一個投影層projection layer把視覺特征映射到語言模型的嵌入空間。這個投影層的形式有好幾種。最簡單的是一個線性層Linear直接把視覺維度映射到語言維度。稍微復(fù)雜點的是 MLP比如兩層帶 GELU 激活的全連接。還有用Q-Former的比如 BLIP-2 那套用一組可學(xué)習(xí)的 query 向量去查詢視覺特征壓縮成固定數(shù)量的視覺 token。不同方案各有取舍線性層參數(shù)少、訓(xùn)練快但表達(dá)能力有限Q-Former 表達(dá)能力強(qiáng)能把變長的視覺特征壓成固定長度但訓(xùn)練更復(fù)雜需要額外的預(yù)訓(xùn)練階段。3.2 視覺 token 的數(shù)量一個被低估的工程問題一張圖經(jīng)過 ViT 編碼后會產(chǎn)生多少個視覺 token以 ViT-L/14 為例輸入 224×224 的圖patch size 是 14那么 patch 數(shù)量是 (224/14)2 256 個加上一個 cls token 就是 257 個。如果輸入分辨率提高到 336×336patch 數(shù)就變成 576 個。這些 token 全都要送進(jìn)語言模型會占用大量上下文長度。這是個很現(xiàn)實的工程問題。語言模型的上下文窗口是有限的如果一張圖就吃掉幾百個 token那多圖輸入或者長對話就很容易爆。所以實際系統(tǒng)里通常要做視覺 token 壓縮。常見手段包括用 Q-Former 壓到固定的 32 或 64 個 token用池化pooling對相鄰 patch 特征做聚合或者用 perceiver 式的交叉注意力做重采樣。我實測下來把視覺 token 從 576 壓到 64在多數(shù)問答任務(wù)上性能損失很小但顯存和延遲改善非常明顯。3.3 拼接方式視覺 token 放在哪影響很大視覺 token 投影完之后怎么和文本 token 拼在一起送進(jìn)語言模型這也有講究。最常見的是前綴拼接把視覺 token 放在文本 token 前面形成 [視覺token][文本token] 的序列。語言模型的自注意力機(jī)制會讓后面的文本 token 去 attend 前面的視覺 token從而實現(xiàn)看圖。但前綴拼接有個問題視覺 token 和文本 token 在語義上是有斷層的模型需要額外的訓(xùn)練才能學(xué)會跨越這個斷層。有些方案會在視覺和文本之間插入特殊的分隔 token或者用特殊的 attention mask 來控制可見性。還有的方案比如一些早期工作用交叉注意力層讓文本 token 通過 cross-attention 去查詢視覺特征而不是簡單拼接。這兩種路線各有擁躉前綴拼接實現(xiàn)簡單、易于擴(kuò)展交叉注意力則更接近原生多模態(tài)的設(shè)計。4. VLM 的訓(xùn)練范式凍結(jié)、對齊、聯(lián)合到底怎么選4.1 三階段訓(xùn)練為什么不能一步到位現(xiàn)在主流的 VLM 訓(xùn)練基本遵循一個多階段范式雖然具體劃分各家不同但核心邏輯類似。第一階段是視覺-語言對齊。這時候通常凍結(jié)視覺編碼器和語言模型只訓(xùn)練中間的投影層。目的是讓投影層學(xué)會把視覺特征映射到語言模型能理解的語義空間。這個階段數(shù)據(jù)量可以很大但訓(xùn)練目標(biāo)相對簡單就是圖文對或者簡單的描述生成。第二階段是指令微調(diào)。這時候會解凍語言模型有時也解凍視覺塔的高層用圖文指令數(shù)據(jù)訓(xùn)練讓模型學(xué)會按照人類指令去描述圖像、回答問題。這個階段的數(shù)據(jù)質(zhì)量比數(shù)量更重要需要精心構(gòu)造的問答對。第三階段是偏好對齊可選。用人類反饋或者 AI 反饋來進(jìn)一步優(yōu)化模型的輸出風(fēng)格和有用性類似語言模型里的 RLHF/DPO。為什么要分階段因為如果一上來就聯(lián)合訓(xùn)練所有參數(shù)視覺塔的梯度會非常嘈雜容易把預(yù)訓(xùn)練好的視覺表征破壞掉。分階段訓(xùn)練相當(dāng)于先搭好橋再讓兩岸的交通順暢起來。4.2 凍結(jié)視覺塔 vs 解凍一個反復(fù)被討論的取舍視覺塔到底該不該解凍這個問題在社區(qū)里爭論了很久。我的經(jīng)驗是看你的數(shù)據(jù)規(guī)模和任務(wù)類型。如果你的下游任務(wù)和預(yù)訓(xùn)練視覺塔的領(lǐng)域差異很大比如醫(yī)學(xué)影像、遙感圖像那解凍視覺塔至少解凍高層是必要的否則視覺特征根本不適配你的領(lǐng)域。但解凍的代價是顯存占用上升、訓(xùn)練不穩(wěn)定、容易過擬合。這時候通常用較小的學(xué)習(xí)率配合 layer-wise learning rate decay。如果下游任務(wù)是通用的圖文問答而且數(shù)據(jù)量不大那凍結(jié)視覺塔、只訓(xùn)投影層和語言模型往往性價比最高。我做過對比實驗在幾萬條通用 VQA 數(shù)據(jù)上凍結(jié)視覺塔的方案和全解凍方案性能差距在 1-2 個點以內(nèi)但訓(xùn)練成本差了好幾倍。4.3 數(shù)據(jù)配比視覺指令數(shù)據(jù)的隱形陷阱做 VLM 微調(diào)數(shù)據(jù)配比是個大坑。很多人把大量純文本指令數(shù)據(jù)和圖文指令數(shù)據(jù)混在一起訓(xùn)結(jié)果發(fā)現(xiàn)模型的語言能力沒退化但視覺能力提升很慢。原因在于圖文數(shù)據(jù)的比例被稀釋了。我的建議是在視覺指令微調(diào)階段圖文數(shù)據(jù)應(yīng)該占主導(dǎo)純文本數(shù)據(jù)只保留一小部分用來防止語言能力災(zāi)難性遺忘。具體比例沒有定論但圖文:純文本在 4:1 到 10:1 之間是比較常見的區(qū)間。另外圖文數(shù)據(jù)的任務(wù)多樣性比單一任務(wù)的數(shù)據(jù)量更重要。描述、問答、推理、定位這幾類任務(wù)都要有否則模型容易偏科。5. 本地部署 VLM 時踩過的那些坑5.1 顯存不夠視覺塔和語言模型誰更吃顯存本地部署 VLM第一個攔路虎就是顯存。很多人以為語言模型是大頭其實視覺塔在高分辨率下也很吃顯存。ViT 的注意力是 patch 數(shù)量的平方復(fù)雜度分辨率翻倍patch 數(shù)翻四倍注意力矩陣就翻十六倍。所以如果你要處理高分辨率圖像視覺塔的顯存占用可能超出預(yù)期。實操上幾個有效的省顯存手段降低輸入分辨率但會損失細(xì)節(jié)、用梯度檢查點gradient checkpointing、把視覺塔量化到 FP16 或 INT8。我實測下來把視覺塔單獨量化到 INT8精度損失很小但顯存能省下不少。5.2 圖像預(yù)處理被忽視的對齊問題CLIP 和 SigLIP 在訓(xùn)練時對圖像做了特定的預(yù)處理resize 到固定尺寸、歸一化用的均值和方差也是固定的。如果你部署時預(yù)處理不一致視覺特征就會偏移下游表現(xiàn)會明顯下降。這個坑我踩過——當(dāng)時用了默認(rèn)的圖像加載庫歸一化參數(shù)和訓(xùn)練時不一致結(jié)果模型回答質(zhì)量肉眼可見地變差。后來統(tǒng)一了預(yù)處理流程問題就消失了。注意不同視覺塔的預(yù)處理參數(shù)不一樣。CLIP 用的是 OpenAI 那套均值和方差SigLIP 用的是另一套。部署前一定要查清楚你用的權(quán)重對應(yīng)哪套預(yù)處理別想當(dāng)然。5.3 視覺 token 與上下文長度的博弈前面提過視覺 token 會占用上下文。本地部署時如果你的推理框架對上下文長度有限制多圖輸入或者高分辨率輸入很容易觸發(fā)截斷。這時候要么壓縮視覺 token要么增大上下文窗口但顯存會漲。我的做法是根據(jù)任務(wù)動態(tài)調(diào)整單圖問答用較高分辨率多圖對比用較低分辨率加 token 壓縮在效果和資源之間找平衡。5.4 配置文件格式Y(jié)AML 還是別的現(xiàn)在不少本地部署工具用 YAML 來管理配置參數(shù)模型路徑、量化方式、上下文長度、采樣參數(shù)都寫在里面。YAML 的好處是可讀性好、層級清晰改起來直觀。但要注意 YAML 對縮進(jìn)極其敏感一個空格錯了整個配置就廢了。我建議改配置時用帶 YAML 校驗的編輯器改完先跑一遍語法檢查再啟動能省不少排查時間。6. 從特征對齊到真正看懂還差什么6.1 對比學(xué)習(xí)學(xué)到的是全局相似不是細(xì)粒度理解回到最開始的問題CLIP 和 SigLIP 把視覺特征對齊到了文本空間但這個對齊是全局的、粗粒度的。它們擅長判斷這張圖整體上是不是關(guān)于這個主題但不擅長回答圖中第三個物體是什么顏色這種需要空間和關(guān)系推理的問題。VLM 通過把視覺特征接進(jìn)語言模型借助語言模型的推理能力在一定程度上彌補(bǔ)了這個短板。但要注意視覺塔本身的能力上限決定了 VLM 的視覺理解上限。如果視覺塔壓根沒編碼某個細(xì)節(jié)語言模型再強(qiáng)也推理不出來。6.2 視覺特征增強(qiáng)幾個實用的方向如果你想讓 VLM 的視覺理解更強(qiáng)除了換更大的視覺塔還有幾個方向可以試。一是多尺度特征融合把不同分辨率的視覺特征拼起來兼顧全局和細(xì)節(jié)。二是區(qū)域級特征先用檢測或分割模型框出感興趣區(qū)域再對每個區(qū)域單獨編碼喂給語言模型。三是視覺 token 的層次化組織讓語言模型能按需關(guān)注不同粒度的視覺信息。這幾個方向在近期的研究里都有不少探索實際效果因任務(wù)而異。6.3 一個常被問的問題VLM 能替代專用視覺模型嗎經(jīng)常有人問有了 VLM是不是就不用單獨訓(xùn)練檢測、分割模型了。我的看法是短期內(nèi)不能替代但能互補(bǔ)。VLM 強(qiáng)在開放域的問答和推理弱在精確定位和密集預(yù)測。檢測和分割任務(wù)需要像素級的輸出VLM 的輸出是文本 token天然不適合。但 VLM 可以作為調(diào)度器理解用戶意圖后調(diào)用專用的視覺模型這種組合在實際系統(tǒng)里越來越常見。7. 一些實操層面的經(jīng)驗補(bǔ)充7.1 微調(diào) CLIP 時學(xué)習(xí)率怎么設(shè)微調(diào) CLIP 的視覺塔學(xué)習(xí)率通常要比從頭訓(xùn)練小一到兩個數(shù)量級。我一般從 1e-5 到 5e-6 起步配合 warmup。文本塔的學(xué)習(xí)率可以稍大一點因為文本塔的預(yù)訓(xùn)練表征相對更通用微調(diào)空間更大。如果只訓(xùn)投影層學(xué)習(xí)率可以到 1e-4 甚至更高因為投影層是隨機(jī)初始化的需要快速收斂。7.2 評估 VLM 不能只看 lossVLM 的訓(xùn)練 loss 和實際生成質(zhì)量的相關(guān)性沒那么強(qiáng)。loss 降了生成的可能還是胡言亂語。所以評估一定要用生成式指標(biāo)比如人工評估、GPT 打分、或者任務(wù)特定的準(zhǔn)確率。我習(xí)慣在訓(xùn)練過程中定期抽樣生成人眼看幾條比盯著 loss 曲線有用得多。7.3 視覺塔的選擇不是越大越好ViT-L 比 ViT-B 大但不一定在你的任務(wù)上更好。大視覺塔需要更多數(shù)據(jù)才能訓(xùn)好小數(shù)據(jù)下反而容易過擬合。而且大視覺塔的推理延遲高本地部署時體驗會打折。我的建議是先用中等規(guī)模的視覺塔跑通流程確認(rèn)任務(wù)可行后再考慮升級。7.4 關(guān)于視覺特征增強(qiáng)的一個誤區(qū)有人覺得視覺特征增強(qiáng)就是簡單地把特征維度堆高、把 token 數(shù)加多。其實不然。特征的質(zhì)量比數(shù)量重要。一個經(jīng)過良好對齊的 64 維視覺 token可能比一堆沒對齊的高維特征更有用。增強(qiáng)的核心是讓視覺特征攜帶更多對下游任務(wù)有用的信息而不是單純增加信息量。8. 寫在折騰之后從 CLIP 到 SigLIP 再到 VLM這條線走下來我最大的體會是視覺進(jìn)入語言模型這件事本質(zhì)上是一個翻譯問題。CLIP 和 SigLIP 解決的是把圖像翻譯成文本語義空間里的向量投影層解決的是把這個向量翻譯成語言模型能吃的 token而 VLM 的訓(xùn)練范式解決的是讓語言模型學(xué)會理解這種翻譯后的輸入。每一層翻譯都會損失信息也會引入偏差理解這些損失和偏差在哪比記住某個模型的參數(shù)量更有用。實際做項目的時候我越來越傾向于夠用就好的原則。不是每個任務(wù)都需要最大的視覺塔、最多的視覺 token、最復(fù)雜的訓(xùn)練范式。先跑通最小可行流程測出瓶頸在哪再針對性優(yōu)化往往比一上來就堆配置更高效。視覺大語言模型這個方向還在快速演進(jìn)今天的最佳實踐明天可能就被推翻但底層的對齊邏輯和工程取舍短期內(nèi)不會變。把這些搞明白換什么模型都能快速上手。