1. 視覺多模態簡介
視覺多模態一般涵蓋2個要點:視覺表徵 以及 視覺與自然語言的對齊(Visual Language Alignment)或融合。
1.1. 視覺表徵
視覺表徵是指:將影像資訊轉化為深度學習模型可以處理的特徵向量或向量序列的過程。具體來說,它包含以下2點:
- 合理建模視覺輸入特徵:這是指透過卷積神經網路(CNN)或Vision Transformer(VIT)等方法來提取影像中的關鍵特徵
- 透過預訓練手段進行充分學習表徵:這意味著利用大規模資料集進行無監督或弱監督的訓練,使模型能夠學習到通用的視覺特徵。預訓練階段通常使用大量的標註或未標註影像,讓模型學習到廣泛適用的特徵表示。
這兩點是完成基於視覺的任務的基礎。從視覺表展的技術發展來說,有兩個主要階段:卷積神經網路和Vision Transformer(ViT)。兩者都有各自的視覺表徵方式、與訓練以及多模態對齊過程。目前CNN已不再是主流,所以下面也不再介紹CNN,而是會介紹ViT。
1.2. Visual Language Alignment
視覺與自然語言的對齊(Visual Language Alignment,VLA)在多模態學習中,指的是將視覺資訊(例如影像)和語言資訊(例如文字)進行有效結合的過程。這種對齊的目標是希望讓模型能夠理解和生成與影像內容相關的文字描述,或者根據文字描述檢索和識別影像中的內容。
更具體的來說,就是希望將視覺表徵和自然語言表徵建模到同一個表徵空間,使得它們相互理解並融合,實現兩者的互通。這個過程也稱模態對齊,透過模型訓練完成。
模態對齊是處理多模態問題的基礎,也是目前流行的多模態大模型基礎。在下文中,我們統一使用“多模態對齊”來表示VLA。
2. Vision Transformer
Vision Transformer(ViT)模型於2021年在《An Image is Worth 16*16 Words: Transformers for Image Recognition at Scale》中首次提出。ViT的微調程式碼和預訓練模型可在Google Research的GitHub上獲取。這些ViT模型在ImageNet和ImageNet-21k資料集上進行預訓練。
ViT廣泛應用於流行的影像識別任務,如目標檢測、影像分割、影像分類和動作識別。此外,ViT還被應用於生成式建模和多模態任務,包括視覺定位、視覺問答以及視覺推理。
在ViT中,影像被表示為序列,模型透過預測影像的類別標籤來學習影像的結構特徵。輸入影像被視為一組小塊(patches),每個小塊(patch)透過將其畫素的通道扁平化為一個向量,然後線性對映到所需的輸入維度。
下面逐步解析Vision Transformer的架構:
- 將影像分割為小塊(分割成小塊的原因是減少attention的計算量,如果使用原始畫素點作為基本單元,則計算量太大)
- 扁平化(Flatten)這些小塊
- 對扁平化的小塊生成低維線性嵌入
- 新增位置嵌入
- 將序列輸入到標準Transformer Encoder
- 使用影像標籤在大規模資料集上對模型進行預訓練(完全監督學習)
- 在下游資料集上進行微調以完成影像分類任
過程如下圖所示:
影像塊在ViT中相當於序列中的標記(類似於單詞)。編碼器塊的結構與Vaswani等人(2017年)提出的原始Transformer完全相同。
在ViT Encoder中包含多個block,每個block由以下三個主要處理單元組成:
- 層歸一化(Layer Norm)
- 多頭注意力網路(Multi-head Attention Network, MSP)
- 多層感知機(Multi-Layer Perceptrons, MLP)
這幾個元件其實和原始Transformer Encoder中的結構基本一致。最後CLS token對應的輸出表徵,再輸入到MLP+softmax即可用於生成分類標籤(以影像分類任務為例)。之前若是有對Transformer的結構有過了解,是可以非常容易理解ViT的架構。本質上是圖片切割成小塊後,充當了文字token的角色,其中位置編碼的概念也和原始Encoder一致。
ViT 在計算機視覺(CV)任務中的有效性得到了驗證,削弱了卷積神經網路(CNN)在 CV 領域的主導地位。同時,ViT的出現也為開發視覺模型提供了重要基礎。在後續由 Google 在2021年推出的視覺模型的 ViT-MoE,擁有 150 億個引數,在當時的 ImageNet分類中也是創下了新紀錄。ViT這種Transformer 的架構需要大量的資料才能實現高準確率,這也是它成功的秘訣。如果在資料較少的情況下,CNN 通常比 Transformer 表現更好。因此,後續的一大研究方向就是如何更加有效的對ViT結構的網路進行預訓練,例如MAE(Masked AutoEncoder)和BEIT(BERT Pre-Training of Image Transformers)。
3. 多模態對齊
在瞭解了視覺表徵以及代表模型後,我們再看看多模態對齊方法。多模態對齊涉及將不同來源和型別的資料(例如影像、文字、音訊等)結合起來,以便模型可以從多個角度理解資料。下面我們以CLIP為例,介紹如何做圖片和文字模態的對齊。
4. CLIP
在多模態對齊中,CLIP(Contrastive Language-Image Pre-training)是OpenAI推出的一種多模態對齊方法。它是一種結合了影像和文字的嵌入式模型,使用4億張影像和文字對,以自監督的方式進行訓練的來。也就是說,它可以將文字和影像對映到同一個嵌入空間。舉個例子來說,對於一張包含小狗的圖片,以及文字“一張狗的圖片”,這兩個物件在投射到同一個向量空間後,它們倆的距離時非常相近的。在這個基礎之上,便可以衍生出各種多模態的應用,例如使用自然語言描述搜尋圖片。
除了本身訓練的任務之外,CLIP 可以用於許多它未經過訓練的任務。例如,在 ImageNet 等基準測試資料集上,它展示了非常好的zero-shot learning能力。CLIP 並未顯式地在ImageNet其中 128 萬個訓練樣本上進行訓練。但是,CLIP 的準確率與原始的 ResNet-50(在該資料上訓練的模型)基本一致。
那如何用 CLIP 進行影像分類?以 ImageNet 為例,假設它有 1000 個可能的類別或物件。可以透過 CLIP 使用提示語 “a photo of a {object}”(例如 “a photo of a dog” 或 “a photo of a cat”)對每個類別進行嵌入,得到這個類別的embedding。而後我們就得到了 1000 個對應於所有可能類別的embedding。接著,取你想要分類的影像,例如一張狗的照片,並用 CLIP 對該影像進行嵌入得到圖片的embedding。最後,將影像嵌入與所有文字嵌入計算點積。由於 CLIP 的訓練方式是使影像和文字共享相同的嵌入空間,而點積計算嵌入之間的相似性,因此“a photo of a dog”的點積結果很可能是最高的。因此可以預測這張影像是狗。
需要注意的是,如果希望將 CLIP 轉變為一個真正的分類器,則可以將點積結果透過 softmax 函式,從而得到每個類別的預測機率。
上述過程可以在下圖的第 2 和第 3 步中看到:
4.1. CLIP模型結構
CLIP模型有2個主要模組,text encoder和image encoder,Text encoder部分使用的是transformer。對於image encoder,作者嘗試了2個不同的模型,ResNet-50和ViT,發現使用ViT訓練速度更快(text encoder和image encoder均未複用預訓練過的引數):
“最大的 ResNet 模型 RN50x64 使用 592 個 V100 GPU 訓練了 18 天,而最大的 Vision Transformer 使用 256 個 V100 GPU 訓練了 12 天”
4.2. 訓練
作者最初是嘗試訓練一個生成圖片描述的模型,給定一張圖片,預測它的準確的標題或描述。初始方法類似於 VirTex,從零開始聯合訓練一個影像 CNN 和一個文字 Transformer 來預測影像的標題。但是隨後發現這種方法在擴充套件到大規模資料時遇到了效率問題。他們發現這種方法無法有效地擴充套件到訓練 4 億對(影像-文字)資料集,因此他們選擇了一種對比表示學習(contrastive representation learning)方法。
4.2.1. 對比表示學習
對比表示學習(Contrastive Representation Learning)是一種自監督學習方法,其核心思想是透過比較資料樣本之間的相似性或差異性來驅動模型學習良好的特徵或表徵。這種方法的目標是確保相似的資料樣本在特徵空間中彼此接近,而不相似的資料樣本彼此遠離。當模型在這種任務上表現良好時,它已經學會了區分資料的關鍵特徵,這種特徵表徵為後續的監督學習任務(如分類、迴歸等)可以提供有利的起點。
對比表示學習的基本框架一般包括以下幾個關鍵元件:
- 資料增強:透過對原始資料樣本進行變換,生成正樣本對。
- 正負樣本構建:正樣本通常透過對原資料樣本進行資料增強得到,而負樣本通常是從資料集中隨機選取的,它們不與當前的正樣本對有直接關聯。
- 網路結構:設計神經網路以學習區分正負樣本的特徵表示。
- 損失函式(Loss Function):使用特定的損失函式來最佳化模型,使得正樣本的表示更接近,負樣本的表示更遠離。
在標準的對比表示學習方法中,模型接受的樣本形式為(anchor,positive,negative)。anchor表示來自某一個類別的圖片(例如一隻狗的圖片),positive是同一個類別的另一張圖片(例如也是狗),negative表示來自其他類別的圖片(例如一隻鳥的圖片)。隨後對這些圖片進行嵌入,並訓練模型達成以下目標:最小化同一個類別embedding之間的距離,即minimize distance(anchor, positive);同時最大化不同類別embedding之間的距離,即maximize distance(anchor, negative)。這種方法鼓勵模型對相同類別的物件輸出非常相似的嵌入,而對不同類別的物件輸出差異較大的嵌入。
Fig. A visualization of contrastive learning[4]
同樣的方法可以應用於文字以及影像和文字的組合。例如,在 CLIP 的單個訓練樣本中,anchor 可以是狗的影像,positive可以是文字標題“狗的影像”,而 negative 可以是文字標題“鳥的影像”。
CLIP 更進一步地推廣了這一方法,使用了一種多類別 N 對損失函式(multi-class N-pair loss),這是上述方法的擴充套件,適用於每個 anchor 有多個 positive 和 negative 的情況。具體地說:
給定一個包含 N 對(影像,文字)樣本的批次,CLIP 在訓練時預測批次中 N × N 個可能的(影像,文字)配對中哪些是真實的。為此,CLIP 聯合訓練image encoder和text encoder,學習出一個多模態嵌入空間,以最大化批次中 N 對真實配對的image embedding和text embedding的餘弦相似度,同時最小化 N² − N 個錯誤配對的embedding餘弦相似度。然後透過這些相似度分數最佳化對稱交叉熵損失。
論文中提供的虛擬碼很好地總結了這一核心細節:
# image_encoder - ResNet or Vision Transformer # text_encoder - CBOW or Text Transformer # I[n, h, w, c] - minibatch of aligned images # T[n, l] - minibatch of aligned texts # W_i[d_i, d_e] - learned proj of image to embed # W_t[d_t, d_e] - learned proj of text to embed # t - learned temperature parameter # extract feature representations of each modality I_f = image_encoder(I) #[n, d_i] T_f = text_encoder(T) #[n, d_t] # joint multimodal embedding [n, d_e] I_e = l2_normalize(np.dot(I_f, W_i), axis=1) T_e = l2_normalize(np.dot(T_f, W_t), axis=1) # scaled pairwise cosine similarities [n, n] logits = np.dot(I_e, T_e.T) * np.exp(t) # symmetric loss function labels = np.arange(n) loss_i = cross_entropy_loss(logits, labels, axis=0) loss_t = cross_entropy_loss(logits, labels, axis=1) loss = (loss_i + loss_t)/2
步驟包括:
- 使用image encoder對影像進行嵌入,並使用text encoder對文字進行嵌入。
- 由於影像和文字的嵌入來自不同的模型,維度可能不同,需要透過一個可學習的投影矩陣將它們投影到相同的聯合多模態嵌入空間。例如,np.dot(I_f, W_i)將大小為 [n, d_i] 的矩陣與大小為 [d_i, d_e] 的矩陣相乘,結果是一個大小為 [n, d_e] 的投影矩陣。
- 對新的嵌入向量進行歸一化,將它們轉化為單位向量。
- 計算點積矩陣。
- 對每一行和每一列計算交叉熵損失,併除以 2,因為每對樣本會被計算兩次
4.3. Prompt Engineer
由於 CLIP 的文字編碼器是一個 Transformer 模型,作者發現Prompt Engineer(PE)對獲得良好的Zero-shot效能也非常關鍵。在其預訓練資料集中,文字與影像配對的情況中,單個詞語(例如,“dog” 作為類別標籤)相對較少見,更常見的是文字為完整的句子,例如影像的標題或描述。因此,作者發現使用提示語 “a photo of a {object}” 是一個不錯的預設選擇,但在某些特定情況下,更專門化的提示語效果更佳。例如,對於衛星影像,作者發現使用 “a satellite photo of a {object}” 效果更好。
4.4. Limitation
儘管論文中進行了許多實驗並展示了相應結果,但也需要指出,CLIP 並非完美,存在一些侷限性:
- 非生成模型:CLIP從設計上來看,並不是生成模型,因此無法實現例如影像字幕生成這樣的任務
- 效能與泛化能力不足: 作者指出,CLIP 仍遠未達到最先進水平(僅能與在 ResNet 頂層加線性層的模型相媲美)。對於某些任務,它的泛化能力非常差。例如,在簡單的 MNIST 手寫數字識別資料集上,CLIP 的準確率僅為 88%。這可能是因為訓練集中缺乏類似影像,但 CLIP 對此問題幾乎沒有改進。
- 文字長度限制: Transformer text encoder的最大序列長度(即可以傳遞的最大 token 數)在原始實現中被限制為 76。因為資料集主要是影像和標題,通常是較短的句子。因此,使用現成的預訓練模型處理較長文字時效果不佳,超過 76 個 token 的文字會被截斷,而訓練時的文字也主要是短文字。
4.5. 後續相關研究
CLIP 可以應用於多種場景,尤其是在語義搜尋類的應用中。例如,我們可以透過描述影像的文字在資料庫中檢索影像。CLIP 的想法及其替代方案也成為了自此以來許多多模態模型的構建基礎。例如,在 Flamingo 這種視覺語言模型中,它可以同時處理一系列文字和影像並生成文字。
5. Flamingo視覺語言模型
前面介紹中也提到,CLIP並非是一種生成式模型,它提出了一種圖片和文字模態對齊的方法,將圖片與文字投射到同一個嵌入空間內,使得它們可以相互比較。這裡要介紹的Flamingo模型一個視覺語言模型,是早期多模態生成式模型中一個比較有代表性的模型。
Flamingo 於 2022 年在論文《Flamingo: a Visual Language Model for Few-Shot Learning》中首次提出。這是一種多模態語言模型(實際上是不同規模模型的一個家族,其中 Flamingo 是size最大的一種)。它的多模態特性意味著它可以接收多種模態的輸入,同時像語言模型一樣生成文字。
如論文中所示,Flamingo 能夠在給定一些示例的情況下,透過文字和影像進行生成式推理(few-shot learning),如下圖所示:
上圖中最後一個例子也給出了Flamingo如何和影片結合的例子。影片可以分割為幀(以1 FPS取樣),然後作為序列傳入給模型。
除此之外,Flamingo也能做基於多張圖片的對話:
以及QA:
5.1. 模型架構
前面也提到,Flamingo是生成式模型,所以它也是一個標準的自迴歸模式,基於前面的輸入序列,預測下一個token。
Flamingo模型的輸入是交替排列的視覺/文字資料。影像會從文字中抽取出來,並用一個通用標記(例如 `<image>`)替換。隨後,這些資料傳遞到普通的語言模型block中。同時,影像會單獨透過視覺編碼器模型處理,轉換為固定大小的嵌入向量。然後,這些嵌入向量透過一種cross-attention機制進行“關注”。如下圖所示:
Flamingo 模型利用了兩個互為補充的預訓練且凍結的模型:一個能夠“感知”視覺場景的視覺模型,以及一個執行基本推理的大型語言模型(LM)。在這些模型之間新增了新的架構元件進行連線它們,同時保留它們在預訓練過程中積累的知識。
在Vision Encoder部分,模型使用的視覺編碼器與CLIP模型非常相似。視覺編碼器與文字編碼器一起訓練,使用這兩個編碼器,將影像和文字對映到同一個向量空間,並進行L2歸一化處理。訓練過程類似於CLIP,也採用了對比表示學習以及multi-class N-pair loss。不同的是,CLIP使用的是ViT,Flamingo使用的是Normalizer-Free Resnet。在預訓練完成後,視覺編碼器的模型引數便凍結,後續不再進行更新。
在Vision Encoder輸出後,我們可以看到一個Perceiver Resampler元件,它是由Perceiver衍生而來。Perceiver Resampler的作用就是:接收可變數量的視覺特徵,並將它們轉換為固定數量的token輸出。然後視覺特徵會與文字特徵在多個LM block中進行“融合”,簡單地說,“融合”的方式就是用文字特徵作為Q,視覺特徵作為K和V,然後透過cross attention的方式進行“融合”,這種“融合”可以直觀的理解為:在語言模型內關注視覺部分的輸入。後續結構也和Transformer Decoder結構基本一致,在輸出時透過前饋網路+softmax的方進行分類,然後取樣輸出下一個token。
Flamingo的文字模型使用Chinchilla,是谷歌釋出的對標GPT-3的語言模型,並提供了1.4B、7B、和70B版本,分別對應Flamingo-3B、Flamingo-9B和Flamingo-80B。
5.2. Perceiver
Perceiver的推出的一個重要原因是為了解決原始transformer模型無法處理場序列的瓶頸。在transformer架構中,由於self-attention的複雜度是O(S2),所以若是序列非常長,則會產生大量的計算量,特別是在嘗試將Transformer的結構用於視覺資料時。在描述一張圖片所需要的畫素數量是遠遠超過一段文字所需的token數量的。前面介紹的ViT是透過將影像分割為多個塊從而減少序列的長度,這種方法雖然減少了計算量,但其缺點是對輸入資料做了假設,從而會導致歸納偏差。
2021年提出的Perceiver的通用架構,便是一種替代方案,可以用來處理各種模態的資料,並能擴充套件至處理數十萬級別的輸入,是多模態處理裡一個重要的里程碑。
(值得一提的事,在解決長序列的計算複雜性的問題上,目前也有一些新的方法,例如Mistral 7B裡使用的滑動視窗注意力機制。滑動視窗注意力機制的核心思想是將輸入特徵(如影像或文字)劃分為多個區域性視窗,每個視窗內的特徵計算注意力權重,並在這些視窗間進行滑動,逐步覆蓋整個輸入的所有特徵。這種方法可以減少計算量,並保持區域性依賴性,同時避免了全域性注意力機制中的高計算複雜度問題。)
下圖是Perceiver的架構:
在Perceiver模型中,K和V是從輸入序列(稱為byte array,例如一幅影像)的投影得到的(Q、K以及後面的V本質上都是引數矩陣,概念來源於Attention機制)。這個輸入序列的長度M非常大(例如對於224x224大小的ImageNet影像來說已超過50,000),直接將它輸入到Transformer中會帶來巨大的計算開銷。因此,他們使用了一個固定大小的latent array(潛陣列),其大小為N(N遠小於M,比如512)。查詢矩陣Q則是從這個latent array進行投影得到的。Perceiver採用了一種交叉注意力機制,利用這個latent array來關注byte array中的token。這種機制與原始Transformer Decoder類似,其複雜度隨byte array大小線性增長,即O(NM)。接下來,可以對latent array應用標準的Transformer流程,包括對latent array執行自注意力操作,其複雜度為O(N²)。這樣整體的複雜度就變成了O(NM) + O(N²),其中N遠小於M。重要的是,由於N較小,這使得可以在大規模資料上構建包含許多Transformer層的大規模網路成為可能,如果複雜度為O(M²)的話這是不可行的。這種使用潛在空間的方法是在其他模型如Stable Diffusion中常見的計算技巧。
5.3. Limitation
Flamingo作為一個語言類生成式模型,也具有語言類生成式模型中常見的問題,如幻覺、輸出攻擊性語言、傳播社會偏見和刻板印象,以及洩露私人資訊。它能夠處理視覺輸入的能力也帶來了特定的風險,例如與輸入影像內容相關的性別和種族歧視。下圖是原文中展示的一個例子:
6. 總結
本文介紹了視覺多模態的基本概念,例如視覺表徵 以及 視覺與自然語言對齊(VLA)兩個主要要素。視覺表徵涉及透過卷積神經網路(CNN)或Vision Transformer(ViT)等方法提取影像特徵,並透過預訓練使模型學習通用視覺特徵。
在視覺與自然語言對齊方面,以CLIP為例,介紹瞭如何利用對比表示學習方法將影像和文字對映到同一嵌入空間中,實現跨模態的相似性匹配。CLIP展示了良好的zero shot learning能力,但存在一些侷限性,如非生成模型、效能限制以及文字長度限制。
在視覺多模態理解以及文字生成方面,介紹的Flamingo是一個早期非常有代表性的視覺語言模型,它結合了視覺編碼器和語言模型,能夠處理多種模態輸入並生成文字。不過,Flamingo同樣面臨生成式模型常見的挑戰,如幻覺、偏見等問題。
References
[1] 一文看完多模態,從視覺表徵到多模態大模型:https://zhuanlan.zhihu.com/p/684472814
[2] Vision Transformer: What It Is & How It Works:https://www.v7labs.com/blog/vision-transformer-guide
[3] Understanding OpenAI’s CLIP model: https://medium.com/@paluchasz/understanding-openais-clip-model-6b52bade3fa3
[4] The Beginner’s Guide to Contrastive Learning: https://www.v7labs.com/blog/contrastive-learning-guide
[5] Understanding DeepMind’s Flamingo Visual Language Models: https://medium.com/@paluchasz/understanding-flamingo-visual-language-models-bea5eeb05268
[6] Flamingo: a Visual Language Model for Few-Shot Learning: https://arxiv.org/abs/2204.14198