预训练语言模型(GPT,BERT)

文章目录

  • GPT 模型
    • 预训练语言模型
    • 模型和学习
  • BERT 模型
    • 去噪自编码器
    • 模型和学习
    • 模型特点
  • References

在自然语言处理中事先使用大规模语料学习基于 Transformer 等的语言模型,之后用于各种任务的学习和预测,称这种模型为预训练语言模型。代表性的模型有 BERT (bidirectional encoder representations from Transformers)和 GPT (generative pre-training)。BERT 的模型是 Transformer 的编码器。首先在预训练中使用大规模语料通过掩码语言模型化的方法估计模型的参数,之后在微调中使用具体任务的标注数据对参数进行进一步调节。前者的过程是无监督学习,后者的过程是监督学习。GPT 的模型是 Transformer 的解码器,预训练通过一般的语言模型化方式进行。

GPT 模型

预训练语言模型

预训练语言模型的基本想法如下:基于神经网络,如 Transformer 的编码器或解码器,实现语言模型,以计算语言的生成概率。首先使用大规模的语料通过无监督学习的方式学习模型的参数,称为预训练,得到的模型可以有效地表示自然语言的特征;之后将模型用于一个具体任务,使用少量的标注数据通过监督学习的方式进一步学习模型的参数,称为微调,任务称为下游任务(downstream task)。预训练使用通用的语料统一进行,微调使用各个下游任务的标注数据分别进行。微调的模型有时在预训练模型的基础上增加新的参数。

下表比较了 GPT 和 BERT 的主要特点,其主要区别在于模型的架构和预训练方式。

GPTBERT
语言模型类型单向语言模型双向语言模型
模型架构Transformer 解码器Transformer 编码器
预训练方式语言模型化掩码语言模型化
预训练原理序列概率估计去噪自编码器
下游任务语言理解、语言生成语言理解

GPT 是单向语言模型,从一个方向对单词序列建模,方向为从左到右或者从右到左。假设有单词序列 x = x 1 , x 2 , ⋯   , x n \bm{x}=x_1,x_2,\cdots,x_n x=x1,x2,,xn,在单词序列的各个位置上,单向语言模型具有以下单词生成的条件概率
P ( x i ∣ x 1 , x 2 , ⋯   , x i − 1 ) , i = 1 , 2 , ⋯   , n P(x_i|x_1,x_2,\cdots,x_{i-1}),\quad i=1,2,\cdots,n P(xix1,x2,,xi1),i=1,2,,n 每一个位置的单词依赖于之前位置的单词。可以使用单向语言模型计算单词序列 x = x 1 , x 2 , ⋯   , x n \bm{x}=x_1,x_2,\cdots,x_n x=x1,x2,,xn 的生成概率。

BERT 是双向语言模型,从两个方向同时对单词序列建模。在单词序列的各个位置上,双向语言模型具有以下单词生成的条件概率
P ( x i ∣ x 1 , x 2 , ⋯   , x i − 1 , x i + 1 , ⋯   , x n ) , i = 1 , 2 , ⋯   , n P(x_i|x_1,x_2,\cdots,x_{i-1},x_{i+1},\cdots,x_n),\quad i=1,2,\cdots,n P(xix1,x2,,xi1,xi+1,,xn),i=1,2,,n 每一个位置的单词依赖于之前位置和之后位置的单词。

GPT 的预训练通过语言模型化(language modeling)的方式进行,基于序列概率估计。对给定的单词序列 x = x 1 , x 2 , ⋯   , x n \bm{x}=x_1,x_2,\cdots,x_n x=x1,x2,,xn,计算以下负对数似然函数或交叉熵,并通过其最小化估计模型的参数:
− log ⁡ P ( x ) = − ∑ i = 1 n log ⁡ P θ ( x i ∣ x 1 , x 2 , ⋯   , x i − 1 ) -\log P(\bm{x})=-\sum_{i=1}^n \log P_{\bm{\theta}} (x_i|x_1,x_2,\cdots,x_{i-1}) logP(x)=i=1nlogPθ(xix1,x2,,xi1)

