人類學習本質上是多模態 (multi-modal) 的,因為聯合利用多種感官有助於我們更好地理解和分析新資訊。理所當然地,多模態學習的最新進展即是從這一人類學習過程的有效性中汲取靈感,建立可以利用影像、影片、文字、音訊、肢體語言、面部表情和生理訊號等各種模態資訊來處理和連結資訊的模型。
自 2021 年以來,我們看到大家對結合視覺和語言模態的模型 (也稱為聯合視覺語言模型) 的興趣越來越濃,一個例子就是 OpenAI 的 CLIP。聯合視覺語言模型在非常具有挑戰性的任務中表現出了讓人眼前一亮的能力,諸如影像標題生成、文字引導影像生成、文字引導影像操作以及視覺問答等。這個領域在不斷髮展,其零樣本泛化能力也在不斷改進,從而產生了各種實際應用。
本文,我們將介紹聯合視覺語言模型,重點關注它們的訓練方式。我們還將展示如何利用 ? Transformers 對該領域的最新進展進行實驗。
簡介
將模型稱為 “視覺語言” 模型是什麼意思?一個結合了視覺和語言模態的模型?但這到底是什麼意思呢?
有助於定義此類模型的一個特性是它們處理影像 (視覺) 和自然語言文字 (語言) 的能力。而這個過程體現在輸入、輸出以及要求這些模型執行的任務上。
以零樣本影像分類任務為例。我們將傳給模型如下一張影像和一些候選提示 (prompt),以獲得與輸入影像最匹配的提示。
小動物圖片出自: https://www.istockphoto.com/photos/dog-cat-love
為了預測類似的東西,模型需要理解輸入影像和文字提示。它將使用單獨或融合的視覺和語言編碼器來達到理解的目的。
輸入和輸出可以有多種形式。下面僅舉幾例:
- 用自然語言文字來檢索影像。
- 短語關聯 (Phrase grounding),即在輸入影像中檢測出文字中提到的短語 (例如: 一個 年輕人 揮動 球拍)。
- 視覺問答,即在輸入影像中找到自然語言問題的答案。
- 為給定影像生成標題。該任務還有一個形式就是條件文字生成,此時輸入變成了兩個,即自然語言提示和影像。
- 從包含影像和文字模態的社交媒體內容中檢測仇恨言論。
學習策略
視覺語言模型通常由 3 個關鍵元素組成: 影像編碼器、文字編碼器以及融合兩個編碼器的資訊的策略。這些關鍵元素緊密耦合在一起,因為損失函式是圍繞模型架構和學習策略設計的。雖然視覺語言模型研究算不上是一個新的研究領域,但此類模型的設計隨著時間的變遷發生了巨大變化。早期的研究採用手工設計的影像描述子、預訓練詞向量或基於頻率的 TF-IDF 特徵,而最新的研究主要採用 transformer 架構的影像和文字編碼器來單獨或聯合學習影像和文字特徵。我們使用戰略性的預訓練目標來訓練這些模型,從而使之可用於各種下游任務。
在本節中,我們將討論視覺語言模型的一些典型預訓練目標和策略,這些模型已被證明有良好的遷移效能。我們還將討論其他有趣的東西,它們要麼特定於某些預訓練目標,要麼可以用作預訓練的通用元件。
我們將在預訓練目標中涵蓋以下主題:
- 對比學習: 以對比方式將影像和文字對齊到聯合特徵空間
- PrefixLM: 透過將影像視作語言模型的字首來聯合學習影像和文字嵌入
- 基於交叉注意力的多模態融合: 將視覺資訊融合到具有交叉注意力機制的語言模型的各層中
- MLM / ITM: 使用掩碼語言建模 (Masked-Language Modeling,MLM) 和影像文字匹配 (Image-Text Matching,ITM) 目標將影像的各部分與文字對齊
- 無訓練: 透過迭代最佳化來利用獨立視覺和語言模型
請注意,本節並未詳盡陳述所有方法,還有各種其他方法以及混合策略,例如 Unified-IO。如需更全面地瞭解多模態模型,請參閱 這項工作
1) 對比學習
對比預訓練和零樣本影像分類,上圖出處: https://openai.com/blog/clip
對比學習是視覺模型常用的預訓練目標,也已被證明同時是視覺語言模型的高效預訓練目標。近期的工作如 CLIP、CLOOB、ALIGN 和 DeCLIP 在 {影像,標題} 對組成的大型資料集上,透過使用對比損失函式聯合訓練文字編碼器和影像編碼器,從而橋接視覺和語言兩個模態。對比學習旨在將輸入影像和文字對映到相同的特徵空間,使得影像 - 文字對的嵌入之間的距離在兩者匹配時最小化,而在不匹配時最大化。
CLIP 僅採用文字和影像嵌入之間的餘弦距離作為距離度量。而 ALIGN 和 DeCLIP 等模型則設計了自己的距離度量,這些距離在設計時考慮了資料集是有噪聲的。
另一項工作 LiT 引入了一種凍結影像編碼器而僅使用 CLIP 預訓練目標來微調文字編碼器的簡單方法。作者將這個想法解釋為 一種教文字編碼器更好地讀懂影像編碼器生成的影像嵌入的方法 。這種方法已被證明是有效的,並且比 CLIP 的樣本效率更高。 FLAVA 等其他工作將對比學習和其他預訓練策略相結合來對齊視覺和語言嵌入。
2) PrefixLM
PrefixLM 預訓練策略框圖, 上圖出處: https://ai.googleblog.com/2021/10/simvlm-simple-visual-language-model-pre.html
另一種訓練視覺語言模型的方法是使用 PrefixLM 目標。 SimVLM 和 VirTex 等模型使用該預訓練目標並使用一個統一的由 transformer 編碼器和 transformer 解碼器組成的多模態架構,有點類似於自迴歸語言模型。
讓我們拆解一下,看看它是如何工作的。具有字首目標的語言模型在給定輸入文字作為字首的情況下預測下一個詞。例如,給定序列 “一個男人站在牆角”,我們可以使用” 一個男人站在” 作為字首並訓練模型以預測下一個詞: 可以是 “牆角” 或另一個合理的補全詞。
Visual transformers (ViT) 透過將每個影像劃分為多個塊 (patch) 並將這些塊按順序輸入給模型,從而將相同的字首概念應用於影像。利用這個想法,SimVLM 實現了這樣一種架構,將影像塊序列和字首文字序列串接起來作為最終的字首,輸入給編碼器,然後由解碼器來預測該文字序列的接續文字。上圖描述了該思想。 SimVLM 模型首先在字首中沒有影像塊的文字資料集上進行預訓練,然後在對齊的影像文字資料集上進行預訓練。這些模型用於圖生文 / 影像標題生成和 VQA 任務。
利用統一的多模態架構將視覺資訊融合到語言模型 (Language Model,LM) 中,最終生成的模型在影像引導類任務中顯示出令人印象深刻的能力。然而,僅使用 PrefixLM 策略的模型在應用領域上可能會受到限制,因為它們主要為影像標題生成或視覺問答這兩個下游任務而設計。例如,給定一組包含人的影像,我們透過影像的描述來查詢符合描述的影像 (例如,“一群人站在一起微笑著站在建築物前”) 或使用以下視覺推理問題來查詢: “有多少人穿著紅色 T 恤?” 影像。另一方面,學習多模態表示或採用混合方法的模型可以適用於各種其他下游任務,例如目標檢測和影像分割。
凍結 PrefixLM
凍結 PrefixLM 預訓練策略, 上圖出處: https://lilianweng.github.io/posts/2022-06-09-vlm
雖然將視覺資訊融合到語言模型中非常有效,但能夠使用預訓練語言模型 (LM) 而無需微調會更有效。因此,視覺語言模型的另一個預訓練目標是學習與凍結語言模型對齊的影像嵌入。
Frozen、MAPL 和 ClipCap 使用了凍結 PrefixLM 預訓練目標。它們在訓練時僅更新影像編碼器的引數以生成影像嵌入,這些影像嵌入可以用作預訓練的凍結語言模型的字首,其方式與上面討論的 PrefixLM 目標類似。 Frozen 和 ClipCap 都在對齊的影像文字 (標題) 資料集上進行訓練,目的是在給定影像嵌入和字首文字的情況下生成標題中的下一個詞。
最後,Flamingo 索性把預訓練視覺編碼器和語言模型都凍結了,並在一系列廣泛的開放式視覺和語言任務上重新整理了少樣本學習的最高水平。 Flamingo 透過在預訓練的凍結視覺模型之上新增一個感知器重取樣器 (Perceiver Resampler) 模組並在凍結的預訓練 LM 層之間插入新的交叉注意層以根據視覺資料調節 LM 來達到這個效能。
凍結 PrefixLM 預訓練目標的一個很好的優勢是它可以使用有限的對齊影像文字資料進行訓練,這對於那些沒有對齊多模態資料集的領域特別有用。
3) 多模態融合與交叉注意力
使用交叉注意力機制將視覺資訊直接融合到語言模型中, 上圖出處: https://www.semanticscholar.org/paper/VisualGPT%3A-Data-efficient-Adaptation-of-Pretrained-Chen-Guo/616e0ed02ca024a8c1d4b86167f7486ea92a13d9
將預訓練語言模型用於多模態任務的另一種方法是使用交叉注意機制將視覺資訊直接融合到語言模型解碼器的層中,而不是使用影像作為語言模型的附加字首。 VisualGPT、VC-GPT 和 Flamingo 使用此預訓練策略並在影像標題任務和視覺問答任務上進行訓練。此類模型的主要目標是在把視覺資訊融入文字生成能力時在這兩者間取得高效的平衡,這在沒有大型多模態資料集的情況下非常重要。
VisualGPT 等模型使用視覺編碼器來生成影像嵌入,並將視覺嵌入提供給預訓練語言解碼器模組的交叉注意層,以生成合理的標題。最近的一項工作 FIBER 將具有門控機制的交叉注意力層插入到視覺和語言的主幹模型中,以實現更高效的多模態融合,並使能各種其他下游任務,如圖文互搜、開放域 (open-vocabulary) 目標檢測等。
4) 掩膜語言建模及圖文匹配
另一派視覺語言模型把掩碼語言建模 (MLM) 和圖文匹配 (ITM) 目標組合起來使用,將影像的特定部分與文字對齊,並使能各種下游任務,例如視覺問答、視覺常識推理、文搜圖以及文字引導的目標檢測。遵循這種預訓練設定的模型包括 VisualBERT、FLAVA、ViLBERT、LXMERT 和 BridgeTower。
將影像與文字按部分相應對齊, 上圖出處: https://arxiv.org/abs/1908.02265
讓我們解釋一下 MLM 和 ITM 目標。給定一個部分遮蓋的標題,MLM 的目標是根據相應的影像預測遮蓋的單詞。請注意,MLM 目標需要使用帶有邊界框的標註豐富的多模態資料集,或者使用目標檢測模型為部分輸入文字生成候選目標區域。
對於 ITM 目標,給定影像和標題對,任務是預測標題是否與影像匹配。負樣本通常是從資料集中隨機抽取的。 MLM 和 ITM 目標通常在多模態模型的預訓練期間結合使用。例如,VisualBERT 提出了一種類似 BERT 的架構,它使用預訓練的目標檢測模型 Faster-RCNN 來檢測目標。VisualBERT 在預訓練期間結合了 MLM 和 ITM 目標,透過自注意力機制隱式對齊輸入文字的元素和相應輸入影像中的區域。
另一項工作 FLAVA 由一個影像編碼器、一個文字編碼器和一個多模態編碼器組成,用於融合和對齊影像和文字表示以進行多模態推理,所有這些都基於 transformers。為了實現這一點,FLAVA 使用了多種預訓練目標: MLM、ITM,以及 掩膜影像建模 (Masked-Image Modeling,MIM) 和對比學習。
5) 無訓練
最後,各種最佳化策略旨在使用預訓練的影像和文字模型來橋接影像和文字表示,或者使預訓練的多模態模型能夠在無需額外訓練的情況下適應新的下游任務。
例如,MaGiC 提出透過預訓練的自迴歸語言模型進行迭代最佳化,為輸入影像生成標題。為此,MaGiC 使用生成的詞的 CLIP 嵌入和輸入影像的 CLIP 嵌入來計算基於 CLIP 的 “魔法分數 (magic score) ”。
用預訓練的凍結的單模態影像和文字編碼器建立一個相似性搜尋空間
ASIF 提出了一種簡單的方法,可以使用相對較小的多模態資料集將預訓練的單模態影像和文字模型轉換為多模態模型來用於影像標題生成,無需附加訓練。 ASIF 背後的關鍵直覺是相似影像的標題也彼此相似。因此,我們可以透過使用小型資料集裡的真實多模態對的來構建一個相對錶示空間,然後在該空間執行基於相似性的搜尋。
資料集
視覺語言模型通常根據預訓練目標在結構各異的大型影像和文字資料集上進行訓練。在對它們進行預訓練後,再使用特定於任務的資料集進一步針對各種下游任務進行微調。本節概述了一些用於訓練和評估視覺語言模型的流行的預訓練和下游資料集。
預訓練資料集
一般來講,我們從網上收集大量的多模態資料並將它們組織成影像 / 影片 - 文字對資料集。這些資料集中的文字資料可以是人工生成的標題、自動生成的標題、影像後設資料或簡單的目標類別標籤。此類大型資料集有 PMD 和 LAION-5B 等。 PMD 資料集結合了多個較小的資料集,例如 Flickr30K、COCO 和 Conceptual Captions 資料集。 COCO 檢測和影像標題 (>330K 影像) 資料集分別由影像例項和其所含目標的文字標籤及描述對組成。 Conceptual Captions (> 3.3M images) 和 Flickr30K (> 31K images) 資料集中的影像以及它們的對應的用自然語言描述影像的標題都是從網上爬取的。
即使是那些人工生成標題的影像文字資料集 (例如 Flickr30K) 也存在固有的噪聲,因為使用者並不總是為其影像編寫描述性或反應影像內容的標題。為了克服這個問題,LAION-5B 等資料集利用 CLIP 或其他預訓練的多模態模型來過濾噪聲資料並建立高質量的多模態資料集。此外,一些視覺語言模型,如 ALIGN,提出了進一步的預處理步驟並建立了自己的高質量資料集。還有些視覺語言資料集包含了影片和文字雙模態,例如 LSVTD 和 WebVid 資料集,雖然它們規模較小。
下游資料集
預訓練視覺語言模型通常還會針對各種下游任務進行訓練,例如視覺問答、文字引導目標檢測、文字引導影像修復、多模態分類以及各種獨立的 NLP 和計算機視覺任務。
針對問答類下游任務進行微調的模型,例如 ViLT 和 GLIP,一般使用 VQA (視覺問答) 、VQA v2、NLVR2, OKVQA, TextVQA, TextCaps 和 VizWiz 資料集。這些資料集的影像通常都配有多個開放式問題和答案。此外,VizWiz 和 TextCaps 等資料集也可用於影像分割和目標定位這些下游任務。其他一些有趣的多模態下游資料集有,用於多模態分類的 Hateful Memes,用於視覺蘊含預測的 SNLI-VE,以及用於視覺語言組合推理的 Winoground。
請注意,視覺語言模型也可用於各種經典的 NLP 和計算機視覺任務,例如文字或影像分類。此時,通常使用單模態資料集如 SST2,ImageNet-1k 來完成此類下游任務。此外,COCO 和 Conceptual Captions 等資料集也常用於預訓練模型以及標題生成等下游任務。
在 ? Transformers 中支援視覺語言模型
使用 Hugging Face Transformers,你可以輕鬆下載、執行和微調各種預訓練視覺語言模型,或者混合搭配預訓練視覺模型和預訓練語言模型來搭建你自己的模型。 ? Transformers 支援的一些視覺語言模型有:
- CLIP
- FLAVA
- GIT
- BridgeTower
- GroupViT
- BLIP
- OWL-ViT
- CLIPSeg
- X-CLIP
- VisualBERT
- ViLT
- LiT (
VisionTextDualEncoder
的一個例項) - TrOCR (
VisionEncoderDecoderModel
的一個例項) VisionTextDualEncoder
VisionEncoderDecoderModel
這裡 CLIP、FLAVA、BridgeTower、BLIP、LiT 和 VisionEncoderDecoder 等模型會生成聯合影像 - 文字嵌入,可用之於零樣本影像分類等下游任務,而其他模型則針對有趣的下游任務進行訓練。此外,FLAVA 是基於單模態和多模態兩個預訓練目標訓練的,因此可用於單模態視覺或語言任務以及多模態任務。
例如,OWL-ViT 使能 了零樣本 - 文字引導目標檢測和單樣本 - 影像引導目標檢測任務,CLIPSeg 和 GroupViT 使能 了文字和影像引導的影像分割任務,VisualBERT、GIT 和 ViLT 使能 了視覺問答以及其他各種任務。 X-CLIP 是一種使用影片和文字模態進行訓練的多模態模型,它能夠 使能 類似於 CLIP 的零樣本影像分類的影片分類任務。
與其他模型不同,VisionEncoderDecoderModel
是一個標準化的模型,可用於初始化任意影像轉文字模型,這類模型可以使用任何預訓練的基於 Transformer 的視覺模型作為編碼器 (例如 ViT、BEiT、DeiT、Swin) 以及任何預訓練的語言模型作為解碼器 (例如 RoBERTa、GPT2、BERT、DistilBERT)。事實上,TrOCR 是這個標準類的一個例項。
讓我們繼續試驗其中的一些模型。我們將使用 ViLT 進行視覺問答,使用 CLIPSeg 進行零樣本影像分割。首先,我們要安裝 ?Transformers: pip install transformers
。
基於 ViLT 的 VQA
讓我們從 ViLT 開始,下載一個在 VQA 資料集上預訓練的模型。我們可以簡單地初始化相應的模型類然後呼叫 “from_pretrained ()” 方法來下載想要的 checkpoint。
from transformers import ViltProcessor, ViltForQuestionAnswering
model = ViltForQuestionAnswering.from_pretrained ("dandelin/vilt-b32-finetuned-vqa")
接下來,我們隨便下載一張有兩隻貓的影像,並對該影像和我們的查詢問題進行預處理,將它們轉換為模型期望的輸入格式。為此,我們可以方便地使用相應的前處理器類 (ViltProcessor
) 並使用相應 checkpoint 的預處理配置對其進行初始化。
import requests
from PIL import Image
processor = ViltProcessor.from_pretrained ("dandelin/vilt-b32-finetuned-vqa")
# download an input image
url = "http://images.cocodataset.org/val2017/000000039769.jpg"
image = Image.open (requests.get (url, stream=True).raw)
text = "How many cats are there?"
# prepare inputs
inputs = processor (image, text, return_tensors="pt")
最後,我們可以使用預處理後的影像和問題作為輸入進行推理,並列印出預測答案。但是,要牢記的重要一點是確保你的文字輸入與訓練時所用的問題模板相似。你可以參考 論文和資料集 來了解如何生成這些問題。
import torch
# forward pass
with torch.no_grad ():
outputs = model (**inputs)
logits = outputs.logits
idx = logits.argmax (-1).item ()
print ("Predicted answer:", model.config.id2label [idx])
直截了當,對吧?讓我們用 CLIPSeg 做另一個演示,看看我們如何用幾行程式碼執行零樣本影像分割。
使用 CLIPSeg 做零樣本影像分割
我們將從初始化 CLIPSegForImageSegmentation
及其相應的預處理類開始,並載入我們的預訓練模型。
from transformers import CLIPSegProcessor, CLIPSegForImageSegmentation
processor = CLIPSegProcessor.from_pretrained ("CIDAS/clipseg-rd64-refined")
model = CLIPSegForImageSegmentation.from_pretrained ("CIDAS/clipseg-rd64-refined")
接下來,我們將使用相同的輸入影像,並用描述待分割目標的文字來查詢模型。與其他前處理器類似,CLIPSegProcessor
將輸入轉換為模型期望的格式。由於我們要分割多個目標,我們分別對每個描述文字都使用相同的輸入影像。
from PIL import Image
import requests
url = "http://images.cocodataset.org/val2017/000000039769.jpg"
image = Image.open (requests.get (url, stream=True).raw)
texts = ["a cat", "a remote", "a blanket"]
inputs = processor (text=texts, images=[image] * len (texts), padding=True, return_tensors="pt")
與 ViLT 類似,重要的是要參考 原作,看看他們用什麼樣的文字提示來訓練模型,以便在推理時獲得最佳效能。雖然 CLIPSeg 在簡單的物件描述 (例如 “汽車”) 上進行訓練的,但其 CLIP 主幹是在設計好的文字模板 (例如 “汽車影像”、“汽車照片”) 上預訓練的,並在隨後的訓練中凍結。輸入經過預處理後,我們可以執行推理以獲得每個文字查詢的二值分割圖。
import torch
with torch.no_grad ():
outputs = model (**inputs)
logits = outputs.logits
print (logits.shape)
>>> torch.Size ([3, 352, 352])
讓我們視覺化一下結果,看看 CLIPSeg 的表現如何 (程式碼改編自 這篇文章)
import matplotlib.pyplot as plt
logits = logits.unsqueeze (1)
_, ax = plt.subplots (1, len (texts) + 1, figsize=(3*(len (texts) + 1), 12))
[a.axis ('off') for a in ax.flatten ()]
ax [0].imshow (image)
[ax [i+1].imshow (torch.sigmoid (logits [i][0])) for i in range (len (texts))];
[ax [i+1].text (0, -15, prompt) for i, prompt in enumerate (texts)]
太棒了,不是嗎?
視覺語言模型支援大量有用且有趣的用例,並不僅限於 VQA 和零樣本分割。我們鼓勵你嘗試將本節中提到的模型用於不同的應用。有關示例程式碼,請參閱模型的相應文件。
新興研究領域
伴隨著視覺語言模型的巨大進步,我們看到了新的下游任務和應用領域的出現,例如醫學和機器人技術。例如,視覺語言模型越來越多地被用於醫療,產生了諸如 Clinical-BERT 之類的工作來根據放射照片來進行醫學診斷和報告生成,以及 MedFuseNet 來用於醫學領域的視覺問答。
我們還看到大量將聯合視覺語言表示應用於各種領域的工作,如用於影像處理 (例如,StyleCLIP、StyleMC,DiffusionCLIP)、基於文字的影片檢索 (例如,X-CLIP) 、基於文字的操作 (例如,Text2Live 以及 基於文字的 3D 形狀和紋理操作 (例如,AvatarCLIP,CLIP-NeRF, Latent3D, CLIPFace, Text2Mesh)。在類似的工作中,MVT 提出了一種聯合 3D 場景 - 文字表示模型,可用於各種下游任務,例如 3D 場景補全。
雖然機器人研究尚未大規模利用視覺語言模型,但我們看到 CLIPort 等工作利用聯合視覺語言表示進行端到端模仿學習,並宣稱比之前的 SOTA 有了很大的改進。我們還看到,大型語言模型越來越多地被用於機器人任務,例如常識推理、導航和任務規劃。例如,ProgPrompt 提出了一個使用大語言模型 (Large Language Model,LLM) 生成情境機器人任務計劃的框架。同樣,SayCan 使用 LLM 根據給定的環境及環境中物體的視覺描述,選擇最合理的動作。儘管這些進展令人印象深刻,但由於目標檢測資料集的限制,機器人研究仍然侷限在有限的環境和目標集中。隨著 OWL-ViT 和 GLIP 等開放集目標檢測模型的出現,我們可以期待多模態模型與機器人導航、推理、操作和任務規劃框架的整合會更緊密。
結論
近年來,多模態模型取得了令人難以置信的進步,視覺語言模型在效能、用例以及應用的多樣性方面取得了顯著的飛躍。在這篇文章中,我們討論了視覺語言模型的最新進展,可用的多模態資料集以及我們可以使用哪些預訓練策略來訓練和微調此類模型。我們還展示瞭如何將這些模型整合到 ? Transformers 中,以及如何使用它們透過幾行程式碼來執行各種任務。
我們將繼續整合最具影響力的計算機視覺和多模態模型,並希望收到你的迴音。要了解多模態研究的最新訊息,歡迎在 Twitter 上關注我們: @adirik,@NielsRogge,@apsdehal,@a_e_roberts,@RisingSayak 和 @huggingface。
致謝: 我們感謝 Amanpreet Singh 和 Amy Roberts 的嚴格審查。此外,還要感謝 Niels Rogge、Younes Belkada 和 Suraj Patil,以及 Hugging Face 的許多其他人,他們為促進基於 Transformers 的多模態模型的使用奠定了基礎。
英文原文: <url> https://huggingface.co/blog/v... </url>
作者: Alara Dirik, Sayak Paul
譯者: Matrix Yao (姚偉峰),英特爾深度學習工程師,工作方向為 transformer-family 模型在各模態資料上的應用及大規模模型的訓練推理。
審校、排版: zhongdongy (阿東)