深度学习进阶篇-国内预训练模型[5]:ERINE、ERNIE 3.0、ERNIE-的设计思路、模型结构、应用场景等详解

news2025/1/10 21:34:58

在这里插入图片描述
【深度学习入门到进阶】必看系列,含激活函数、优化策略、损失函数、模型调优、归一化算法、卷积模型、序列模型、预训练模型、对抗神经网络等

在这里插入图片描述
专栏详细介绍:【深度学习入门到进阶】必看系列,含激活函数、优化策略、损失函数、模型调优、归一化算法、卷积模型、序列模型、预训练模型、对抗神经网络等

本专栏主要方便入门同学快速掌握相关知识。后续会持续把深度学习涉及知识原理分析给大家,让大家在项目实操的同时也能知识储备,知其然、知其所以然、知何由以知其所以然。

声明:部分项目为网络经典项目方便大家快速学习,后续会不断增添实战环节(比赛、论文、现实应用等)

专栏订阅:深度学习入门到进阶专栏

后预训练模型时代

1.ERINE

1.1 ERINE简介

ERINE是百度发布一个预训练模型,它通过引入三种级别的Knowledge Masking帮助模型学习语言知识,在多项任务上超越了BERT。在模型结构方面,它采用了Transformer的Encoder部分作为模型主干进行训练,如 图1 (图片来自网络)所示。

图1 Transformer的Encoder部分

关于ERNIE网络结构(Transformer Encoder)的工作原理,这里不再展开讨论。接下来,我们将聚焦在ERNIE本身的主要改进点进行讨论,即三个层级的Knowledge Masking 策略。这三种策略都是应用在ERNIE预训练过程中的预训练任务,期望通过这三种级别的任务帮助ERNIE学到更多的语言知识。

1.2 Knowledge Masking Task

训练语料中蕴含着大量的语言知识,例如词法,句法,语义信息,如何让模型有效地学习这些复杂的语言知识是一件有挑战的事情。BERT使用了MLM(masked language-model)和NSP(Next Sentence Prediction)两个预训练任务来进行训练,这两个任务可能并不足以让BERT学到那么多复杂的语言知识,特别是后来多个研究人士提到NSP任务是比较简单的任务,它实际的作用不是很大。


说明:

masked language-model(MLM)是指在训练的时候随即从输入预料上mask掉一些单词,然后通过的上下文预测这些单词,该任务非常像我们在中学时期经常做的完形填空。 Next Sentence Prediction(NSP)的任务是判断连个句子是否是具有前后顺承关系的两句话。


考虑到这一点,ERNIE提出了Knowledge Masking的策略,其包含三个级别:ERNIE将Knowledge分成了三个类别:token级别(Basic-Level)短语级别(Phrase-Level)实体级别(Entity-Level)。通过对这三个级别的对象进行Masking,提高模型对字词、短语的知识理解。

图2展示了这三个级别的Masking策略和BERT Masking的对比,显然,Basic-Level Masking 同BERT的Masking一样,随机地对某些单词(如 written)进行Masking,在预训练过程中,让模型去预测这些被Mask后的单词;Phrase-Level Masking 是对语句中的短语进行masking,如 a series of;Entity-Level Masking是对语句中的实体词进行Masking,如人名 J. K. Rowling。

图2 ERNIE和BERT的Masking策略对比

除了上边的Knowledge Masking外,ERNIE还采用多个异源语料帮助模型训练,例如对话数据,新闻数据,百科数据等等。通过这些改进以保证模型在字词、语句和语义方面更深入地学习到语言知识。当ERINE通过这些预训练任务学习之后,就会变成一个更懂语言知识的预训练模型,接下来,就可以应用ERINE在不同的下游任务进行微调,提高下游任务的效果。例如,文本分类任务。

异源语料 :来自不同源头的数据,比如百度贴吧,百度新闻,维基百科等等

2.ERNIE 3.0: Large-scale Knowledge Enhanced Pre-training for Language Understanding and Generation

2.1. ERNIE 3.0的设计思路

