BART:用于自然语言生成、翻译和理解的去噪序列到序列预训练

news2025/1/7 7:24:55

摘要: 我们提出了BART,一种用于预训练序列到序列模型的去噪自编码器。BART通过以下方式训练:(1) 使用任意的噪声函数对文本进行破坏,(2) 学习一个模型来重建原始文本。它采用了一种标准的基于Transformer的神经机器翻译架构,尽管结构简单,但可以视为对BERT(得益于双向编码器)、GPT(带有从左到右的解码器)以及许多其他最新预训练方案的泛化。我们评估了多种噪声处理方法,发现通过随机打乱原始句子的顺序以及使用一种新颖的填充方案(其中文本片段被替换为单个掩码标记)可以获得最佳性能。BART在针对文本生成进行微调时特别有效,但在理解任务上也表现良好。它在GLUE和SQuAD上与RoBERTa在可比的训练资源下性能相当,在一系列抽象对话、问答和摘要任务上实现了新的最先进成果,ROUGE得分提高了多达6点。BART在仅使用目标语言预训练的情况下,比反向翻译系统在机器翻译上提高了1.1个BLEU分数。我们还报告了在BART框架内复制其他预训练方案的消融实验,以更好地衡量哪些因素对最终任务性能影响最大。

1 引言

自监督方法在广泛的自然语言处理(NLP)任务中取得了显著成功(Mikolov等,2013;Peters等,2018;Devlin等,2019;Joshi等,2019;Yang等,2019;Liu等,2019)。最成功的方法是基于掩码语言模型的变体,这些模型是去噪自编码器,通过重建被随机掩码部分单词的文本来进行训练。最近的研究通过改进掩码标记的分布(Joshi等,2019)、预测掩码标记的顺序(Yang等,2019)以及替换掩码标记的可用上下文(Dong等,2019)取得了进展。然而,这些方法通常专注于特定类型的最终任务(例如,片段预测、生成等),限制了其适用性。

在本文中,我们提出了BART,它是一种结合了双向和自回归Transformer的预训练模型。BART是一种基于序列到序列模型的去噪自编码器,适用于非常广泛的最终任务。预训练分为两个阶段:(1)使用任意的噪声函数对文本进行破坏,(2)学习一个序列到序列模型来重建原始文本。BART采用了一种标准的基于Transformer的神经机器翻译架构,尽管结构简单,但可以视为对BERT(得益于双向编码器)、GPT(带有从左到右的解码器)以及许多其他最新预训练方案的泛化(见图1)。

这种设置的一个关键优势是噪声处理的灵活性;可以对原始文本应用任意变换,包括改变其长度。我们评估了多种噪声处理方法,发现通过随机打乱原始句子的顺序以及使用一种新颖的填充方案(其中任意长度的文本片段,包括零长度,被替换为单个掩码标记)可以获得最佳性能。这种方法通过迫使模型更多地推理整体句子长度并对输入进行更长范围的变换,泛化了BERT中的原始单词掩码和下一句预测目标。

BART在针对文本生成进行微调时特别有效,但在理解任务上也表现良好。它在GLUE(Wang等,2018)和SQuAD(Rajpurkar等,2016)上与RoBERTa(Liu等,2019)在可比的训练资源下性能相当,并在一系列抽象对话、问答和摘要任务上实现了新的最先进成果。例如,在XSum(Narayan等,2018)任务上,它将性能提高了6个ROUGE分数。

BART还为微调提供了新的思路。我们提出了一种新的机器翻译方案,其中BART模型堆叠在几个额外的Transformer层之上。

在这里插入图片描述

这些层通过BART传播,训练将外语翻译为带噪声的英语,从而将BART用作预训练的目标端语言模型。这种方法在WMT罗马尼亚语-英语基准测试上,比强大的反向翻译机器翻译基线提高了1.1个BLEU分数。

为了更好地理解这些效果,我们还报告了一项消融分析,复制了其他最近提出的训练目标。这项研究使我们能够仔细控制多种因素,包括数据和优化参数,这些因素已被证明对整体性能与训练目标的选择同样重要(Liu等,2019)。我们发现,BART在我们考虑的所有任务范围内表现出一致且强大的性能。

