信息检索(39):Condenser: a Pre-training Architecture for Dense Retrieval

Condenser: a Pre-training Architecture for Dense Retrieval

  • 摘要
  • 1 引言
  • 2 相关工作
  • 3 方法
    • 3.1 前提
    • 3.2 Transformer 编码器的问题
    • 3.3 Condenser
    • 3.4 Transformer 编码器的 Condenser
  • 4 实验
    • 4.1 预训练
    • 4.2 句子相似度
    • 4.3 开放域问答检索
    • 4.4 Web search 检索
  • 5 注意力分析
  • 6 结论


发布时间(2021)


用于密集检索的预训练架构

1)结构准备:为了目标任务,调整LM内部激活的微调过程
普通双编码器微调缺乏结构准备,没能学习到好的表示
2)U-net--》Funnel Transformer--》Condenser:本文是为了学习密集的信息聚合
3)两个损失:
a)cls-late + 早期hidden-state --》condenser 头 --》预测 mask
b)后期hidden-state --》预测 mask
4)两个发现
a)预训练和微调的注意力结构相近的任务,表现更好
b)针对于检索任务来说,需要更广泛的注意力来获取全局的信息

摘要

预训练的 Transformer 语言模型 (LM) 已成为首选的文本表示编码器。先前的研究对深度 LM 进行了微调,以将文本序列(例如句子和段落)编码为单个密集向量表示,以实现高效的文本比较和检索。但是,密集编码器需要大量数据和复杂的技术才能有效训练,并且在数据量较少的情况下会受到影响。本文发现一个关键原因是标准 LM 的内部注意力结构尚未准备好用于密集编码器,密集编码器需要将文本信息聚合到密集表示中。我们建议使用一种新颖的 Transformer 架构 Condenser 对密集编码器进行预训练,其中 LM 预测条件基于密集表示。我们的实验表明,在各种文本检索和相似性任务上,Condenser 的表现都比标准 LM 有了很大的提高。

1 引言

语言模型 (LM) 预训练在学习文本编码器方面非常有效,可以针对许多下游任务进行微调(Peters 等人,2018 年;Devlin 等人,2019 年)。深度双向 Transformer 编码器(Vaswani 等人,2017 年)像 BERT(Devlin 等人,2019 年)这样的 LM 是最先进的。最近的研究对 CLS 标记进行微调,将输入文本序列编码为单个向量表示(Lee 等人,2019 年;Chang 等人,2020 年;Karpukhin 等人,2020 年)。生成的模型称为密集编码器或双编码器。微调将一些实际语义(例如文本相似性或相关性)与向量相似性相关联,因此可以使用向量进行有效的文本比较或通过内积检索。尽管双编码器效率很高,但它们很难训练。即使有足够的数据,双编码器仍然需要精心设计的复杂方法才能有效训练(Xiong 等人,2021 年;Qu 等人,2020 年;Lin 等人,2020 年)。在数据较少的情况下,它们的性能也会受到很大影响(Karpukhin 等人,2020 年;Thakur 等人,2020 年;Chang 等人,2020 年)。深度 LM 的另一种常见用途是交叉编码器,将比较的文本对直接传入并使用注意整体标记进行预测。与双编码器相比,交叉编码器训练更容易,并且在数据较少的情况下对于相似性和排名任务有效(Devlin 等人,2019 年;Yang 等人,2019 年)。

然而,基于相同的 LM,双编码器和交叉编码器具有相似的语言理解能力。为了解释训练双编码器的难度(交叉编码器没有这种难度),我们研究了预训练 LM 的内部结构。我们发现像 BERT 这样直接从预训练中出来的 LM 具有非最佳的注意力结构。特别是,它们没有接受过将复杂信息聚合成单一密集表示的训练。我们将微调过程中调整 LM 内部激活以将其知识引导出目标任务的努力称为结构准备。我们认为双编码器微调效率低下,因为缺乏结构准备。许多更新用于调整模型注意力结构,而不是学习良好的表示

