文本向量化模型acge_text_embedding

1.背景
文本向量化模型是自然语言处理(NLP)中的一项核心技术,它可以将单词、句子或图像特征等高维的离散数据转换为低维的连续向量,从而将文本数据转换为计算机能够处理的数值型向量形式。当文本信息被转换为向量形式后,输出的结果能够进一步地为多种后续任务提供有力支持,例如:搜索、聚类、推荐、分类等。
在主体框架上,acge_text_embedding模型主要运用了俄罗斯套娃表征学习(Matryoshka Representation Learning,以下简称MRL)这一灵活的表示学习框架。类似于俄罗斯套娃结构,MRL 产生的嵌入向量也是一个嵌套结构,其旨在创建一个嵌套的、多粒度的表示向量,每个较小的向量都是较大向量的一部分,并且可以独立用于不同的任务。在训练时,MRL根据指定维度[64,128,...,2048,3072]的向量来计算多个loss。使得用户在推理时,可以根据自己的实际需求,输入维度参数,来得到指定维度的向量。
MRL的优化问题可以表示为

这种方法的核心思想是学习不同粒度的信息,允许一个嵌入向量在保持准确性和丰富性的同时,适应不同计算资源的需求,并可以无缝地适应大多数表示学习框架,并且可以扩展到多种标准计算机视觉和自然语言处理任务。
运用MRL技术,实现一次训练,获取不同维度的表征,acge模型实现了从粗到细的层次化表示,从而提供了一种在推理和部署时不需要额外成本的灵活表示。另外,具体实践上,为做好不同任务的针对性学习,acge模型使用策略学习训练方式,显著提升了检索、聚类、排序等任务上的性能;引入持续学习训练方式,克服了神经网络存在灾难性遗忘的问题,使模型训练迭代能够达到相对优秀的收敛空间。
2.特点
acge模型是一个通用的文本编码模型,是一个可变长度的向量化模型,来自于合合信息技术团队,对外技术试用平台TextIn。其有以下几个特点:
Token:acge模型支持最大1024 tokens,可以满足大多数场景的分词需求;
模型大小:0.65GB,模型较小,占用资源少,又便于部署和维护;
分类任务性能: acge的平均准确率(Average)为69.07%,在所有模型中排名最高;
向量维度:模型输入文本长度为1024,可以有效的输入更丰富的信息。
acge模型较小,占用资源少,聚类分数也比较高,支持在不同场景下构建通用分类模型、提升长文档信息抽取精度,且应用成本相对较低,可帮助大模型在多个行业中快速创造价值,推动科技创新和产业升级,为构建新质生产力提供强有力的技术支持。
3.使用
acge模型提供了预训练好的模型供试用与性能复现,首先安装sentence_transformers依赖:
pip install --upgrade sentence_transformers
安装完成后

from sentence_transformers import SentenceTransformer

sentences = ["数据1", "数据2"]
model = SentenceTransformer('acge_text_embedding')
print(model.max_seq_length)
embeddings_1 = model.encode(sentences, normalize_embeddings=True)
embeddings_2 = model.encode(sentences, normalize_embeddings=True)
similarity = embeddings_1 @ embeddings_2.T
print(similarity)

或者我们可以从acge_text_embedding模型入口使用官网自带的API来测试

数值代表了表示源文本与目标文本之间的语义相关性,相似度值越接近于1,文本之间的语义相关性越强
从测试中可以看出,与“今天想吃西红柿炒鸡蛋”最相近的是“今天想吃番茄炒鸡蛋”,而“昨天吃的是红烧肉”在语义上也表达出了“日期”,“吃”,“食物”等特点,剩下的语句也仅仅在语义上涉及了“日期”的概念,所以相似度很低。
4.代码
在sentence-transformer库中的使用方法:

from sentence_transformers import SentenceTransformer

sentences = ["数据1", "数据2"]
model = SentenceTransformer('acge_text_embedding')
print(model.max_seq_length)
embeddings_1 = model.encode(sentences, normalize_embeddings=True)
embeddings_2 = model.encode(sentences, normalize_embeddings=True)
similarity = embeddings_1 @ embeddings_2.T
print(similarity) 

在sentence-transformer库中的使用方法,选取不同的维度:

from sklearn.preprocessing import normalize
from sentence_transformers import SentenceTransformer

sentences = ["数据1", "数据2"]
model = SentenceTransformer('acge_text_embedding')
embeddings = model.encode(sentences, normalize_embeddings=False)
matryoshka_dim = 1024
embeddings = embeddings[..., :matryoshka_dim]  # Shrink the embedding dimensions
embeddings = normalize(embeddings, norm="l2", axis=1)
print(embeddings.shape)
posted @ 2024-05-08 23:34  soreaK  阅读(199)  评论(0编辑  收藏  举报