向量模型Jina Embedding: 从v1到v3论文笔记

news2024/11/5 16:39:40

文章目录

    • Jina Embedding: 从v1到v3
      • Jina Embedding v1
        • 数据集准备
        • 训练过程
      • Jina Embedding v2
        • 预训练修改版BERT
        • 在文本对上微调
        • 在Hard Negatives上微调
      • Jina Embedding v2 双语言
        • 预训练修改版BERT
        • 在文本对上微调
        • 用多任务目标微调
      • Jina Embedding v3
        • 预训练
        • 在文本对上微调
        • 训练任务相关的适配器
          • 分类适配器
          • 文本匹配适配器
          • Separation适配器
          • 非对称检索适配器
      • 参考资料

Jina Embedding: 从v1到v3

基座模型支持语言模型大小编码长度向量维度下载链接
Jina Embedding v1T5英语14M/35M/110M/330M512512/512/768/1024huggingface
Jina Embedding v2BERT英语33M/137M/435M8192512/768/1024huggingface
Jina Embedding v3XLM-RoBERTa多语言572M81921024(可变大小)huggingface

Jina Embedding v1

jina embedding v1 对应的论文为2023年7月的《Jina Embeddings: A Novel Set of High-Performance Sentence Embedding Models》,在这篇论文里强调了数据清洗在数据集准备过程中很重要,一个更小但质量高的数据集比一个很大但是质量差的数据集训练的模型效果更好。

数据集准备

数据集来源包括公共数据集和自有数据集。

在数组的组织方式上,分为数据对和三元组,根据源数据集的类型分别采用不同的数据提取方法,比如QA数据集用问题作为query字符串,用答案作为目标字符串。

  • 数据对,记为 ( q , p ) ∈ D pairs (q, p) \in D_{\text{pairs}} (q,p)Dpairs,每一个数据对包括query字符串q和相关的目标字符串p。
  • 三元组,记为 ( q , p , n ) ∈ D triplets (q,p,n) \in D_{\text{triplets}} (q,p,n)Dtriplets,每一个三元组包括了query字符串q和一个匹配字符串p (positive) 和 不匹配字符串n (negative)

在准备数据对时,进行如下的清洗步骤:

  • 去重(De-Duplication):用hash函数来识别去掉重复的数据对。在检查重复数据之前将空格字符串归一化,并进行大小写转换。
  • 语言过滤(Language Filterring):用fasttext-language-identification模型只保留英文数据。
  • 一致性过滤(Consistency Filtering):去掉相似性比较低数据对。用all-MiniLM-L6-v2 model模型来进行一致性过滤:从 D pairs D_{\text{pairs}} Dpairs数据集中随机采样1M个数据对 ( q i , p i ) i (q_i, p_i)_i (qi,pi)i,并为它们生成embedding。对于数据集中的每一个数据对 ( q , p ) ∈ D pairs (q, p) \in D_{\text{pairs}} (q,p)Dpairs,检查 p p p与所有passages p i , i = 1 , … , 1 M p_i, i=1,\ldots,1M pi,i=1,,1M相比是不是与 q q q最相似的top 2(基于向量余弦相似度)。经过这一步骤后,数据集大小从1.5B减少到了385M。

数据对来源于32个数据集,过滤前的数据量为1.6 billion,过滤完之后为385 million。

在这里插入图片描述

在准备三元组数据时,没有进行去重和语言过滤步骤,但采用了与一致性过滤类似的步骤来校验“positive”元素与"query"元素的相关性:用cross-encoder模型ms-marco-MiniLM-L-6-v2来比较每一个三元组 ( q , p , n ) ∈ D triplets (q,p,n) \in D_{\text{triplets}} (q,p,n)Dtriplets的相似度 r ( q , p ) r(q,p) r(q,p) r ( q , n ) r(q,n) r(q,n),判断是否满足 r ( q , p ) − r ( q , n ) > κ r(q,p) - r(q,n) > \kappa r(q,p)r(q,n)>κ,阈值为 κ = 0.2 \kappa=0.2 κ=0.2,只保留满足阈值条件的三元组。