根据我们的观察,我们建议在预训练期间解决结构准备问题。我们引入了一种新颖的 Transformer 预训练架构 Condenser,它通过对 DENSE 表示进行主动条件 LM 预训练来建立结构准备。与以前针对特定任务进行预训练的工作不同,Condenser 针对双编码器结构进行预训练。我们的结果表明了结构准备的重要性。我们尝试了句子相似性任务以及问答和网络搜索的检索。我们发现在低数据设置下,在相同的测试时间架构下,Condenser 比标准 LM 有显着的改进,并且表现出与强大的任务特定预训练模型相当的性能。通过大量训练数据,我们发现 Condenser 检索器更容易优化,优于以前使用复杂技术训练的模型,只需一轮负挖掘

2 相关工作

Transformer 双编码器
LM 预训练,然后进行任务微调,已成为 NLP 中的一个重要范例 (Howard and Ruder, 2018)。SOTA 模型采用 Transformer 架构 (Devlin et al, 2019; Liu et al, 2019; Yang et al, 2019; Lan et al, 2020)。应用深度 Transformer 的一个挑战是,当用于从大型集合中检索文本时,它们的计算成本很高。受此启发,Reimers 和 Gurevych (2019) 提出了 SBERT,它从 BERT 训练双编码器并使用向量积进行有效的句子相似度比较。Transformer 双编码器很快也被用作密集检索器 (Lee et al, 2019; Chang et al, 2020; Karpukhin et al, 2020; Gao et al, 2021b)。
密集检索
密集检索使用内积将编码的查询向量与语料库文档向量进行比较。虽然有关于高效交叉编码器的研究(Gao et al, 2020; MacAvaney et al, 2020),但此类模型对于全语料库检索而言仍然成本过高。通过将语料库预编码为 MIPS(Johnson et al, 2017; Guo et al, 2020)索引,检索可以以毫秒级延迟在线运行。另一种方法是最近提出的上下文化稀疏检索模型(Gao et al, 2021a)。相比之下,密集检索更易于使用,并由 FAISS(Johnson et al, 2017)等更成熟的软件支持。
预训练双编码器
Lee 等人 (2019) 是首批展示 Transformer 双编码器对密集检索有效性的人之一。他们建议使用逆完形填空任务 (ICT) 进一步预训练 BERT。ICT 使用段落片段对和完整段落作为伪训练对。Chang 等人 (2020) 发现 ICT 和其他相关任务是强双编码器的“关键成分”。他们的结果还表明,未经预训练的模型在低数据设置下无法产生有用的检索结果。Guu 等人 (2020) 建议对检索器和阅读器一起进行预训练,以构建端到端 QA 系统。上述方法是基于对比损失改进双编码器训练的专门任务特定解决方案。本文对学习问题进行了解释,并提出了一种使用通用语言模型预训练建立通用解决方案的架构。我们还注意到,语言模型和对比预训练是正交的想法。在后续工作中,我们展示了在 Condenser 语言模型预训练中添加对比学习后进一步提高的性能(Gao and Callan,2021)。

有效的密集检索器
Karpukhin 等人 (2020) 发现,仔细微调 BERT 可以产生比早期预训练的密集检索系统更好的结果。为了进一步提高密集检索器的最终性能,后来的研究研究了更好的微调技术。使用学习过的检索器挖掘硬负样本并用它们重新训练另一个检索器被发现很有帮助 (Karpukhin 等人,2020;Qu 等人,2020)。ANCE (Xiong 等人,2021) 在训练期间每隔一段时间主动挖掘一次硬负样本,以防止梯度减小。它分配额外的资源来重复更新和检索语料库检索索引。 (Gao 等人,2021b) 提出联合学习一对密集和稀疏系统,以缓解低维密集向量的容量问题。除了微调之外,使用更复杂的知识蒸馏损失来学习基于软标签的双编码器也被发现很有用(Chen et al, 2020; Lin et al, 2020)。他们首先学习一个教师模型,并在训练时使用其预测来优化密集检索器。这些工作都旨在在训练期间产生更好的梯度更新,而 Condenser 旨在更好地初始化模型。我们还将在实验中展示 Condenser 和 hard negatives 的综合改进。另一类工作质疑单向量表示的容量,并建议使用多向量表示(Luan et al, 2020)。容量定义了性能上限,是除训练(优化)之外的另一个问题,即如何达到上限。