自回归模型(Autoregressive Model, AR),通过估计一串文本序列的生成概率分布进行建模。一般而言,AR模型通过要么从前到后计算文本序列概率,要么从后向前计算文本序列概率,但不论哪种方式的建模,都是单向的。即在预测一个单词的时候无法同时看到该单词位置两边的信息。假设给定的文本序列 x = ( x 1 , x 2 , . . . , x n ) x=(x_1, x_2, ..., x_n) x=(x1,x2,...,xn),其从左到右的序列生成概率为:

p ( x ) = ∏ t = 1 n p ( x t ∣ x < t ) p(x)=\prod_{t=1}^n p(x_t|x_{<t}) p(x)=t=1np(xtx<t)

自编码模型(Autoencoding Model, AE), 通过从破坏的输入文本序列中重建原始数据进行建模。例如BERT通过预测【mask】位置的词重建原始序列。它的优点在于在预测单词的时候能够同时捕获该单词位置前后双向的信息;它的缺点是预训练过程中采用了mask单词的策略,然而微调阶段并没有,因此导致了预训练阶段和微调阶段的的GAP,另外在训练过程中,对不同mask单词的预测是相互独立的。假设序列中被mask的词为 w ∈ W m w\in W_m wWm,未被mask的词为 w ∈ W n w\in W_n wWn,则其相应的计算概率为:

p ( x ) = ∏ w ∈ W m p ( w ∣ W n ) p(x) = \prod_{w\in Wm} p(w|W_n) p(x)=wWmp(wWn)

一般而言,自回归模型在文本生成任务上表现更好,自编码模型在语言理解任务上表现更好。ERNIE 3.0借鉴此想法,在如下方面进行了改进:

  1. ERNIE 3.0同时结合了将自回归和自编码网络,从而模型在文本生成和语言理解任务表现均很好。

  2. ERNiE 3.0在预训练阶段中引入了知识图谱数据。

2.2. ERNIE 3.0的模型结构

图1 ERNIE 3.0模型结构

2.2.1 ERNIE 3.0的网络结构

延续ERNIE 2.0的语言学习思路,ERNIE 3.0同样期望通过设置多种预任务的方式辅助模型学习语言的各方面知识,比如词法、句法、和语义信息。这些预训练任务包括自然语言生成、自然语言理解和关系抽取等范畴。ERNIE 3.0期望能够在这三种任务模式(task paradigm)中均能获得比较好的效果,因此提出了一个通用的多模式预训练框架,这就是ERNIE 3.0,如图1所示。

ERNIE 3.0认为不同的任务模式依赖的自然语言的底层特征是相同的,比如词法和句法信息,然而不同的任务模式需要的上层具体的特征是不同的。自然语言理解的任务往往倾向于学习语义连贯性,然而自然语义生成任务却期望能够看见更长的上下文信息。

因此,ERNIE 3.0设计了上下两层网络结构:Universal Representation Module 和 Task-specific Representation Module。其中各个模式的任务共享Universal Representation Module,期望其能够捕获一些通用的基础特征; Task-specific Representation Module将去具体适配不同模式的任务(生成和理解),去抽取不同的特征。

前边提到,自回归模型在文本生成任务上表现更好,自编码模型在语言理解任务上表现更好。因此,ERNIE 3.0在上层使用了两个网络,一个用于聚焦自然语言理解,一个用于聚焦自然语言生成任务。这样做主要有两个好处:

  1. 不同任务适配更合适的网络,能够提高模型在相应任务上的表现。

  2. 在fune-tuning阶段,可以固定Universal Representation Module,只微调Task-specific Representation Module参数,提高训练效率。

2.2.2 Universal Representation Module

此部分使用Transformer-XL作为骨干网络,Transformer-XL允许模型使用记忆循环机制建模更长的文本序列依赖。在实验中,Universal Representation Module设置了比较多的层数和参数,用以加强捕获期望的词法和句法底层语言特征能力。

这里需要注意的一点是,记忆循环机制只有在自然语言生成任务上会使用。

2.2.3 Task-specific Representation Module

此部分同样使用了Transformer-XL作为骨干网络,Task-specific Representation Module将用于根据不同模式的任务去学习task-specific的高层语义特征。

