NLP学习笔记(八) GPT简明介绍

news2024/11/27 14:34:04

大家好,我是半虹,这篇文章来讲 GPT \text{GPT} GPT ( G enerative  P re- T raining \textbf{G}\text{enerative}\ \textbf{P}\text{re-}\textbf{T}\text{raining} Generative Pre-Training)

实际上, GPT \text{GPT} GPT 包括一系列论文,具体有 :

  1. GPT-1 \text{GPT-1} GPT-1 Improving Language Understanding by Generative Pre-Training \text{Improving Language Understanding by Generative Pre-Training} Improving Language Understanding by Generative Pre-Training
  2. GPT-2 \text{GPT-2} GPT-2 Language Models are Unsupervised Multitask Learners \text{Language Models are Unsupervised Multitask Learners} Language Models are Unsupervised Multitask Learners
  3. GPT-3 \text{GPT-3} GPT-3 Language Models are Few-Shot Learners \text{Language Models are Few-Shot Learners} Language Models are Few-Shot Learners

0  概述

GPT \text{GPT} GPT 本质上就是一个预训练语言模型,其用大规模无标注语料、以自回归的方式进行预训练

GPT \text{GPT} GPT 通过不断增加模型参数以及预训练语料规模进行更新迭代,并最终取得令人惊艳的效果


值得一提的是, GPT \text{GPT} GPT 的模型参数以及预训练语料规模非常夸张,我们来看一组数据就会清楚

注意量级换算, K ( Kilo ) = 1 0 3 ,  M ( Mega ) = 1 0 6 ,  G ( Giga ) = 1 0 9 ,  T ( Tera ) = 1 0 12 \text{K}(\text{Kilo}) = 10^3,\ \text{M}(\text{Mega}) = 10^6,\ \text{G}(\text{Giga}) = 10^9,\ \text{T}(\text{Tera}) = 10^{12} K(Kilo)=103, M(Mega)=106, G(Giga)=109, T(Tera)=1012

  • GPT-1 模型参数量为 117M,预训练语料有   5GB
  • GPT-2 模型参数量为 1.5G,预训练语料有 40GB
  • GPT-3 模型参数量为 175G,预训练语料有 45TB

最后再来简单回顾一下, GPT \text{GPT} GPT 系列模型及其相关模型的发展历程

2017 2017 2017 06 06 06 月, Transformer \text{Transformer} Transformer  横空出世,在自然语言处理领域中掀起轩然大波

2018 2018 2018 06 06 06 月, GPT-1 \text{GPT-1} GPT-1 正式发布,其用 Transformer \text{Transformer} Transformer  的解码器训练单向语言模型,引领预训练模型热潮

2018 2018 2018 10 10 10 月, BERT \text{BERT} BERT  随之发布,其用 Transformer \text{Transformer} Transformer  的编码器训练掩码语言模型,效果更超越 GPT-1 \text{GPT-1} GPT-1

2019 2019 2019 02 02 02 月, GPT-2 \text{GPT-2} GPT-2 沿着原有路线,增加更多数据,扩展更大模型,尝试解决 zero-shot \text{zero-shot} zero-shot 任务

2020 2020 2020 05 05 05 月, GPT-3 \text{GPT-3} GPT-3 是暴力出奇迹,深度挖掘预训练语言模型潜力,且最后在   few-shot \text{few-shot} few-shot 任务表现优秀

下面我们将会逐一介绍, GPT \text{GPT} GPT 系列模型的详细内容及其细节


1  介绍 GPT-1

关键词:无标注文本、自监督学习

1.1 动机

在自然语言处理领域,存在各种各样的任务,这些任务都需要大量的标注数据进行训练才有不错的模型效果

但针对特定任务的高质量标注数据难以获得,通常都需要花费大量的人力物力才能得到数量不多的有效数据


另一方面,在目前的互联网上有海量的文本,但这些文本是没有针对特定任务做标注的,被称为无标注文本

所以很难将这些文本应用到特定任务的训练,这未免有些遗憾和浪费


基于此情, GPT-1 \text{GPT-1} GPT-1  将预训练和微调的范式引入到自然语言处理领域,使得模型能够利用海量的无标注文本

具体来说就是先让模型在大规模无标注数据上针对通用任务进行训练,使模型具备理解语言的基础能力

然后将预训练好的模型在特定的有标注数据上针对下游任务进行微调,使模型能够适应不同的下游任务