否定数据(Negation Data)的准备:许多向量模型对于否定含义的句子难以区分,比如对于三个句子:1. “A couple walks hand in hand down a street.”,2. “A couple is walking together.”, 3. “A couple is not walking together.” ,直觉上前面两个的向量距离应该更接近,第二个和第三个应该距离更远,但是很多模型无法区别其差异。于是Jina Embedding团队创建了一个negation数据集( [已开源](https:// huggingface.co/datasets/jinaai/negation-dataset) ),这个数据集的正样本对来自SNLI数据集,否定句由GPT-3.5生成,组成(anchor, entailment, negative)的三元组形式,与前述例子类似。(anchor, entailment)组成正样本对,“negetive"与”anchor"和“entailment”的含义都互相矛盾,但是与“entailment”的句法非常相似。这个否定数据集是前面的三元组数据集的一部分。

三元组数据在过滤前是1.13 million,过滤完之后927,000个,其分布如论文图2。

在这里插入图片描述

训练过程

训练分为两阶段:第一阶段在数据对上进行训练,使得它们的语义整合到一个语义向量上;第二阶段在相对较小的三元组数据上训练,让模型区分相似和不相似文本的区别。

Jina Embedding模型基于zero-shot T5模型的encoder训练,作者说因为它在一系列下游任务上进行了预训练所以选择它。在T5 encoder之上使用mean pooling layer由token embeddings得到固定长度的向量。

第一阶段的训练损失函数采用InfoNCE,即对一个大小为k的batch B ∈ D k B \in D^k BDk的数据对 ( q , p ) ∼ B (q, p) \sim B (q,p)B,损失函数通过比较给定问题q和目标p的余弦相似度与batch中其他目标的的相似度来计算得到:
L N C E pairs  ( B ) : = E ( q , p ) ∼ B [ − ln ⁡ e s ( q , p ) / τ ∑ i = 1 k e s ( q , p i ) / τ ] \mathcal{L}_{\mathrm{NCE}}^{\text {pairs }}(B):=\mathbb{E}_{(q, p) \sim B}\left[-\ln \frac{e^{s(q, p) / \tau}}{\sum_{i=1}^k e^{s\left(q, p_i\right) / \tau}}\right] LNCEpairs (B):=E(q,p)B[lni=1kes(q,pi)/τes(q,p)/τ]
此外作者发现在训练时计算两个方向的损失可以提高性能,即也考虑 L N C E ‾ pairs  \mathcal{L}_{\mathrm{\overline{NCE}}}^{\text {pairs }} LNCEpairs  从目标字符串去匹配所有query字符串。所以其最终损失函数如下式(温度参数取 τ = 0.05 \tau=0.05 τ=0.05):
L pairs  ( B ) : = L N C E pairs  ( B ) + L N C E ‾ pairs  ( B ) , where L N C E ‾ pairs  ( B ) : = E ( q , p ) ∼ B [ − ln ⁡ e s ( p , q ) / τ ∑ i = 1 k e s ( p , q i ) / τ ] \mathcal{L}^{\text {pairs }}(B) := \mathcal{L}_{\mathrm{NCE}}^{\text {pairs }}(B)+\mathcal{L}_{\mathrm{\overline{NCE}}}^{\text {pairs }}(B), \text{where} \\ \mathcal{L}_{\mathrm{\overline{NCE}}}^{\text {pairs }}(B):=\mathbb{E}_{(q, p) \sim B}\left[-\ln \frac{e^{s(p, q) / \tau}}{\sum_{i=1}^k e^{s\left(p, q_i\right) / \tau}}\right] Lpairs (B):=LNCEpairs (B)+LNCEpairs (B),whereLNCEpairs (B):=E(q,p)B[lni=1kes(p,qi)/τes(p,q)/τ]
在训练时,不是按顺序地在每个训练集上训练,而是同时在所有数据集上训练,但是在每一个训练batch里数据只来自单个数据集以确保损失计算时不会合并其他任务的数据。训练前每个数据集中的数据被shuffle,训练时根据采样概率 ρ ( D i ) = ∣ D i ∣ s i ∑ j = 1 n ∣ D j ∣ s j \rho (D_i)= \frac{|D_i|s_i}{\sum^n_{j=1} |D_j|s_j} ρ(Di)=j=1nDjsjDisi来采样 D i D_i Di,采样概率与数据集大小 ∣ D i ∣ |D_i| Di和缩放因子 s i s_i si决定,因为数据集大小的不一样,更频繁地从更大的数据集采样可以防止过拟合,用缩放因子来优先在高质量数据集上训练并且可以平衡文本领域。训练时如果一个数据集的样本消耗完了,数据集会被重置,模型可以重新从这个数据集获取数据来训练,确保了高采样率数据集在单个训练epoch中可以贡献多次。论文图1b是基于采样率的每个数据集的比例。

作者经过试验发现在训练第二阶段最好的结果是通过组合多个常用tuiplet loss 函数得到的(温度参数取 τ = 0.05 \tau=0.05 τ=0.05):InfoNCE损失函数的使用了额外负例的扩展版本 L N C E + triplets  \mathcal{L}_{\mathrm{NCE+}}^{\text {triplets }} LNCE+triplets  (式2),与第一阶段一样的反向InfoNCE损失函数 L N C E ‾ triplets  \mathcal{L}_{\mathrm{\overline{NCE}}}^{\text {triplets }} LNCEtriplets  (式3),triplet margin损失函数 L 3 triplets  \mathcal{L}_{3}^{\text {triplets }} L3triplets (式4), ϵ = 0.05 \epsilon=0.05 ϵ=0.05
L triplets  ( B ) : = L N C E + triplets  ( B ) + L N C E triplets  ( B ) + L 3 triplets  ( B ) ,  where  ( 1 ) L N C E + triplets  ( B ) : = E ( q , p , n ) ∼ B [ − ln ⁡ exp ⁡ ( s ( q , p ) / τ ) ∑ i = 1 k exp ⁡ ( s ( q , p i ) / τ ) + exp ⁡ ( s ( q , n i ) / τ ) ] ( 2 ) L N C E ‾ triplets  ( B ) : = E ( q , p , n ) ∼ B [ − ln ⁡ exp ⁡ ( s ( p , q ) / τ ) ∑ i = 1 k exp ⁡ ( s ( p , q i ) / τ ) ] ( 3 ) L 3 triplets  ( B ) : = E ( q , p , n ) ∼ B [ ReLU ⁡ ( s ( q , n ) − s ( q , p ) + ε ) ] . ( 4 ) \begin{aligned} & \mathcal{L}^{\text {triplets }}(B):=\mathcal{L}_{N C E+}^{\text {triplets }}(B)+\mathcal{L}_{\mathrm{NCE}}^{\text {triplets }}(B)+\mathcal{L}_3^{\text {triplets }}(B), \quad \text { where } \qquad (1) \\ & \mathcal{L}_{N C E+}^{\text {triplets }}(B):=\mathbb{E}_{(q, p, n) \sim B}\left[-\ln \frac{\exp (s(q, p) / \tau)}{\sum_{i=1}^k \exp \left(s\left(q, p_i\right) / \tau\right)+\exp \left(s\left(q, n_i\right) / \tau\right)}\right] \qquad (2) \\ & \mathcal{L}_{\mathrm{\overline{NCE}}}^{\text {triplets }}(B):=\mathbb{E}_{(q, p, n) \sim B}\left[-\ln \frac{\exp (s(p, q) / \tau)}{\sum_{i=1}^k \exp \left(s\left(p, q_i\right) / \tau\right)}\right] \qquad (3)\\ & \mathcal{L}_3^{\text {triplets }}(B):=\mathbb{E}_{(q, p, n) \sim B}[\operatorname{ReLU}(s(q, n)-s(q, p)+\varepsilon)] . \qquad (4) \end{aligned} Ltriplets (B):=LNCE+triplets (B)+LNCEtriplets (B)+L3triplets (B), where (1)LNCE+triplets (B):=E(q,p,n)B[lni=1kexp(s(q,pi)/τ)+exp(s(q,ni)/τ)exp(s(q,p)/τ)](2)LNCEtriplets (B):=E(q,p,n)B[lni=1kexp(s(p,qi)/τ)exp(s(p,q)/τ)](3)L3triplets (B):=E(q,p,n)B[ReLU(s(q,n)s(q,p)+ε)].(4)

训练的超参数如论文表5.
在这里插入图片描述

Jina Embedding v2

Jina Embedding v2 对应的论文是2023年10月的《Jina Embeddings 2: 8192-Token General-Purpose Text Embeddings for Long Documents》,Jina Embedding v2的主要特点是可以对长达8192 token的文本进行向量编码,长文本上下文窗口是通过AliBi来实现的。

Jina Embedding v2 的训练过程分为3个阶段:1. 预训练一个修改的BERT,2. 在文本对数据上微调,3. 在Hard Negatives上微调。第2和第3阶段是针对embedding任务来进行微调的,与其他论文的结论有一样,第三阶段对于提升模型在检索和分类任务上的性能很关键。

预训练修改版BERT

对BERT模型做一些修改,而训练过程主要采用RoBERTa所描述的方法。

模型架构

  • 对自注意力机制使用ALiBi方法,因为原始的ALiBi是为因果语言建模设计的,所以其特征bias只在一个方向,所以在encoder模型里应用了ALiBi的修改版,如论文图1所示意。
  • 对注意力模块的前向传播子层使用GLU(Gated Linear Units): 对于small和base模型,使用GEGLU,对于large模型使用ReGLU(这个选择也与其他论文一致说对于large模型使用GEGLU不稳定)。
  • 对于Layer Normalixation,使用与transformer的原论文《attention is all you need》一样的post-layer normalization。

在这里插入图片描述

训练数据:使用C4(Colossal, Cleaned, Common Crawl)数据集来进行预训练,只保留了英文语料。

训练算法

  • 去掉BERT里的下句预测任务(next sentence predictin, NSP)
  • 使用whole word masking, 随机mask掉30%的输入词元(token)。在这些被mask掉的token中,80%用[MASK] token替换,10%用随机token替换,10%保持不变。
  • 损失函数使用Masked Language Model 损失函数
  • 训练时文本最大长度为512。样本处理上不会将多个文档的数据堆叠到一起组成长文本,也会避免从一个文档中采样多个文本序列,对每一个文档,只考虑前512个token而裁剪掉剩下的文本。
  • 使用AdamW优化器, β 1 = 0.9 , β 2 = 0.98 , ϵ = 1 e − 6 \beta_1=0.9, \beta_2=0.98, \epsilon=1e-6 β1=0.9,β2=0.98,ϵ=1e6, weight decay为0.01,dropout rate为0.1, attention的dropout也为0.1。learning rate schedule为线性的,从0开始,在10000步时达到 η \eta η(对small、base、large模型的 η \eta η取值分别为1e-3, 6e-4,4e-4),在达到100000步后学习率逐渐线性衰减到0。
  • 通常DeepSpeed来实现FP16动态混合精度,而作者说初步测试表明BF16会导致不满意的性能指标。
在文本对上微调

文本向量通过在所有token embedding上加mean pooling层得到。

训练数据:与Jina Embedding v1的文本对准备数据流程一致,包括了40种不同来源数据,观察到数据集中包括title-abstract对可以显著提升向量模型在聚类任务上的性能。在数据上的采样策略也与Jina Embedding v1一致。

损失函数:与Jina Embedding v1一致。

在Hard Negatives上微调

这一阶段的主要目的是提高模型的排序能力,所以是在包含负样本的数据集来训练的。

训练数据:数据集包括检索数据集如MSMarco, NQ(Natural Questions),以及多个非检索数据集如Natural Language Inference(NLI)。对于每一个训练样本,记为 ( q , p , n 1 , … , n 15 ) (q, p, n_1, \ldots, n_{15}) (q,p,n1,,n15),即包括1个正样本和15个负样本。对于检索数据集,难负样本由检索模型判断与p相似而得到,即指导模型优先相关文档而不仅仅是语义相关;对于非检索数据集,负样本是随机选择的,因为在正样本和负样本之间画一条清晰的线并不可行。判断是否相关时,使用cross-encoder模型来判断。

损失函数:修改后的InfoNCE损失函数
L NCE + ( B ) : = E r ∼ B [ − ln ⁡ e s ( q , p ) / τ ∑ i = 1 k [ e s ( q , p i ) / τ + ∑ j = 1 15 e s ( q , n j , i ) / τ ) ] ] + E r ∼ B [ − ln ⁡ e s ( p , q ) / τ ∑ i = 1 k e s ( p , q i ) / τ ] with  r = ( q , p , n 1 , … , n 15 ) \mathcal{L}_{\text{NCE}+}(B):=\mathbb{E}_{r \sim B} \left[ -\ln \frac{e ^{s(q, p) / \tau}} {\sum_{i=1}^k [ e^{s(q, p_i) / \tau}+ \sum^{15}_{j=1} e^{s(q, n_{j,i})/ \tau)}]} \right] + \qquad \\ \mathbb{E}_{r \sim B}\left[-\ln \frac{e^{s(p, q) / \tau}}{\sum_{i=1}^k e^{s\left(p, q_i\right) / \tau}}\right] \\ \text{with} \ r=(q, p, n_1,\ldots, n_{15}) LNCE+(B):=ErB[lni=1k[es(q,pi)/τ+j=115es(q,nj,i)/τ)]es(q,p)/τ]+ErB[lni=1kes(p,qi)/τes(p,q)/τ]with r=(q,p,n1,,n15)

