為何凍結、為何橋接
從頭訓練一個視覺編碼器與一個大型語言模型各自所費不貲。因此,視覺語言模型的主流做法是把兩者都重複利用:取一個預訓練的視覺編碼器(常是上一篇的 CLIP 圖像塔)與一個預訓練的 LLM,凍結它們大部分的權重,只訓練一個小小的橋,把影像特徵轉成 LLM 讀得懂的東西。這在設計上就是參數高效的——你訓練的是數百萬個橋接參數,而非數十億個骨幹參數。
底下每個設計選擇,其實都在回答同一個問題:視覺特徵要如何進入語言模型的注意力? 它們分成兩大陣營——輸入空間的橋把影像轉成偽 token,讓 LLM 像讀字一樣讀它們;以及逐層的橋,透過在 LLM 內部新增的交叉注意力把視覺注入進去。
最簡單的橋:投影器
最小可行的橋是視覺編碼器投影器:一個小小的 MLP(有時只是單一線性層),把每個影像區塊的嵌入映射到 LLM 的 token 空間。投影後的區塊向量就直接前置到文字 token 前,彷彿它們是字。LLM 自己的自注意力接著免費把它們與提示融合起來。這就是 LLaVA 的做法——而它驚人的啟示是:一個兩層 MLP 加上好的指令資料,就足以打造一個有能力的助手。
投影器其实就是一个小型 MLP,把每个图块嵌入 e_i 映射成 LLM 输入空间中的伪 token h_i。
patch_feats = vision_encoder(image) # (P, d_vis), frozen vis_tokens = mlp_projector(patch_feats) # (P, d_llm), trained seq = concat(vis_tokens, embed(text)) # treat patches as tokens out = llm(seq) # self-attention fuses both
用可學習查詢重採樣:Perceiver 與 Q-Former
與其傳入全部 P 個區塊,不如把它們重採樣成固定的 K 個(比方 32 或 64)。Perceiver 的點子是保留一小組可學習的潛在查詢,讓它們對(龐大的)影像特徵集合做交叉注意力。往後傳遞的是潛在向量——而非影像本身——因此成本與輸入大小脫鉤。Flamingo 的 Perceiver 重採樣器正是這樣,把數量不定的區塊(或影片影格)轉成固定的少量視覺 token。
注意力作为带 softmax 权重的查询–键–值检索的示意图。
Q-Former(出自 BLIP-2)把同一招打磨成一座兩階段的橋。一組可學習的查詢 token 通過一個小型 transformer,對凍結的影像特徵做交叉注意力;這些查詢同時也對文字訓練,因此這座橋被教會抽取與語言相關的視覺證據——而非任意的壓縮。最終的查詢輸出成為 LLM 的視覺前綴。整個 Q-Former 相對任一骨幹都很小,而兩座骨幹都保持凍結。
逐層注入視覺:門控交叉注意力
另一個陣營在輸入端不動文字 token,而是在 LLM 既有區塊之間插入新的跨模態注意力層。這就是 Flamingo 的門控交叉注意力:每隔幾層,文字隱狀態就對重採樣後的視覺 token 做注意力。巧妙之處——也是優雅之處——在於一個初始化為零的 tanh 門。訓練之初門是關閉的,因此增強後的模型與原本凍結的 LLM 逐位元相同;隨著新層學習,門逐漸打開,這讓預訓練的語言能力不致崩塌。
Flamingo 式的门控交叉注意力加入一个初始为零的 tanh 门,使新的视觉通路在第 0 步贡献为零。
如何選一座橋
- 想要最簡單的路徑、又手握指令資料集?用 MLP 投影器(LLaVA 風格)。它強得驚人,又好除錯。
- token 預算吃緊,或要餵影片/多張影像?用 Perceiver 或 Q-Former 重採樣到固定的小數量。
- 必須保住 LLM 純淨的文字行為、又要交錯許多影像?門控交叉注意力(Flamingo)在初始時完全保留凍結的 LLM。
橋告訴模型怎麼看。它還沒告訴模型怎麼變得有用——怎麼回答問題、遵循指令、為自己的說法找依據。那需要資料與一個微調階段,正是下一篇的主題。