句子表征
我们还想与通用句子表征和编码器方面的工作(Kiros 等人,2015 年;Conneau 等人,2017 年;Cer 等人,2018 年)进行区分。它们是基于特征的方法,而不是微调(Houlsby 等人,2019 年)。在评估中,他们专注于将学习到的嵌入用作广泛任务的通用特征(Conneau 和 Kiela,2018 年)。本文考虑了整个模型的任务特定微调,并重点关注目标任务性能。

3 方法

本节讨论了 Condenser 背后的动机、其设计及其预训练程序。

3.1 前提

Transformer 编码器
许多最新深度 LM 都采用了 Transformer 编码器的架构。它接收一个文本序列,将其嵌入并通过一组 L 个自注意力 Transformer 块传递。形式上,给定输入文本 x = [x1; x2; :::],我们可以迭代地写出,
直观地讲,Transformer 块会细化每个 token 对序列中所有 token 的表示条件,以有效地嵌入它们。

Transformer LM 预训练
许多成功的 Transformer Encoder LM(例如 BERT)都是使用掩码语言模型 (MLM) 任务进行训练的。 MLM 会掩蔽一部分输入标记并要求模型对其进行预测。对于位置 i 处的掩蔽标记 xi,其对应的最终表示 h L i 用于预测实际 xi。 训练使用交叉熵损失,
一个特殊的标记(通常称为 CLS)被添加到文本的其余部分中并进行编码。
一些模型在预训练期间明确训练 CLS,特别是 BERT 的下一句预测(NSP;Devlin 等人(2019)),而其他模型则隐式地训练 CLS(Yang 等人,2019;Liu 等人,2019)。

3.2 Transformer 编码器的问题

回想一下,在 Transformers 中,所有 token(包括 CLS)都仅通过注意来接收序列中其他 token 的信息。因此,注意模式定义了 CLS 聚合信息的有效性。为了理解 CLS 的注意行为,我们借用了 Clark et al (2019) 对 BERT 的分析:1)在大多数中间层中,CLS token 具有与其他文本 token 相似的注意模式,并且不受其他 token 的关注,2)直到最后一层,CLS 在整个序列上都具有独特的广泛注意力来执行 NSP 任务。换句话说,CLS token 在许多中间层中处于休眠状态,仅在最后一轮注意中重新激活。我们认为,有效的双编码器应该通过所有层主动聚合来自整个句子的不同粒度的信息,而标准预训练 LM 中的这种结构并不能立即进行微调。我们将通过第 4 节中的实验和第 5 节中对 BERT、ICT 和提出的 Condenser 的注意力的定量分析来验证这一说法。

3.3 Condenser

在以左右上下文为条件的 Transformer 编码器 LM(Devlin 等人,2019)的基础上,我们提出了双编码器预训练架构 Condenser,它在 LM 预训练中积极地以 DENSE 表示为条件

模型设计
与 Transformer Encoder 类似,Condenser 被参数化为 Transformer 块的堆栈,如图 1 所示。我们将它们分为三组,L e 早期编码器骨干层、L l 晚期编码器骨干层和 L h Condenser 头层。输入首先由骨干层编码,

