Nomic Embed:能够复现的SOTA开源嵌入模型

Nomic-embed-text是2月份刚发布的,并且是一个完全开源的英文文本嵌入模型,上下文长度为8192。它在处理短文和长文本任务方面都超越了现有的模型,如OpenAI的Ada-002和text-embedding-3-small。该模型有137M个参数在现在可以算是非常小的模型了。

模型、训练代码以及一个包含2.35亿文本对的大型数据集都已经发布,我们可以复现、审计和重新构建这个先进的嵌入模型。

模型架构

以下是该模型对BERT base应用的架构变化和优化:

  • 使用Rotary位置嵌入替代绝对位置编码。
  • 使用SwiGLU激活代替GeLU。
  • 使用Flash Attention。
  • 删除Dropout。
  • 词汇大小为64的倍数。

这样就得到了nomic-bert-2048,该模型在所有阶段的最大序列长度为2048。在推断时使用动态NTK插值将模型扩展到8192的序列长度。

BooksCorpus和2023年的Wikipedia转储被用作预训练语料库。每个文档使用bert-base-uncased分词器进行分词,并打包成2048个标记的块。使用30%的掩码率而不是bert的15%。预训练不考虑下一句子预测任务,只进行掩码填充。

无监督对比预训练

无监督对比预训练旨在教会模型区分最相似的文档和其他无关的文档。

论文的数据集使用大量公开可用的数据形成文本对。这些数据集涵盖各种目标和领域,从网页检索到科学文章,总共精选了涵盖29个数据集的470M个文本对。

为了去除噪声样本,使用gte-base模型进行了一致性过滤。

对于数据集的100万个子样本,每个对都被嵌入为查询和文档。如果文档不在前k个(在这种情况下是2)中,使用余弦相似度,那么该示例将被丢弃。过滤后得到约235M个文本对。

此外,还使用完整的维基百科文章与它们的标题配对,以及来自S2ORC的单篇论文的摘要和全文主体,这样就得到了一个长上下文数据集。

在训练过程中,一次从一个数据源中抽样一对,并且整个批次都用来自单一数据源的样本填充,这样可以防止模型学习特定于源的问题(不让模型走捷径,减少过拟合)。

使用InfoNCE对比损失。对于给定的批次B = (q0, d0), (q1, d1), …, (qn, dn),最小化如下所示:

其中,s(q, d)是(q, d)的余弦相似度。

为了打破双编码器的对称性,使用以下特定任务前缀:

  • 搜索查询(通常用于问题)
  • 搜索文档(通常用于响应)
  • 分类(用于与STS相关的任务,如改写)
  • 聚类(用于将语义相似的文本组合在一起的任务)

监督对比微调

训练的这个阶段旨在通过利用人工标记的数据集来提高性能。

监督微调在MSMarco、NQ、NLI、HotpotQA、FEVER、MEDI的部分数据、WikiAnswers和Reddit上进行。

配对的对比损失被调整为包含每个批次中的难区分的负样本。作者发现将负样本数量增加到7以上并不能明显提高性能。此外多次训练也会对性能造成了损害。

评估

对BEIR进行了少量样本的评估,获得了在特定数据集上的训练对整体MTEB分数的影响。在FEVER、HotpotQA和MEDI数据集上的训练提高了整体MTEB分数,这表明在训练中选择数据集对于提升性能至关重要。

nomic-bert-2048在GLUE基准测试上进行了评估。对于某些任务,它是从MNLI检查点初始化的。nomic-bert-2048在GLUE基准测试上与大小和训练方式相似的模型竞争力相当,与MosaicBERT和JinaBERT在各个任务上的得分也很相似,除了Cola(这个任务中由于模型的序列长度更长)因为在预训练过程中看到更多的标记,所以表现有所不同。

MTEB基准测试

Jina 长上下文语境测试

LoCo基准测试

nomic-embed-text-v1与其他模型如text-embedding-ada-002和jina-embeddings-v2-base-en的比较。nomic-embed-text-v1在MTEB上的表现超过了text-embedding-ada-002和jina-embeddings-v2-base-en。它在长上下文基准测试(LoCo和Jina长上下文基准测试)上一致优于jina-embeddings-v2-base-en,展现出对长序列更优越的性能。

Nomic Embed 1.5

Nomic Embed v1.5是Nomic Embed模型的增强版本,它融合了Matryoshka Representation Learning,允许在单个模型中调整嵌入维度。训练过程从对弱相关文本对进行无监督对比训练开始,逐渐转向在更高质量的标记数据集上进行微调。

nomic-embed-text-unsupervised 在 nomic-embed-text微调数据集上使用MRL进行微调。

Nomic Embed v1.5支持嵌入维度从64到768,在512和768维度上表现优于其他模型。与以前的版本相比,它实现了显著的内存减少,同时保持了与其他高级模型(如MiniLM-L6-v2)相当的性能水平。