在这两个阶段进行微调训练时,大的batch size是更优的,为了节省内存,利用deepspeed实现混合精度训练,此外使用Activation checkpointing技术,在模型的每一个BERT层插入checkpoint。

Jina Embedding v2 双语言

Jina Embedding v2双语言模型对应的论文为2024年2月的《Multi-Task Contrastive Learning for 8192-Token Bilingual Text Embeddings》,这一篇里讲了用相对小的模型实现英语和另一个目标语言(如德语、中文、西班牙语)的双语向量编码。

与Jina Embedding v2一样,训练过程分为3个阶段:1. 预训练一个修改的BERT,2. 在文本对数据上微调,3. 用多任务目标(Multi-Task Objective)来微调。

预训练修改版BERT

模型架构: 与Jina Embedding v2一样。对西班牙语模型,对key和query向量引入了一个normalization来解决训练不稳定性,这个方法与QK-normalization有点关联,但不完全一样。子词分词器使用BPE分词器,并使得词汇表大小比jina Embedding v2的单语言版扩展了一倍,所以base模型的参数增加了一些(从137M到161M)。

训练数据:数据来源有CulturaX, Wikipedia, Opus,经过清洗后得到250M英文文本和相同数量的目标语言文本,留了1%的数据用作验证集。

训练算法:与Jina Embedding v2基本一样,因为训练数据包括双语言,所以在每一个batch的数据是单语言。

