项目地址:
-
m3e-small https://huggingface.co/moka-ai/m3e-small -
m3e-base https://huggingface.co/moka-ai/m3e-base
M3E 是 Moka Massive Mixed Embedding 的缩写
-
Moka,此模型由 MokaAI 训练,开源和评测,训练脚本使用 uniem ,评测 BenchMark 使用 MTEB-zh -
Massive,此模型通过 千万级 (2200w+) 的中文句对数据集进行训练 -
Mixed,此模型支持中英双语的同质文本相似度计算,异质文本检索等功能,未来还会支持代码检索 -
Embedding,此模型是文本嵌入模型,可以将自然语言转换成稠密的向量
相关 GitHub 仓库:
更新说明
-
2023.06.08,添加检索任务的评测结果,在 T2Ranking 1W 中文数据集上,m3e-base 在 ndcg@10 上达到了 0.8004,超过了 openai-ada-002 的 0.7786 -
2023.06.07,添加文本分类任务的评测结果,在 6 种文本分类数据集上,m3e-base 在 accuracy 上达到了 0.6157,超过了 openai-ada-002 的 0.5956
模型对比
参数数量 | 维度 | 中文 | 英文 | s2s | s2p | s2c | 开源 | 兼容性 | s2s Acc | s2p ndcg@10 | |
---|---|---|---|---|---|---|---|---|---|---|---|
m3e-small | 24M | 512 | 是 | 否 | 是 | 否 | 否 | 是 | 优 | 0.5834 | 0.7262 |
m3e-base | 110M | 768 | 是 | 是 | 是 | 是 | 否 | 是 | 优 | 0.6157 | 0.8004 |
text2vec | 110M | 768 | 是 | 否 | 是 | 否 | 否 | 是 | 优 | 0.5755 | 0.6346 |
openai-ada-002 | 未知 | 1536 | 是 | 是 | 是 | 是 | 是 | 否 | 优 | 0.5956 | 0.7786 |
说明:
-
s2s, 即 sentence to sentence ,代表了同质文本之间的嵌入能力,适用任务:文本相似度,重复问题检测,文本分类等 -
s2p, 即 sentence to passage ,代表了异质文本之间的嵌入能力,适用任务:文本检索,GPT 记忆模块等 -
s2c, 即 sentence to code ,代表了自然语言和程序语言之间的嵌入能力,适用任务:代码检索 -
兼容性,代表了模型在开源社区中各种项目被支持的程度,由于 m3e 和 text2vec 都可以直接通过 sentence-transformers 直接使用,所以和 openai 在社区的支持度上相当 -
ACC & ndcg@10,详情见下方的评测
Tips:
-
使用场景主要是中文,少量英文的情况,建议使用 m3e 系列的模型 -
多语言使用场景,并且不介意数据隐私的话,我建议使用 openai-ada-002 -
代码检索场景,推荐使用 ada-002
使用方式
您需要先安装 sentence-transformers
pip install -U sentence-transformers
安装完成后,您可以使用以下代码来使用 M3E Models
from sentence_transformers import SentenceTransformer
model = SentenceTransformer('moka-ai/m3e-base')
#Our sentences we like to encode
sentences = [
'* Moka 此文本嵌入模型由 MokaAI 训练并开源,训练脚本使用 uniem',
'* Massive 此文本嵌入模型通过**千万级**的中文句对数据集进行训练',
'* Mixed 此文本嵌入模型支持中英双语的同质文本相似度计算,异质文本检索等功能,未来还会支持代码检索,ALL in one'
]
#Sentences are encoded by calling model.encode()
embeddings = model.encode(sentences)
#Print the embeddings
for sentence, embedding in zip(sentences, embeddings):
print("Sentence:", sentence)
print("Embedding:", embedding)
print("")
M3E 系列的所有模型在设计的时候就考虑到完全兼容 sentence-transformers ,所以你可以通过替换名称字符串的方式在所有支持 sentence-transformers 的项目中无缝使用 M3E Models,比如 chroma, guidance, semantic-kernel 。
-
chroma: https://docs.trychroma.com/getting-started -
guidance: https://github.com/microsoft/guidance -
semantic-kernel: https://github.com/microsoft/semantic-kernel
训练方案
M3E 使用 in-batch 负采样的对比学习的方式在句对数据集进行训练,为了保证 in-batch 负采样的效果,我们使用 A100 80G 来最大化 batch-size,并在共计 2200W+ 的句对数据集上训练了 1 epoch。训练脚本使用 uniem,您可以在这里查看具体细节。
特性
-
中文训练集,M3E 在大规模句对数据集上的训练,包含中文百科,金融,医疗,法律,新闻,学术等多个领域共计 2200W 句对样本,数据集详见 M3E 数据集 -
英文训练集,M3E 使用 MEDI 145W 英文三元组数据集进行训练,数据集详见 MEDI 数据集,此数据集由 instructor team 提供 -
指令数据集,M3E 使用了 300W + 的指令微调数据集,这使得 M3E 对文本编码的时候可以遵从指令,这部分的工作主要被启发于 instructor-embedding -
基础模型,M3E 使用 hfl 实验室的 Roberta 系列模型进行训练,目前提供 small 和 base 两个版本,大家则需选用 -
ALL IN ONE,M3E 旨在提供一个 ALL IN ONE 的文本嵌入模型,不仅支持同质句子相似度判断,还支持异质文本检索,你只需要一个模型就可以覆盖全部的应用场景,未来还会支持代码检索
上述部分数据集和模型地址:
-
MEDI 数据集 https://drive.google.com/file/d/1vZ5c2oJNonGOvXzppNg5mHz24O6jcc52/view -
instructor-embedding https://github.com/HKUNLP/instructor-embedding -
Roberta 模型 https://huggingface.co/hfl/chinese-roberta-wwm-ext
评测
-
评测模型,text2vec, m3e-base, m3e-small, openai-ada-002 -
评测脚本,具体参考 MTEB-zh
https://github.com/wangyuxinwhy/uniem/blob/main/mteb-zh
文本分类
-
数据集选择,选择开源在 HuggingFace 上的 6 种文本分类数据集,包括新闻、电商评论、股票评论、长文本等 -
评测方式,使用 MTEB 的方式进行评测,报告 Accuracy。
text2vec | m3e-small | m3e-base | openai | |
---|---|---|---|---|
TNews | 0.43 | 0.4443 | 0.4827 | 0.4594 |
JDIphone | 0.8214 | 0.8293 | 0.8533 | 0.746 |
GubaEastmony | 0.7472 | 0.712 | 0.7621 | 0.7574 |
TYQSentiment | 0.6099 | 0.6596 | 0.7188 | 0.68 |
StockComSentiment | 0.4307 | 0.4291 | 0.4363 | 0.4819 |
IFlyTek | 0.414 | 0.4263 | 0.4409 | 0.4486 |
Average | 0.5755 | 0.5834 | 0.6157 | 0.5956 |
检索排序
T2Ranking 1W
-
数据集选择,使用 T2Ranking 数据集,由于 T2Ranking 的数据集太大,openai 评测起来的时间成本和 api 费用有些高,所以我们只选择了 T2Ranking 中的前 10000 篇文章 https://github.com/THUIR/T2Ranking -
评测方式,使用 MTEB 的方式进行评测,报告 map@1, map@10, mrr@1, mrr@10, ndcg@1, ndcg@10
text2vec | openai-ada-002 | m3e-small | m3e-base | |
---|---|---|---|---|
map@1 | 0.4684 | 0.6133 | 0.5574 | 0.626 |
map@10 | 0.5877 | 0.7423 | 0.6878 | 0.7656 |
mrr@1 | 0.5345 | 0.6931 | 0.6324 | 0.7047 |
mrr@10 | 0.6217 | 0.7668 | 0.712 | 0.7841 |
ndcg@1 | 0.5207 | 0.6764 | 0.6159 | 0.6881 |
ndcg@10 | 0.6346 | 0.7786 | 0.7262 | 0.8004 |
T2Ranking
-
数据集选择,使用 T2Ranking,刨除 openai-ada-002 模型后,我们对剩余的三个模型,进行 T2Ranking 10W 和 T2Ranking 50W 的评测。(T2Ranking 评测太耗内存了... 128G 都不行) -
评测方式,使用 MTEB 的方式进行评测,报告 ndcg@10
text2vec | m3e-small | m3e-base | |
---|---|---|---|
t2r-1w | 0.6346 | 0.72621 | 0.8004 |
t2r-10w | 0.44644 | 0.5251 | 0.6263 |
t2r-50w | 0.33482 | 0.38626 | 0.47364 |
说明:
-
检索排序对于 text2vec 并不公平,因为 text2vec 在训练的时候没有使用过检索相关的数据集,所以没有办法很好的完成检索任务也是正常的。
M3E数据集
如果您想要使用这些数据集,你可以在 uniem process_zh_datasets 中找到加载 huggingface 数据集的脚本,非 huggingface 数据集需要您根据下方提供的链接自行下载和处理。
数据集加载脚本所在仓库:
表格内容下载地址:
计划表
-
✔️ 完成 MTEB 中文评测 BenchMark, MTEB-zh -
完成 Large 模型的训练和开源 -
完成支持代码检索的模型 -
对 M3E 数据集进行清洗,保留高质量的部分,组成 m3e-hq,并在 huggingface 上开源 -
在 m3e-hq 的数据集上补充 hard negative 的样本及相似度分数,组成 m3e-hq-with-score,并在 huggingface 上开源 -
在 m3e-hq-with-score 上通过 cosent loss loss 进行训练并开源模型,CoSent 原理参考这篇博客 https://kexue.fm/archives/8847 -
开源商用版本的 M3E models
致谢
感谢开源社区提供的中文语料,感谢 HuggingFace 提供了如此好的生态,感谢所有在此工作中提供帮助的人们,希望中文社区越来越好,共勉!
License
M3E models 使用的数据集中包括大量非商用的数据集,所以 M3E models 也是非商用的,仅供研究使用。不过我们已经在 M3E 数据集上标识了商用和非商用的数据集,您可以根据自己的需求自行训练。
Citation
请使用以下格式引用此模型:
@software {
Moka Massive Mixed Embedding,
author = {Wang Yuxin,Sun Qingxuan,He sicheng},
title = {M3E: Moka Massive Mixed Embedding Model},
year = {2023}
}
作者信息
王宇昕,MokaHR 自然语言处理工程师,中央财经大学,Kaggle Expert;
孙庆轩,MokaHR 算法实习生,东北大学,自然语言处理实验室研究生在读;
何思成,MokaHR 算法实习生,清华大学,电子系大四在读。
本文转载自社区供稿内容,不代表官方立场。 如 果你有好的文章希望通过我们的平台分享给更多人,请通过这个链接与我们联系:
https://huggingface.link/tougao
本文分享自微信公众号 - Hugging Face(gh_504339124f0f)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。