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

影像如何變成詞元

跟著一張照片走過編碼器、投影器,進入序列——每個視覺語言模型背後三段式的管線。

照片與答案之間的三個盒子

幾乎每個視覺語言模型都由串接的三個階段組成:一個觀看影像的視覺編碼器(vision encoder)、一個把它所看到的內容翻譯成語言模型那套向量詞彙的投影器(projector),以及負責推理與回覆的大型語言模型(LLM)本身。可以把它想成眼睛 → 轉接頭 → 大腦。每個盒子都可以替換,而多模態模型大部分的工程心力都花在中間那個。

盒子一:視覺編碼器

視覺編碼器是一個獨立的神經網路——通常是在龐大影像-文字資料集上訓練的視覺轉換器(vision transformer),常見的是CLIP 風格的編碼器——它的工作是把原始像素轉成一格一格豐富的特徵向量。它把影像切成一塊塊小區塊(patch,例如每塊 16×16 像素),並為每塊輸出一個向量,概括那裡有什麼:邊緣、紋理、物體、文字。一張 336×336 的影像可能變成一個例如 24×24 = 576 個區塊向量的網格。

第一個盒子——視覺編碼器:一個視覺網路把影像提煉成一格格的圖塊特徵向量。

一個視覺網路流水線,把輸入影像轉換成一組特徵向量。

為什麼用預先訓練好的編碼器,而不在語言模型內部從零學視覺?因為這便宜太多了。編碼器從它自己的訓練中早就知道貓、字型和長條圖長什麼樣;多模態這個工程只需要教語言模型如何詮釋那個編碼器的輸出,而不必教它從零開始看。

盒子二:投影器——真正的翻譯官

編碼器的向量住在它的空間裡;語言模型期待的是它自己那個詞元嵌入(token embedding)空間裡的向量。模態投影器(modality projector,也叫連接器 connector 或轉接器 adapter)就在兩者之間搭橋。最簡單的形式,它只是一個小型多層感知器(MLP),把每個區塊向量映射成語言模型嵌入大小的向量——把 576 個區塊特徵變成 576 個影像詞元,在語言模型眼中,這些詞元看起來就跟字詞嵌入一模一樣。

\mathbf{e}_i = W_2\,\mathrm{GELU}\!\left(W_1\,\mathbf{v}_i + \mathbf{b}_1\right) + \mathbf{b}_2

投影器只是一個學到的小映射(這裡是兩層 MLP),把每個編碼器圖塊向量 v_i 送進 LLM 的詞元嵌入空間。

這個小投影器幹的是吃重的外交活:它常常是最先被訓練的部分(同時凍結編碼器與語言模型),用來教兩半學會講同一種語言。有些設計在這裡加一個重取樣器(resampler),把 576 個區塊向量壓縮到例如 64 個詞元,用一點細節換取短得多的序列——這很重要,因為影像詞元很貴。

盒子三:拼接進序列

現在輪到多模態詞元化的魔法:投影後的影像詞元,就直接插進文字序列中影像該出現的位置。像「<image> 裡有什麼、為什麼?」這樣的提示,會變成「裡有什麼、為什麼?」前的字詞詞元、接著 576 個影像詞元、再接著其餘字詞詞元——成為一條扁平的序列。從這裡開始,轉換器就照它處理純文字的方式運轉;它完全不知道(也不需要知道)某些詞元其實來自像素。

第三個盒子——拼接:就像文字會變成按 id 索引的嵌入向量一樣,投影後的影像詞元被插入同一個序列。

圖示:文字被切成詞元,映射為詞元 id,再變成嵌入向量。

# Conceptual pipeline (one image + a question)
patches      = split_into_patches(image)          # e.g. 576 patches
features     = vision_encoder(patches)            # 576 vision vectors
image_tokens = projector(features)                # 576 LLM-sized vectors

text_before  = embed("What is in")
text_after   = embed("and why?")
sequence     = concat(text_before, image_tokens, text_after)

answer       = llm.generate(sequence)             # plain next-token prediction
像素進來、詞元拼接、用普通的生成輸出——不需要任何新種類的模型。

由於影像詞元在序列裡佔了真實的位置,它們會吃掉脈絡視窗(context window):一張高解析度影像可能就要花掉數百甚至數千個詞元,跟你花在一頁文字上的額度一樣多。這正是解析度處理、把大圖切片(tiling),以及壓縮詞元的重取樣器之所以是如此熱門的工程議題的原因。

把管線組起來

  1. 編碼器:像素 → 一格格區塊特徵向量(常是凍結的 CLIP 風格視覺轉換器)。
  2. 投影器:區塊向量 → 語言模型嵌入空間裡的影像詞元(最常被訓練的部分)。
  3. 拼接:把影像詞元插進文字序列裡正確的位置。
  4. 語言模型:在混合序列上跑普通的下一個詞元預測;注意力把影像與文字融合起來。