在文本对上微调

文本向量通过在所有token embedding上加mean pooling层得到,在训练节省内存的策略上也与Jina Embedding v2保持一致。

训练数据

  • 收集了211million德文、111million西班牙语、518million英语文本对(有点奇怪为什么没有提到中文数据量)。数据集中主要数据都是单语言文本对(97.5%),主要是(标题, 文章)、(问题, 回答)、(文本, 文本总结);其余的是双语言文本对,即包括用两种语言表示的相同含义文本,构成了用来桥接英语和其他语言的平行语料。
  • 数据集来源包括MQA、XL-Sum、XNLI、 MLSum、Europarl。此外为了多样性和数据量,用Common Crawl数据闯将了两种类型的文本对:1. 网页title和内容;2. 从FAQ和相关页面挖掘question-answer对。从Wikipedia获取段落和对应的章节标题。
  • 通过两阶段处理策略来提高数据质量: 过滤阶段通过一些质量检查实现,比如将非常短的文本、非常长的文本、重复行很多的文本给删除;在改进阶段不删除文本,只进行包括去掉网址相关的元数据、去掉未结束的行、只有一个单词的行等的操作。
  • 为进一步提高数据集质量,使用near-depuplication方法去除重复数据,使用Jina Embedding v1里用过的一致性过滤方法过滤不一致的文本对