在ERNIE 3.0的设置中,Universal Representation Module采用了Base版的Transformer-XL,其层数会比Universal Representation Module少。

另外,ERNIE 3.0采用了两种任务模式的Representation Module,一个是NLU-specific Representation Module,另一个是NLG-specific Representation Module,其中前者是一个双向编码网络,后者是个单向编码网络。

2.3. 不同类型的预训练任务

2.3.1 Word-aware Pre-training Task

  • Knowledge Masked Language Modeling

Knowledge Masking策略包含三个级别:token级别(Basic-Level)短语级别(Phrase-Level)实体级别(Entity-Level)。通过对这三个级别的对象进行 Masking,提高模型对字词、短语的知识理解。

图2展示了这三个级别的Masking策略和BERT Masking的对比,显然,Basic-Level Masking 同BERT的Masking一样,随机地对某些单词(如 written)进行Masking,在预训练过程中,让模型去预测这些被Mask后的单词;Phrase-Level Masking 是对语句中的短语进行masking,如 a series of;Entity-Level Masking是对语句中的实体词进行Masking,如人名 J. K. Rowling。

图2 ERNIE和BERT的Masking策略对比

  • Document Language Modeling

ERNIE 3.0 选择使用传统的语言模型作为预训练任务,期望减小模型的语言困惑度。同时采用了ERNIE-Doc中提出的记忆循环机制,以建模更长的序列依赖。

2.3.2 Structure-aware Pre-training Tasks

  • Sentence Reordering Task

将给定的文档依次划分为1-m段,然后打乱这些段,让模型对这些段进行排序,是个k分类问题,这能够帮助模型学习语句之间的关系。

将文档划分为2段,那么排列组合后将有 2 ! 2! 2! 个可能;将文档划分为3段,那么排列组合后将有 3! 个可能;依次类推,将文档划分为 n 段,那么排列组合后将有 n! 个可能。因此ERNIE将这个任务建模成了一个 k 分类问题,这里 k = ∑ n = 1 m n ! k=\sum_{n=1}^m n! k=n=1mn!

  • Sentence Distance Task

预测两个句子之间的距离,是个3分类任务。对应的Label依次是0、1和2。其中0代表两个句子在同一篇文章中,并且他们是相邻的;1代表两个句子在同一篇文章中,但他们不是相邻的;2代表两个句子不在同一篇文章中。

2.3.3 Knowledge-aware Pre-training Tasks

为了向预训练模型中引入知识,ERNIE 3.0 尝试在预训练阶段引入了universal knowledge-text prediction(UKTP)任务,如图3所示。

给定一个三元组<head, relation, tail>和一个句子,ERNIE 3.0会mask掉三元组中的实体关系relation,或者句子中的单词word,然后让模型去预测这些内容。当预测实体关系的时候,模型不仅需要考虑三元组中head和tail实体信息,同时也需要根据句子的上下文信息来决定head和tail的关系,从而帮助模型来理解知识。

这个操作基于远程监督的假设:如果一个句子中同时出现head和tail两个实体,则这个句子能够表达这两个实体的关系。

另外,当预测句子中的单词word时,模型不仅需要考虑句子中的上下文信息,同时还可以参考三元组<head, relation, tail>的实体关系。

图3 universal knowledge-text prediction

  • 相关资料
  1. ERNIE 3.0: LARGE-SCALE KNOWLEDGE ENHANCED PRE-TRAINING FOR LANGUAGE UNDERSTANDING AND GENERATION

  2. ERNIE-DOC: A Retrospective Long-Document Modeling Transformer

3.ERNIE-Gram: Pre-training with Explicitly N-Gram Masked language Modeling for Natural Language Understanding

3.1. ERNIE-Gram简介

在经典预训练模型BERT中,主要是通过Masked Language Modeling(MLM)预训练任务学习语言知识。在BERT中MLM会随机Masking一些位置的token,然后让模型去预测这些token。这些Masking的token在中文中便是,在英文中便是sub-word,这样的预测也许不能让模型获取更加直观的语言知识,所以后续又出现了一些模型,比如ERNIE, SpanBERT等,其从Masking单个字转变成了Masking一系列连续的token,例如Masking实体词,Masking短语等,即从细粒度的Masking转向粗粒度的Masking。

