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

給語言模型一雙眼睛:多模態大型語言模型

看看把視覺編碼器接到強大語言模型上,如何造出能看、能推理、能對話、能依視覺指令行動的通用助手。

轉變:從專用模型到通用助手

本軌跡前面的每一篇,都是「一個任務、一個專用模型」。我們訓練一個模型做圖說、一個 視覺問答 頭去回答問題、一個 grounding 模型去指向像素。每一個都在自己的狹窄工作上表現出色,但離開那個工作就毫無用處。前沿研究想彌平這道鴻溝,懷抱著不同的企圖心:一個模型就能寫圖說、回答問題、一步步推理、為自己的說法提供 grounding 證據、進行對話,並遵循從未見過的自由形式指令。我們不再為每個任務打造新架構,而是為一個強大的預訓練語言「大腦」裝上眼睛,讓它自行類推泛化。這就是 多模態大型語言模型(MLLM),也是更廣義的 視覺語言模型 家族中最通用的成員。

幾乎每一個 MLLM 都遵循同一個三段式配方,看懂之後你會在每一篇論文裡認出它。第一,預訓練視覺編碼器扮演眼睛——很常就是你在第 2 篇認識的 CLIP 影像編碼器,因為它的特徵早已落在一個與語言對齊過的空間裡。第二,預訓練大型語言模型(LLM)扮演大腦:它承載了文法、世界知識,以及推理與對話的能力,全都從海量文字中學來。第三,也就是設計抉擇發生的地方,一座橋樑(bridge)把兩者連起來,讓眼睛看見的東西能流進大腦的推理裡。眼睛和大腦通常是現成借來的;真正有趣的工程,在那座橋。

主流的橋樑有兩種風格,接下來兩節會正面比較它們。第一種是交叉注意力橋接(Flamingo 配方):把 LLM 凍結,插入新的注意力層,讓文字 token 能伸手去讀影像——正是你在第 3 篇學過的跨模態注意力,如今被接進一個巨大的 LLM。第二種是token 投影橋接(LLaVA 配方),做法簡單到幾乎令人吃驚:把影像特徵轉成幾個看起來像詞嵌入的向量,直接和文字一起餵進去,讓 LLM 既有的自注意力包辦全部的融合。目標相同,哲學有二——是要「加裝新機件」,還是「重用既有機件」。

Flamingo:把影像嵌入凍結的語言模型

給 LLM 裝眼睛時,最核心的擔憂是:用影像資料重新訓練它,可能會破壞你當初看上它的那份語言能力——這個現象叫「災難性遺忘(catastrophic forgetting)」,新的訓練把舊技能覆蓋掉。Flamingo 用一條嚴格的規則解決它:把大 LLM 完全凍結。它的權重永不改動,所有得來不易的文法、知識與推理都原封不動地保留。視覺只透過全新的、可訓練的層引入,這些層插在 LLM 既有的 transformer 區塊之間。凍結的骨幹提供智慧;少量新增的層學會把圖片餵給它。

先有個實務問題:視覺編碼器會依影像解析度、影片有幾個畫格,吐出不同數量的特徵向量,而 LLM 想要的是整齊、固定大小的輸入。Flamingo 的答案是 Perceiver Resampler,一個小型注意力模組:它接收長度不定的一堆影像特徵,外加固定數量的「可學習查詢向量」(例如 64 個),讓這些查詢對特徵做注意力,把它們摘要起來。無論輸入多大,它永遠吐出同一組少量的視覺 token——就像不管原文是一段還是一整本書,你都寫成一份 64 字的摘要。這讓計算量可控,也給交叉注意力層一個穩定、精簡的對象去讀。

橋樑本身重用了第 3 篇的 跨模態注意力:文字隱藏狀態當查詢(query),視覺 token 當鍵(key)與值(value),於是每一段文字都能查找影像中相關的部分。關鍵在於,Flamingo 接受圖文交錯的序列——像「文字、影像、文字、影像、文字」這樣在單一串流裡。每一段文字會對最近、在它前面的那張影像做注意力。光是這個設計抉擇,就解鎖了帶影像的少樣本情境學習(in-context learning):你可以先給兩三個示範(影像+期望答案),再給一張全新影像,凍結的 LLM 就會接續這個模式,全程不需任何梯度更新——正是文字 LLM 出名的那個情境學習招式,如今提示裡帶著圖片。