损失函数: 与Jina Embedding v1一致。

用多任务目标微调

在之前的文献以及Jina Embedding v1和v2都表明第三阶段的在难负样本上的微调可以提高模型的排序能力,所以在这篇论文里将这个概念扩展为多任务训练阶段。

对于不同的任务一般有不同的格式,比如STS任务包含三元组(q,p, t),即两个文本q和p以及他们的相似分数t。而对于检索任务通常包括query q和一个或多个相关文档p以及可选的不相关文档n。所以对于每一个任务,定义自己的损失函数,在这篇论文中,只考虑STS任务和检索任务。在每个batch,采样一个数据集,根据数据集任务类型来选择相应的损失函数。

训练数据:检索任务与Jina Embedding v2类似,STS任务数据集包括SemEval等。因为英文数据的高质量数据更多,所以使用机器翻译将一些数据集翻译成目标语言。为了增加数据多样性和减少仅由翻译数据副作用的影响,还挑选了一些目标语言的数据集。

损失函数:检索任务的损失函数与Jina Embedding v2第三阶段的损失函数一样。STS数据集的损失函数采用negative Pearson’s sample correlation,设一个batch B包括文本对(q, p)和对应的相关分数t,其计算如下式:
L S T S ( B ) : = − c o v ( q , p , t ) ∼ B ( s ( q , p ) , t ) σ s ( B ) σ t ( B ) \mathcal{L}_{STS}(B) := - \frac{cov_{(q,p,t) \sim B } (s(q, p), t)}{\sigma_s(B) \sigma_t(B)} LSTS(B):=σs(B)σt(B)cov(q,p,t)B(s(q,p),t)
上式中, σ s \sigma_s σs σ t \sigma_t σt是估计的s(q,p)和t的标准差,在一个batch内计算得到,而上式中的协方差是跨批次B计算得到的。作者说基于相关性的损失函数可行的原因是它考虑相似性分数的大小而不是二元相关性,选择Pearson相关系数是因为它对相似度值的尺度是不变的。作者假定这可以使包含InfoNCE损失函数的多任务训练更稳定。

Jina Embedding v3

Jina Embedding v3 对应的论文为2024年9月的《jina-embeddings-v3: Multilingual Embeddings With Task LoRA》,它是一个多语言文本向量模型,可处理最多8192个token长度的文本,使用任务相关的LoRA适配器来生成检索、聚类、分类、文本匹配任务对应的向量,向量的默认大小为1024,因为使用了Matryoshka Representation Learning技术,用户可灵活地改变向量大小。(此外论文强调Jina embedding v3比v2和v2双语效果好很多,并且在MTEB的评估上在英文任务上超过了OpenAI和Cohere的私有向量模型,且比基于LLM的向量模型的大小小很多)

Jina Embedding v3的架构如论文图1所示

在这里插入图片描述

Jina Embedding v3的训练过程也分为3个阶段:1. 预训练XLM-RoBERTa,2. 在文本对数据上微调,3. 训练了任务相关的LoRA适配器。

预训练

模型:使用XLM-RoBERTa模型的参数来初始化模型,但是将位置编码修改为RoPE,保留了XLM-RoBERTa的tokenizer。训练目标为使用全词mask的MLM。

训练数据: CulturaX语料集,它包括89种语言的数据,其中英语大概占20%。每一个batch只包含一种语言,但是不同batch之间的语言是交替的。

在训练的前100000步文本序列长度被裁剪到512个token,在后60000步文本序列长度被裁剪到8192个token同时使用更小的batch size,具体超参见表A1。在训练时RoPE的旋转频率是10000,在推理时调整到20000有助于提升模型在长文本上的能力,但是作者发现这个调整后模型的长文本能力不及jina embedding v2,所以在训练时将模型在更长的文本上进行了训练,经过长文本训练之后jina embedding v3的长文本能力更强。

在这里插入图片描述

在文本对上微调

文本向量与之前系列模型一致,通过在所有token embedding上加mean pooling层得到。

损失函数:与jina embedding v2双语言一致。

训练数据:从超过300个数据集收集得到,训练时每个batch采样自一个特定数据集。数据集准备方法与jina embedding v2双语言一致,只是多了一个过滤步骤:将短文本里至少有80%的内容属于长文本的子字符串的文本对给去掉了,这个过滤可以增加训练的难度。

与预训练过程一样,先在短文本对上训练,接着用更小的batch size来训练更长的文本序列(这时只有包含足够多的长文本数据的数据集)

训练任务相关的适配器

在这一阶段训练了在四个任务上的五个不同LoRA适配器,如论文表2所示。训练时这些任务是独立训练的,基座模型参数是被冻结的。在推理时,用户根据下游任何和输入内容角色选择合适的适配器。
在这里插入图片描述

分类适配器

分类适配器为下游分类任务特别是逻辑回归分类器生成向量,为训练适配器,采用Gecko向量模型提出的分类训练方法。