2 模型

BART是一种去噪自编码器,它将一个被破坏的文档映射回其原始文档。它被实现为一个序列到序列模型,具有一个基于被破坏文本的双向编码器和一个从左到右的自回归解码器。在预训练过程中,我们优化原始文档的负对数似然。

2.1 架构

BART使用了标准的序列到序列Transformer架构(Vaswani等,2017),但根据GPT的做法,我们将ReLU激活函数修改为GeLU(Hendrycks & Gimpel,2016),并从N(0, 0.02)初始化参数。对于基础模型,编码器和解码器各使用6层;对于大型模型,各使用12层。该架构与BERT使用的架构密切相关,但有以下区别:(1)解码器的每一层额外对编码器的最终隐藏层执行交叉注意力(如Transformer序列到序列模型);(2)BERT在单词预测之前使用了一个额外的前馈网络,而BART则没有。总体而言,BART的参数比同等规模的BERT模型多约10%。

2.2 预训练BART

BART通过破坏文档然后优化重建损失(解码器输出与原始文档之间的交叉熵)进行训练。与现有的针对特定噪声方案的去噪自编码器不同,BART允许我们应用任何类型的文档破坏。在极端情况下,当源文档的所有信息都丢失时,BART等同于一个语言模型。

我们尝试了几种先前提出的和新颖的变换方法,但我们相信开发其他新方法具有巨大潜力。我们使用的变换方法总结如下,示例见图2。

标记掩码
遵循BERT(Devlin等,2019),随机选择标记并将其替换为[MASK]元素。

标记删除
从输入中随机删除标记。与标记掩码不同,模型必须确定哪些位置缺少输入。

在这里插入图片描述

文本填充

从文档中随机采样若干文本片段,片段长度服从泊松分布( λ = 3 λ = 3 λ=3)。每个片段被替换为单个[MASK]标记。长度为0的片段对应于插入[MASK]标记。文本填充的灵感来自SpanBERT(Joshi等,2019),但SpanBERT从不同的(截断几何)分布中采样片段长度,并用长度完全相同的[MASK]标记序列替换每个片段。文本填充教会模型预测一个片段中缺失了多少个标记。

句子重排

文档根据句号划分为句子,然后这些句子被随机打乱顺序。

文档旋转

随机均匀选择一个标记,并将文档旋转以该标记开头。此任务训练模型识别文档的起始位置。

3 BART的微调

BART生成的表示可以以多种方式用于下游应用。

3.1 序列分类任务

对于序列分类任务,将相同的输入同时输入编码器和解码器,并将解码器最后一个标记的最终隐藏状态输入一个新的多类线性分类器。这种方法类似于BERT中的CLS标记;然而,我们将额外的标记添加到末尾,以便解码器中该标记的表示可以关注完整输入的解码器状态(图3a)。

3.2 标记分类任务

对于标记分类任务(例如SQuAD中的答案端点分类),我们将完整文档输入编码器和解码器,并使用解码器的顶部隐藏状态作为每个单词的表示。该表示用于对标记进行分类。

3.3 序列生成任务

由于BART具有自回归解码器,它可以直接微调用于序列生成任务,例如抽象问答和摘要生成。在这些任务中,信息从输入中复制但经过处理,这与去噪预训练目标密切相关。在这里,编码器输入是输入序列,解码器自回归生成输出。

3.4 机器翻译

我们还探索了使用BART改进翻译成英语的机器翻译解码器。先前的工作(Edunov等,2019)表明,通过结合预训练编码器可以改进模型,但在解码器中使用预训练语言模型的收益有限。我们展示了可以通过添加一组从双语文本中学习的新编码器参数,将整个BART模型(包括编码器和解码器)用作机器翻译的单一预训练解码器(见图3b)。

更具体地说,我们用一个新的随机初始化的编码器替换BART的编码器嵌入层。模型端到端训练,训练新编码器将外语单词映射为BART可以去噪为英语的输入。新编码器可以使用与原始BART模型不同的词汇表。