其中最重要的是设计预训练任务让模型能够利用无标注文本进行训练,这关系到预训练模型基础能力的强弱

怎么利用无标注文本呢? GPT-1 \text{GPT-1} GPT-1  的想法就是做语言模型,简单来说,就是根据之前的词语预测下一个词语

这是一个自监督的学习,因此不需要对文本做特殊的标注,只需要把要预测的词语掩盖就行


1.2  模型结构

事实上, GPT-1 \text{GPT-1} GPT-1 可以看作是 Transformer \text{Transformer} Transformer 的解码器,然后在此基础上去掉解码层中的多头外注意力机制

解码器由若干个解码层堆叠而成,而且模型中上一个解码层的输出会作为下一个解码层的输入

解码层包括带掩码的多头自注意力机制和前馈神经网络两个子模块,每个子模块后有残差连接和层正则化

由于我们在之前的文章中已经详细介绍过各个模块细节,所以这里就不再重复了,整体的结构如下图所示

模型结构

具体来说, GPT-1 \text{GPT-1} GPT-1 包含 12 12 12 个改过的 Transformer \text{Transformer} Transformer 的解码层,这些解码层会堆叠起来

最后一个解码层的输出表示会经过线性预测层得到要预测单词的概率分布

而第一个解码层的输入表示由词元嵌入和位置嵌入相加得到,这里的嵌入是可学习向量,要通过数据训练

输入表示的示意图如下所示:

模型输入

1.3  模型训练

GPT-1 \text{GPT-1} GPT-1  的思想是先在无标注语料上预训练语言模型,再用预训练模型在有标注语料对下游任务进行微调


GPT-1 \text{GPT-1} GPT-1  首先要解决的问题是:怎么预训练语言模型

注意这里的语言模型是单向的,简单来说就是要模型根据之前若干个词语预测未来下一个词语是什么

形式化表达如下:

给定一个无标注语料库 U \mathcal{U} U,其中包含文本序列 { u 1 , . . . , u n } \{u_1, ..., u_n\} {u1,...,un}

语言模型的优化目标是最大化下面的似然函数,其中 k k k 表示上下文窗口大小
L 1 ( U ) = ∑ i log ⁡ P ( u i ∣ u i − k , . . . , u i − 1 ) L_1(\mathcal{U}) = \sum_{i}{\log P(u_i|u_{i-k},...,u_{i-1})} L1(U)=ilogP(uiuik,...,ui1)

GPT-1 \text{GPT-1} GPT-1  面临的下一个问题是:怎么对下游任务微调

所谓微调就是用预训练模型在有标注的数据集对特定下游任务继续训练,使得模型能够适应不同下游任务

形式化表达如下:

给定一个有标注数据集 C \mathcal{C} C,其中每个样本包含文本序列 { x 1 , . . . , x m } \{x^1,...,x^m\} {x1,...,xm} 和对应的标签 y y y

微调模型的优化目标是最大化下面的似然函数
L 2 ( C ) = ∑ ( x ,   y ) log ⁡ P ( y ∣ x 1 , . . . , x m ) L_2(\mathcal{C}) = \sum_{(x,\ y)}{\log P(y|x^1,...,x^m)} L2(C)=(x, y)logP(yx1,...,xm)

具体来说,我们会将预训练模型用于初始化,并在此基础上添加一个额外的线性预测层用于标签预测

输入序列经过预训练模型后,取序列最后一个单词在模型最后一层输出作为整个序列的特征向量表示

最终这个特征向量经过新增的线性预测层后,就能得到预测标签的概率分布


在对下游任务进行微调时,将语言模型作为辅助目标,有利于加速模型收敛,并且提高模型的泛化性

因此,最终微调目标如下,其中 λ \lambda λ 为任务的权重系数
L 3 ( C ) = L 2 ( C ) + λ L 1 ( C ) L_3(\mathcal{C}) = L_2(\mathcal{C}) + \lambda L_1(\mathcal{C}) L3(C)=L2(C)+λL1(C)

上述介绍的微调过程可直接用于分类任务,以此类推,我们可以拓展出如何处理其他类型的下游任务