这里简单介绍一下Matryoshka Representation Learning:

Matryoshka Representation Learning是一种使我们的模型具有可变嵌入维度的技术。类似于俄罗斯套娃,我们明确地训练模型来学习在不同嵌入维度下的嵌套表示。这使我们能够从完整大小截断嵌入以减少它们的内存占用,同时保持性能。

总结

很高兴能够看到有关文本嵌入的最新论文,这篇论文也说明了在模型很小的情况下还是可以得到更好的测试结果,这对我们应用来说非常重要,另外就是现在嵌入的研究方向变为了动态维度表示,但是我个人认为目前这方面还可以有更大的发展。

论文:

https://avoid.overfit.cn/post/2ed4f1b0173a444f836ccfaee424db0d

作者:Ritvik Rastogi

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/526614.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[LeetCode][LCR151]彩灯装饰记录 III——队列

题目 LCR 151. 彩灯装饰记录 III 一棵圣诞树记作根节点为 root 的二叉树,节点值为该位置装饰彩灯的颜色编号。请按照如下规则记录彩灯装饰结果: 第一层按照从左到右的顺序记录除第一层外每一层的记录顺序均与上一层相反。即第一层为从左到右&#xff0c…

鸿蒙报错:Hhvigor Update the SDKs by going to Tools > SDK Manager....

鸿蒙报错:Hhvigor Update the SDKs by going to Tools > SDK Manager… 打开setting里面的sdk,将API9工程下的全部勾上,应用下载 刚打开 js 和 Native 是没勾上的

LeetCode Python - 43.字符串相乘

目录 题目答案运行结果 题目 给定两个以字符串形式表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘积,它们的乘积也表示为字符串形式。 注意:不能使用任何内置的 BigInteger 库或直接将输入转换为整数。 示例 1: 输入: num1 “2”, …

Pytorch学习 day08(最大池化层、非线性激活层、正则化层、循环层、Transformer层、线性层、Dropout层)

最大池化层 最大池化,也叫上采样,是池化核在输入图像上不断移动,并取对应区域中的最大值,目的是:在保留输入特征的同时,减小输入数据量,加快训练。参数设置如下: kernel_size&#…

AI智能应用百科立即落地实操课

该课程旨在教授学员如何将AI智能应用于实际场景。通过深入的案例研究和实操练习,学员将学会应用机器学习、自然语言处理等技术,快速解决现实问题。课程强调实际操作,帮助学员快速运用AI技术解决工作中的挑战。 课程大小:3.3G 课…

【Java探索之旅】数据类型与变量,字面常量,整型变量

🎥 屿小夏 : 个人主页 🔥个人专栏 : Java入门到精通 🌄 莫道桑榆晚,为霞尚满天! 文章目录 📑前言一、字面常量二、数据类型三、变量3.1 变量概念3.2 语法格式 四、整型变量4.1 整型变…

reids设计与实现(一)——数据对象

文章目录 1. 前言2. redis 动态字符串2.1. 字符串的数据结构:2.2. 剖析,length;2.3. 剖析,free;2.3. 使用c字符串函数; 3. redis 链表4. 字典5. 跳跃表 1. 前言 reids作为最常用的缓存数据库,深…

【Pytorch】进阶学习:深入解析 sklearn.metrics 中的 classification_report 函数---分类性能评估的利器

【Pytorch】进阶学习:深入解析 sklearn.metrics 中的 classification_report 函数—分类性能评估的利器 🌈 个人主页:高斯小哥 🔥 高质量专栏:Matplotlib之旅:零基础精通数据可视化、Python基础【高质量合…

界面开发框架DevExpress XAF v24.1新版预告 - 跨平台应用UI(一)

DevExpress XAF是一款强大的现代应用程序框架,允许同时开发ASP.NET和WinForms。XAF采用模块化设计,开发人员可以选择内建模块,也可以自行创建,从而以更快的速度和比开发人员当前更强有力的方式创建应用程序。 本文中的内容概述了…

js前天、昨天、今天、明天、后天,大后天代码

js 前天、昨天、今天、明天、后天,大后天代码 function GetDateStr(AddDayCount) {var dd new Date();dd.setDate(dd.getDate() AddDayCount); //获取 AddDayCount 天后的日期 var y dd.getFullYear();var m dd.getMonth() 1; //获取当前月份的日期 var d dd…

课时59:流程控制_if条件控制_语法解读

2.2.1 语法解读 学习目标 这一节,我们从 基础知识、简单实践、小结 三个方面来学习。 基础知识 简介 条件结构能够根据某个特定的条件,结合内置的测试表达式功能,结合测试的结果状态值对于条件进行判断,然后选择执行合适的任务…

JavaScript中的Set和Map:理解与使用

🤍 前端开发工程师、技术日更博主、已过CET6 🍨 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 🕠 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 🍚 蓝桥云课签约作者、上架课程《Vue.js 和 E…