一個 transformer 區塊。Flamingo 把這些區塊凍結,並在它們之間插入新的「閘控交叉注意力」層,讓視覺資訊進入,卻不擾動原本的語言堆疊。

一個 transformer 區塊的示意圖,顯示自注意力與前饋層,以及殘差連接與層正規化。

y \;\leftarrow\; y \;+\; \tanh(\alpha)\cdot \mathrm{CrossAttn}\big(y_{\text{text}},\, x_{\text{visual}}\big)

每一個新增 Flamingo 層內部的「閘控交叉注意力」殘差更新。

我們來拆解它,因為那個小小的 \tanh(\alpha) 因子正是整個訣竅。y 是 LLM 的隱藏狀態——文字通過區塊時那個不斷更新的向量表示。\mathrm{CrossAttn}(y_{\text{text}}, x_{\text{visual}}) 是視覺交叉注意力的輸出:文字 y_{\text{text}} 形成查詢,對視覺 token x_{\text{visual}} 做注意力,回傳一個向量,意思是「這裡是與這段文字相關的影像內容」。這個更新是殘差式的——我們把那份視覺貢獻加回y 上,而不是取代它。重點來了:\alpha 是單一的可學習純量閘,初始值設為 0。因為 \tanh(0)=0,一開始整個新增項都被乘以零而消失,於是 y \leftarrow y + 0 = y。這個新層是完美的「無作用(no-op)」,模型表現得完全像那個未被動過、凍結的 LLM。隨著訓練進行,梯度下降緩緩把 \alpha 推離零;\tanh(\alpha) 平滑地朝 \pm 1 增長,每一步都把視覺多融入一點點。

LLaVA:簡單而強大的投影配方

LLaVA(Large Language and Vision Assistant)問了一個美妙又「偷懶」的問題:如果我們完全不加任何新的注意力層呢?Flamingo 的閘控交叉注意力確實有效,但那是要額外設計、安插、訓練的機件。LLaVA 賭的是:LLM*自己*的自注意力本來就是一台通用的融合引擎,所以只要我們能讓影像資訊「看起來像文字」,LLM 就會免費地把它融合進去。正是這份極簡,讓 LLaVA 成為主流的開源配方:訓練便宜(常常幾顆 GPU、數小時就好)、實作極簡、而且任何視覺編碼器或任何 LLM 都能輕鬆替換進去。你今天遇到的大多數開源 MLLM,都是 LLaVA 風格。

配方就三招。拿凍結的 CLIP 影像編碼器,把影像跑過它,得到一個特徵向量的格點(每個影像 patch 一個)。把這個格點送過一個小小的投影(projection)——就只是單一線性層,後來的版本則是一個小型的兩層 MLP——它唯一的工作,是把每個特徵向量映射到 LLM 的詞嵌入空間。輸出稱為視覺 token:與真正的詞嵌入處於同一座標系統的向量。最後,只要把這些視覺 token 前置(prepend)到文字 token 嵌入的序列前面,整串當成一個長句餵給 LLM。任何地方都沒有加交叉注意力。LLM 的自注意力於是自然地讓每個文字 token 都能對每個視覺 token 做注意力——它把影像 patch 當成坐在提示最前面的額外詞語。

LLaVA 的橋樑就只是一個小型 MLP(或單一線性層)。它把每個 CLIP 特徵向量映射到 LLM 的詞嵌入空間——整座視覺語言連接器,就是這一個樸素的區塊。

一個多層感知器的示意圖:輸入向量經過一到兩個全連接層與一個非線性,輸出一個向量。

H_v \;=\; W \cdot Z_v \qquad (\text{or } H_v = \mathrm{MLP}(Z_v))

位於 LLaVA 核心的視覺 token 投影。