核心是将不同类型下游任务的输入都转化为文本序列,下面是几个例子:

  1. 文本分类:给定单个句子,判断这个句子的类别

    解决方法:将这个句子直接输入预训练模型得到特征向量,然后经过预测层做分类

  2. 文本蕴涵:给定两个句子,判断两个句子的关系

    解决方法:将两个句子拼接输入预训练模型得到特征向量,然后经过预测层做分类

  3. 语义相似:给定两个句子,计算两个句子相似度

    解决方法:将两个句子前和后两次拼接输入预训练模型得到两个特征向量

         将两个特征向量逐元素相加后经过预测层计算相似度得分

  4. 多项选择:给定问题和多个选项,选择一个作为正确答案

    解决方法:将问题和多个选项分别拼接输入预训练模型得到多个特征向量

         将多个特征向量分别经过预测层计算匹配得分后选最大值作为答案

文本序列在输入模型微调前都需要添加特殊标记 GPT-1 \text{GPT-1} GPT-1 中使用的特殊标记如下:

  1. 开始标记 <s> 添加在输入文本开头
  2. 结尾标记 <e> 添加在输入文本结尾
  3. 分割标记   $   添加在拼接文本之间

下面是示意图:

下游任务_1

2  介绍 GPT-2

关键词:零样本任务、多任务学习

2.1 动机

GPT-1 \text{GPT-1} GPT-1  已具备很强大的能力,但仍存在着一些不足,其中最重要的一点是:下游任务不能泛化

GPT-1 \text{GPT-1} GPT-1  面对不同的下游任务,都需要重新进行训练,这要求各种下游任务要有对应的标注数据


从另一方面来说, GPT-1 \text{GPT-1} GPT-1 出现后不久, BERT \text{BERT} BERT 以更多的数据、更大的模型全面超越了 GPT-1 \text{GPT-1} GPT-1

而为了进行反击, GPT-2 \text{GPT-2} GPT-2 增加了数据和模型规模,并尝试解决更困难的零样本任务 ( zero-shot \text{zero-shot} zero-shot)


2.2 模型结构

GPT-2 \text{GPT-2} GPT-2  的模型结构与之前相比基本没变,只是做了一些细微的修改

概括来说,层正则化被移动到子模块之前,另有一个新的层正则化被添加到最后的自注意力模块之后


GPT-2 \text{GPT-2} GPT-2  并没有对模型结构有太大的创新,其最重要的改变在于使用了更大的数据和更多的模型参数

具体来说,作者设计了以下几种模型大小:

模型总参数解码层数量隐藏层维度备注
   117  M 117\ \text{M} 117 M 12 12 12   768 768 768 BERT BASE \text{BERT}_\text{BASE} BERTBASE GPT-1 \text{GPT-1} GPT-1 对标
   345  M 345\ \text{M} 345 M 24 24 24 1024 1024 1024 BERT LARGE \text{BERT}_\text{LARGE} BERTLARGE 对标
   762  M 762\ \text{M} 762 M 36 36 36 1280 1280 1280
1542  M 1542\ \text{M} 1542 M 48 48 48 1600 1600 1600 GPT-2 \text{GPT-2} GPT-2

2.3 模型训练

GPT-2 \text{GPT-2} GPT-2  的思想是在大规模无标注语料上预训练语言模型,然后直接把预训练模型应用到各种下游任务


这样的任务设定可以进一步引申为零样本任务

所谓零样本任务就是说预训练模型对下游任务进行预测时,不提供下游任务的训练样本,而是直接开始预测

这意味着预训练模型需要有泛化性,不用经过微调就可以应对各种下游任务


怎么使得预训练模型具备此能力呢?要从预训练过程入手,作者引入多任务学习的概念

所谓多任务学习就是说训练模型时,用多个任务的数据集,并且保证模型在各个任务的数据集上都可以收敛


说回模型, GPT-2 \text{GPT-2} GPT-2  还是将单向语言模型作为预训练任务,其训练方式还是和 GPT-1 \text{GPT-1} GPT-1 一样

不同在于, GPT-2 \text{GPT-2} GPT-2  会在更大型更丰富的语料上进行训练,可以认为这些语料隐式包含翻译、问答等的任务

与之对应, GPT-2 \text{GPT-2} GPT-2  的模型参数也增加了许多,使其能拥有更强大的学习能力


作者认为,当语言模型的容量足够大且训练语料的数量足够多时,通过无监督训练就能覆盖所有有监督任务

换句话说,所有有监督任务都是语言模型的子集,直观的解释是:理想的语言模型能真正理解语言