数据集包括常见分类任务,包括情感分析、意图分类、文章类别。对每一个数据集,选择属于同一个类别的2个文本值(q,p)和7个不同类别的文本 ( n 1 , … , n 7 ) (n_1, \ldots, n_7) (n1,,n7),构建包含9个文本的元祖 ( q , p , n 1 , … , n 7 ) (q,p,n_1,\ldots,n_7) (q,p,n1,,n7),模型的训练目标是为q和p分配高的余弦相似度,同时使q和其他 n i n_i ni的余弦相似度很低。每一个batch的元祖来自同一个数据集。

损失函数与Jina Embedding v2一样,是InfoNCE的扩展版本,考虑了额外的负样本。
L triplet ( B ) : = E r ∼ B [ − ln ⁡ e s ( q , p ) / τ ∑ i = 1 k [ e s ( q , p i ) / τ + ∑ j = 1 m e s ( q , n j , i ) / τ ) ] ] + E r ∼ B [ − ln ⁡ e s ( p , q ) / τ ∑ i = 1 k e s ( p , q i ) / τ ] with  r = ( q , p , n 1 , … , n m ) \mathcal{L}_{\text{triplet}}(B):=\mathbb{E}_{r \sim B} \left[ -\ln \frac{e ^{s(q, p) / \tau}} {\sum_{i=1}^k [ e^{s(q, p_i) / \tau}+ \sum^{m}_{j=1} e^{s(q, n_{j,i})/ \tau)}]} \right] + \qquad \\ \mathbb{E}_{r \sim B}\left[-\ln \frac{e^{s(p, q) / \tau}}{\sum_{i=1}^k e^{s\left(p, q_i\right) / \tau}}\right] \\ \text{with} \ r=(q, p, n_1,\ldots, n_{m}) Ltriplet(B):=ErB[lni=1k[es(q,pi)/τ+j=1mes(q,nj,i)/τ)]es(q,p)/τ]+ErB[lni=1kes(p,qi)/τes(p,q)/τ]with r=(q,p,n1,,nm)
在使用这个损失函数时,在同一个batch里与 q i q_i qi来自相同类别的文本 p j ( i ≠ j ) p_j (i \neq j) pj(i=j)被当做负样本,这可能会造成假负例,所以Gecko向量模型是每一个文本一个唯一id值,允许模型区分batch里文本的差别,就可以避免掉假负例。

文本匹配适配器

文本匹配适配器为量化两个文本之间的相似性而生成向量,可应用与语义文本相似性(sementic textual similarity, STS)和对称性检索任务(即query和target之间的区别不明显)。

训练数据包括STS训练数据集如STS12、SICK,这些数据集包括三元组 ( q i , p i , t i ) ∈ D (q_i, p_i, t_i) \in D (qi,pi,ti)D,即文本对 ( q i , p i ) (q_i, p_i) (qi,pi)以及他们的相关分数 t i t_i ti。一个batch B包含指定数量的三元组,ground truth相似度定义为 ζ ( q i , p i ) = t i \zeta(q_i, p_i) = t_i ζ(qi,pi)=ti。为了模型在跨语言的表现,使用机器翻译模型如WMT19和MADLAD-3B将STS12和SICK翻译到了多种语言。此外还将natural language inference (NLI) 数据集包括进来了。每个batch中也只包含了一个数据集的数据,并使用相应的损失函数(没提NLI数据集的损失函数是什么,用InfoNCE?)。

损失函数使用了苏剑林提出的CoSent loss:
L c o ( B ) : = l n [ 1 + ∑ ( q 1 , p 1 ) , ( q 2 , p 2 ) ∈ B e s ( q 2 , p 2 ) − e s ( q 1 , p 1 ) τ ] where  ζ ( q 1 , p 1 ) > ζ ( q 2 , p 2 ) \mathcal{L}_{co} (B) := ln \left[ 1 + \sum_{(q_1,p_1),(q_2,p_2) \in B} \frac {e^{s(q_2,p_2)} - e^{s(q_1, p_1)}}{\tau} \right] \\ \text{where} \ \zeta(q_1, p_1) > \zeta(q_2, p_2) Lco(B):=ln 1+(q1,p1),(q2,p2)Bτes(q2,p2)es(q1,p1) where ζ(q1,p1)>ζ(q2,p2)
CoSent loss 在两个文本对上进行运算,要求数据集里标注ground truth相似度 ζ \zeta ζ

Separation适配器

分离适配器(Separation Adapter)是为聚类和重排序任务设计的(对重排序任务是将相关文档和不相关文档给分开)。

损失函数是CoSent loss的变体,训练数据 B ′ B^{\prime} B由元组 ( x , l ) ∈ B ′ (x, l) \in B^{\prime} (x,l)B组成,x是文本,l是它对应的标签。为了组成匹配 L c o \mathcal{L}_{co} Lco 的文本对,在一个batch里生成同一个标签 l i l_i li的所有文本对组合。最终的分离损失定义如下:
L s e p ( B ′ ) : = L c o ( B ) B = { ( x i , x j ) ∣ ∃ l : ( x i , l ) , ( x j , l ) ∈ B ′ } \mathcal{L}_{sep}(B^{\prime}) := \mathcal{L}_{co}(B) \\ B = \{(x_i, x_j)| \exists l:(x_i, l),(x_j, l) \in B^{\prime} \} Lsep(B):=Lco(B)B={(xi,xj)∣∃l:(xi,l),(xj,l)B}
因为满足要求的训练数据不多,所以在这一阶段还混合了训练第二阶段的文本对数据(训练损失也是第二阶段的损失),在每一个训练步,特定数据集被采样并使用相应的损失函数。