ERNIE-Gram指出一种观点:这种连续的粗粒度Masking策略会忽略信息内部的相互依赖以及不同信息之间的关联。因此,基于这种想法进行改进,提出了一种显式建模n-gram词的方法,即直接去预测一个n-gram词,而不是预测一系列连续的token,从而保证n-gram词的语义完整性。

另外,ERNIE-Gram在预训练阶段借鉴ELECTRA想法,通过引入一个生成器来显式地对不同n-gram词进行建模。具体来讲,其应用生成器模型去采样合理的n-gram词,并用这些词去mask原始的语句,然后让模型去预测这些位置原始的单词。同时还使用了RTD预训练任务,来识别每个token是否是生成的。

3.2. ERNIE和N-Gram的融入方式

上边我们提到了,不同于连续多个token的预测,ERNIE-GRAM采用了一种显式的n-gram方式进行建模,在本节我们将展开讨论ERNIE和显式的n-gram融合建模的方式。ERNIE-Gram主要提出了两种融合方式:Explictly N-gram MLM 和 Comprehensive N-gram Prediction。

在正式介绍之前,我们先回顾一下经典的连续token的建模方式:Contiguously MLM,然后再正式介绍以上ERNIE-Gram提出的两种方式。

3.2.1 Contiguously MLM

给定一串序列 x = { x 1 , x 2 , . . . , x ∣ x ∣ } x=\{x_1, x_2, ..., x_{|x|}\} x={x1,x2,...,xx} 和 n-gram起始边界序列(starting boundaries) b = { b 1 , b 2 , . . . , b ∣ b ∣ } b=\{b_1, b_2, ..., b_{|b|}\} b={b1,b2,...,bb}​,根据 x x x b b b​进行如下约定:

  • z = { z 1 , z 2 , . . . , z ∣ b ∣ − 1 } z=\{z_1, z_2,..., z_{|b|-1}\} z={z1,z2,...,zb1}:由 x x x转换成的n-gram序列。

  • M = { } M=\{\} M={}​:从起始边界 b b b​​​中随机选择15%的准备Masking的index,组成 M M M​​

  • z M z_M zM:由 M M M​​选择出的相应的token集

  • z M z_{\text{\\}M} zM: 表示将 x x x​​进行Masking后的序列

图1展示了一个Contiguously MLM的例子,给定的序列为 x = { x 1 , x 2 , x 3 , x 4 , x 5 , x 6 } x=\{x_1,x_2,x_3,x_4,x_5,x_6\} x={x1,x2,x3,x4,x5,x6}​​​​, 起始边界序列为 b = { 1 , 2 , 4 , 5 , 6 , 7 } b=\{1,2,4,5,6,7\} b={1,2,4,5,6,7}​​​, 假设从起始边界序列 b b b​​的随机选择的索引为 M = { 2 , 4 } M=\{2,4\} M={2,4}​​​, 则

  • z = { x 1 , x [ 2 : 4 ) , x 4 , x 5 , x 6 } z=\{x_1, x_{[2:4)}, x_4, x_5, x_6\} z={x1,x[2:4),x4,x5,x6}​​

  • z M = { x [ 2 : 4 ) , x 5 } z_M = \{x_{[2:4)}, x_5\} zM={x[2:4),x5}

  • z M = { x 1 , [M] , [M] , x 4 , [M] , x 6 } z_{\text{\\}M}=\{x_1,\text{[M]} , \text{[M]}, x_4, \text{[M]}, x_6\} zM={x1,[M],[M],x4,[M],x6}

Contiguously MLM 可通过如下方式进行优化:

− log p θ ( z M ∣ z M ) = − ∑ z ∈ z M ∑ x ∈ z log    p θ ( x ∣ z M ) \begin{split} -\text{log} p_{\theta}(z_M|z_{\text{\\}M}) = -\sum_{z \in z_M} \sum_{x \in z} \text{log}\; p_{\theta}(x|z_{\text{\\}M}) \end{split} logpθ(zMzM)=zzMxzlogpθ(xzM)