BERT 的预训练主要通过掩码语言模型化的方式进行,可以认为基于去噪自编码器。假设单词序列 x = x 1 , x 2 , ⋯   , x n \bm{x}=x_1,x_2,\cdots,x_n x=x1,x2,,xn 中有若干个单词被随机掩码,也就是被改写为特殊字符 <mask>,得到掩码单词序列 x ~ \tilde{\bm{x}} x~,假设被掩码的几个单词是 x ˉ \bar{\bm{x}} xˉ。计算以下负对数似然函数,并通过其最小化估计模型的参数:
− log ⁡ P ( x ˉ ∣ x ~ ) ≈ − ∑ i = 1 n δ i log ⁡ P θ ( x i ∣ x ~ ) -\log P(\bar{\bm{x}}|\tilde{\bm{x}}) \approx -\sum_{i=1}^n \delta_i \log P_{\bm{\theta}} (x_i|\tilde{\bm{x}}) logP(xˉx~)i=1nδilogPθ(xix~) 其中, δ i \delta_i δi 取值为 1 或 0,表示是否对位置 i i i 的单词进行掩码处理。

BERT 只能用于语言理解,语言理解是对自然语言进行分析的处理,如文本分类、文本匹配、文本序列标注。

模型和学习

模型

GPT 模型有以下结构。输入是单词序列 x 1 , x 2 , ⋯   , x n x_1,x_2,\cdots,x_n x1,x2,,xn,可以是一个句子或一段文章。首先经过输入层,产生初始的单词表示向量的序列,记作矩阵 H ( 0 ) \bm{H}^{(0)} H(0)
H ( 0 ) = X + E \bm{H}^{(0)} = \bm{X} + \bm{E} H(0)=X+E 其中, X \bm{X} X 表示单词的词嵌入的序列 X = ( x 1 , x 2 , ⋯   , x n ) \bm{X}=(\bm{x}_1,\bm{x}_2,\cdots,\bm{x}_n) X=(x1,x2,,xn),矩阵 E \bm{E} E 表示单词的位置嵌入的序列 E = ( e 1 , e 2 , ⋯   , e n ) \bm{E}=(\bm{e}_1,\bm{e}_2,\cdots,\bm{e}_n) E=(e1,e2,,en) X , E , H ( 0 ) \bm{X}, \bm{E}, \bm{H}^{(0)} X,E,H(0) d × n d\times n d×n 矩阵,设词嵌入和位置嵌入向量的维度是 d d d

之后经过 L L L 个解码层,得到单词表示向量的序列,记作矩阵 H ( L ) \bm{H}^{(L)} H(L)
H ( L ) = transformer_decoder ( H ( 0 ) ) \bm{H}^{(L)} = \text{transformer\_decoder}(\bm{H}^{(0)}) H(L)=transformer_decoder(H(0)) 具体地, H ( L ) = ( h 1 ( L ) , h 2 ( L ) , ⋯   , h n ( L ) ) \bm{H}^{(L)} = \left(\bm{h}_1^{(L)},\bm{h}_2^{(L)},\cdots,\bm{h}_n^{(L)}\right) H(L)=(h1(L),h2(L),,hn(L))
其中, h i ( L ) \bm{h}_i^{(L)} hi(L) 是第 i i i 个位置的单词表示向量。GPT 模型中,在每一层,每一个位置的表示向量是该位置的单词基于之前位置的上下文表示。

GPT 模型的输出是在单词序列各个位置上的条件概率,第 i i i 个位置的单词的条件概率 p i p_i pi 定义为
P θ ( x i ∣ x 1 , x 2 , ⋯   , x i − 1 ) = softmax ( W x ⊤ h i ( L ) ) P_{\bm{\theta}} (x_i|x_1,x_2,\cdots,x_{i-1})=\text{softmax}(\bm{W}_x^\top \bm{h}_i^{(L)}) Pθ(xix1,x2,,xi1)=softmax(Wxhi(L)) 其中 W x \bm{W}_x Wx 表示所有单词的权重矩阵。

下图显示的是 GPT 模型的架构。GPT 利用 Transformer 解码器对语言的内容进行层次化的组合式的表示。

在这里插入图片描述
GPT 中解码层的多头自注意力都是单向的,也就是各个位置的单词只针对之前所有位置的单词进行自注意力计算。


预训练

预训练时,估计模型的参数,使模型对单词序列数据有准确的预测。预训练估计得到的参数作为下游任务模型的初始值。整个预训练通过 Transformer 解码器的学习进行。


微调