逐符號讀:Z_v 是從凍結 CLIP 編碼器吐出的影像特徵向量格點——把它想成一疊向量,比如 576 個,每個 patch 一個,各自描述該 patch 在 CLIP 視覺空間裡長什麼樣。W可訓練的投影矩陣(線性版;MLP 版則把兩個這樣的映射、中間夾一個非線性疊起來),而它是對齊階段裡唯一被學習的部分。H_v = W \cdot Z_v 是結果:向量數量不變,但每一個都被搬進了 LLM 的詞嵌入空間——正是 LLM 預期它的輸入 token 所在的空間。具體來說,若 CLIP 給的是 1024 維特徵、LLM 用 4096 維嵌入,那 W 就是一個 4096 \times 1024 的矩陣,每一個 H_v 的欄都是一個 4096 維向量,LLM 能把它當成詞語來讀。正因 H_v 落在那個共享空間,LLM 的尋常自注意力就能用它本來算詞對詞注意力的同一套查詢—鍵機件,去計算視覺 token 與文字 token 之間的相容度。這就是為什麼不需要特別的融合層:把視覺放進詞嵌入空間,等於把視覺語言融合,變成在一條稍長序列上做的普通自注意力。

  1. 階段一——對齊(特徵預訓練):把 CLIP 編碼器與 LLM 凍結,只用大量圖文對訓練投影 W。唯一目標是教 W 把視覺 token 放到 LLM 能理解的位置——它學會從 CLIP 空間到詞空間的「翻譯」,過程中不擾動任何一個預訓練網路。
  2. 階段二——視覺指令微調:此時解凍 LLM(並繼續訓練投影),在(影像、指令、回應)的對話資料上微調,讓模型真正學會當一個有用的助手——能對話、能推理、能遵循任意的視覺要求。這第二階段正是下一節的主題。

視覺指令微調:教它變得有用

對齊之後,模型已能融合視覺與語言,但它還不是個有用的助手——它知道影像與文字相關,卻從沒被示範過「一個好的、有幫助的、對話式的回答」長什麼樣。視覺指令微調 正是彌平這道鴻溝的步驟。這個想法借自文字 LLM:在那裡,指令微調把單純的「預測下個字」的模型,變成了會遵循要求的聊天機器人。這裡我們把圖片也納入這個迴圈:我們在大量(影像、指令、回應)範例上,微調組裝好的「編碼器+ LLaVA 式 LLM」,讓它學會「看、想、然後有幫助地回答」這個行為——不只是一個固定任務,而是「使用者問什麼關於這張圖的事,就做什麼」這個開放式技能。

  1. 從已有豐富文字標註的影像出發——人寫的圖說,加上帶標籤的物件邊界框(正是第 4 篇那種 grounding 資料)。它們提供了「每張圖裡實際有什麼」的忠實、文字化描述。
  2. 把那些圖說與邊界框(當成文字,不給真正的像素)餵給一個強大的純文字 LLM,提示它去「扮演」一段對話:讓它發想使用者可能會問的自然問題、寫出詳細的回答,甚至產出一步步的推理——全都以提供的描述為依據。
  3. 把成果組裝成(影像、指令、回應)三元組——常是多輪對話,混合簡短的事實問答、詳細描述,以及「推理」對話。LLaVA 正是這樣用一個文字 LLM 當資料產生器,廉價地引導出一個大型指令資料集。
  4. 在這些對話上微調完整的多模態模型。此時真正的影像給模型看,而它必須產出文字 LLM 寫的那個回應——學會把「它所看見的」連到一個有幫助、結構良好的答案。
指令微調的訓練迴圈:餵入(影像、指令),生成回應,與目標答案比較,然後更新——但損失只在回應 token 上計算。

一個機器學習訓練迴圈示意圖:資料餵入模型,預測與目標比較以算出損失,梯度更新模型,如此反覆。

\mathcal{L} \;=\; -\sum_{t}\, \log p_{\theta}\big(y_t \,\mid\, \text{image},\; \text{instruction},\; y_{<t}\big)

自迴歸指令微調損失,只在回應 token 上加總。