图1 contiguously MLM

在讨论完连续的token Masking策略之后,下面我们将继续讨论ERNIE-Gram中提出的两种显式n-gram的建模方式。

3.2.2 Explicitly N-gram Masked Language Modeling

在连续token预测中, 需要预测多次,每次预测一个token,直到完成这一段连续token的所有预测,才表示完成了一个实体词或者短语。不同于连续token预测, 显式的N-gram预测直接去预测一个n-gram词,即站在一种粗粒度的角度上进行预测。

如图2为所示,假设 y = { y 1 , y 3 , . . . , y ∣ b ∣ − 1 } y=\{y_1,y_3, ..., y_{|b|-1}\} y={y1,y3,...,yb1}为显式的n-gram序列, y M = { y 2 , y 4 } y_M=\{y_2, y_4\} yM={y2,y4}为随机选择的Masking token, 则Masking后的完整序列为 z ˉ M = { x 1 , [M] , x 4 , [M] , x 6 } \bar {z}_{\text{\\M}}=\{x_1, \text{[M]}, x_4, \text{[M]}, x_6\} zˉM={x1,[M],x4,[M],x6}

Explicitly N-gram Masked Language Modeling可通过如下方式进行优化:

− log p θ ( y M ∣ z M ) = − ∑ y ∈ y M log    p θ ( y ∣ z ˉ M ) \begin{split} -\text{log}p_{\theta}(y_M|z_{\text{\\}M}) = -\sum_{y \in y_M} \text{log} \; p_{\theta}(y|\bar{z}_{\text{\\}M}) \end{split} logpθ(yMzM)=yyMlogpθ(yzˉM)

图2 Explicitly N-gram MLM

3.2.3 Comprehensive N-gram Prediction

通过以上讨论可知,Contiguously MLM是从细粒度角度进行预测连续token, Explicitly N-gram MLM是从粗粒度角度进行预测n-gram token, 而本节介绍的Comprehensive N-gram是一种融合细粒度和粗粒度的预测方式,其将更加全面地进行建模。其优化的目标函数为以上两种方式的融合,这里需要注意这两种方式是基于统一的上下文 z ˉ M \bar{z}_{\text{\\}M} zˉM进行预测:

− log    p θ ( y M , z M ∣ z ˉ M ) = − ∑ y ∈ y M log    p θ ( y ∣ z ˉ M ) − ∑ z ∈ z M ∑ x ∈ z log    p θ ( x ∣ z ˉ M ) \begin{split} -\text{log} \; p_{\theta}(y_M, z_M|\bar{z}_{\text{\\}M}) = -\sum_{y \in y_M} \text{log} \; p_{\theta}(y|\bar{z}_{\text{\\}M})-\sum_{z \in z_M} \sum_{x \in z} \text{log}\; p_{\theta}(x|\bar{z}_{\text{\\}M}) \end{split} logpθ(yM,zMzˉM)=yyMlogpθ(yzˉM)zzMxzlogpθ(xzˉM)

图3a展示了细粒度和粗粒度预测的详细融合方式,其将细粒度的预测位置直接拼接到了序列的末尾,图中以虚线分割。其中虚线以左是Explictly N-gram的粗粒度预测,虚线以右是Contiguously MLM的细粒度预测。以 y 2 y_2 y2​​位置为例,由于其包含两个token,所以细粒度预测需要预测2次(论文中这两个位置使用了 M 1 M_1 M1​​和 M 2 M_2 M2​​​这两个不同的token进行Masking)。