我们分两步训练源编码器,在这两种情况下都从BART模型的输出反向传播交叉熵损失。第一步,我们冻结大部分BART参数,仅更新随机初始化的源编码器、BART的位置嵌入以及BART编码器第一层的自注意力输入投影矩阵。第二步,我们对所有模型参数进行少量迭代训练。

4 预训练目标的比较

BART在预训练期间支持比以往工作更广泛的噪声处理方案。我们使用基础规模的模型(6层编码器和6层解码器,隐藏层大小为768)比较了一系列选项,并在我们将在第5节中全面大规模实验中考虑的任务子集上进行了评估。

4.1 比较目标

尽管已经提出了许多预训练目标,但这些目标之间的公平比较一直难以进行,至少部分原因是训练数据、训练资源、模型架构差异和微调程序的不同。
在这里插入图片描述

我们重新实现了最近为判别和生成任务提出的强预训练方法。我们尽可能控制与预训练目标无关的差异。然而,我们确实对学习率和层归一化的使用进行了微小调整以提高性能(为每个目标单独调整这些参数)。作为参考,我们将我们的实现与BERT的公开结果进行比较,BERT同样在书籍和维基百科数据的组合上训练了100万步。

我们比较了以下方法:

语言模型
类似于GPT(Radford等,2018),我们训练了一个从左到右的Transformer语言模型。该模型等同于BART的解码器,但没有交叉注意力。

排列语言模型
基于XLNet(Yang等,2019),我们采样1/6的标记,并以随机顺序自回归生成它们。为了与其他模型保持一致,我们没有实现XLNet中的相对位置嵌入或跨片段注意力。

掩码语言模型
遵循BERT(Devlin等,2019),我们将15%的标记替换为[MASK]符号,并训练模型独立预测原始标记。

多任务掩码语言模型
如UniLM(Dong等,2019),我们训练了一个带有额外自注意力掩码的掩码语言模型。自注意力掩码按以下比例随机选择:1/6从左到右,1/6从右到左,1/3无掩码,1/3前50%的标记无掩码,其余部分从左到右掩码。

掩码序列到序列
受MASS(Song等,2019)启发,我们掩码包含50%标记的片段,并训练一个序列到序列模型来预测被掩码的标记。

对于排列语言模型、掩码语言模型和多任务掩码语言模型,我们使用双流注意力(Yang等,2019)来高效计算序列输出部分的可能性(在输出上使用对角线自注意力掩码以从左到右预测单词)。
我们尝试了以下两种方法:(1)将任务视为标准的序列到序列问题,其中编码器的输入是源文本,解码器的输出是目标文本;(2)将源文本作为目标文本的前缀添加到解码器中,并且仅在目标部分计算损失。我们发现前者对BART模型效果更好,而后者对其他模型更有效。

为了最直接地比较模型在建模其微调目标(人类文本的对数似然)方面的能力,我们在表1中报告了困惑度(perplexity)。

4.2 任务

SQuAD(Rajpurkar等,2016):一个基于维基百科段落的抽取式问答任务。答案是从给定文档上下文中提取的文本片段。与BERT(Devlin等,2019)类似,我们将问题和上下文连接作为BART编码器的输入,并额外将其传递给解码器。模型包含分类器以预测每个标记的开始和结束索引。

MNLI(Williams等,2017):一个双语文本分类任务,用于预测一个句子是否蕴含另一个句子。微调后的模型将两个句子与附加的EOS标记连接,并将其传递给BART编码器和解码器。与BERT不同,EOS标记的表示用于分类句子关系。

ELI5(Fan等,2019):一个长文本抽象问答数据集。模型根据问题和支持文档的拼接生成答案。

XSum(Narayan等,2018):一个新闻摘要数据集,包含高度抽象的摘要。

ConvAI2(Dinan等,2019):一个对话响应生成任务,基于上下文和角色生成回复。

CNN/DM(Hermann等,2015):一个新闻摘要数据集。这里的摘要通常与源句子密切相关。