最后还有一点,预训练模型进行预测时,是不能出现特殊标记的,因为模型无法理解预训练时没见过的东西

模型在预测时的输入应该是纯自然语言,用于明确待做任务类型,这在后来的文献中称为提示 ( prompt \text{prompt} prompt )

下面是示意图, GPT-2 \text{GPT-2} GPT-2  所做的事情是:根据提示和输入来续写,从而完成各种下游任务

下游任务_2

3  介绍  GPT-3

关键词:少样本任务、上下文学习

3.1 动机

GPT-2 \text{GPT-2} GPT-2 的实验结果能看到:随着模型参数和训练语料的增加,模型的性能会不断提升

GPT-3 \text{GPT-3} GPT-3 继续沿着原有道路,进一步增加模型参数和训练语料,在大规模预训练模型上越走越远


另一方面, GPT-3 \text{GPT-3} GPT-3  不再追求零样本任务,而是转为少样本任务 ( few-shot \text{few-shot} few-shot)

这与人类的习惯更加相似,具有一定知识的人类,在给出若干个例子后,就可以学会某种能力


3.2 模型结构

GPT-3 \text{GPT-3} GPT-3  的模型结构与之前相比基本没变, 只是做了一些细微的修改

概括来说,就是用 Sparse Transformer \text{Sparse Transformer} Sparse Transformer 中提出的稀疏自注意力机制代替原有的自注意力机制


GPT-3 \text{GPT-3} GPT-3  也没有对模型结构有太大的创新,最重要的改变在于使用了更大的数据和更多的模型参数

具体来说,作者设计了以下几种模型大小:

名称模型总参数解码层数量隐藏层维度
GPT-3 Small \text{GPT-3 Small} GPT-3 Small 125  M 125\ \text{M} 125 M 12 12 12 768 768 768
GPT-3 Medium \text{GPT-3 Medium} GPT-3 Medium 350  M 350\ \text{M} 350 M 24 24 24 1024 1024 1024
GPT-3 Large \text{GPT-3 Large} GPT-3 Large 760  M 760\ \text{M} 760 M 24 24 24 1536 1536 1536
GPT-3 XL \text{GPT-3 XL} GPT-3 XL 1.3  B 1.3\ \text{B} 1.3 B 24 24 24 2048 2048 2048
GPT-3 2.7B \text{GPT-3 2.7B} GPT-3 2.7B 2.7  B 2.7\ \text{B} 2.7 B 32 32 32 2560 2560 2560
GPT-3 6.7B \text{GPT-3 6.7B} GPT-3 6.7B 6.7  B 6.7\ \text{B} 6.7 B 32 32 32 4096 4096 4096
GPT-3 13B \text{GPT-3 13B} GPT-3 13B 13  B 13\ \text{B} 13 B 40 40 40 5140 5140 5140
GPT-3 175B \text{GPT-3 175B} GPT-3 175B / GPT-3 \text{GPT-3} GPT-3 175  B 175\ \text{B} 175 B 96 96 96 12288 12288 12288

3.3 模型训练

GPT-3 \text{GPT-3} GPT-3  的思想是在大规模无标注语料上预训练语言模型,然后直接把预训练模型应用到各种下游任务


这和 GPT-2 \text{GPT-2} GPT-2 是一样的,不同之处在于 : GPT-2 \text{GPT-2} GPT-2  设定为零样本任务, GPT-3 \text{GPT-3} GPT-3  设定为少样本任务

所谓少样本任务就是说预训练模型对下游任务进行预测时,只提供极少量的任务样本供预训练模型使用


通常 GPT-3 \text{GPT-3} GPT-3 不会将这些极少量的任务样本用于微调模型,而是会将其当作提示输入到预训练模型

这是因为对参数量如此大的模型进行微调也是非常困难的


这样在预测时将任务样本放到提示中给模型来学习的行为,可以称作是上下文学习 ( in-context learning \text{in-context learning} in-context learning)

简单来说就是预训练模型需要在提示的上下文语境中学习要完成的下游任务


因此对于使用者来说,使用预训练模型完成下游任务最需要考虑的事情就是:如何设计提示

下面是一个例子:

下游任务_3

GPT-3 \text{GPT-3} GPT-3  的最终效果虽然已十分惊艳,但仍不可避免地存在一些局限性,下面来简单讨论下:

  1. 假设存在很多任务样本,如果以拼接的方式输入预训练模型,那么会使得提示文本很长,难以理解
  2. 预训练模型每次预测时,都会直接从给定的上下文获得信息,但是每次得到的信息都没有保存下来

