LLM2CLIP:使用大語言模型提升CLIP的文本處理,提高長文本理解和跨語言能力
在人工智能迅速發展的今天,多模態系統正成為推動視覺語言任務前沿發展的關鍵。CLIP(對比語言-圖像預訓練)作為其中的典范,通過將文本和視覺表示對齊到共享的特征空間,為圖像-文本檢索、分類和分割等任務帶來了革命性突破。然而其文本編碼器的局限性使其在處理復雜長文本和多語言任務時顯得力不從心。
大型語言模型(LLM),如 GPT-4 和 LLaMA,則展示了卓越的語言理解和生成能力。這種強大的語言能力能否與 CLIP 結合,解決其文本編碼器的短板?微軟團隊提出的 LLM2CLIP 框架便是這一創新的成果。
該論文提出了一種創新的方法,通過將 LLM 強大的語言知識與 CLIP 的視覺能力相結合,顯著提升多模態任務的性能。通過整合 LLM 和 CLIP,LLM2CLIP 解決了傳統 CLIP 在文本理解、語言支持和任務泛化方面的瓶頸。
方法創新
字幕對比微調(Caption Contrastive Fine-tuning)
- 核心問題:LLM 的原生文本特征缺乏區分性,難以直接用于多模態任務。
- 創新點:通過監督對比損失函數,將同一圖像的字幕作為正樣本,將其他字幕作為負樣本,從而顯著增強 LLM 的文本編碼能力。
凍結 LLM 梯度
- 目的:保留 LLM 的開放世界知識,降低計算成本。
- 方法:僅微調適配器和投影層,實現多模態對齊。
高效訓練策略
- 使用 LoRA 技術進行輕量級訓練,在計算資源有限的情況下優化模型性能。
- 預提取文本特征,減少推理階段的計算負擔。
開放世界知識的利用
- LLM 的廣泛訓練語料使其能夠處理復雜字幕,甚至支持多語言任務。
LLM2CLIP 的關鍵特性
- 增強文本理解:LLM2CLIP 能夠處理超過 CLIP 原生限制的長文本和復雜描述。
- 跨語言支持:通過 LLM 的知識遷移,即使僅使用英語數據訓練,仍可在中文等多語言任務中實現卓越表現。
- 高效計算:通過凍結梯度和輕量級適配器優化計算開銷。
詳細改進描述
處理長字幕和復雜文本: LLM 的更大的上下文窗口和更強的語言理解能力使得 LLM2CLIP 能夠有效地處理長字幕和復雜文本,而無需像之前的工作那樣進行文本截斷或分段。
融入開放世界知識: LLM 在大規模文本語料庫上進行預訓練,因此擁有豐富的開放世界知識。LLM2CLIP 將這些知識融入到 CLIP 的視覺表示中,從而提高了其在各種下游任務中的性能。
跨語言能力: LLM2CLIP 的跨語言能力使其成為構建多語言多模態系統的強大工具,無需為每種語言單獨訓練模型。
高效訓練: 通過凍結 LLM 的權重和預先提取文本特征,LLM2CLIP 的訓練成本與微調原始 CLIP 模型相當。
實驗結果
結果展示
LLM2CLIP 在多個基準測試中表現優異,在短文本、長文本以及跨語言任務中的性能顯著提升,尤其在中文任務中,其表現甚至超越了專用中文數據集訓練的模型。
- 圖像-文本檢索 (I2T 和 T2I): 在 Flickr30k、COCO、ShareGPT4V、Urban-1k 和 DOCCI 等數據集上進行評估。
- 跨語言圖像-文本檢索: 在 Flickr30K-CN 和 COCO-CN 數據集上進行評估。
- 視覺問答 (VQA): 使用 LLaVA 1.5 框架進行評估。
- 字幕檢索準確率 (CRA): 用于評估文本模型區分字幕的能力。
如何開始使用 LLM2CLIP
以下是快速上手 LLM2CLIP 的完整代碼教程:
1. 安裝依賴環境
pip install llm2vec
git clone https://github.com/microsoft/LLM2CLIP.git && cd LLM2CLIP
pip install -r requirements.txt
2. 配置 Jupyter Notebook
如果需要交互式環境:
conda install -c conda-forge --override-channels notebook
conda install -c conda-forge --override-channels ipywidgets -y jupyter notebook
3. 導入必要庫
from PIL import Image
from transformers import AutoModel, AutoConfig, AutoTokenizer
from transformers import CLIPImageProcessor
import torch
from llm2vec import LLM2Vec
4. 加載模型
# 圖像處理器
processor = CLIPImageProcessor.from_pretrained("openai/clip-vit-large-patch14-336")
# 加載 CLIP 模型
model_name_or_path = "microsoft/LLM2CLIP-Openai-L-14-336"
model = AutoModel.from_pretrained(
model_name_or_path,
torch_dtype=torch.float16,
trust_remote_code=True
).to('cuda').eval()
# 加載微調后的 LLM 模型
llm_model_name = 'microsoft/LLM2CLIP-Llama-3-8B-Instruct-CC-Finetuned'
config = AutoConfig.from_pretrained(llm_model_name, trust_remote_code=True)
llm_model = AutoModel.from_pretrained(llm_model_name, config=config, trust_remote_code=True)
tokenizer = AutoTokenizer.from_pretrained(llm_model_name)
# 初始化 LLM2Vec
l2v = LLM2Vec(llm_model, tokenizer, pooling_mode="mean", max_length=512, doc_max_length=512)
5. 圖像和字幕預處理
captions = ["a diagram", "a dog", "horses"]
image_path = "path_to_image/horses.png"
image = Image.open(image_path)
input_pixels = processor(images=image, return_tensors="pt").pixel_values.to('cuda')
6. 提取特征并匹配字幕
with torch.no_grad(), torch.cuda.amp.autocast():
image_features = model.get_image_features(input_pixels)
text_features = l2v.encode(captions, convert_to_tensor=True).to('cuda')
text_features = model.get_text_features(text_features)
# 歸一化特征
image_features /= image_features.norm(dim=-1, keepdim=True)
text_features /= text_features.norm(dim=-1, keepdim=True)
# 計算匹配概率
text_probs = (100.0 * image_features @ text_features.T).softmax(dim=-1)
print("匹配結果:", text_probs)
輸入圖像為上面的馬照片時,輸出為:
匹配結果: tensor([[3.425e-08, 1.0911e-06, 1.000e+00]], device='cuda:0')
這表明模型預測圖像對應的字幕為“horses”,匹配概率為 100%。
再試一張更復雜的圖片:
captions = ["a sunset over a mountain range", "a group of people hiking on a trail", "a peaceful lake surrounded by trees"]
image_path = "hiking_trail.jpg"
image = Image.open(image_path)
input_pixels = processor(images=image, return_tensors="pt").pixel_values.to('cuda')
with torch.no_grad(), torch.cuda.amp.autocast():
image_features = model.get_image_features(input_pixels)
text_features = l2v.encode(captions, convert_to_tensor=True).to('cuda')
text_features = model.get_text_features(text_features)
image_features /= image_features.norm(dim=-1, keepdim=True)
text_features /= text_features.norm(dim=-1, keepdim=True)
text_probs = (100.0 * image_features @ text_features.T).softmax(dim=-1)
print("Label probs:", text_probs)
輸出為:
匹配結果:: tensor([[1.122e-06, 9.998e-01, 1.243e-04]], device='cuda:0')
模型可以匹配出更準確的文字。
總結
LLM2CLIP 為多模態學習提供了一種新的范式,通過整合 LLM 的強大功能來增強 CLIP 模型。其在圖像-文本檢索、跨語言應用和長文本理解方面的出色性能,突顯了其作為構建更強大、更通用的多模態系統的潛力。未來的研究可以進一步探索 LLM2CLIP 在更廣泛的應用場景中的潛力,例如視頻理解、多模態對話和具身智能。