此时,整个文本序列为: [ x 1 , [M] , x 4 , [M] , x 6 , [M1] , [M2] , [M1] ] [x_1, \text{[M]}, x_4, \text{[M]}, x_6, \text{[M1]}, \text{[M2]}, \text{[M1]}] [x1,[M],x4,[M],x6,[M1],[M2],[M1]]​​​​, 为了在Self-Attention时不造成信息的混乱,ERNIE-Gram约定:

  • 虚线以左的 Explicitly N-gram MLM 粗粒度预测,即在预测 y 2 y_2 y2 y 4 y_4 y4​时,只能看见虚线以左的token。

  • 虚线以后的Contiguously MLM细粒度预测,即在预测 x 2 , x 3 x_2,x_3 x2,x3 x 5 x_5 x5​​时,只能看见自己以及虚线以左的token。

图3b展示了其计算时的Attention矩阵,其中红色点表示相互能够看见,在Self-Attention计算时,相互的信息需要融入。

图3 Comprehensive N-gram Prediction

3.3. 使用生成器显式建模N-gram Relation

为了更加显式地建模不同n-gram之间的关系,在预训练阶段,ERNIE-Gram借鉴了Electra的思路,使用一个生成器去生成一个位置的n-gram词,并且用这个n-gram词去mask该位置的n-gram token。