好啦,本文到此结束,感谢您的阅读!

如果你觉得这篇文章有需要修改完善的地方,欢迎在评论区留下你宝贵的意见或者建议

如果你觉得这篇文章还不错的话,欢迎点赞、收藏、关注,你的支持是对我最大的鼓励 (/ω\)

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

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

相关文章

探针台常见的故障及解决方法

症状、 可能原因、 解决方法 移动样品后画面变模糊 —显微镜不垂直&#xff0c;调垂直显微镜 样品台不水平 —调水平样品台 显微镜视场亮度不足&#xff0c;边缘切割或看不到像—转换器不在定位位置上 把转换器转到定位位置上 管镜转盘不在定位位置上 —把管镜转盘转到定…

SpringCloud 中 Config、Bus、Stream、Sleuth

文章目录&#x1f68f; 第十三章 分布式配置中心&#x1f6ac; 一、Config 概述&#x1f6ac; 二、Config 快速入门&#x1f6ad; config-server&#xff1a;&#x1f6f9; 1、使用gitee创建远程仓库&#xff0c;上传配置文件&#x1f6f9; 2、导入 config-server 依赖&#x1…

【概念辨析】整型提升的深入理解(手画图解)

整型提升是一个小的知识点&#xff0c;但是请继续学习&#xff0c;保持空杯心态&#xff01; 目录 文章目录 前言 一、整型提升是什么&#xff1f; 二、发生整型提升的情况 1.字节数比int少的内置类型进行的整型提升 2.整型提升的规则 图解&#xff1a; 总结 前言 整型提升也是…

ubuntu18.04下交叉编译 nginx源码(支持推送H265的rtmp和http-flv)

ubuntu18.04下交叉编译 nginx源码&#xff08;支持推送H265的rtmp和http-flv&#xff09;适合在aarch64-linux-gnu平台下的交叉编译一、源码下载准备二、执行configure三、解决执行configure时遇到的出错问题1、checking for C compiler ... found but is not working2、error:…

Vue-第一天 前端工程化与 webpack

前端工程化与 webpack一、前端工程化1. 小白眼中的前端开发 vs 实际的前端开发2. 什么是前端工程化3. 前端工程化的好处4. 前端工程化的解决方案二、webpack 的基本使用1. 什么是 webpack2. 创建列表隔行变色项目3. 在项目中安装 webpack4. 在项目中配置 webpack4.1 mode 的可选…

Homekit智能家居DIY设备-智能通断开关

智能通断器&#xff0c;也叫开关模块&#xff0c;可以非常方便地接入家中原有开关、插座、灯具、电器的线路中&#xff0c;通过手机App或者语音即可控制电路通断&#xff0c;轻松实现原有家居设备的智能化改造。 随着智能家居概念的普及&#xff0c;越来越多的人想将自己的家改…

【微服务】Elasticsearch集群介绍搭建(六)

&#x1f697;Es学习第六站~ &#x1f6a9;Es学习起始站&#xff1a;【微服务】Elasticsearch概述&环境搭建(一) &#x1f6a9;本文已收录至专栏&#xff1a;微服务探索之旅 &#x1f44d;希望您能有所收获 一.引入 单机的elasticsearch做数据存储&#xff0c;必然面临两个…

暗月内网渗透实战——项目七

首先环境配置 VMware的网络配置图 环境拓扑图 开始渗透 信息收集 使用kali扫描一下靶机的IP地址 靶机IP&#xff1a;192.168.0.114 攻击机IP&#xff1a;192.168.0.109 获取到了ip地址之后&#xff0c;我们扫描一下靶机开放的端口 靶机开放了21,80,999,3389,5985,6588端口…

20、CSS中单位:【px和%】【em和rem】【vw|vh|vmin|vmax】的区别

CSS中的px 和 % px (pixels) 是固定单位,也可以叫基本单位&#xff0c;代表像素&#xff0c;可以确保元素的大小不受屏幕分辨率的影响。 % (percentage) 是相对单位&#xff0c;代表元素大小相对于其父元素或视口&#xff08;viewport&#xff09;的大小的百分比。使用百分比可…

linux001之linux系统部署安装