Condenser头部
关键设计是,我们将早期输出与头部短路,它接收一对晚期-早期表示,
我们用 MLM 损失函数训练 head 的输出
我们遵循 Devlin 等人(2019)中的掩蔽方案来对抗训练测试差异。
在 Condenser 中,后期编码器骨干可以进一步细化标记表示,但只能通过 h late cls(后期 CLS)传递新信息。因此,后期 CLS 表示需要在骨干的后期聚合新生成的信息,然后头部可以根据后期 CLS 进行条件反射以进行 LM 预测。同时,跳过连接早期层,我们消除了编码局部信息和输入文本句法结构的负担,将 CLS 重点放在输入文本的全局含义上。层数 L e 和 L l 控制信息的分离。
Condenser 的架构灵感来自 Funnel Transformer(Dai 等人,2020 年),而 Funnel Transformer 本身灵感来自计算机视觉领域的 U-net(Ronneberger 等人,2015 年)。Funnel Transformer 在前向过程中将序列长度缩短 4 倍,并使用 2 层 Transformer 将长度压缩的序列解码为跳跃连接的全长表示。Funnel Transformer 旨在加快预训练速度,而我们的 Condenser 则学习密集的信息聚合。

微调
Condenser 头部是一个预训练时间组件,在微调期间被丢弃。 微调训练 late CLS h late cls 并将梯度反向传播到骨干中。换句话说,Condenser 简化为其编码器骨干,或有效地成为用于微调的 Transformer 编码器;头部仅用于指导预训练。在微调期间,Condenser 具有与类似结构的 Transformer 相同的容量。在实践中,Condenser 可以作为典型 Transformer LM(如 BERT)的嵌入式权重替代品。

3.4 Transformer 编码器的 Condenser

在本文中,我们选择使用预训练的 Transformer LM 权重初始化 Condenser。这符合我们的计​​算预算,避免了从头开始进行预训练的巨额成本。这也让我们可以直接与原始 LM 进行比较。给定一个预先训练的 LM,我们用其权重初始化整个 Condenser 主干,并随机初始化头部。为了防止从随机头部反向传播的梯度破坏主干权重,我们通过对主干后期输出执行 MLM 来设置语义约束,
这一约束背后的直觉是,编码每个 token 表示 h late 和序列表示 h late cls 共享类似的机制,不会互相干扰。因此,h late 仍可用于 LM 预测。然后将总损失定义为两个 MLM 损失的总和,
输出投影矩阵 W 在两个 MLM 损失之间共享,以减少参数总数和内存使用量。

4 实验

在本节中,我们首先介绍如何从 BERT 预训练 Condenser 的细节。然后,我们的微调实验研究了 Condenser 在低数据和高数据设置下的影响。为了评估低数据,我们通过对原始训练集进行子采样,对类似于 Chang et al (2020) 的较小训练集进行采样。我们在运行过程中保持开发/测试集不变,以便直接比较。我们首先使用短句级任务验证我们的模型,然后根据先前的研究(Chang et al, 2020; Xiong et al, 2021)评估开放式问答和网络搜索任务中的检索。我们将研究如何将原始 BERT 替换为 Condenser 来提高性能,以及这些改进与各种改进的训练技术相比如何。

4.1 预训练

我们从流行的 12 层 BERT 基础初始化 Condenser 主干层,并且仅从头开始初始化 2 层头部。预训练按照第 3.4 小节中描述的步骤运行。我们使用均等分割,6 个早期层和 6 个后期层。我们在与 BERT 相同的数据上进行预训练:英文维基百科和 BookCorpus。这确保 BERT 和 Condenser 仅在架构上有所不同,以便直接比较。我们训练了 8 个 epoch,使用 AdamW,学习率为 1e-4,线性计划,预热率为 0.1。由于计算预算限制,我们无法调整最佳层分割、头部大小或训练超参数,但将这些留待以后的工作。我们在 4 个 RTX 2080ti 上使用梯度累积进行训练。该过程大约需要一周时间才能完成。预训练后,我们丢弃 Condenser 头部,得到一个与 BERT 相同架构的 Transformer 模型。所有微调实验都共享这个单一的预训练权重。

4.2 句子相似度

结果表 1 显示了不同训练规模在 STS-b 上的表现。NLI 预训练的 BERT 和 Condenser 始终优于 BERT,并且在训练规模较小的情况下具有更大的优势。此外,仅使用 500 个训练对,它们的表现就优于最佳通用句子编码器 (USE) 基线。 对于 Wiki 部分,在表 2 中,我们观察到 BERT 和 Condenser 模型之间的结果几乎相同,它们的表现优于 BERT 之前的基线。同时,即使训练规模小至 1K,我们也只观察到比使用所有数据进行训练的准确率下降约 10%。即使不使用 NSP 任务进行训练,Condenser 仍然有效。