4.3 结果

结果如表1所示。几个趋势很明显:
在这里插入图片描述

  1. 预训练方法的性能因任务而异
    预训练方法的有效性高度依赖于任务。例如,简单的语言模型在ELI5上表现最佳,但在SQuAD上表现最差。

  2. 标记掩码至关重要
    基于文档旋转或句子重排的预训练目标在单独使用时表现不佳。成功的方法要么使用标记删除或掩码,要么使用自注意力掩码。在生成任务中,删除似乎优于掩码。

  3. 从左到右的预训练改善了生成能力
    掩码语言模型和排列语言模型在生成任务上表现较差,它们是我们考虑的仅有的在预训练期间不包含从左到右自回归语言建模的模型。

  4. 双向编码器对SQuAD至关重要
    正如之前的工作(Devlin等,2019)所指出的,仅使用从左到右的解码器在SQuAD上表现不佳,因为未来的上下文在分类决策中至关重要。然而,BART仅使用一半的双向层数就实现了类似的性能。

  5. 预训练目标并非唯一重要因素
    我们的排列语言模型表现不如XLNet(Yang等,2019)。这种差异的部分原因可能是未包含其他架构改进,例如相对位置嵌入或片段级递归。

纯语言模型在ELI5上表现最佳

ELI5数据集是一个异常值,其困惑度远高于其他任务,并且是唯一一个其他模型优于BART的生成任务。纯语言模型表现最佳,这表明当输出仅受输入松散约束时,BART的效果较差。

BART实现了最一致且强大的性能

除了ELI5之外,使用文本填充的BART模型在所有任务上均表现良好。

5 大规模预训练实验

最近的研究表明,当预训练扩展到大批量和大型语料库时,下游性能可以显著提高(Yang等,2019;Liu等,2019)。为了测试BART在这种情况下的表现,并为下游任务创建一个有用的模型,我们使用与RoBERTa模型相同的规模训练了BART。

5.1 实验设置

我们预训练了一个大型模型,编码器和解码器各有12层,隐藏层大小为1024。遵循RoBERTa(Liu等,2019),我们使用8000的批量大小,并训练模型50万步。文档使用与GPT-2(Radford等,2019)相同的字节对编码进行标记化。基于第4节的结果,我们结合使用文本填充和句子重排。我们在每个文档中掩码30%的标记,并重排所有句子。尽管句子重排仅在CNN/DM摘要数据集上显示出显著的附加收益,但我们假设更大的预训练模型可能能够更好地从该任务中学习。
在这里插入图片描述
在这里插入图片描述

为了帮助模型更好地拟合数据,我们在最后10%的训练步骤中禁用了dropout。我们使用与Liu等(2019)相同的预训练数据,包括160GB的新闻、书籍、故事和网络文本。

5.2 判别任务

表2比较了BART与几种近期方法在广泛研究的SQuAD和GLUE任务上的表现(Warstadt等,2018;Socher等,2013;Dolan & Brockett,2005;Agirre等,2007;Williams等,2018;Dagan等,2006;Levesque等,2011)。最直接可比的基线是RoBERTa,它使用相同的资源进行预训练,但目标不同。总体而言,BART表现相似,在大多数任务上模型之间的差异很小,这表明BART在生成任务上的改进并未以分类性能为代价。

5.3 生成任务

我们还尝试了几种文本生成任务。BART被微调为从输入到输出文本的标准序列到序列模型。在微调期间,我们使用标签平滑的交叉熵损失(Pereyra等,2017),平滑参数设置为0.1。在生成过程中,我们将束搜索大小设置为5,去除束搜索中的重复三元组,并在验证集上调整了最小长度、最大长度和长度惩罚参数(Fan等,2017)。
在这里插入图片描述

**摘要生成 **

为了与摘要生成领域的最新成果进行比较,我们在两个具有不同特性的摘要数据集上展示了结果:CNN/DailyMail和XSum。

CNN/DailyMail
CNN/DailyMail中的摘要通常与源句子相似。抽取式模型在这里表现良好,甚至前三个源句子的基线也具有很强的竞争力。尽管如此,BART仍然优于所有现有工作。