注意&#xff1a;本次安装讲解以乌班图(Ubuntu) 虚拟机来说明讲解&#xff0c;既然学习linux&#xff0c;就无需用图形界面了&#xff0c;直接用服务器版本 1. 下载乌班图 网址&#xff1a;https://www.ubuntu.org.cn/download/server 然后就可以看到右下角有下载提示&#xff…

Scala - Idea 项目报错 Cannot resolve symbol XXX

一.引言 Idea 编译 Scala 项目大面积报错 Cannot resolve symbol xxx。 二.Cannot resolve symbol xxx 1.问题描述 Idea 内的 Scala 工程打开后显示下述异常&#xff1a; 即 Scala 常规语法全部失效&#xff0c;代码出现大面积红色报错。 2.尝试解决方法 A.设置 Main Sourc…

车道线检测-E2E_LSFitting 论文学习笔记

论文&#xff1a;《End-to-end Lane Detection through Differentiable Least-Squares Fitting》 代码&#xff1a;https://github.com/wvangansbeke/LaneDetection_End2End 材料&#xff1a;https://zhuanlan.zhihu.com/p/94419168 特点&#xff1a; 拟合二次曲线&#xff1b…

Kafka安装及zookeeper is not a recognized option问题解决

一安装JAVA JDK&#xff08;略&#xff09; 二安装ZooKeeper 下载安装包&#xff0c;建议bin版本 http://zookeeper.apache.org/releases.html#download解压并进入ZooKeeper&#xff0c;将“zoo_sample.cfg”重命名为“zoo.cfg” D:\Kafka\apache-zookeeper-3.7.1-bin\conf…

Python中类和对象(2)

1.继承 Python 的类是支持继承的&#xff1a;它可以使用现有类的所有功能&#xff0c;并在无需重新编写代码的情况下对这些功能进行扩展。 通过继承创建的新类称为 “子类”&#xff0c;被继承的类称为 “父类”、“基类” 或 “超类”。 继承语法是将父类写在子类类名后面的…

相机坐标系的正向投影和反向投影

1 、正向投影: 世界坐标系到像素坐标系 世界3D坐标系(x, y, z) 到图像像素坐标(u,v)的映射过程 &#xff08;1&#xff09;世界坐标系到相机坐标系的映射。 两个坐标系的转换比较简单&#xff0c;就是旋转矩阵 平移矩阵&#xff0c;旋转矩阵则是绕X&#xff0c; Y&#xff…

nginx中间件常见漏洞总结

nginx中间件常见漏洞总结1.中间件漏洞的概念1.1 中间件、容器、服务器的基本概念辨析2.Nginx 配置错误导致漏洞2.1 $uri导致的CRLF注入漏洞2.1.1 漏洞成因2.1.2 利用方式2.1.3 修改方案2.2 目录穿越漏洞2.1.1 漏洞成因2.2.2 利用方式2.2.3 修改方案2.3 Http Header被覆盖2.3.1 …

JS学习笔记三

目录 一、this详解 1、this原理 2、使用场景 1、普通函数的调用&#xff0c;this指向的是Window 2、对象的方法&#xff0c;this指的是该对象 一、this详解 1、this原理 this是JavaScript的一个关键字&#xff0c;函数调用时才会出现&#xff1b; 因为函数是在一定的环…

Android核心开发【UI绘制流程解析+原理】

一、UI如何进行具体绘制 UI从数据加载到具体展现的过程&#xff1a; 进程间的启动协作&#xff1a; 二、如何加载到数据 应用从启动到onCreate的过程&#xff1a; Activity生产过程详解&#xff1a; 核心对象 绘制流程源码路径 1、Activity加载ViewRootImpl ActivityThread…

Java并发编程概述

在学习并发编程之前&#xff0c;我们需要稍微回顾以下线程相关知识&#xff1a;线程基本概念程序&#xff1a;静态的代码&#xff0c;存储在硬盘中进程&#xff1a;运行中的程序&#xff0c;被加载在内存中&#xff0c;是操作系统分配内存的基本单位线程&#xff1a;是cpu执行的…

Jenkins部署及持续集成——傻瓜式教程

文章目录jenkins安装jenkins启动jenkins登录jenkins插件Jenkin创建一个项目通过Git进行构建构建策略jenkins安装 jenkins官网 https://www.jenkins.io/ 支持Docker pull下载安装 我用的windows&#xff0c;这里下载war包,这个位置下载的是最新的&#xff0c;需要java11或者更…