4.3 开放域问答检索

在本节中,我们通过开放式 QA 段落检索实验测试双编码器(Chang 等人,2020 年;Karpukhin 等人,2020 年)。与句子级任务相比,搜索任务明确使用嵌入空间的学习结构,其中相似性对应于一对查询、段落之间的相关性。我们采用 DPR(Karpukhin 等人,2020 年)设置,在训练中使用对比损失对 LM 进行微调,针对查询 q 计算正文档 d + 对一组负文档 fd − 1 ; d− 2 ; ::d− l ::g 的负对数似然。
负样本可以来自各种来源:随机、顶级 BM25、硬负样本或像 ANCE 一样经过复杂采样。我们使用 BM25 负样本进行低数据实验以节省计算量,并在完整训练实验中使用挖掘出的硬负样本 (HN)。

结果 在表 3 中,我们记录了使用低数据量的 NQ 和 TQA 的测试集性能。我们观察到 ICT 和 Condenser 都优于 vanilla BERT,在 1K 训练规模下差距尤其大,与全尺寸训练相比,Top-20 Hit 下降不到 10%,Top-100 下降不到 5%。 当考虑到相对于无监督 BM25 的增益时,改进更为显著。ICT 和 Condenser 表现出相当的性能,ICT 在 NQ 上略胜一筹,而 Condenser 在 TQA 上略胜一筹。 这也与 Lee et al (2019) 的结果一致,即 ICT 专注于 NQ。结果表明,通用 LM 训练的 Condenser 可以成为任务特定的预训练模型 ICT 的有效替代方案。

在表 4 中,我们将使用完整训练数据训练的 Condenser 与其他系统进行了比较。在 NQ 上,密集检索器的性能均优于词汇检索器,尤其是那些使用硬否定的检索器。 我们看到 Condenser 在 Top-20 中表现最佳,在 Top-100 中与 RocketQA 的差距在 0.1 以内,而且不需要复杂且昂贵的训练流程。在 TQA 上,我们看到 GAR(具有深度 LM 查询扩展的词汇)的性能优于除 Condenser 之外的所有密集系统。这表明 TQA 可能需要密集检索器难以捕捉的细粒度术语级信号。尽管如此,我们发现 Condenser 仍然可以捕捉这些信号,并且比所有其他词汇和密集系统表现更好。

4.4 Web search 检索

在本节中,我们将研究 Condenser 检索器在网络搜索任务中的表现。设置类似于开放式问答。网络搜索数据集的一个问题是它们噪声较大,包含大量假阴性(Qu 等人,2020 年)。我们研究了 Condenser 是否有助于抵抗这种噪声。
由于段落检索是本文的重点,我们将长文档检索的讨论推迟到 A.4。

结果
在表 5 中,我们再次发现,在低数据量的情况下,ICT 和 Condenser 初始化检索器的表现远胜于 BERT。当它获得 10K 训练数据(占整个训练集的 2%)时,所有密集检索器的表现都优于 BM25,而 ICT 和 Condenser 保持了优于 BERT 的优势。在完整训练集上训练后,Condenser 在召回率和 NDCG 方面已经表现出与 BERT 相当的性能。我们还观察到,Condenser 可以在各种训练规模下胜过 ICT,这表明 Condenser 的通用 LM 预训练有助于它比特定于任务的 ICT 更好地跨领域推广。
在表 6 中,我们比较了各种系统的完整训练性能。我们发现各种训练技术有助于显著提高原始微调的性能。 Condenser 可以进一步大幅超越这些模型,显示出预训练带来的好处。无需涉及复杂的训练技术,也无需增加模型/检索的负担,Condenser 的性能已经略优于 RocketQA。
我们进一步在表 7 中与 RocketQA 变体进行了比较,以了解成本更高的策略:非常大的批量、去噪难样本和数据增强。RocketQA 作者发现挖掘出的难样本包含对双编码器训练不利的假样本,如表所示,并建议使用交叉编码器对其进行重新标记和去噪,但这一过程的成本比难样本挖掘高出数千倍。他们进一步采用了数据增强技术,使用交叉编码器标记外部数据。在这里,我们看到使用批量大小 64 和 BM25 样本训练的 Condenser 比批量大小为 8192 的 RocketQA 具有更好的性能。更重要的是,Condenser 能够抵抗挖掘出的难样本中的噪音,使用挖掘出的难样本获得不错的提升训练,而 RocketQA 的性能在没有去噪的情况下会大幅下降。我们看到,Condenser 消除了许多复杂训练技术的需求:它仅次于使用外部数据(数据增强)的 RocketQA 变体。