XSum
相比之下,XSum的摘要具有高度抽象性,抽取式模型表现较差。BART在所有ROUGE指标上比之前利用BERT的最佳工作提高了约6.0分,这代表了在该问题上的显著性能提升。从定性角度来看,生成样本的质量也很高(见第6节)。

对话生成

我们在CONVAI2(Dinan等,2019)上评估了对话响应生成任务,其中代理必须根据之前的上下文和文本指定的角色生成响应。BART在两个自动化指标上优于之前的工作。
在这里插入图片描述
在这里插入图片描述

**抽象问答 **

我们使用最近提出的ELI5数据集来测试模型生成长篇自由形式答案的能力。我们发现BART比之前的最佳工作提高了1.2个ROUGE-L分数,但该数据集仍然具有挑战性,因为答案仅由问题弱指定。

5.4 机器翻译

我们还在WMT16罗马尼亚语-英语数据集上评估了性能,并增加了来自Sennrich等(2016)的反向翻译数据。我们使用一个6层的Transformer源编码器将罗马尼亚语映射为BART能够去噪为英语的表示,遵循第3.4节中介绍的方法。实验结果如表6所示。我们将我们的结果与使用Transformer-large设置的基线Transformer架构(Vaswani等,2017)进行比较(基线行)。我们在固定BART和调优BART行中展示了我们模型两个步骤的性能。对于每一行,我们在增加了反向翻译数据的原始WMT16罗马尼亚语-英语数据集上进行了实验。我们使用束宽为5和长度惩罚α = 1。初步结果表明,如果没有反向翻译数据,我们的方法效果较差,并且容易过拟合——未来的工作应探索更多的正则化技术。

6 定性分析

BART在摘要生成指标上显示出显著的改进,比之前的最新技术提高了多达6分。为了理解BART在自动化指标之外的性能,我们对其生成结果进行了定性分析。表7展示了BART生成的摘要示例。示例取自预训练语料库创建后发布的WikiNews文章,以消除模型训练数据中可能包含所述事件的可能性。遵循Narayan等(2018)的方法,我们在摘要生成之前删除了文章的第一句话,因此文档没有简单的抽取式摘要。

不出所料,模型的输出是流畅且符合语法的英语。然而,模型的输出也具有高度抽象性,很少从输入中复制短语。输出通常在事实上是准确的,并整合了输入文档中的支持证据和背景知识(例如,正确补全名称或推断PG&E在加利福尼亚运营)。在第一个示例中,推断鱼类正在保护珊瑚礁免受全球变暖的影响需要从文本中进行非平凡的推理。然而,关于该研究发表在《科学》杂志上的说法并未得到来源的支持。

这些样本表明,BART的预训练已经学习到了自然语言理解和生成的强大结合。

7 相关工作

早期的预训练方法基于语言模型。GPT(Radford等,2018)仅建模左向上下文,这对某些任务来说存在问题。ELMo(Peters等,2018)将仅左向和仅右向的表示连接起来,但并未预训练这些特征之间的交互。Radford等(2019)证明了非常大的语言模型可以作为无监督的多任务模型。

BERT(Devlin等,2019)引入了掩码语言建模,使预训练能够学习左右上下文单词之间的交互。最近的研究表明,通过更长时间的训练(Liu等,2019)、跨层参数绑定(Lan等,2019)以及掩码片段而非单词(Joshi等,2019),可以实现非常强的性能。BERT的预测不是自回归的,这降低了其在生成任务中的有效性。

UniLM(Dong等,2019)通过一组掩码微调BERT,其中一些掩码仅允许左向上下文。与BART类似,这使得UniLM可以用于生成和判别任务。不同之处在于,UniLM的预测是条件独立的,而BART的预测是自回归的。BART减少了预训练和生成任务之间的不匹配,因为解码器始终在未破坏的上下文中进行训练。

