🚀 LLM2CLIP: 通過大語言模型拓展CLIP的能力邊界
LLM2CLIP是一種新穎的方法,藉助大語言模型(LLMs)的強大能力,挖掘CLIP的潛力。通過在字幕空間中使用對比學習對LLM進行微調,將其文本能力融入輸出嵌入中,顯著提高了輸出層的文本區分能力。該方法還設計了高效的訓練過程,讓微調後的LLM作為CLIP視覺編碼器的強大導師,突破了傳統CLIP文本編碼器在上下文窗口和能力上的限制,在跨模態任務中取得顯著提升。
🚀 快速開始
在本文中,我們提出了LLM2CLIP,這是一種利用大語言模型(LLMs)的力量來挖掘CLIP潛力的新方法。通過在字幕空間中使用對比學習對LLM進行微調,我們將其文本能力提取到輸出嵌入中,顯著提高了輸出層的文本區分能力。然後,我們設計了一個高效的訓練過程,其中微調後的LLM作為CLIP視覺編碼器的強大導師。由於有了LLM,我們現在可以納入更長、更復雜的字幕,而不受原始CLIP文本編碼器的上下文窗口和能力限制。我們的實驗表明,這種方法在跨模態任務中帶來了顯著的改進。我們的方法直接將之前的SOTA EVA02模型在長文本和短文本檢索任務上的性能提高了16.5%,將僅在英語數據上訓練的CLIP模型轉變為最先進的跨語言模型。此外,當與Llava 1.5等模型集成到多模態訓練中時,它在幾乎所有基準測試中都始終優於CLIP,展示了全面的性能提升。
⚠️ 重要提示
論文中呈現的所有結果均使用PyTorch權重進行評估。使用Hugging Face (hf) 模型時,性能可能會有所不同。
✨ 主要特性
- 通過微調大語言模型,提升CLIP輸出層的文本區分能力。
- 突破原始CLIP文本編碼器的上下文窗口和能力限制,可納入更長、更復雜的字幕。
- 在跨模態任務中顯著提升性能,如將EVA02模型在長文本和短文本檢索任務上的性能提高16.5%。
- 可將僅在英語數據上訓練的CLIP模型轉變為先進的跨語言模型。
- 在與Llava 1.5等模型集成的多模態訓練中,全面優於CLIP。
📚 詳細文檔
模型信息
屬性 |
詳情 |
模型類型 |
視覺基礎模型,特徵骨幹網絡 |
預訓練數據集 |
CC3M、CC12M、YFCC15M和Recap - DataComp - 1B(30M子集) |
作者信息
Weiquan Huang1*、Aoqi Wu1*、Yifan Yang2†、Xufang Luo2、Yuqing Yang2、Liang Hu1、Qi Dai2、Xiyang Dai2、Dongdong Chen2、Chong Luo2、Lili Qiu2
1同濟大學,2微軟公司
*同等貢獻
† 通訊作者郵箱:yifanyang@microsoft.com
相關鏈接
💻 使用示例
基礎用法
圖像嵌入
from PIL import Image
from transformers import AutoModel
from transformers import CLIPImageProcessor
import torch
image_path = "CLIP.png"
model_name_or_path = "LLM2CLIP-Openai-B-16"
processor = CLIPImageProcessor.from_pretrained("openai/clip-vit-base-patch16")
model = AutoModel.from_pretrained(
model_name_or_path,
torch_dtype=torch.float16,
trust_remote_code=True).to('cuda').eval()
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():
outputs = model.get_image_features(input_pixels)
高級用法
檢索
import os
os.environ["CUDA_VISIBLE_DEVICES"] = "0"
from PIL import Image
import torch
from llm2vec import LLM2Vec
from transformers import AutoModel, AutoConfig, AutoTokenizer
from transformers import CLIPImageProcessor
processor = CLIPImageProcessor.from_pretrained("openai/clip-vit-base-patch16")
model_name_or_path = "microsoft/LLM2CLIP-Openai-B-16"
model = AutoModel.from_pretrained(
model_name_or_path,
torch_dtype=torch.bfloat16,
trust_remote_code=True).to('cuda').eval()
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, torch_dtype=torch.bfloat16, config=config, trust_remote_code=True)
tokenizer = AutoTokenizer.from_pretrained(llm_model_name)
llm_model.config._name_or_path = 'meta-llama/Meta-Llama-3-8B-Instruct'
l2v = LLM2Vec(llm_model, tokenizer, pooling_mode="mean", max_length=512, doc_max_length=512)
captions = ["a diagram", "a dog", "a cat"]
image_path = "CLIP.png"
image = Image.open(image_path)
input_pixels = processor(images=image, return_tensors="pt").pixel_values.to('cuda')
text_features = l2v.encode(captions, convert_to_tensor=True).to('cuda')
with torch.no_grad(), torch.cuda.amp.autocast():
image_features = model.get_image_features(input_pixels)
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)
📄 許可證
本項目採用Apache-2.0許可證。
📖 BibTeX引用
@misc{huang2024llm2clippowerfullanguagemodel,
title={LLM2CLIP: Powerful Language Model Unlock Richer Visual Representation},
author={Weiquan Huang and Aoqi Wu and Yifan Yang and Xufang Luo and Yuqing Yang and Liang Hu and Qi Dai and Xiyang Dai and Dongdong Chen and Chong Luo and Lili Qiu},
year={2024},
eprint={2411.04997},
archivePrefix={arXiv},
primaryClass={cs.CV},
url={https://arxiv.org/abs/2411.04997},
}