LLM2CLIP:使用大語言模型提升CLIP的文本處理,提高長文本理解和跨語言能力
在人工智能迅速發(fā)展的今天,多模態(tài)系統(tǒng)正成為推動視覺語言任務(wù)前沿發(fā)展的關(guān)鍵。CLIP(對比語言-圖像預(yù)訓(xùn)練)作為其中的典范,通過將文本和視覺表示對齊到共享的特征空間,為圖像-文本檢索、分類和分割等任務(wù)帶來了革命性突破。然而其文本編碼器的局限性使其在處理復(fù)雜長文本和多語言任務(wù)時顯得力不從心。
大型語言模型(LLM),如 GPT-4 和 LLaMA,則展示了卓越的語言理解和生成能力。這種強大的語言能力能否與 CLIP 結(jié)合,解決其文本編碼器的短板?微軟團隊提出的 LLM2CLIP 框架便是這一創(chuàng)新的成果。
該論文提出了一種創(chuàng)新的方法,通過將 LLM 強大的語言知識與 CLIP 的視覺能力相結(jié)合,顯著提升多模態(tài)任務(wù)的性能。通過整合 LLM 和 CLIP,LLM2CLIP 解決了傳統(tǒng) CLIP 在文本理解、語言支持和任務(wù)泛化方面的瓶頸。
方法創(chuàng)新
字幕對比微調(diào)(Caption Contrastive Fine-tuning)
- 核心問題:LLM 的原生文本特征缺乏區(qū)分性,難以直接用于多模態(tài)任務(wù)。
- 創(chuàng)新點:通過監(jiān)督對比損失函數(shù),將同一圖像的字幕作為正樣本,將其他字幕作為負(fù)樣本,從而顯著增強 LLM 的文本編碼能力。
凍結(jié) LLM 梯度
- 目的:保留 LLM 的開放世界知識,降低計算成本。
- 方法:僅微調(diào)適配器和投影層,實現(xiàn)多模態(tài)對齊。
高效訓(xùn)練策略
- 使用 LoRA 技術(shù)進行輕量級訓(xùn)練,在計算資源有限的情況下優(yōu)化模型性能。
- 預(yù)提取文本特征,減少推理階段的計算負(fù)擔(dān)。
開放世界知識的利用
- LLM 的廣泛訓(xùn)練語料使其能夠處理復(fù)雜字幕,甚至支持多語言任務(wù)。
LLM2CLIP 的關(guān)鍵特性
- 增強文本理解:LLM2CLIP 能夠處理超過 CLIP 原生限制的長文本和復(fù)雜描述。
- 跨語言支持:通過 LLM 的知識遷移,即使僅使用英語數(shù)據(jù)訓(xùn)練,仍可在中文等多語言任務(wù)中實現(xiàn)卓越表現(xiàn)。
- 高效計算:通過凍結(jié)梯度和輕量級適配器優(yōu)化計算開銷。
詳細改進描述
處理長字幕和復(fù)雜文本: LLM 的更大的上下文窗口和更強的語言理解能力使得 LLM2CLIP 能夠有效地處理長字幕和復(fù)雜文本,而無需像之前的工作那樣進行文本截斷或分段。
融入開放世界知識: LLM 在大規(guī)模文本語料庫上進行預(yù)訓(xùn)練,因此擁有豐富的開放世界知識。LLM2CLIP 將這些知識融入到 CLIP 的視覺表示中,從而提高了其在各種下游任務(wù)中的性能。
跨語言能力: LLM2CLIP 的跨語言能力使其成為構(gòu)建多語言多模態(tài)系統(tǒng)的強大工具,無需為每種語言單獨訓(xùn)練模型。
高效訓(xùn)練: 通過凍結(jié) LLM 的權(quán)重和預(yù)先提取文本特征,LLM2CLIP 的訓(xùn)練成本與微調(diào)原始 CLIP 模型相當(dāng)。
實驗結(jié)果
結(jié)果展示
LLM2CLIP 在多個基準(zhǔn)測試中表現(xiàn)優(yōu)異,在短文本、長文本以及跨語言任務(wù)中的性能顯著提升,尤其在中文任務(wù)中,其表現(xiàn)甚至超越了專用中文數(shù)據(jù)集訓(xùn)練的模型。
- 圖像-文本檢索 (I2T 和 T2I): 在 Flickr30k、COCO、ShareGPT4V、Urban-1k 和 DOCCI 等數(shù)據(jù)集上進行評估。
- 跨語言圖像-文本檢索: 在 Flickr30K-CN 和 COCO-CN 數(shù)據(jù)集上進行評估。
- 視覺問答 (VQA): 使用 LLaVA 1.5 框架進行評估。
- 字幕檢索準(zhǔn)確率 (CRA): 用于評估文本模型區(qū)分字幕的能力。
如何開始使用 LLM2CLIP
以下是快速上手 LLM2CLIP 的完整代碼教程:
1. 安裝依賴環(huán)境
pip install llm2vec
git clone https://github.com/microsoft/LLM2CLIP.git && cd LLM2CLIP
pip install -r requirements.txt
2. 配置 Jupyter Notebook
如果需要交互式環(huán)境:
conda install -c conda-forge --override-channels notebook
conda install -c conda-forge --override-channels ipywidgets -y jupyter notebook
3. 導(dǎo)入必要庫
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()
# 加載微調(diào)后的 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. 圖像和字幕預(yù)處理
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("匹配結(jié)果:", text_probs)
輸入圖像為上面的馬照片時,輸出為:
匹配結(jié)果: tensor([[3.425e-08, 1.0911e-06, 1.000e+00]], device='cuda:0')
這表明模型預(yù)測圖像對應(yīng)的字幕為“horses”,匹配概率為 100%。
再試一張更復(fù)雜的圖片:
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)
輸出為:
匹配結(jié)果:: tensor([[1.122e-06, 9.998e-01, 1.243e-04]], device='cuda:0')
模型可以匹配出更準(zhǔn)確的文字。
總結(jié)
LLM2CLIP 為多模態(tài)學(xué)習(xí)提供了一種新的范式,通過整合 LLM 的強大功能來增強 CLIP 模型。其在圖像-文本檢索、跨語言應(yīng)用和長文本理解方面的出色性能,突顯了其作為構(gòu)建更強大、更通用的多模態(tài)系統(tǒng)的潛力。未來的研究可以進一步探索 LLM2CLIP 在更廣泛的應(yīng)用場景中的潛力,例如視頻理解、多模態(tài)對話和具身智能。