在2025年初,阿里巴巴通义实验室推出了GME(General MultiModal Embedding)系列模型,旨在解决多模态信息检索中的复杂问题。随着多媒体应用的迅猛发展,用户产生的数据类型日益多样化,不再局限于文本,还包含大量图像、音频和视频等多模态信息。传统的信息检索模型多关注单一模态,如仅对文本或图像进行分析和搜索,而GME通过统一的多模态表征模型,显著提升了信息检索的效率和精准度。
Paper: http://arxiv.org/abs/2412.16855
huggingface:
https://huggingface.co/Alibaba-NLP/gme-Qwen2-VL-2B-Instruct
https://huggingface.co/Alibaba-NLP/gme-Qwen2-VL-7B-Instruct
modelscope:
https://modelscope.cn/models/iic/gme-Qwen2-VL-2B-Instruct
https://modelscope.cn/models/iic/gme-Qwen2-VL-7B-Instruct
以下是对GME效果的详细介绍:
GME的核心技术
GME基于Qwen2-VL多模态大语言模型构建,采用对比学习的方法进行训练。每个训练样本包含一个查询、一个相关候选项及多组无关候选项,覆盖文本、图像及图文组合等多种数据类型。通过指令调优,GME能够适应不同的检索任务,比如视觉问答(VQA)等,进一步增强了模型的表征能力。具体为:
模型架构:GME基于MLLM构建,能够接受图像、文本或图像-文本对作为输入。受先前文本嵌入研究的启发,GME使用最后一个标记的最终隐藏状态作为输入的表示(或嵌入)。尽管预训练的MLLM具有强大的多模态理解能力,但其原始训练目标并未针对表示学习进行优化。因此,需要进行任务特定的微调(或对齐)以增强模型的表示能力。
对比学习:在对比学习设置中,每个训练实例包括一个查询q、一个相关候选c和一组不相关的候选{c1?,c2?,…,cK?}。为了适应各种下游检索任务,GME采用了指令调优方法,为每个检索任务添加定制的指令文本i。训练过程中,GME通过最小化相关对的余弦距离,同时最大化不相关对的余弦距离来优化模型。
硬负样本:为了提高对比学习模型的质量和多样性,GME采用了两阶段训练策略:首先使用随机选择的负候选进行初始训练,然后使用初始模型检索每个查询的前K个候选,从中选择非相关候选作为硬负样本进行进一步训练。
训练数据组成:GME的训练数据包括单模态、跨模态和融合模态数据。通过实验,研究团队发现平衡不同类型的数据可以显著提高模型在各种检索场景中的表现。
在训练数据方面,GME不仅利用了丰富的单模态和跨模态数据,还通过大模型生成技术,合成了海量的混合模态相关性数据。为了高效合成高质量的融合模态数据,研究团队采用了类似于Doc2Query的策略。
具体步骤包括:文档到查询生成、实体提取和查询重写、图像检索和生成以及数据过滤。通过这些步骤,研究团队成功合成了113.5万条高质量的融合模态训练数据,显著增强了模型的训练和性能。
统一多模态检索评测 (UMRB)
为系统评估模型在多种模态检索场景下的表现,GME作者团队构建了一个统一多模态检索评测数据集,命名为通用多模态检索基准(Universal Multimodal Retrieval Benchmark,UMRB)。
该Benchmark包含47个评测子集,覆盖广泛的多模态检索任务。这些子集主要来源于之前针对不同子场景或子任务构建的专用数据集。UMRB包括以下几类数据:
- BEIR评测集:用于文本到文本的检索场景。
- M-BEIR数据集:聚焦于视觉相关的检索场景。
- 混合模态数据集:涵盖M-BEIR未覆盖的检索任务。
- 文本到视觉文档搜索数据集(如ViDoRe):扩展评测数据的覆盖范围,确保对模型通用性的全面评估。
在UMRB评测中,GME-Qwen2-VL系列模型表现优异。2B和7B规模的GME模型均超越了此前的基线模型,验证了其在单模态、跨模态及混合模态检索任务中的有效性。
此外,GME在纯文本检索和富文本图片检索上也展现出强大的能力。在BEIR文本检索评测中,尽管多模态嵌入模型在文本任务上略逊于专门的纯文本模型,但GME在富文本图片检索(如论文PDF、财报等)中,无需经过OCR识别即可直接进行高效检索,取得了显著优势。
模型使用方法
GME模型是通义基于多模态预训练大模型构建多模态Embedding模型进行的初步探索,当前版本还有许多提升空间和技术改进方向。基于Qwen2-VL系列模型训练的General MultiModal Embedding(GME)系列模型现已在Huggingface和ModalScope平台开源。
Huggingface例代码(2B):
# You can find the script gme_inference.py in https://huggingface.co/Alibaba-NLP/gme-Qwen2-VL-2B-Instruct/blob/main/gme_inference.py
from gme_inference import GmeQwen2VL
texts = [
"What kind of car is this?",
"The Tesla Cybertruck is a battery electric pickup truck built by Tesla, Inc. since 2023."
]
images = [
'https://en.wikipedia.org/wiki/File:Tesla_Cybertruck_damaged_window.jpg',
'https://en.wikipedia.org/wiki/File:2024_Tesla_Cybertruck_Foundation_Series,_front_left_(Greenwich).jpg',
]
gme = GmeQwen2VL("Alibaba-NLP/gme-Qwen2-VL-2B-Instruct")
# Single-modal embedding
e_text = gme.get_text_embeddings(texts=texts)
e_image = gme.get_image_embeddings(images=images)
print((e_text * e_image).sum(-1))
## tensor([0.2281, 0.6001], dtype=torch.float16)
# How to set embedding instruction
e_query = gme.get_text_embeddings(texts=texts, instruction='Find an image that matches the given text.')
# If is_query=False, we always use the default instruction.
e_corpus = gme.get_image_embeddings(images=images, is_query=False)
print((e_query * e_corpus).sum(-1))
## tensor([0.2433, 0.7051], dtype=torch.float16)
# Fused-modal embedding
e_fused = gme.get_fused_embeddings(texts=texts, images=images)
print((e_fused[0] * e_fused[1]).sum())
## tensor(0.6108, dtype=torch.float16)
Modelscope例代码(7B):
# You can find the script gme_inference.py in https://modelscope.cn/models/iic/gme-Qwen2-VL-7B-Instruct/file/view/master?fileName=gme_inference.py
from gme_inference import GmeQwen2VL
texts = [
"What kind of car is this?",
"The Tesla Cybertruck is a battery electric pickup truck built by Tesla, Inc. since 2023."
]
images = [
'https://mitalinlp.oss-cn-hangzhou.aliyuncs.com/test/Tesla_Cybertruck_damaged_window.jpg',
'https://mitalinlp.oss-cn-hangzhou.aliyuncs.com/test/2024_Tesla_Cybertruck_Foundation_Series%2C_front_left_(Greenwich).jpg',
]
gme = GmeQwen2VL("gme-Qwen2-VL-7B-Instruct")
# Single-modal embedding
e_text = gme.get_text_embeddings(texts=texts)
e_image = gme.get_image_embeddings(images=images)
print((e_text * e_image).sum(-1))
## tensor([0.2281, 0.6001], dtype=torch.float16)
# How to set embedding instruction
e_query = gme.get_text_embeddings(texts=texts, instruction='Find an image that matches the given text.')
# If is_query=False, we always use the default instruction.
e_corpus = gme.get_image_embeddings(images=images, is_query=False)
print((e_query * e_corpus).sum(-1))
## tensor([0.2433, 0.7051], dtype=torch.float16)
# Fused-modal embedding
e_fused = gme.get_fused_embeddings(texts=texts, images=images)
print((e_fused[0] * e_fused[1]).sum())
## tensor(0.6108, dtype=torch.float16)
阿里云多模态Embedding模型服务
通义实验室也在阿里云百炼大模型平台上推出推理性能更佳、垂直领域检索效果更优秀的公共云多模态Embedding模型服务multimodal-embedding-v1, multimodal-embedding-v1模型服务提供文本、图片、视频三种模态的表征能力,详情参考阿里云百炼大模型服务平台模型服务。
结论
GME系列模型的推出,标志着多模态信息检索领域的一次重大突破。通过统一的多模态表征模型,GME不仅提升了信息检索的效率和精准度,还为未来的多模态应用提供了强大的技术支持。随着开源社区的不断壮大,GME有望在多模态信息处理与检索领域发挥更大的作用。
探讨
我以前用Chinese Clip进行商品比对一类的工作。效果还不错,具体参考:
北方的郎:利用Chinese Clip实现基于图片的商品识别
看GME的文档,感觉效果肯定比Clip要好。可是看了一下模型,也大了很多:
后续准备有时间评估一下费效比。