社区供稿 | M3E,开源中文 Embedding 模型新 SOTA

2023/06/13 18:00
阅读数 8.3K

项目地址:

  • 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 仓库: wangyuxinwhy/uniem

更新说明

  • 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 数据集需要您根据下方提供的链接自行下载和处理。

数据集加载脚本所在仓库: wangyuxinwhy/uniem

表格内容下载地址: https://hf.co/datasets/HuggingFace-CN-community/posts/resolve/main/m3e-dataset-sheet.pdf

计划表

  • ✔️ 完成 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源创计划”,欢迎正在阅读的你也加入,一起分享。

展开阅读全文
加载中
点击引领话题📣 发布并加入讨论🔥
0 评论
2 收藏
1
分享
返回顶部
顶部