论文阅读:JINA EMBEDDINGS: A Novel Set of High-Performance Sentence Embedding Models
Abstract
JINA EMBEDINGS构成了一组高性能的句子嵌入模型,擅长将文本输入转换为数字表示,捕捉文本的语义。这些模型在密集检索和语义文本相似性等应用中表现出色。文章详细介绍了JINA EMBEDINGS的开发,从创建高质量的成对(pairwise)和三元组数据集(triplet datasets)开始。它强调了数据清理在数据集准备中的关键作用,深入了解了模型训练过程,并使用Massive Text Embedding Benchmark(MTEB)进行了全面的性能评估。此外,为了提高模型对语法否定的认识,构建了一个新的否定(negated)和非否定(non-negated)语句的训练和评估数据集,并向社区公开。
1.
Jina Embeddings模型集实在T5结构上通过对比学习训练而成。选择使用T5模型作为基础,因为它在一组混合的下游任务上进行了预训练。我们的大规模对比微调方法超越了zero-short T5,并提供了与其他领先的基于T5的句子嵌入模型(如句子-T5和GTR)相当的性能水平。这项工作表明,通过明智地使用资源和创新的训练方法,可以实现高质量的句子嵌入。
2. 数据准备
- 格式
这里的格式分为二元组和三元组,对于未提供不相关信息的数据,用二元组表示为 ( q , p ) ∈ D p a i r s (q, p) \in D_{pairs} (q,p)∈Dpairs, q q q 表示query, p p p 表示之相关的target;对于提供了不相关信息的数据,用三元组表示为 ( q , p , n ) ∈ D t r i p l e t s (q, p, n) \in D_{triplets} (q,p,n)∈Dtriplets,其中 q q q 表示query, p p p 表示与这个query相匹配的正样本, n n n 表示与这个query不匹配的负样本 n n n - 数据提取
用于提取二元组和三元组的方法特定于每个源数据集。例如,给定一个问答数据集,我们将问题用作查询字符串,将答案用作目标字符串。检索数据集通常包含可以作为查询字符串的queries,以及可以作为匹配字符串和非匹配字符串操作的相关和非相关注释文档。 - 训练步骤
训练流程是一个两步的方法,第一步我们使用二元组数据进行训练,第二步使用三元组数据对模型进行微调
2.1 二元组数据准备
许多大型数据集的庞大规模和不一致的质量需要严格的过滤管道。我们应用以下步骤来筛选训练数据:
- 去除重复数据:训练数据中重复的条目可能会对模型性能产生负面影响,并可能导致过度拟合。因此,我们从数据集中删除重复条目。考虑到数据集的体积,我们使用哈希函数来识别和消除映射到重复哈希值的文本对。在检查重复项之前,我们对空白和大写进行规范化。空白pairs和具有相同元素的pairs也会被删除。
- 语言过滤:由于设计的是针对英语的embedding模型,所以使用基于fasttext text 分类方法的fasttext-language-identification模型来移除数据中的非英语项。
- 一致性过滤:一致性过滤是指排除语义相似度较低的训练对。先前的研究表明,使用辅助模型(尽管不太精确)消除低相似性对可以提高性能。本文使用all-MiniLM-L6-v2模型来进行一致性过滤:从 D p a i r s D_{pairs} Dpairs里面随机选取1M的pairs ( q i , p i ) i (q_i, p_i)_i (qi,pi)i,然后生成embeddings。对于数据集里面的每个pair对 ( q , p ) ∈ D p a i r s (q, p) \in D_{pairs} (q,p)∈Dpairs,我们会计算出 p p p 和 q q q 的余弦相似度,同时计算出之前随机选择的1M的文档与 q q q 的余弦相似度,然后验证一下 p p p 与 q q q 的余弦相似度是不是排在前二。
这些预处理步骤的应用将数据集的大小从超过15亿个混合质量pair减少到3.85亿个高质量pair。这种减少使我们能够在不牺牲embedding质量的情况下,用比经典embedding模型少得多的数据来训练我们的模型。
2.2 三元组数据的准备
对于三元组数据集,我们放弃了重复数据消除和语言过滤,并假设这些数据集的质量已经满足我们的质量要求。然而,我们以类似于一致性过滤的方式验证了正样本相对于每个三元组的query的相关性。这里没有像一致性过滤一样拿 q q q 和 p p p 的余弦相似度与 q q q 和一组随机文档的余弦相似度进行比较,而只是将同一个三元组 ( q , p , n ) (q, p, n) (q,p,n) 的 s ( q , p ) s(q, p) s(q,p) 和 s ( q , n ) s(q, n) s(q,n) 进行了比较。 s ( ) s() s() 表示余弦相似度。这是用一个 cross-encoder 模型完成的,该模型直接评估pair,而不生成embedding表示。更具体地说,我们利用ms-marco-MiniLM-L-6-v2模型来验证由该模型确定的检索得分的差异是否超过阈值 r ( q , p ) − r ( q , n ) > κ r(q, p)−r(q, n)>κ r(q,p)−r(q,n)>κ,阈值 κ = 0.2 κ=0.2 κ=0.2,并消除分差没有超过阈值的pairs。
2.3 否定数据的准备
我们观察到,许多嵌入模型难以准确嵌入否定的语义。比如当给下面三个句子进行embedding时,“A couple walks hand in hand down a street.”, “A couple is walking together.”,“A couple is not walking together.”,前两个句子的embedding应该靠近的,第二个句子和第三个句子的embedding应该是远离的。但是有些模型,比如all-MiniLM-L6-v2给前两个句子计算的余弦相似度为0.7,而给第二个和第三个句子计算的余弦相似度为0.86。
本文通过创建自己的否定数据集(negation dataset)来解决这个问题。这个数据集从SNLI数据集里面拿到正样本对,使用GPT-3生成负样本对,组成类似上面例子里面的三元组,其中(anchor, entailment) 组成一个正样本对,而"negative"与"anchor"和"entailment"相对立,同时要保证"negative"和"entailment"在语法上非常相似。该数据集形成了我们前面提到的三元组数据集的子集,第3.3节提供了训练细节。我们对否定数据集的模型评估,包括与其他流行的开源模型的比较分析,如第4.3节所示。
2.4 数据构成
我们的文本对数据集是由32个独立的数据集聚合而成的,表示为 D p a i r s = D 1 ⊔ ⋯ ⊔ D n D_{pairs}=D_1\sqcup \cdots \sqcup D_n Dpairs=D1⊔⋯⊔Dn。在过滤之前规模达到了16亿对,其随后在严格过滤之后被减少到鲁棒的3.85亿个高质量对。相比之下,我们的三元组数据集在过滤前最初共包含113万个条目,过滤后精简为927000个三元组。过滤后数据集的组成如图1a中文本对所示,如图2中三元组所示。这些共同构成了JINA EMBEDINGS模型训练的最终数据集。
3. 训练
训练分为两个阶段。第一阶段的中心是使用大量的二元组文本对训练模型,将整个文本短语的语义整合为一个具有代表性的embedding。第二阶段使用相对较小的三元组数据集,包括一个anchor、一个entailment和一个hard-negative,教它区分相似和不同的文本短语。
3.1 在二元组数据上训练
JINA EMBEDDINGS集合中的每个模型都基于相应尺寸的zero-shot T5模型并使用其进行训练。zero-shot T5模型由encoder-decoder对组成。然而,Ni等人已经证明,与同时部署编码器和解码器相比,仅使用T5模型的编码器组件来计算文本嵌入更有效。因此,JINA embedding models仅使用其各自T5模型的编码器。
在tokenization的时候,INA EMBEDINGS模型使用SentencePiece对输入文本进行分段,并将其编码为WordPiece token。在编码器模型之后,实现了平均池化层(mean pooling layer),以从token embedding生成固定长度的表示。
对于涉及pair的训练过程,我们使用InfoNCE作为对比损失函数。这个函数用于计算 ( q , p ) (q, p) (q,p) 对的的损失,其中 ( q , p ) (q, p) (q,p) 是从B中随机抽取的一个样本对,而B是数据集 D k D^k Dk 的一个batch,batch size为 k k k,函数如下:
loss是通过比较给定的问题 q q q 和它的目标 p p p 的余弦相似度和 q q q 与同batch里面其他目标 p p p 的余弦相似度给计算出来的。我们发现,计算两个方向的损失可以在训练中得到更大的改善。因此损失函数定义如下:
直观地说, L p a i r s N C E \mathcal {L}_{\frac{pairs}{NCE}} LNCEpairs 将目标字符串与所有查询字符串匹配。常数 τ \tau τ 表示温度参数,我们将其设置为 τ = 0.05 τ=0.05 τ=0.05。
3.2 数据采样和二元组训练
我们选择并行方法,同时在所有数据集上进行训练,而不是在单个数据集上顺序训练。我们假设这种并行训练促进了在不同任务中增强的模型泛化。尽管如此,每个训练batch都完全由来自单个数据集的数据组成。这样可以确保在整个批次中执行的损失计算不会将来自不同任务的数据混为一谈。(这里描述的方法在LLM-Embedder里面也用到了。)
我们的数据加载器首先选择一个数据集,然后从中采样必要数量的数据点,为worker(参见第四节)组成一个批次。在训练之前,数据集中的配对会被彻底打乱。对数据集 D i D_i Di 进行采样遵循所有数据集 D i D_i Di 的概率分布 ρ ρ ρ。对 D i D_i Di 的采样概率为 ρ ( D i ) = ∣ D i ∣ s i ∑ j = 1 n ∣ D j ∣ s j ρ(D_i) = \frac {\left|D_i \right|s_i}{\sum^n_{j=1}\left|D_j \right|s_j} ρ(Di)=∑j=1n∣Dj∣sj∣Di∣si ,并且取决于数据集的大小 ∣ D i ∣ |D_i| ∣Di∣和缩放因子 s i s_i si。
考虑到数据集大小的差异,经常从较大的数据集进行采样以防止对较小的数据集过度拟合是至关重要的。此外,我们使用比例因子操纵数据集的采样率,以优先在高质量数据集上进行训练,并实现文本领域之间的平衡。在采样率较高的数据集在训练epoch完成前耗尽其数据的情况下,数据集会被重置,从而使模型能够重新循环其项目。这确保了高采样率数据集在单个训练epoch内贡献多次。
图1b显示了基于采样率使用的每个数据集的比例。在创建了这种调整后的分布后,从较大数据集进行采样的频率显著降低,导致在训练过程中实际使用的对数只有1.8亿对。
3.3 在三元组上的训练
在完成二元组数据集训练后,模型进入下一阶段,该阶段涉及在三元组数据集上进行训练。此阶段使用不同的损失函数,利用负样本来提高模型性能。
我们对各种三元组损失函数进行了实验,发现通过组合多种常用的三元组损失函数可以获得最佳结果。具体来说我们使用infoNCE损失函数的扩展版本 L t r i p l e t s N C E + \mathcal {L}_{\frac{triplets}{NCE+}} LNCE+triplets,如式(2),它利用了额外的负样本,初始训练阶段的反向InfoNCE损失 L t r i p l e t s N C E \mathcal {L}_{\frac{triplets}{NCE}} LNCEtriplets ,如(3) 所示,triplet margin loss函数如(4)所示:
L t r i p l e t s 3 \mathcal {L}_{\frac{triplets}{3}} L3triplets query和target之间的余弦相似度 s ( q , n ) s(q, n) s(q,n),以及query和其对应的负样本 s ( q , n ) s(q, n) s(q,n)。此外,它在这两个值之间建立了最小margin ε = 0.05 ε=0.05 ε=0.05。如果负样本与query更相似,或者违反了margin, L t r i p l e t s 3 \mathcal {L}_{\frac{triplets}{3}} L3triplets将返回一个正值。否则,它的值0,这是通过应用ReLU激活函数来实现的。对于温度参数,我们选择了 τ = 0.05 τ=0.05 τ=0.05 的值。
4. Evaluation
我们进行了全面评估,将我们的模型与其他最先进的模型进行比较(第4.1节),调查我们的过滤管道的影响(第4.2节),并评估模型对否定陈述的敏感性(第4.3节)。第6节提到了训练的细节。为了提供适用于嵌入的各种下游任务的模型性能的全面结果,我们依赖于Muennighoff等人引入的MTEB基准框架。这也包含了BEIR基准测试中包含的所有检索任务。我们还在模型的hugging face页面上发布了在模型上执行它的代码。对于在否定数据集上评估模型,我们使用自己的单独评估工具
4.1 与最先进模型的性能比较
为了衡量JINA embedding集相对于其他类似规模的开源和不开源模型的性能,我们从五个不同的规模类别中选择了具有代表性的模型,如表1所示。此外,我们还对比了包括sentence-t5和gtr-t5 xl和xxl模型,它们分别基于具有30亿和110亿参数的t5模型。这种对比有助于研究这种大规模模型的性能变化。
表6显示了MTEB的句子相似性任务的得分,其中JINA EMBEDINGS集合中的模型在许多任务中都超过了类似大小的模型。值得注意的是,jina-large-v1模型始终提供与十亿参数范围内的模型相当(如果不是更好的话)的结果。jina-base-v1和jina-mall-v1在类似尺寸的模型上也表现出出色的性能,在BIOSESS任务上超过了同行。这突出了使用高度多样化的数据源进行训练的好处。
jina-base-v1始终表现出与专门为检索任务训练的gtr-t5-base相似或更好的性能。然而,它很少与在句子相似性任务中训练的sentence-t5-base的分数相匹配。表8所示的模型在检索任务中的性能评估反映了gtr-t5、sentence-t5和JINA EMBEDINGS之间的相似关系。在这里,经过专门训练的gtr-t5模型在相应的模型大小上始终得分最高。JINA EMBEDDING模型紧随其后,而sentence-t5模型明显靠后。JINA EMBEDINGS系列模型能够在这些任务中保持有竞争力的分数,这突出了多任务训练的优势。如表7所示,jina-large-v1在rerank任务上也取得了极高的分数,优于另外两个模型的large版本。
4.2 过滤步骤的影响
我们通过进行消融研究来评估数据集预处理pipeline的有效性。在这项研究中,我们对Reddit数据集上的最小模型进行了微调,其中分别应用了各种预处理步骤。相应的结果如表3所示。
消融研究的结果强调了语言过滤和一致性过滤作为关键预处理步骤的价值。它们的组合应用可在大多数基准测试中获得最高性能。特别是对于Reddit数据集,我们观察到一致性过滤的应用显著提高了性能,而语言过滤仅略微提高了性能。我们可以通过注意到语言过滤器只删除了17.4%的Reddit数据来解释这种差异,而一致性过滤则屏蔽了84.3。Reddit样本主要是英文的,但许多都是正样本pair,相似度很低,这使得一致性过滤比语言过滤更有效。
然而,这些预处理步骤的有效性在不同的数据集之间确实存在差异。
4.3 否定数据的有效性
为了确定我们的模型对否定数据的有效性,我们根据从否定数据集中划分出来的的测试集对它们进行评估,并将结果与其他开源模型进行比较。我们根据两个指标来衡量性能:一种是计算模型将anchor与entailment放置地比anchor与negative更近的百分比(这是一项容易的任务,因为anchor和negative在语法上是不同的),另一种是计算模型将anchor与entailment放置地比entailment与negative更近的百分比(这是一项艰巨的任务,因为entailment和negative在句法上anchor和entailment更相似)。前者表示为EasyNegation,后者表示为HardNegation。这些评估的结果如表4所示。我们在对三元组数据进行微调之前和之后评估我们的模型,分别表示为 < m o d e l > p a i r w i s e <model>_{pairwise} <model>pairwise 和 < m o d e l > a l l <model>_{all} <model>all。从结果中,我们观察到,在所有模型大小中,对三元组数据(包括我们的否定训练数据集)的微调显著提高了性能,尤其是在Hard-Negative任务中。我们的模型在性能方面与其他最先进的开源模型不相上下,而实现这一点只需同行所需的一小部分训练数据。
5. 相关工作
多年来,embedding模型领域取得了重大进展,开发了各种具有不同架构和训练pipelines的模型。比如Sentence-BERT使用BERT来生成句子的embedding。相似的,基于T5模型encoder结构的Sentence-T5在很多测试基准上的表现超过了Sentence-BERT。Muennighoff的论文SGPT: GPT Sentence Embeddings for Semantic Search 强调了编码器对句子嵌入的有效性,并与另一种探索解码器使用的方法进行了对比。知识蒸Distilling the Knowledge in a Neural Network为模型训练提供了一种替代方法。在这种设置中,一个较大的、预先训练过的模型充当导师,在训练期间指导一个较小的模型。这种方法可以与对比损失函数无缝集成,为未来的研究提供了途径。
embedding模型也可以基于其功能来表征。例如,虽然一些模型被设计为仅embed queries,但其他模型被训练为embed queries和特定instructions,从而生成依赖于任务的embeddings。使用基于T5的模型的一个例子是大型双编码器,它针对检索任务进行了微调,并直接计算检索分数。
最近的研究强调了对比预训练与对hard-negative进行微调的好处。这两种方法都在多个基准上取得了SOTA,还将一致性过滤作为其预处理管道的一部分。
6. 训练细节
对于训练,我们使用A100 GPU,并利用DeepSpeed第2阶段的分布式训练策略进行有效的多设备管理。为了训练我们的模型,我们使用AdamW优化器,再加上一个学习率调度器,该调度器在训练的初始阶段调整学习率。表5列出了在整个训练过程中在所有三个模型中使用的超参数。
7. 总结
本文介绍了JINA EMBEDINGS嵌入模型集,表明与具有可比backbone的其他模型相比,可以在大幅减少训练数据量的同时,实现各种任务的竞争性能。通过对MTEB基准的广泛评估,我们表明,与使用更大但质量更低的数据集进行训练相比,采用明智的数据过滤技术可以提高性能。这些发现显著改变了范式,表明为嵌入任务训练大型语言模型可以用比以前假设的更少的数据进行,从而可能节省训练时间和资源。
然而,我们承认当前方法和JINA EMBEDINGS集合性能的局限性。在二元组训练过程中,采样率的选择是基于启发式方法的。鉴于这些采样率的搜索空间很大,我们依靠直觉和对数据集的熟悉程度,将价值较高的数据集优先于价值较低的数据集。然而,这种主观的方法指出为未来的进步需要更客观的方法。
此外,JINA EMBEDINGS套装在一些任务上也有所欠缺。例如,在我们的否定数据集上计算句子相似性(如第4.3节所述)没有达到我们的预期(见表4),也没有在MTEB基准上获得分类和聚类任务的竞争分数。这些性能缺陷表明,在我们的训练数据中,这些类型的任务的表现可能存在缺陷,需要进一步调查。
展望未来,我们的目标是完善我们的训练流程,以提供具有改进性能和更大序列长度的模型。我们未来的努力还包括生成双语训练数据,训练能够在两种语言之间理解和翻译的嵌入模型,从而扩大JINA EMBEDINGS集合的实用性和多功能性。
相关文章:

