多模态嵌入优化框架与单模态训练策略
E5-V框架通过调整多模态大型语言模型,有效实现多模态嵌入,提高不同输入之间的连接能力,即便不进行微调。其提出的单模态训练方法,仅训练文本对,表现超过多模态训练。
E5-V是一种基于多模态大语言模型(MLLMs)的通用嵌入框架,重点在于有效地跨越不同输入类型之间的模态差异。这个模型是通过在lmms-lab/llama3-llava-next-8b基础上微调得来的,展现了即使在不进行进一步微调的情况下,在多模态嵌入中依然能达到卓越的性能。
E5-V的主要创新之一在于它所提出的单一模态训练方法。在这种方法中,模型仅在文本对上进行训练。结果显示,这种单一模态训练方法相比于传统的多模态训练方法能够提供更好的性能表现。
在实际应用中,E5-V被设计为能够处理文本与图像两种不同类型的输入,并能有效生成相应的嵌入。这种能力使得E5-V在涉及不同模态融合的任务中有着广泛的应用前景。
通过一个简单的Python代码示例,可以展示E5-V处理图像和文本输入的过程:
import torch import torch.nn.functional as F import requests from PIL import Image from transformers import AutoTokenizer from transformers import LlavaNextProcessor, LlavaNextForConditionalGeneration llama3_template = '<|start_header_id|>user<|end_header_id|>\n\n{}<|eot_id|><|start_header_id|>assistant<|end_header_id|>\n\n \n' processor = LlavaNextProcessor.from_pretrained('royokong/e5-v') model = LlavaNextForConditionalGeneration.from_pretrained('royokong/e5-v', torch_dtype=torch.float16).cuda() img_prompt = llama3_template.format('<image>\nSummary above image in one word: ') text_prompt = llama3_template.format('<sent>\nSummary above sentence in one word: ') urls = ['https://upload.wikimedia.org/wikipedia/commons/thumb/4/47/American_Eskimo_Dog.jpg/360px-American_Eskimo_Dog.jpg', 'https://upload.wikimedia.org/wikipedia/commons/thumb/b/b6/Felis_catus-cat_on_snow.jpg/179px-Felis_catus-cat_on_snow.jpg'] images = [Image.open(requests.get(url, stream=True).raw) for url in urls] texts = ['A dog sitting in the grass.', 'A cat standing in the snow.'] text_inputs = processor([text_prompt.replace('<sent>', text) for text in texts], return_tensors="pt", padding=True).to('cuda') img_inputs = processor([img_prompt]*len(images), images, return_tensors="pt", padding=True).to('cuda') with torch.no_grad(): text_embs = model(**text_inputs, output_hidden_states=True, return_dict=True).hidden_states[-1][:, -1, :] img_embs = model(**img_inputs, output_hidden_states=True, return_dict=True).hidden_states[-1][:, -1, :] text_embs = F.normalize(text_embs, dim=-1) img_embs = F.normalize(img_embs, dim=-1) print(text_embs @ img_embs.t())
更多的细节和技术说明可以通过E5-V的GitHub页面找到。在这个页面上,感兴趣的读者可以深入了解模型的构建和训练方法,以及如何在实际项目中应用这个多模态嵌入框架。