MASS(Song等,2019)可能是与BART最相似的模型。它将掩码连续标记的输入序列映射到由缺失标记组成的序列。MASS在判别任务中效果较差,因为编码器和解码器输入的是不相交的标记集。
XLNet(Yang等,2019)通过以排列顺序自回归地预测掩码标记来扩展BERT。这一目标使得预测可以同时依赖于左右上下文。相比之下,BART的解码器在预训练期间从左到右工作,与生成期间的设置相匹配。

有几篇论文探索了使用预训练表示来改进机器翻译。最大的改进来自于在源语言和目标语言上进行预训练(Song等,2019;Lample & Conneau,2019),但这需要对所有相关语言进行预训练。其他研究表明,可以使用预训练表示改进编码器(Edunov等,2019),但在解码器中的改进较为有限。我们展示了如何使用BART来改进机器翻译解码器。
在这里插入图片描述

8 结论

我们提出了BART,这是一种预训练方法,通过学习将破坏的文档映射回原始文档。BART在判别任务上实现了与RoBERTa相似的性能,同时在多个文本生成任务上取得了新的最先进成果。未来的工作应探索用于预训练的文档破坏新方法,或许可以针对特定的最终任务进行定制。

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

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

相关文章

Promise编码小挑战

题目 我们将实现一个 createImage 函数,该函数返回一个 Promise,用于处理图片加载的异步操作。此外,还会实现暂停执行的 wait 函数。 Part 1: createImage 函数 该函数会: 创建一个新的图片元素。将图片的 src 设置为提供的路径…

Dubbo扩展点加载机制

加载机制中已经存在的一些关键注解,如SPI、©Adaptive> ©Activateo然后介绍整个加载机制中最核心的ExtensionLoader的工作流程及实现原理。最后介绍扩展中使用的类动态编译的实 现原理。 Java SPI Java 5 中的服务提供商https://docs.oracle.com/jav…

【Web】软件系统安全赛CachedVisitor——记一次二开工具的经历

明天开始考试周,百无聊赖开了一把CTF,还顺带体验了下二开工具,让无聊的Z3很开心🙂 CachedVisitor这题 大概描述一下:从main.lua加载一段visit.script中被##LUA_START##(.-)##LUA_END##包裹的lua代码 main.lua loca…

在不到 5 分钟的时间内将威胁情报 PDF 添加为 AI 助手的自定义知识

作者:来自 Elastic jamesspi 安全运营团队通常会维护威胁情报报告的存储库,这些报告包含由报告提供商生成的大量知识。然而,挑战在于,这些报告的内容通常以 PDF 格式存在,使得在处理安全事件或调查时难以检索和引用相关…

vscode代码AI插件Continue 安装与使用

“Continue” 是一款强大的插件,它主要用于在开发过程中提供智能的代码延续功能。例如,当你在编写代码并且需要进行下一步操作或者完成一个代码块时,它能够根据代码的上下文、语法规则以及相关的库和框架知识,为你提供可能的代码续…

leetcode(hot100)4

解题思路:双指针思想 利用两个for循环,第一个for循环把所有非0的全部移到前面,第二个for循环将指针放在非0的末尾全部加上0。 还有一种解法就是利用while循环双指针条件,当不为0就两个指针一起移动 ,为0就只移动右指针…

vulnhub——Earth靶机

使用命令在kali查看靶机ip arp-scan -l 第一 信息收集 使用 nmap 进行 dns 解析 把这两条解析添加到hosts文件中去,这样我们才可以访问页面 这样网站就可以正常打开 扫描ip时候我们发现443是打开的,扫描第二个dns解析的443端口能扫描出来一个 txt 文件…

k8s基础(1)—Kubernetes-Pod

一、Pod简介 Pod是Kubernetes(k8s)系统中可以创建和管理的最小单元,是资源对象模型中由用户创建或部署的最小资源对象模型‌。Pod是由一个或多个容器组成的,这些容器共享存储和网络资源,可以看作是一个逻辑的主机‌。…

【FlutterDart】页面切换 PageView PageController(9 /100)