這就是標準的語言模型目標,調整成以影像為條件。逐符號看:y_t目標回應(我們希望模型產出的那個有幫助的答案)的第 t 個 token。y_{<t} 是位置 t 之前所有的回應 token——也就是「目前為止寫好的答案」。p_{\theta}(y_t \mid \text{image}, \text{instruction}, y_{<t}) 是模型(參數為 \theta)對「正確的下一個 token」所賦予的機率,同時以三件事為條件:影像、使用者的指令、以及已寫好的部分答案。-\log p_\theta(\cdot) 這個式子是負對數似然(等同於交叉熵):當模型有信心地預測對 token 時它很小,被「驚到」時它很大,所以最小化它,會推動模型把真正的答案變得更可能。加總跑遍 t,也就是每個回應 token 一項,把它們加起來為整個答案評分。訓練時我們用teacher forcing:不餵模型它自己(可能出錯)的猜測,而是在每一步餵入真實的前文 y_{<t},這讓學習穩定,也讓每個位置能平行訓練。直覺很單純:在把圖片與問題都放在眼前的同時,學會一次一個 token 地接續那個有幫助的答案。

用像素提示:實際操作多模態大型語言模型

手上有了一個經過指令微調的 MLLM,你究竟要怎麼驅動它?從它身上問出好答案的這門技藝,叫做 視覺提示(visual prompting),它涵蓋一整個光譜。最簡單的一端,是不帶影像的純文字提示(模型仍表現得像個普通 LLM)。加上一張圖,你就得到了主力的圖加文模式:「這是一張照片——它哪裡不尋常?」再往下就更豐富了:多影像輸入讓你能要模型比較兩張圖、或讀一段序列;指向(pointing)set-of-marks 提示讓你能在空間上引導它的注意力;而思維鏈(chain-of-thought)提示則要模型把推理說出聲,並引用它所看到的東西。

其中兩種值得細看,因為它們能大幅提升可靠度。Set-of-marks 提示的意思是:你在送出影像之前,真的在圖上畫上編號的方框或點——在物件上疊「1、2、3」——然後用這些編號來措辭你的問題:「物件 2 在物件 3 的左邊嗎?」這給了模型明確無歧義的視覺錨點,繞開它出了名不穩的空間語言。指向(pointing)則是反過來:你(或模型)指涉一個特定座標或區域,把詞語綁到一個確切的位置。兩者都把含糊的「圖裡某處」的推理,變成具體、可查核的東西。

# Driving an MLLM: a few common visual-prompting patterns.

# 1) Image + text (the workhorse)
chat = [
    {"role": "user", "content": [
        {"type": "image", "image": photo},
        {"type": "text",  "text": "What is unusual about this scene?"},
    ]},
]

# 2) Set-of-marks: pre-annotate the image, then refer to the marks
marked = draw_numbered_boxes(photo, boxes)   # overlay 1,2,3 on objects
chat = [
    {"role": "user", "content": [
        {"type": "image", "image": marked},
        {"type": "text",  "text": "Is object 2 closer to the camera than object 3? "
                                   "Reason step by step, then answer."},
    ]},
]

# 3) Multi-image comparison
chat = [
    {"role": "user", "content": [
        {"type": "image", "image": before},
        {"type": "image", "image": after},
        {"type": "text",  "text": "What changed between the first and second image?"},
    ]},
]

# 4) Grounded chain-of-thought: force the answer to cite visual evidence
prompt = (
    "Answer the question. For each claim, name the object or region you used "
    "as evidence (e.g. 'the red sign, top-left'). Then give the final answer."
)
提示 MLLM 的常見做法,從單純的圖加文,一路到帶 grounding 的思維鏈。
  1. 把任務與你想要的格式講清楚(「用一個詞回答」「逐步條列」「輸出 JSON」)。MLLM 很會遵循指令,所以格式跑掉通常是提示的問題,不是模型的極限。
  2. 若問題涉及空間或計數,先加上視覺結構:裁切到關注區域,或用 set-of-marks,讓模型針對有標籤的錨點推理,而非生硬的幾何。
  3. 要求帶有「引用視覺證據」的思維鏈(「是哪個區域讓你這樣判斷?」)。這既能提升難題的準確度,也讓答案可被稽核。
  4. 對任何你必須信任的結果,用 grounding 把迴圈收尾:讓模型回傳它所引用物件的邊界框,再拿這些框去對照影像(或另一個獨立偵測器)查核。