有趣的是,我们运行的 BERT (DPR) + HN 在所有检索任务中都比 BERT 有显著的性能提升,有时甚至比 QA 和 Web 搜索上的主动挖掘 ANCE 更好。 这与 RocketQA 中的发现相矛盾,即直接挖掘困难负样本会损害性能。 回想一下,我们的困难负样本是由 Condenser 检索器挖掘的,我们推测它产生了更高质量的困难负样本。这一发现表明,挖掘出的困难负样本可能并不依赖于检索器。存在普遍更好的困难负样本,可以使用更有效的检索器找到

5 注意力分析

Condenser 建立在这样一个理念之上:典型的预训练 LM 缺乏适当的注意力结构。我们已经在上一节中看到,我们可以通过使用 Condenser 进行预训练来解决这个问题。在本节中,我们将提供更深入的注意力分析:我们比较预训练/微调的 BERT、ICT 和 Condenser 之间的注意力行为。我们使用 Clark et al (2019) 提出的分析方法,通过测量 CLS 的注意力熵来表征其注意力模式。熵越高,注意力越广泛,熵越低,注意力越集中。与 Clark et al (2019) 类似,我们展示了每一层的 CLS 注意力熵,对所有头部取平均值,并对 1k 个随机挑选的维基百科部分取平均值。

在图 2 中,我们绘制了各种模型的 CLS 的注意力。我们在图 2a 中看到,BERT 在预训练模型和微调模型之间的注意力模式发生了巨大变化。这再次证实了我们的理论,即典型的 Transformer Encoder LM 尚未准备好微调为双编码器,但需要经历巨大的内部结构变化。相比之下,我们在图 2b、2c 中看到,任务特定的预训练 ICT 和 LM 预训练 Condenser 只有很小的变化,保留了一般的注意力结构。换句话说,ICT 和 Condenser 都建立了结构准备,但方式非常不同。ICT 和 Condenser 在后面的层中都有扩大注意力(增加熵),这可能是因为实际的搜索任务需要聚合比预训练更多的高级概念。这里的结果再次证实了我们的理论,即现成的结构可以更容易训练;它们的结构只需要很小的改变就可以作为有效的双编码器工作。

6 结论

从预训练的 LM 初始化器(如 BERT)进行微调已成为 NLP 中非常常见的做法。 然而,在本文中,我们质疑像 BERT 这样的模型是否是双编码器最合适的初始化器。 我们发现典型的预训练 LM 没有为双编码器准备的内部注意力结构。 它们无法有效地将信息压缩为单个向量密集表示。我们提出了一种新的架构 Condenser,它通过 LM 预训练建立了结构上的准备就绪。我们表明 Condenser 可有效用于各种任务、句子相似性、问答检索和网络搜索检索。在数据较少的情况下,Condenser 表现出与特定于任务的预训练模型相当的性能。它还为学习有效检索器提供了一个新的预训练视角,而不是微调策略。经过充分的训练,Condenser 和直接微调可以成为许多复杂训练技术的轻量级替代方案。

Condenser 的积极结果表明,结构准备度是易于训练的双编码器的基本属性。我们的注意力分析表明,Condenser 和任务特定的预训练模型都建立了结构准备度,这表明任务特定的目标可能不是必需的。研究人员可以利用这一发现来指导双编码器更好的 LM 的研究,例如,探索使用其他 LM 目标训练 Condenser。