论文阅读:JINA EMBEDDINGS: A Novel Set of High-Performance Sentence Embedding Models
Abstract JINA EMBEDINGS构成了一组高性能的句子嵌入模型,擅长将文本输入转换为数字表示,捕捉文本的语义。这些模型在密集检索和语义文本相似性等应用中表现出色。文章详细介绍了JINA EMBEDINGS的开发,从创建高质量的成对(pairwi…...
计数排序.
一.定义: 计数排序(Counting Sort)是一种非比较性质的排序算法,其时间复杂度为O(nk)(其中n为待排序的元素个数,k为不同值的个数)。这意味着在数据值范围不大并且离散分布的情况下,规…...

flink中配置Rockdb的重要配置项
背景 由于我们在flink中使用了状态比较大,无法完全把状态数据存放到tm的堆内存中,所以我们选择了把状态存放到rockdb上,也就是使用rockdb作为状态后端存储,本文就是简单记录下使用rockdb状态后端存储的几个重要的配置项 使用rockdb状态后端…...
代码随想录二刷 | 数组 | 有序数组的平方
代码随想录二刷 | 数组 | 有序数组的平方 题目描述题目分析 & 代码实现暴力排序双指针法 题目描述 977.有序数组的平方 给你一个按 非递减顺序 排序的整数数组 nums,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 …...

基于单片机C51全自动洗衣机仿真设计
**单片机设计介绍, 基于单片机C51全自动洗衣机仿真设计 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于单片机C51的全自动洗衣机仿真设计是一个复杂的项目,它涉及到硬件和软件的设计和实现。以下是对这…...

「Verilog学习笔记」实现3-8译码器①
专栏前言 本专栏的内容主要是记录本人学习Verilog过程中的一些知识点,刷题网站用的是牛客网 分析 ① 本题要求根据38译码器的功能表实现该电路,同时要求采用基础逻辑门实现,那么就需要将功能表转换为逻辑表达式。 timescale 1ns/1nsmodule d…...

Centos(Linux)服务器安装Dotnet8 及 常见问题解决
1. 下载dotnet8 sdk 下载 .NET 8.0 SDK (v8.0.100) - Linux x64 Binaries 拿到 dotnet-sdk-8.0.100-linux-x64.tar.gz 文件 2. 把文件上传到 /usr/local/software 目录 mkdir -p /usr/local/software/dotnet8 把文件拷贝过去 mv dotnet-sdk-8.0.100-linux-x64.tar.gz /usr/loc…...

最强人工智能ChatGPT引领AIGC发展
从公众号转载,关注微信公众号掌握更多技术动态 --------------------------------------------------------------- ——AI不会淘汰所有人,但会淘汰不懂AI的人 一、最强人工智能GPT-4 Turbo 在前不久的OpenAI开发者大会,正值Chatgpt3.5发布一…...
10.Oracle的同义词与序列
oracle11g的同义词与序列 一、Oracle同义词:1、同义词的基本使用2、同义词的相关权限3、同义词的作用范围 二、Oracle序列:1、序列的基本操作2、序列的相关权限 一、Oracle同义词: 同义词是一个数据库对象的别名,它允许用户通过不…...
【周报2023-11-10】
周报2023-11-10 本周的主要工作下周工作计划 本周的主要工作 本周的主要工作就有三个 第一个是进行对我们目前的高企项目的完善情况第二个是对于高企项目的接口对接情况以及细节的把控第三个为新的小程序项目做准备工作 首先第一个高企项目的完善情况得话主要是页面上 对于原…...

搜维尔科技:业内普遍选择Varjo头显作为医疗VR/AR/XR解决方案
Varjo 的人眼分辨率混合现实和虚拟现实头显将医疗专业人员的注意力和情感投入提升到更高水平。借助逼真的 XR/VR,医疗和保健人员可以为最具挑战性的现实场景做好准备! 在虚拟、增强和混合现实中进行最高水平的训练和表现 以逼真的 3D 方式可视化医疗数据…...

数据结构02附录01:顺序表考研习题[C++]
图源:文心一言 考研笔记整理~🥝🥝 之前的博文链接在此:数据结构02:线性表[顺序表链表]_线性链表-CSDN博客~🥝🥝 本篇作为线性表的代码补充,每道题提供了优解和暴力解算法…...

ClientDateSet:Cannot perform this operation on a closed dataset
一、问题表现 Delphi 三层DataSnap,使用AlphaControls控件优化界面,一窗口编辑时,出现下列错误提示: 编译通过,该窗口中,重新显示数据,下图: 相关代码: procedure…...

python中列表的基础解释
列表: 一种可以存放多种类型数据的数据结构 列表的创建: 1.用【】创建列表 #创建一个空列表 list1[] #创建一个非空列表 list2 [zhang,li,ying,1,2,3] #输出内容及类型 print(list1,type(list1)) print(list2,type(list2))结果: 2.使用list…...
『力扣刷题本』:链表分割
一、题目 现有一链表的头指针 ListNode* pHead,给一定值x,编写一段代码将所有小于x的结点排在其余结点之前,且不能改变原来的数据顺序,返回重新排列后的链表的头指针。 二、思路解析 首先,让我们列出我们需要做的事情&…...

FISCOBCOS入门(十)Truffle测试helloworld智能合约
本文带你从零开始搭建truffle以及编写迁移脚本和测试文件,并对测试文件的代码进行解释,让你更深入的理解truffle测试智能合约的原理,制作不易,望一键三连 在windos终端内安装truffle npm install -g truffle 安装truffle时可能出现网络报错,多试几次即可 truffle --vers…...

Unity Text文本首行缩进两个字符的方法
Text文本首行缩进两个字符的方法比较简单。通过代码把"\u3000\u3000"加到文本字符串前面即可。 参考如下代码: TMPtext1.text "\u3000\u3000" "这是一段有首行缩进的文本内容。\n这是第二行"; 运行效果如下图所示: 虽…...
TS的函数重载、类型合并、类型断言
函数重载 let list5 [1, 2, 3, 4]function findNum(id: number): number[]function findNum(): number[]function findNum(list: number[]): number[]function findNum(ids?: number | number[]): number[] {if (typeof ids number) {return list5.filter((num) > num …...

JVM:字节码文件,类的生命周期,类加载器
JVM:字节码文件,类的生命周期,类加载器 为什么要学这门课程 1. 初识JVM1.1. 什么是JVM1.2. JVM的功能1.3. 常见的JVM 2. 字节码文件详解2.1. Java虚拟机的组成2.2. 字节码文件的组成2.2.1. 以正确的姿势打开文…...

【IPC】消息队列
1、IPC对象 除了最原始的进程间通信方式信号、无名管道和有名管道外,还有三种进程间通信方式,这 三种方式称之为IPC对象 IPC对象分类:消息队列、共享内存、信号量(信号灯集) IPC对象也是在内核空间开辟区域,每一种IPC对象创建好…...

国防科技大学计算机基础课程笔记02信息编码
1.机内码和国标码 国标码就是我们非常熟悉的这个GB2312,但是因为都是16进制,因此这个了16进制的数据既可以翻译成为这个机器码,也可以翻译成为这个国标码,所以这个时候很容易会出现这个歧义的情况; 因此,我们的这个国…...
椭圆曲线密码学(ECC)
一、ECC算法概述 椭圆曲线密码学(Elliptic Curve Cryptography)是基于椭圆曲线数学理论的公钥密码系统,由Neal Koblitz和Victor Miller在1985年独立提出。相比RSA,ECC在相同安全强度下密钥更短(256位ECC ≈ 3072位RSA…...

【Redis技术进阶之路】「原理分析系列开篇」分析客户端和服务端网络诵信交互实现(服务端执行命令请求的过程 - 初始化服务器)
服务端执行命令请求的过程 【专栏简介】【技术大纲】【专栏目标】【目标人群】1. Redis爱好者与社区成员2. 后端开发和系统架构师3. 计算机专业的本科生及研究生 初始化服务器1. 初始化服务器状态结构初始化RedisServer变量 2. 加载相关系统配置和用户配置参数定制化配置参数案…...

ESP32读取DHT11温湿度数据
芯片:ESP32 环境:Arduino 一、安装DHT11传感器库 红框的库,别安装错了 二、代码 注意,DATA口要连接在D15上 #include "DHT.h" // 包含DHT库#define DHTPIN 15 // 定义DHT11数据引脚连接到ESP32的GPIO15 #define D…...
工程地质软件市场:发展现状、趋势与策略建议
一、引言 在工程建设领域,准确把握地质条件是确保项目顺利推进和安全运营的关键。工程地质软件作为处理、分析、模拟和展示工程地质数据的重要工具,正发挥着日益重要的作用。它凭借强大的数据处理能力、三维建模功能、空间分析工具和可视化展示手段&…...
三体问题详解
从物理学角度,三体问题之所以不稳定,是因为三个天体在万有引力作用下相互作用,形成一个非线性耦合系统。我们可以从牛顿经典力学出发,列出具体的运动方程,并说明为何这个系统本质上是混沌的,无法得到一般解…...
OpenLayers 分屏对比(地图联动)
注:当前使用的是 ol 5.3.0 版本,天地图使用的key请到天地图官网申请,并替换为自己的key 地图分屏对比在WebGIS开发中是很常见的功能,和卷帘图层不一样的是,分屏对比是在各个地图中添加相同或者不同的图层进行对比查看。…...

智能分布式爬虫的数据处理流水线优化:基于深度强化学习的数据质量控制
在数字化浪潮席卷全球的今天,数据已成为企业和研究机构的核心资产。智能分布式爬虫作为高效的数据采集工具,在大规模数据获取中发挥着关键作用。然而,传统的数据处理流水线在面对复杂多变的网络环境和海量异构数据时,常出现数据质…...
Java + Spring Boot + Mybatis 实现批量插入
在 Java 中使用 Spring Boot 和 MyBatis 实现批量插入可以通过以下步骤完成。这里提供两种常用方法:使用 MyBatis 的 <foreach> 标签和批处理模式(ExecutorType.BATCH)。 方法一:使用 XML 的 <foreach> 标签ÿ…...

安宝特案例丨Vuzix AR智能眼镜集成专业软件,助力卢森堡医院药房转型,赢得辉瑞创新奖
在Vuzix M400 AR智能眼镜的助力下,卢森堡罗伯特舒曼医院(the Robert Schuman Hospitals, HRS)凭借在无菌制剂生产流程中引入增强现实技术(AR)创新项目,荣获了2024年6月7日由卢森堡医院药剂师协会࿰…...