如图4所示,Transformer Encoder θ ′ {\theta}^{'} θ​​​​​便是生成器,图4b展示了使用生成的n-gram token去mask原始句子token的一个样例,ERNIE-Gram根据数据Masking位置的词分布采样了public official和completely去替换了原始语句词,即

  • 原始语句:the prime minister proposed nothing less than a overhaul of the tax system.

  • Masking语句:the public official proposed completely a overhaul of the tax system.

然后将Masking语句传入Transformer Encoder θ \theta θ​中进行训练。

图4 Enhanced N-gram Relation Modeling

假设 y M ′ = { y 2 ′ , y 4 ′ } y_M^{'} = \{ y_2^{'}, y_4^{'}\} yM={y2,y4}表示生成的n-gram项, z ˉ M ′ = { x 1 , y 2 ′ , x 4 , y 4 ′ , x 6 } \bar{z}^{'}_{\text{\\}M} = \{x_1, y_2^{'}, x_4, y_4^{'},x_6\} zˉM={x1,y2,x4,y4,x6}表示用生成n-gram项Masking后的序列,则联合的预训练目标函数为:

− log    p θ ′ ( y M ∣ z ˉ M ′ ) − log    p θ ( y M , z M ∣ z ˉ M ′ ) \begin{split} -\text{log} \; p_{\theta^{'}}(y_M|\bar{z}_{\text{\\}M ^{'}} ) - \text{log}\; p_{\theta}(y_M, z_M|\bar{z}_{\text{\\}M ^{'}} ) \end{split} logpθ(yMzˉM)logpθ(yM,zMzˉM)

另外,ERNIE-Gram融入了the replaced token detection (RTD)任务,用于识别这些token是否是被生成器替换的token。假设 z ^ M ′ = { x 1 , y 2 , x 4 , y 4 , x 6 } \hat{z}^{'}_{\text{\\}M } = \{x_1, y_2, x_4, y_4,x_6\} z^M={x1,y2,x4,y4,x6}​为真实目标n-gram词替换后的序列,则RTD的目标函数为:

− log    p θ ( 1 ( z ˉ M ′ = z ^ M ∣ z ˉ M ′ ) = − ∑ t = 1 ∣ z ^ M ∣ log    p θ ( 1 ( z ˉ M , t ′ = z ^ M , t ∣ z ˉ M , t ′ ) \begin{split} \begin{align} &-\text{log} \; p_{\theta}(\mathbb{1}(\bar{z}^{'}_{\text{\\}M} = \hat{z}_{\text{\\}M} |\bar{z}^{'}_{\text{\\}M}) \\ &= - \sum_{t=1}^{|\hat{z}_{\text{\\}M}|} \text{log}\; p_{\theta}(\mathbb{1}(\bar{z}^{'}_{\text{\\}M,t} = \hat{z}_{\text{\\}M,t} |\bar{z}^{'}_{\text{\\}M,t}) \end{align} \end{split} logpθ(1(zˉM=z^MzˉM)=t=1z^Mlogpθ(1(zˉM,t=z^M,tzˉM,t)

  • 相关资料
    1. ERNIE-Gram: Pre-training with Explicitly N-Gram Masked language Modeling for Natural Language Understanding

    2. ERNIE-Gram github

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

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

相关文章

旧键盘打字 两数之和

&#x1f495;"不要因为别人的成功而感到沮丧&#xff0c;你的时机会来&#xff0c;只要你继续努力、坚持不懈。"&#x1f495; &#x1f43c;作者:不能再留遗憾了&#x1f43c; &#x1f386;专栏:Java学习&#x1f386; &#x1f697;本文章主要内容:使用哈希表的思…

2023年江苏省中职网络安全Web渗透测试解析(超详细)

一、竞赛时间 180分钟 共计3小时 二、竞赛阶段 1.访问地址http://靶机IP/web1,分析页面内容,获取flag值,Flag格式为flag{xxx}; 2.访问地址http://靶机IP/web2,访问登录页面。用户user01的密码为1-1000以内的数,获取用户user01的密码,将密码作为Flag进行提交,Flag格式为…

Java数据结构之第十四章、泛型进阶

补充复杂示例&#xff1a; public class MyArray<E extends Comparable<E>> { ... } 表明E必须是实现了Comparable接口的 泛型基础内容 目录 一、通配符 二、通配符上界 三、通配符下界 一、通配符 ? 用于在泛型的使用&#xff0c;即为通配符 示例&#xf…

如何使用 Python Nornir 实现基于 CLI 的网络自动化?

在现代网络环境中&#xff0c;网络自动化已成为管理和配置网络设备的重要工具。Python Nornir 是一个强大的自动化框架&#xff0c;它提供了一个简单而灵活的方式来执行网络自动化任务。本文将详细介绍如何使用 Python Nornir 实现基于 CLI 的网络自动化。 1. Python Nornir 概…

jacoco增量覆盖率平台开发

先聊聊做这个平台的意义&#xff0c;从项目管理角度来说&#xff0c;测试说项目测试完成&#xff0c;该如何证明呢&#xff1f;一般情况下我们进行验收时没什么问题就算完成了&#xff0c;但是实际上测试很多情况并没有考虑到。所以该平台可以反哺测试的测试用例&#xff0c;让…

GO的服务

1.go的安装 1.1 确认版本go version go version go1.20.4 darwin/amd64 可以看到是macos10.14版本。如果是m1 需要安装对应的版本 1.2 用vscode 进行编写go的简单例子 先进入vscode的界面&#xff0c;新建一个目录为godemo&#xff0c;里面就是go的例子的工作目录&#xff0…

计算机的大小端存储模式(计算机小白必看!)

目录 1.什么是大端小端 2.为什么会有大小端模式之分呢&#xff1f; 3.如何判断当前机器为大端字节序还是小端字节序 本文将介绍计算机存储数据时的大小端问题 1.什么是大端小端 大端&#xff08;存储&#xff09;模式&#xff0c;是指数据的低位保存在内存的高地址中&…

可视化库seaborn常用操作介绍

目录 1.seaborn 概括2.Seaborn的调色板3.单变量绘图分析4.回归分析绘图5.分类图绘制6.FacetGrid使用7.Heatmap 1.seaborn 概括 seaborn库是一个用于数据可视化的Python库&#xff0c;它建立在matplotlib之上&#xff0c;可以让你轻松地创建各种美观的图表和图形。 在seaborn中…

致敬科技工作者:我们的世界因你们而美好

在我们的日常生活中&#xff0c;科技无处不在&#xff0c;而这一切离不开科技工作者的辛勤付出。作为一名科技从业者&#xff0c;我深深地理解并感悟到&#xff0c;科技工作者们的作用是不可替代的。 二十一世纪&#xff0c;科技的发展日新月异。我们见证了第一台计算机的发明…

RT1170启动详解:Boot配置、Bootable image头的组成

文章目录 1 基础知识2 BOOT配置2.1 BOOT_CFG配置2.2 BOOT_MODE 3 Bootable image3.1 文件格式3.2 Bootable image头的组成3.3 Bootable image的生成3.4 例&#xff1a;BootROM之non-XIP加载过程3.5 例&#xff1a;bin文件分析 1 基础知识 &#xff08;1&#xff09;BootROM Bo…

地面分割--Patchwork

文章目录 1问题定义2同心区域模型3按照区域划分的平面拟合4地面点似然估计&#xff08;GLE&#xff09;总结 patchwork是一种比较优秀的地面分割方法。其过程主要分为三个部分&#xff1a;同心圆环区域(CZM:concentric Zone Model)&#xff0c;按照区域划分的平面拟合(R-GPF:re…

OpenCV基础操作(5)图像平滑、形态学转换、图像梯度

import numpy as np import cv2 as cv from matplotlib import pyplot as plt一、图像平滑 1、2D卷积 我们可以对 2D 图像实施低通滤波&#xff08;LPF&#xff09;&#xff0c;高通滤波&#xff08;HPF&#xff09;等。 LPF 帮助我们去除噪音&#xff0c;模糊图像。HPF 帮助…

【数字信号处理】Goertzl算法详解推导及双音多频(DTMF)信号检测

Geortzel算法 【要点解析】 根据卷积公式 y ( n ) = ∑ m = − ∞ ∞ x ( m )

前端切图仔跑路真经

一、闭包 谈到闭包&#xff0c;我们首先要讨论的就是作用域。 1、作用域&#xff1a; 是指程序源代码中代码定义的范围。规定了如何设置变量&#xff0c;也就是确定了当前执行代码对变量的访问权限。 JavaScript采用词法作用域&#xff0c;也就是静态作用域&#xff0c;就是在…

直接带你使用 FreeRTOS 的 API 函数(基于 CubeMX 生成)(不断更新)

作者有话要说 对于这个越来约浮躁的社会&#xff0c;什么都要钱&#xff0c;特别是网上那些垃圾教程&#xff0c;越听越模糊&#xff0c;那行吧&#xff0c;我直接就从 FreeRTOS 的 API函数 学起&#xff0c;管你这么多底层内容的&#xff0c;以后再说吧&#xff01;&#xff0…

[中间件漏洞]apache漏洞复现

目录 apache未知扩展名解析漏洞 漏洞复现 防范建议 AddHandler导致的解析漏洞 防范建议 Apache HTTPD 换行解析漏洞&#xff08;CVE-2017-15715&#xff09; 漏洞复现 防范建议 apache未知扩展名解析漏洞 Apache默认一个文件可以有多个以点分割的后缀&#xff0c;当最右边的后缀…

【LeetCode热题100】打卡第5天:最长回文子串

文章目录 最长回文子串⛅前言&#x1f512;题目&#x1f511;题解 最长回文子串 ⛅前言 大家好&#xff0c;我是知识汲取者&#xff0c;欢迎来到我的LeetCode热题100刷题专栏&#xff01; 精选 100 道力扣&#xff08;LeetCode&#xff09;上最热门的题目&#xff0c;适合初识…

部署OA系统

文章目录 前言一、OA系统基础1.OA系统2.魔方OA3.OA系统架构4.部署OA系统 二、使用步骤总结 前言 部署OA系统&#xff0c;以魔方OA为例 一、OA系统基础 1.OA系统 办公自动化&#xff08;Office Automation&#xff0c;简称OA&#xff09;&#xff0c;是将计算机、通信等现代化…

⑥电子产品拆解分析-食物电子秤

⑥电子产品拆解分析-食物电子秤 一、功能介绍二、电路分析以及器件作用三、原理图复现与学习1、电源电路2、按键电路3、其它接口电路 一、功能介绍 ①高精度0.1g称重&#xff1b;②内置锂电池和外加2个7号电池超长续航&#xff1b;③可进行克和盎司单位称重&#xff1b;④一键智…

Flask or FastAPI? Python服务端初体验

1. 引言 最近由于工作需要&#xff0c;又去了解了一下简单的python服务搭建的相关工作&#xff0c;主要是为了自己开发的模型或者工具给同组的人使用。之前介绍的针对于数据科学研究比较友好的一个可以展示的前端框架Streamlit可以说是一个利器。不过&#xff0c;随着ChatGPT的…