微调时,进一步调节参数,使模型对下游任务有准确的预测。假设下游任务是文本分类,输入单词序列 x ′ = x 1 , x 2 , ⋯   , x m \bm{x}' = x_1,x_2,\cdots,x_m x=x1,x2,,xm,输出类别是 y y y,计算条件概率
P θ , ϕ = ( y ∣ x 1 , x 2 , ⋯   , x m ) = softmax ( W y ⊤ h m ( L ) ) P_{\bm{\theta,\phi}} = (y|x_1,x_2,\cdots,x_m) = \text{softmax}(\bm{W}_y^\top \bm{h}_m^{(L)}) Pθ,ϕ=(yx1,x2,,xm)=softmax(Wyhm(L)) ϕ \phi ϕ 表示分类的参数。

损失函数包括两部分
L F T = L C L S + λ ⋅ L L M L_{FT}=L_{CLS} + \lambda \cdot L_{LM} LFT=LCLS+λLLM 一个是分类的损失函数 L C L S = − log ⁡ P θ , ϕ ( y ∣ x ′ ) L_{CLS} = -\log P_{\bm{\theta,\phi}} (y|\bm{x}') LCLS=logPθ,ϕ(yx)
另一个是语言模型化的损失函数
L L M = − ∑ j = 1 m log ⁡ P θ ( x j ∣ x 1 , x 2 , ⋯   , x j − 1 ) L_{LM} = -\sum_{j=1}^m \log P_{\bm{\theta}} (x_j|x_1,x_2,\cdots,x_{j-1}) LLM=j=1mlogPθ(xjx1,x2,,xj1)

如果下游任务是生成,针对输入单词序列,进一步调节模型的参数,使得模型对之有准确的预测。损失函数只有语言模型化的部分。

GPT 是单向语言模型,用于语言理解时没有优势。因为语言理解中,输入是一个句子或一段文章,从两个方向同时对语言建模更加合理。BERT 可以解决这个问题。


BERT 模型

去噪自编码器

自编码器是用于数据表示的无监督学习的一种神经网络。自编码器由编码器和解码器网络组成。学习时,编码器将输入向量 x \bm{x} x 转换为中间表示向量 z \bm{z} z,解码器再将中间表示向量转换为输出向量 y \bm{y} y。假设 x \bm{x} x y \bm{y} y 的维度相同,而 z \bm{z} z 的维度远低于 x \bm{x} x y \bm{y} y 的维度。学习的目标是尽量使输出向量和输入向量保持一致,则认为学到的中间表示 z \bm{z} z 就是数据 x \bm{x} x 的表示。

自编码器学习实际进行的是对数据的压缩,得到的中间表示能有效地刻画数据的特征。因为通过解压可以得到原始数据的近似,说明中间表示保留了数据中的主要信息

去噪自编码器是自编码器的扩展,学习时在输入中加入随机噪声,以学到稳健的自编码器。

学习时,首先根据条件概率分布 P ( x ~ ∣ x ) P(\bm{\tilde{x}}|\bm{x}) P(x~x) 对输入向量 x \bm{x} x 进行随机变换,得到有噪声的输入向量 x ~ \bm{\tilde{x}} x~。最基本的情况下,编码器、解码器、目标函数分别是
z = F ( x ) = a ( W E x ~ + b E ) \bm{z} = F(\bm{x}) = a(\bm{W}_E \bm{\tilde{x}}+\bm{b}_E) z=F(x)=a(WEx~+bE) y = G ( z ) = a ( W D z + b D ) \bm{y} = G(\bm{z}) = a(\bm{W}_D \bm{z}+\bm{b}_D) y=G(z)=a(WDz+bD) L = 1 N ∑ i = 1 N L ( x i , y i ) = 1 N ∑ i = 1 N L ( x i , G ( F ( x ~ i ) ) ) L=\frac{1}{N}\sum_{i=1}^N L(x_i,y_i)=\frac{1}{N}\sum_{i=1}^N L(x_i,G(F(\tilde{x}_i))) L=N1i=1NL(xi,yi)=N1i=1NL(xi,G(F(x~i)))

模型和学习

模型

BERT 模型有以下结构。输入是两个合并的单词序列
< cls > , x 1 , x 2 , ⋯   , x m − 1 , < sep > , x m + 1 , x m + 2 , ⋯   , x m + n − 1 , < sep > <\text{cls}>,x_1,x_2,\cdots,x_{m-1},<\text{sep}>,x_{m+1},x_{m+2},\cdots,x_{m+n-1},<\text{sep}> <cls>,x1,x2,,xm1,<sep>,xm+1,xm+2,,xm+n1,<sep> 其中, x 1 , x 2 , ⋯   , x m x_1,x_2,\cdots,x_m x1,x2,,xm 是第一个单词序列, x m + 1 , x m + 2 , ⋯   , x m + n − 1 x_{m+1},x_{m+2},\cdots,x_{m+n-1} xm+1,xm+2,,xm+n1 是第二个单词序列,<cls> 是表示类别的特殊字符,<sep> 是表示序列分割的特殊字符,合并的单词序列共有 m + n + 1 m+n+1 m+n+1 个单词和字符。每一个单词序列是一个句子或一段文章。首先经过输入层,产生初始的单词表示向量的序列,记作矩阵 H ( 0 ) \bm{H}^{(0)} H(0)
H ( 0 ) = X + S + E \bm{H}^{(0)} = \bm{X} + \bm{S} + \bm{E} H(0)=X+S+E 这里,矩阵 S \bm{S} S 是区别前后单词序列的标记序列 S = ( a , a , ⋯ a , b , b , ⋯ b ) \bm{S}=(\bm{a},\bm{a},\cdots\bm{a},\bm{b},\bm{b},\cdots\bm{b}) S=(a,a,a,b,b,b),含有 m + 1 m+1 m+1 个向量 a \bm{a} a n n n 个向量 b \bm{b} b

使用拼接的单词序列作为输入是让 BERT 不仅能用于以一个文本为输入的任务,如文本分类,也能用于以两个文本为输入的任务,如文本匹配

之后经过 L L L 个编码层,得到单词表示向量的序列,记作矩阵 H ( L ) \bm{H}^{(L)} H(L)
H ( L ) = transformer_encoder ( H ( 0 ) ) \bm{H}^{(L)} = \text{transformer\_encoder}(\bm{H}^{(0)}) H(L)=transformer_encoder(H(0)) 具体地, H ( L ) = ( h 1 ( L ) , h 2 ( L ) , ⋯   , h m + n ( L ) ) \bm{H}^{(L)} = \left(\bm{h}_1^{(L)},\bm{h}_2^{(L)},\cdots,\bm{h}_{m+n}^{(L)}\right) H(L)=(h1(L),h2(L),,hm+n(L))
其中, h i ( L ) \bm{h}_i^{(L)} hi(L) 是第 i i i 个位置的单词表示向量。BERT 模型中,在每一层,每一个位置的表示向量是该位置的单词基于之前位置和之后位置的上下文的表示。

BERT 模型的输出是在合并的单词序列的各个位置上的条件概率,第 i i i 个位置的单词(包括特殊字符)的条件概率 p i p_i pi 定义为
P θ ( x i ∣ x 1 , x 2 , ⋯   , x i − 1 , x i + 1 , ⋯   , x m + n ) = softmax ( W x ⊤ h i ( L ) ) P_{\bm{\theta}} (x_i|x_1,x_2,\cdots,x_{i-1}, x_{i+1},\cdots,x_{m+n})=\text{softmax}(\bm{W}_x^\top \bm{h}_i^{(L)}) Pθ(xix1,x2,,xi1,xi+1,,xm+n)=softmax(Wxhi(L)) 其中 W x \bm{W}_x Wx 表示所有单词的权重矩阵。

BERT 中编码层的多头自注意力都是双向的,也就是各个位置的单词针对其他位置的单词都进行自注意力计算,这一点与 GPT 不同。下图比较了 GPT 和 BERT 中表示之间关系的差异。BERT 每一层每一个位置的表示都是由下一层所有位置的表示组合而成,而 GPT 中每一层每一个位置的表示都是由下一层之前所有位置的表示组合而成

在这里插入图片描述


预训练

预训练数据的每个样本由两个单词序列 A 和 B 合并组成,中间由特殊字符 <sep> 分割。50% 的样保证 A 和 B 是同一篇文章中的连续文本,50% 的样本中 A 和 B 来自不同篇文章。在每一个样本的合并单词序列中,随机选择 15% 的位置进行掩码操作。对于掩码操作,在选择的 15% 的位置上,有 80% 的单词替换为特殊字符 <mask>,有 10% 的单词随机替换为其他单词,剩下 10% 的单词保持不变。

BERT 模型的预训练由两部分组成,掩码语言模型化下句预测。掩码语言模型化的目标是复原输入单词序列中被掩码的单词,可以看作是去噪自编码器学习,对被掩码(噪声)的单词独立地进行复原。下句预测的目标是判断输入单词序列是否来自同一篇文章。

模型特点

BERT 通过其多层多头注意力机制能够有效地表示语言的词汇、语法、语义信息。通过自注意力,每一层的每一个位置的单词表示与其他位置的单词表示组合成新的表示,传递到上一层的同一位置。自注意力是多头的,每个头代表一个侧面,因此每一个位置的单词表示由多个不同侧面的表示组合而成。单词表示的内容可以通过自注意力的权重推测

BERT 的各层有不同的特点。底层主要表示词汇信息,中层主要表示语法信息,上层主要表示语义信息

对 BERT 和 GPT 的直观解释是:机器基于大量的语料,做了大量的词语填空(BERT)或词语接龙(GPT)练习,捕捉到了由单词组成句子、再由句子组成文章的各种规律,并且把它们表示并记忆在模型之中。也就是说,BERT 通过无监督学习获取了大量的词汇、语法、语义知识。当用于一个下游任务时,只需要很少的标注数据就可以学习到完成该任务所需的知识。


References

[1] 《机器学习方法》,李航,清华大学出版社。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

STA环境 - 时钟

目录1. 指定时钟create_clock1.1. 时钟延迟set_clock_latency 1.2. 时钟不确定度&#xff08;时钟抖动&#xff09;set_clock_uncertainty 1.3. 时钟过渡时间set_clock_transition 2. 衍生时钟create_generated_clock3. 划定时钟域set_clock_groupsSTA环境配置中对时钟如何约束…

【总结】爬虫4-selenium

爬虫4-selenium 1. selenium 基本操作 在使用selenium之前必须先配置浏览器对应版本的webdriver。才可以控制浏览器打开网页 1.1 创建浏览器对象 b Chrome()1.2 打开网页 &#xff08;需要哪个网页数据&#xff0c;就打开那个网页对应的网页地址&#xff09; b.get(https…

git 001--建本地仓库和远程仓库和拉代码

要使用Git对我们的代码进行管理&#xff0c;首先需要获得Git仓库。 获取Git仓库通常有两种方式&#xff1a; 在本地初始化Git仓库&#xff08;不常用&#xff09; 从远程仓库克隆&#xff08;常用&#xff09; 一.建本地仓库 方法一: 在自己电脑的任意目录下创建一个空目录…

字节测试总监,让我们用这份《测试用例规范》,再也没加班过

经常看到无论是刚入职场的新人&#xff0c;还是工作了一段时间的老人&#xff0c;都会对编写测试用例感到困扰&#xff1f;例如&#xff1a; 固然&#xff0c;编写一份好的测试用例需要&#xff1a;充分的需求分析能力 理论及经验加持&#xff0c;作为测试职场摸爬打滚的老人&…

为什么企业需要一个“企业办公浏览器”?

目前&#xff0c;大多数企业还在用着传统的Web浏览器&#xff0c;它是各行业企业办公最常用到的应用程序&#xff0c;搜索资料、打开其他应用工具、打开文档等等&#xff0c;企业员工几乎每天都在用它做这些工作。 但实际上&#xff0c;Web浏览器并不是一个企业专用的办公应用软…

炒黄金所需的k线图基础知识(上)

炒金&#xff0c;一般是指对杠杠式的黄金电子合约&#xff08;如伦敦金、黄金期货&#xff09;进行短线的多空操作&#xff0c;从中赚取波动价差的行为。无论投资者从事内盘还是外盘交易&#xff0c;K线图都是基础的、必备的知识。 1、什么叫K线图&#xff1f; K线图源于日本的…

计算机网络名词解释和简答题总结

名词解释 CSMA/CD&#xff08;载波监听多点接入/碰撞检测协议&#xff09; CSMA/CD是一种基于冲突检测的载波监听多路访问技术。CSMA/CD协议要求站点在发送数据之前先监听信道。如果信道空闲&#xff0c;站点就可以发送数据&#xff1b;如果信道忙&#xff0c;则站点不能发送…

使用CookieJar提取cookie信息

首先&#xff0c;推荐几个帖子&#xff0c;大伙可以先看看。国内通过cookiejar主要获取cookie的方法&#xff0c;大致都是如此的。 http.cookiejar库之CookieJar_pigYanYan的博客-CSDN博客 Python编程&#xff1a;cookiejar的使用_彭世瑜的博客-CSDN博客 再推荐一个资料帖&a…

Linux权限

Linux下有两种用户&#xff1a;超级用户(root)、普通用户。超级用户(root):可以在linux系统下做任何事&#xff0c;不受限制&#xff0c;只有1个。普通用户:在linux系统下做有限的事,有N个。超级用户的提示符#&#xff1b;普通用户的提示符$切换用户的命令:su切换root时可以直接…

MQ之kafka

一 概念 Kafka是最初由Linkedin公司开发&#xff0c;是一个分布式、支持分区的&#xff08;partition&#xff09;、多副本的&#xff08;replica&#xff09;&#xff0c;基于zookeeper协调的分布式消息系统&#xff0c;它的最大的特性就是可以实时的处理大量数据以满足各种需…

Visual Studio Code2023(VSCode2023)安装包下载及安装教程(最新版接入了chat GPT)

[软件名称]: Visual Studio Code2023 [软件大小]: 88.6 MB [安装环境]: Win11/Win10/Win7 [软件安装包下载]:https://pan.quark.cn/s/ee94a4aa2abc Visual Studio Code简称“VS Code”是Microsoft在2015年4月30日Build开发者大会上正式宣布一个运行于 Mac OS X、Windows和 Lin…

【Datawhale动手学深度学习笔记】多层感知机代码实践

多层感知机 激活函数 激活函数&#xff08;activation function&#xff09;通过计算加权和并加上偏置来确定神经元是否应该被激活&#xff0c; 它们将输入信号转换为输出的可微运算。 大多数激活函数都是非线性的。 由于激活函数是深度学习的基础&#xff0c;下面简要介绍一…

多线程进阶学习09------ThreadLocal详解

ThreadLocal&#xff1a;提供线程的局部变量&#xff0c;对于线程共享变量如果使用ThreadLocal则无需加锁&#xff0c;更省事省心。 ThreadLocal本地线程变量,线程自带的变量副本(实现了每一个线程副本都有一个专属的本地变量,主要解决的就是让每一个线程绑定自己的值,自己用自…

FastReport .NET 2023.2.4 Crack

FastReport .NET Reporting and documents creation library for .NET 7 FastReport .NET适用于 .NET 7、.NET Core、Blazor、ASP.NET、MVC 和 Windows Forms 的全功能报告库。它可以在微软视觉工作室 2022 和 JetBrains Rider 中使用。 利用 .NET 7、.NET Core、Blazor、ASP.N…

React:九、组件的生命周期

1.生命周期的理解 组件从创建到死亡它会经历一些特定的阶段。React组件中包含一系列勾子函数(生命周期回调函数), 会在特定的时刻调用。我们在定义组件时&#xff0c;会在特定的生命周期回调函数中&#xff0c;做特定的工作。2.生命周期小案例 <!DOCTYPE html> <html…

操作系统权限维持(十五)之Linux系统-inetd远程后门

系列文章 操作系统权限维持&#xff08;一&#xff09;之Windows系统-粘贴键后门 操作系统权限维持&#xff08;二&#xff09;之Windows系统-克隆账号维持后门 操作系统权限维持&#xff08;三&#xff09;之Windows系统-启动项维持后门 操作系统权限维持&#xff08;四&…

leaflet加载GPX文件,第2种图形显示方法(119)

第119个 点击查看专栏目录 本示例的目的是介绍演示如何在vue+leaflet中加载GPX文件,将图形显示在地图上,这是另外一种方式,看前一种方式请从目录中查找。GPX文件是以GPS数据交换格式保存的GPS数据文件,是一种通用的地图信息文件,可以被众多GPS应用和Web服务更轻松地导入和…

Jenksin pipeline: 全局变量 和 input中的局部变量

在jenkins的流水线中全局变量的定义基本有两种实现方法&#xff1a;参数化构建过程中定义&#xff0c;流水线中直接定义 参数化构建过程中定义 流水线中直接定义(Jenkins 2.x支持代码及即服务) 可以用流水线生成 在配置parameters后&#xff0c;往往需要先构建一遍&#…

耗时 24 小时整理了网络安全学习路线,非常详细!

前言上次发的文章【都2023年了&#xff0c;还在问网络安全怎么入门】很多小伙伴在评论区回复不知道怎么学习&#xff0c;我也反思了一下&#xff0c;确实没写到学习方法和路线&#xff0c;所以这一期就出一一个怎么学习网络安全的学习路线和方法&#xff0c;觉得有用的话三连收…

软件测试入门简单么?入行后如何做职业规划

软件测试的确是入门相对简单的一个学科&#xff0c;他们不常写代码&#xff0c;主要去检查代码&#xff0c;是不是出现了漏洞、程序是否能运行下去&#xff1f;那这部分程序员就是做软件测试。 这个类别没有做Java难没有大数据那么复杂&#xff0c;但还可以拿到程序员的高薪。…