非对称检索适配器

与E5对应的论文一样,使用两个不同的前缀加在query和document后,并且同时(joinly)训练两个不同的适配器。

训练数据为包含hard negatives的数据集如MS-MARCO和Natural Questions(NQ),目的是为了让模型能够专注于细微的区别并区分相关文档和相似但不相关文档。而对于没有难负例的检索数据集使用RocketQA v2和E5论文中使用的方法用BGE-large和BM25来挖掘难负例。

损失函数是与分类适配器一样的 L triplet \mathcal{L}_{\text{triplet}} Ltriplet

在对Jina embedding v2在非对称检索任务上进行错误分析时,发现了以下影响检索任务的点:

  • F1. Misleading Syntactic Similarities: Documents with high syntactic similarity to the query are often favored over gold/relevant documents with lower syntactic overlap.
  • F2. Misinterpretation of Named Entities:Named entities are frequently not recognized as such, leading to documents being marked as relevant based on partial matches (e.g., “Sofia Albert” vs. “Albert Stone”). This occurs especially with proper nouns that have alternative, more common meanings (e.g., the novel title “The Company” vs. “the company”).
  • F3. No Understanding of Polar Questions:Complex yes-no (polar) questions are not handled effectively. As a result, the model retrieves documents with related content that do not necessarily answer the query.
  • F4. Preference for Low-Quality Documents:jina-embeddings-v2 and many other embedding models do not account for document quality, focusing solely on similarity and relevance. Consequently, low-quality documents(short, repetitive, or uninformative) that mention query terms are often retrieved but do not provide satisfactory answers.

为了减轻F1-F3,设计了prompt生成与这些特定失败案例匹配的文本例子,每个例子包括一个query文本,一个优选答案,7个表示失败案例的负样本。

对于F4,利用了Open Assistant项目的数据集oasst1和oasst2,这些数据集包括由LLM生成的问题和答案,以及由人工判定的质量分数(0-1)。将这些数据集通过选择有至少两个回答的query来转变成难负例训练数据。质量最高的回答被当做正匹配样本,而分数低于0.3质量分的回答作为负样本,如果少于七个负样本,剩下的负样本通过从其他query里随机选择得到。

论文表6是应用这些合成数据后的实验结果。

在这里插入图片描述

参考资料

  1. jina embedding 发布博客:v1, v2, v2双语, v3
  2. jina embedding模型对应的论文,如文中链接。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

为啥学习数据结构和算法

基础知识就像是一座大楼的地基,它决定了我们的技术高度。而要想快速做出点事情,前提条件一定是基础能力过硬,“内功”要到位。 想要通关大厂面试,千万别让数据结构和算法拖了后腿 我们学任何知识都是为了“用”的,是为…

AI打造超写实虚拟人物:是科技奇迹还是伦理挑战?

内容概要 在这个科技飞速发展的时代,超写实虚拟人物仿佛从科幻小说中走进了我们的日常生活。它们以生动的形象和细腻的动作,不仅在影视、广告和游戏中吸引了无数目光,更让我们对AI技术的未来充满了期待和疑惑。这些数字化身在逼真的外貌下&a…

React基础大全

文章目录 一、React基本介绍1.虚拟DOM优化1.1 原生JS渲染页面1.2 React渲染页面 2.需要提前掌握的JS知识 二、入门1.React基本使用2.创建DOM的两种方式2.1 使用js创建(一般不用)2.2 使用jsx创建 3.React JSX3.1 JSX常见语法规则3.2 for循环渲染数据 4.模…

20241102在荣品PRO-RK3566开发板使用荣品预编译的buildroot通过iperf2测试AP6256的WIFI网速

20241102在荣品PRO-RK3566开发板使用荣品预编译的buildroot通过iperf2测试AP6256的WIFI网速 2024/11/2 14:18 客户端:荣耀手机HONOR 70【iPerf2 for Android】 服务器端:荣品PRO-RK3566开发板 预编译固件:update-pro-rk3566-buildroot-hdmi-2…

【启程Golang之旅】并发编程构建简易聊天系统

欢迎来到Golang的世界!在当今快节奏的软件开发领域,选择一种高效、简洁的编程语言至关重要。而在这方面,Golang(又称Go)无疑是一个备受瞩目的选择。在本文中,带领您探索Golang的世界,一步步地了…

【JavaSE】java对象的比较

文章目录 元素的比较基本类型的比较对象的比较 如何进行对象比较重写equals方法基于Comparble.compareTo的比较基于Comparator.compare的比较区分Comparator和Comparable 在PriorityQueue中比较的体现 元素的比较 基本类型的比较 在Java中,基本类型可以直接进行大小的比较 //…