BERT 的一大优势是,经过一次繁琐的预训练后,使用这种通用模型初始化器可以轻松进行微调。然而,对于 BERT 双编码器,尤其是检索器来说,情况并非如此,它需要仔细且昂贵的训练。Condenser 将 BERT 的这一优势扩展到双编码器。预算有限的从业者可以用我们预先训练的 Condenser 作为初始化器替换 BERT,以立即获得性能提升。同时,对于那些以最佳性能为目标的人来说,可以将训练技术和 Condenser 结合起来。正如我们已经展示的 hard negatives 和 Condenser 的结合效果一样,可以进一步结合复杂但更好的技术来训练 Condenser

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

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

相关文章

Adobe Premiere Pro(Pr)安装包软件下载

一、简介 Adobe Premiere Pro(简称Pr)是由Adobe公司开发的一款功能强大的视频编辑软件。它支持多平台使用,包括Windows和Mac系统,并且拥有良好的兼容性和高效的性能。Premiere Pro不仅提供了视频剪辑、特效添加、音频处理等基本功…

《从C/C++到Java入门指南》- 9.字符和字符串

字符和字符串 字符类型 Java 中一个字符保存一个Unicode字符,所以一个中文和一个英文字母都占用两个字节。 // 计算1 .. 100 public class Hello {public static void main(String[] args) {char a A;char b 中;System.out.println(a);System.out.println(b)…

【2024最新华为OD-C/D卷试题汇总】[支持在线评测] 二进制游戏(200分)- 三语言AC题解(Python/Java/Cpp)

🍭 大家好这里是清隆学长 ,一枚热爱算法的程序员 ✨ 本系列打算持续跟新华为OD-C/D卷的三语言AC题解 💻 ACM银牌🥈| 多次AK大厂笔试 | 编程一对一辅导 👏 感谢大家的订阅➕ 和 喜欢💗 🍿 最新华为OD机试D卷目录,全、新、准,题目覆盖率达 95% 以上,支持题目在线…

npm install时报错 reason: connect ETIMEDOUT

在VS code中导入新项目,执行npm install时报错: npm warn old lockfile Could not fetch metadata for antv/coord0.1.0 FetchError: request to https://registry.npmjs.org/antv%2fcoord failed, reason: connect ETIMEDOUT 150.242.56.251:443 npm w…

大数据之路 读书笔记 Day8 数据存储

回顾: 大数据之路 读书笔记 Day7 实时技术 简介及流式技术架构 大数据之路 读书笔记 Day6 离线数据开发之数据开发平台 数据存储 1 数据类型 实时任务在运行过程中,会计算很多维度和指标,这些数据需要放在一个存储系统中作为恢复或者关联使…

微信小程序开发:DOM 相关 API 使用详解

在微信小程序开发中,与传统的网页开发相比,由于安全性和性能考虑,访问 DOM(文档对象模型)是受限的。然而,微信小程序提供了一些特定的 API,使开发者能够处理和操作视图层,实现丰富的…

Transformer之Vision Transformer结构解读

论文地址 代码地址 写在前面 什么是Transformer呢?就是把符号向量化为Token, 再和位置编码求和或者做阿达玛积,最后送入一定层数的Attention Block构成的Encoder和Decoder,就完成了Transformer的基础功能。 那么,把上…

C基础函数——内存分配(未完)

在C语言中,内存管理是非常重要的一部分。C语言提供了几种不同的函数用于动态内存分配和释放,这些函数允许程序在运行时根据需要分配和回收内存。以下是C语言中常用的几个内存管理函数: malloc() void malloc(size_t size); 这个函数用于请求…

C++中枚举(enum)的用法和限制

在C中,枚举(enum)是一种用户定义的类型,它允许程序员为整数常量指定易于阅读的名字。枚举类型是由一组命名的整型常量组成的类型,每个常量都表示该类型的一个有效值。枚举在编程中常用于表示一组固定的值,如…