上效果: 有些不能理解官方例子里的动画为什么没有效果,有可能是我写法不对 后续如果有动画效果修复了,再更新这篇,没有动画效果,总觉得感受的丝滑效果差了很多 上代码: import package:flutter/material.…

使用 NestJS 构建高效且模块化的 Node.js 应用程序,从安装到第一个 API 端点:一步一步指南

一、安装 NestJS 要开始构建一个基于 NestJS 的应用,首先需要安装一系列依赖包。以下是必要的安装命令: npm i --save nestjs/core nestjs/common rxjs reflect-metadata nestjs/platform-express npm install -g ts-node包名介绍nestjs/coreNestJS 框…

第07章 存储管理(一)

一、磁盘简介 1.1 名称称呼 磁盘/硬盘/disk是同一个东西,不同于内存的是容量比较大。 1.2 类型 机械:机械硬盘即是传统普通硬盘,主要由:盘片,磁头,盘片转轴及控制电机,磁头控制器&#xff0…

Appium(一)--- 环境搭建

一、Android自动化环境搭建 1、JDK 必须1.8及以上(1) 安装:默认安装(2) 环境变量配置新建JAVA_HOME:安装路径新建CLASSPath%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar在path中增加:%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin;(3) 验证…

Framebuffer 驱动

实验环境: 正点原子alpha 开发板 调试自己编写的framebuffer 驱动,加载到内核之后,显示出小企鹅 1. Framebufer 总体框架 fbmem.c 作为Framebuffer的核心层,向上提供app使用的接口,向下屏蔽了底层各种硬件的差异; 准确来说fbmem.c 就是一个字符设备驱动框架的程序,对…

复变函数复习

复数 复数的方根计算 例题: 复变函数 导数 解析函数 调和函数 例题: V是U的共轭调和函数 但U不是V的共轭调和函数 其中U和V满足柯西黎曼方程 经典例题 求解析函数例题: 初等函数 指数函数 对数函数 幂函数 三角函数 级数 极限 收敛半…

在DJI无人机上运行VINS-FUISON(PSDK 转 ROS)

安装ceres出现以下报错,将2版本的ceres换成1版本的ceres CMake did not find one.Could not find a package configuration file provided by "absl" with any ofthe following names:abslConfig.cmakeabsl-config.cmakeAdd the installation prefix of …

HTML5实现好看的博客网站、通用大作业网页模板源码

HTML5实现好看的博客网站、通用大作业网页模板源码 前言一、设计来源1.1 主界面1.2 列表界面1.3 文章界面 二、效果和源码2.1 动态效果2.2 源代码 源码下载结束语 HTML5实现好看的博客网站、通用大作业网页模板源码,博客网站源码,HTML模板源码&#xff0…

线性回归从0到1实践

导入需要的包 from idlelib.configdialog import tracers %matplotlib inline import random import torch from d2l import torch as d2l根据有噪声的线性模型构造一个人造数据集。我们使用线性模型参数 w [ 2 , − 3 , 4 ] T w [2,-3,4]^T w[2,−3,4]T、b4.2 和噪声 ϵ \…

从摩托罗拉手机打印短信的简单方法

昨天我试图从摩托罗拉智能手机上打印短信,但当我通过USB将手机连接到电脑时,我在电脑上找不到它们。由于我的手机内存已达到限制,并且我想保留短信的纸质版本,您能帮我将短信从摩托罗拉手机导出到计算机吗? 如您所知&…

elementui table 表格 分页多选,保持选中状态

elementui多选时分页,解决选中状态无法保留选中项问题: 在el-table标签中加入row-key,row-key的值取当前数据里的唯一key在el-table-column selection 项中加入以下:reserve-selection“true” 完成后,将需要清空的地方 ( 如返回…

《掌握 C/C++ 动态内存管理,让编程更高效灵活》

这里写目录标题 一、回顾C/C内存分布1. 三道基础的练习题2. 内存区域划分图 二、C 语言中动态内存的管理方式(malloc/calloc/realloc/free)1. malloc() 和 calloc() 的区别和注意事项2. realloc() 的用法和注意事项 三、C 中的动态内存管理方式&#xff…