多SpringBoot项目同进程下统一启动

1.背景 使用SpringBoot技术栈进行REST HTTP接口开发服务时,一般来说如果模块较多或者涉及多人协作开发,大家会不自觉的将每个模块独立成一个单独的项目进行开发,部署时则将每个服务进行单独部署和运行。服务间的调用则通过FeignClients&…

lvgl

lvgl 目录 lvgl Lvgl移植到STM32 -- 1、下载LVGL源码 -- 2、将必要文件复制到工程目录 -- 3、修改配置文件 将lvgl与底层屏幕结合到一块 -- lvgl也需要有定时器,专门给自己做了一个函数,告诉lvgl经过了多长时间(ms(毫秒)级别) 编写代码 lvgl的中文教程手册网站…

使用WebAssembly优化Web应用性能

💓 博客主页:瑕疵的CSDN主页 📝 Gitee主页:瑕疵的gitee主页 ⏩ 文章专栏:《热点资讯》 使用WebAssembly优化Web应用性能 引言 WebAssembly 简介 安装工具 创建 WebAssembly 项目 编写 WebAssembly 代码 编译 WebAssem…

【docker】docker 环境配置及安装

本文介绍基于 官方存储库 docker 的环境配置、安装、代理配置、卸载等相关内容。 官方安装文档说明:https://docs.docker.com/engine/install/ubuntu/ 主机环境 宿主机环境 Ubuntu 20.04.6 LTS 安装步骤 添加相关依赖 sudo apt-get update sudo apt-get install…

【Linux】网络编程:初识协议,序列化与反序列化——基于json串实现,网络通信计算器中简单协议的实现、手写序列化与反序列化

目录 一、什么是协议? 二、为什么需要有协议呢? 三、协议的应用 四、序列化与反序列化的引入 什么是序列化和反序列化? 为什么需要序列化和反序列化? 五、序列化推荐格式之一:JSON介绍 六、网络版计算器编程逻…

基于MATLAB的加噪语音信号的滤波

一.滤波器的简述 在MATLAB环境下IIR数字滤波器和FIR数字滤波器的设计方 法即实现方法,并进行图形用户界面设计,以显示所介绍迷你滤波器的设计特性。 在无线脉冲响应(IIR)数字滤波器设计中,先进行模拟滤波器…

Java项目实战II基于Spring Boot的智能家居系统(开发文档+数据库+源码)

目录 一、前言 二、技术介绍 三、系统实现 四、文档参考 五、核心代码 六、源码获取 全栈码农以及毕业设计实战开发,CSDN平台Java领域新星创作者,专注于大学生项目实战开发、讲解和毕业答疑辅导。 一、前言 随着物联网技术的快速发展和普及&#…

基于Spring Boot+Vue的助农销售平台(协同过滤算法、限流算法、支付宝沙盒支付、实时聊天、图形化分析)

🎈系统亮点:协同过滤算法、节流算法、支付宝沙盒支付、图形化分析、实时聊天; 一.系统开发工具与环境搭建 1.系统设计开发工具 后端使用Java编程语言的Spring boot框架 项目架构:B/S架构 运行环境:win10/win11、jdk1…

【C++笔记】容器适配器及deque和仿函数

【C笔记】容器适配器及deque和仿函数 🔥个人主页:大白的编程日记 🔥专栏:C笔记 文章目录 【C笔记】容器适配器及deque和仿函数前言一.容器适配器1.1什么是容器适配器1.2 STL标准库中stack和queue的底层结构 二.stack2.1stack类模…

软考:中间件

中间件 中间件是一类位于操作系统软件与用户应用软件之间的计算机软件,它包括一组服务,以便于运行在一台或多台机器上的多个软件通过网络进行交互。 中间件的主要功能包括通信支持和应用支持。 通信支持为应用软件提供平台化的运行环境,屏蔽…

统信UOS设备驱动开发-常见问题

包含linux设备驱动开发的基础知识及统信UOS设备驱动的总体架构,常用的设备驱动开发调试优化手段及在环境搭建和代码编写过程中常见问题处理等。 文章目录 环境搭建如何编译驱动代码编写如何实现同源异构环境搭建 如何编译内核 下载并解压内核源码包,进入源码根目录,内核的编…

JS 异步 Promise、Async、await详解

目录 一、JS里的同步异步 二、Promise 1、状态 2、all()、race()、any() 3、简单案例 4、异步执行案例 5、解决异步嵌套繁琐的场景 三、async和await 1、async返回类型 2、async与await结合使用的简单案例 3、解决异步嵌套问题 4、批量请求优化 一、JS里的同步异步…

【Vue3】Vue3相比Vue2有哪些新特性?全面解析与应用指南

🧑‍💼 一名茫茫大海中沉浮的小小程序员🍬 👉 你的一键四连 (关注 点赞收藏评论)是我更新的最大动力❤️! 📑 目录 🔽 前言1️⃣ 响应式系统的改进2️⃣ Composition API的引入3️⃣ 更好的Type…

Vue 事件阻止 e.preventDefault();click.prevent

Vue 事件阻止 Vue 事件阻止 e.preventDefault(); click.prevent修饰符