這最後一步,正是整條軌跡扣合起來的地方。第 4 篇的 視覺 grounding 不是你拋在身後的另一個工具——它是助手的驗證層。MLLM 能流暢地斷言「這裡有三隻貓」,但一個流暢的句子不是證據。若你改而要它為每個說法提供 grounding——「把你數到的每隻貓的框回傳給我」——你就能查核那些框、自己數一遍、抓出那隻被幻想出來的貓。Grounding 把一個「聽起來很有信心」的答案,轉成一個「可查核」的答案,而這正是「展示品」與「能上線部署的系統」之間的差別。

前沿:幻覺、評估與誠實

若以全然的凱旋來收尾本軌跡,那是不誠實的,所以讓我們精確地講清楚 MLLM 至今仍會出什麼錯。它們會幻覺(hallucinate):一個看過數千張廚房照的模型,可能很有信心地報出這張圖裡根本沒有的「水槽」或「湯匙」,只因它的語言先驗預期會有。它們在精確的空間推理與計數上很弱——「有幾張椅子?」或「杯子在盤子左邊嗎?」絆倒它們的程度,遠超過單純說出物件名稱,因為視覺 token 攜帶的是粗略、摘要過的位置資訊。它們對措辭很敏感:把問題換句話說、甚至只是把選擇題的選項字母換個順序,都可能讓答案翻盤。又因為它們是由預訓練視覺編碼器與預訓練 LLM 組成的,所以繼承了兩者的偏誤——網路文字裡烘焙進去的刻板印象,以及影像資料所描繪內容的偏斜。

誠實地衡量進展,本身就是一個難題。這個領域倚賴基準測試——視覺問答 準確率、圖說分數、以及大批探測式問題——但每一種都有陷阱。資料外洩(leakage)很猖獗:若基準的影像或近似重複品溜進了訓練資料,高分反映的可能是死背、而非理解。可被鑽空子的格式更糟:一個選擇題基準,有時純文字模型不看圖也能拿高分,因為光憑先驗與措辭就能猜中正確選項——這是每個認真的評估都該跑的、發人深省的檢查。而彙總準確率會掩蓋模型在哪裡失敗;單一數字無法告訴你它對顏色沒問題、對計數卻一籌莫展。教訓是:把基準數字當成薄弱的證據,永遠去探測「盲圖基線」與外洩,並在你自己保留的、帶 grounding 的例子上測試。

擴大規模有幫助——更大的視覺編碼器、更大的 LLM、更多高品質指令資料,會穩定地改善 MLLM——但光靠擴大規模並不能抹除幻覺或計數錯誤,這也是為什麼架構與 grounding 仍然重要。

擴展定律曲線,顯示模型損失隨著模型大小、資料與算力增加而可預測地下降。

誠實的部署需要的不只是準確率:可解釋性與 grounding 讓我們能檢視一個答案究竟倚靠了哪些視覺證據,好在使用者之前就抓出「自信卻錯誤」的回覆。

一張可解釋性的示意圖:探測模型內部的證據與注意力,以解釋它為何產出某個輸出。

這要往哪去,我們又從哪來?前進的方向很清楚:擴大規模——編碼器、LLM,尤其是 視覺指令微調 資料的品質與多樣性;以及把同一個三段式配方從靜止影像延伸到影片(一連串畫格,Perceiver 式的重採樣其實早已為此鋪路)與語音,朝真正的「任意模態到任意模態」助手前進。退一步看,整條軌跡的弧線是一個乾淨的故事。我們從教模型在共享空間裡對齊圖片與文字開始(CLIP,第 2 篇)。我們學會用跨模態注意力融合這兩種模態(第 3 篇)。我們讓語言把自己grounding到特定像素上,使說法變得可查核(第 4 篇)。最後,我們為一個強大的大腦裝上眼睛,並用指令微調把它調教成一個能看、能推理、能對話、能遵循視覺指令的通用助手(本篇)。對齊 → 融合 → grounding → 助手。仍未解決的,正是那誠實的部分:幻覺、可靠的空間與數值推理、跨文化的公平行為,以及我們真正能信任的評估。那些開放問題,正是下一世代的工作——或許是你的工作——開始的地方。