MySQL:mysql的数据类型

MySQL 作为一个流行的关系型数据库管理系统,支持多种数据类型以满足不同的数据处理和存储需求。正确理解和使用这些数据类型对于提高数据库性能、确保数据完整性和准确性至关重要。 MySQL 数据类型 数据类型定义了列中可以存储什么数据以及该数据怎样存储的规则。…

idea2019版本创建JavaWeb项目并配置Tomcat步骤

一、创建JavaWeb项目 1.新建项目File->New->Project 2. 选择JavaWeb应用在New Project窗口中选择Java后勾选Java EE中的Web Application后点击next即可 3.设置项目名称后点击finish即可 4.至此项目创建完成,检查文件是否齐全,开始配置Tomcat 二、…

IDEA工具中Java语言写小工具遇到的问题

一:读取excel时遇到 org/apache/poi/ss/usermodel/WorkbookProvider 解决办法: 在pom.xml中把poi的引文包放在最前面即可(目前就算放在最后面也不报错了,不知道为啥) 二:本地maven打包时,没有…

base SAS programing学习笔记(read raw files2)

使用COLUMN input和FORMATTED input读入固定位置的外部文件;如下图所示, 1.COLUMN input (按列数读入外部文件数据) 使用column input 不需要按从左到右的顺序读取外部文件的数值,可以是任意读取,也可以重…

LeeCode Practice Journal | Day18_Binary Tree06

530.二叉搜索树的最小绝对差 题目:530. 二叉搜索树的最小绝对差 - 力扣(LeetCode) 题解:代码随想录 (programmercarl.com) 验证搜索树的进阶,二叉树中的双指针,思考过程中发现容易弄混递归向下传播和向上回…

STM32F103定时器中断详解

目录 目录 目录 前言 一.什么是定时器 1.1 STM32F103定时器概述 1.2基本定时器 1.2通用定时器 1.3高级定时器 1.4 三种定时器区别 基本定时器(Basic Timer) 通用定时器(General-Purpose Timer) 高级定时器(Advanced Ti…

ubuntu2204配置anacondacuda4090nvidia驱动

背景 某个机房的几台机器前段时间通过dnat暴露至公网后被入侵挖矿,为避免一些安全隐患将这几台机器执行重装系统操作; 这里主要记录配置nvidia驱动及cuda&anaconda。 步骤 大概分为几个步骤 禁用nouveau配置grub显示菜单install nvidia-driveri…

基于Python+Django,开发的一个在线教育系统

一、项目简介 使用Python的web框架Django进行开发的一个在线教育系统! 二、所需要的环境与组件 Python3.6 Django1.11.7 Pymysql Mysql pure_pagination DjangoUeditor captcha xadmin crispy_forms 三、安装 1. 下载项目后进入项目目录cd Online-educ…

【Rust光年纪】解锁Rust语言核心库奥秘:加密、数字签名和数据库操作全面解析

从加密到数据库:探索Rust语言丰富的工具库生态系统 前言 在Rust语言开发中,使用合适的库可以极大地提高代码的安全性和效率。本文将介绍一些用于加密、数字签名、数据库连接等功能的Rust语言库,帮助读者快速了解其核心功能、使用场景以及安…

Ubuntu2204搭建ceph17

Ceph 环境初始化搭建Ceph 本次实验基于VMware17 节点IPstorage01192.168.200.161storage01192.168.200.162storage01192.168.200.163 环境初始化 初始化基础环境,三节点执行 #!/bin/bash# 定义节点信息 NODES("192.168.200.161 storage01 root" "…

配置RIPv2的认证

目录 一、配置IP地址、默认网关、启用端口 1. 路由器R1 2. 路由器R2 3. 路由器R3 4. Server1 5. Server2 二、搭建RIPv2网络 1. R1配置RIPv2 2. R2配置RIPv2 3. Server1 ping Server2 4. Server2 ping Server1 三、模拟网络攻击,为R3配置RIPv2 四、在R…