详细介绍BERT模型

news2025/7/13 20:37:45

文章目录

    • BERT简介
      • BERT, OpenAI GPT, 和ELMo之间的区别
      • 相关工作
      • BERT的改进
    • BERT 的详细实现
      • 输入/输出表示
      • 预训练BERT
      • 微调BERT
    • BERT用在下游任务
      • GLUE(一个自然语言任务集合)
      • SQuAD v1.1(QA数据集)
      • SQuAD v2.0
      • SWAG
    • 消融实验
      • 预训练任务的影响
      • 模型大小的影响
      • 基于特征的BERT方法
    • 结论

BERT简介

BERT通过在所有层中联合调节左右语境,从未标记的文本中预训练深度双向表征。因此,预训练的BERT模型可以通过一个额外的输出层进行微调,以创建最先进的模型,用于更广泛的任务,而无需对特定任务的架构进行大量修改。

BERT, OpenAI GPT, 和ELMo之间的区别

在这里插入图片描述
预训练模型结构的差异。BERT使用一个双向的Transformer。OpenAI GPT使用一个从左到右的Transformer。ELMo使用独立训练的从左到右和从右到左的LSTM的串联,为下游任务生成特征。在这三者中,只有BERT的表征在所有层中都是以左和右的上下文为共同条件的。除了架构上的差异外,BERT和OpenAI GPT是微调方法,而ELMo是基于特征的方法。

相关工作

目前有两种将预训练的语言表征应用于下游任务的策略:基于特征的和微调的。

1.非监督的基于特征的方法,如ELMo(尽管用了正向和反向的语言模型,可本质上仍然是用的两个单向的LSTM然后把结果拼接起来。),使用特定任务的架构,包括预训练的表征作为额外的特征。

2.非监督的基于微调的方法,如生成性预训练转化器OpenAI GPT(虽然它一样使用了transformer,但是只利用了一个方向的注意力机制,本质上也一样是单项的语言模型。),引入最小的特定任务参数,并通过简单地微调所有预训练的参数来训练下游任务。
这两种方法在预训练期间具有相同的目标函数,它们使用单向语言模型来学习一般的语言表征。

3.在有监督的数据上做迁移学习,也有工作表明,从具有大型数据集的监督任务中迁移是有效的,如自然语言推理和机器翻译。CV研究也证明了从大型预训练模型进行迁移学习的重要性,其中一个有效的秘诀是对用ImageNet预训练的模型进行微调。

我们认为,目前的技术限制了预训练表征的力量,特别是对于微调方法。主要的限制是,标准的语言模型是单向的,这就限制了在预训练中可以使用的架构的选择。例如,在OpenAI GPT中,作者使用了一个左-右架构,每个标记只能关注Transformer的自我关注层中的先前标记。这样的限制对于句子级别的任务来说是次优的,之前基于微调的方法应用于问题回答等标记级别的任务时,可能会非常有害,因为在这些任务中,从两个方向纳入上下文是至关重要的。

BERT的改进

作为fine-tuning这一类的方法,作者提出了改进的方案:
而BERT:来自变形器的双向编码器表示法便是要改进基于微调的方法。
1.BERT通过使用**masked language model(MLM)**预训练目标,缓解了前面提到的单向性约束。masked language model从输入中随机地遮蔽一些标记,目标是仅根据其上下文来预测被遮蔽的单词的原始词汇ID。 与从左到右的语言模型预训练不同,MLM的目标是使表征融合左和右的语境,这使我们能够预训练一个深度的双向Transformer。
2.除了masked language model,Bert还使用了一个 "next sentence prediction "任务,联合预训练文本对的表示。
在这里插入图片描述
图1:BERT的整体预训练和微调程序。除了输出层之外,在预训练和微调中使用了相同的架构。相同的预训练模型参数被用来初始化不同下游任务的模型。在微调过程中,所有的参数都要进行微调。[CLS]是一个特殊的符号,加在每个输入例子的前面,[SEP]是一个特殊的分隔符。

BERT 的详细实现

在BERT中,有两个步骤:预训练和微调
在预训练期间,模型在不同的预训练任务的无标签数据上进行训练。

对于微调,BERT模型首先用预训练的参数进行初始化,然后用下游任务的有标签数据对所有的参数进行微调。每个下游任务都有单独的微调模型,尽管它们是用相同的预训练参数初始化的。

BERT的一个显著特点是它在不同任务之间的统一架构。预训练的架构和最终的下游架构之间的差异很小。BERT的模型架构是一个多层双向Transformer encoder。

三个参数:
L:transformer块的个数
H:隐藏层的大小
A:在自注意力机制里面那个多头的头的个数
两个模型:
BERTBASE(L=12, H=768, A=12, Total Param-eters=110M)
BERTLARGE(L=24, H=1024,A=16, Total Parameters=340M)
在这里插入图片描述

BERT Transformer使用的是双向的self-attention,而GPT Transformer使用的是受限的self-attention,每个token只能关注其左边的上下文。

输入/输出表示

为了使BERT能够处理各种下游任务,我们的输入表示能够在一个标记序列中毫不含糊地表示单个句子和一对句子(例如,〈问题,答案〉)。一个 "序列 "指的是输入到BERT的标记序列,它可能是一个单独的句子或两个句子挤在一起。

我们使用WordPiece嵌入,有30,000个标记词汇。 每个序列的第一个令牌总是一个特殊的分类令牌([CLS])。 与该标记相对应的最终隐藏状态被用作分类任务的集合序列表示。 句子对被打包成单一序列。

因为两个句子可能在一起,所以可以用两种方式来区分这些句子。 1.我们用一个特殊的标记([SEP])将它们分开。2.我们给每个标记添加一个学习过的嵌入标记,表明它是属于A句还是B句。

对于一个给定的标记,其输入表示是通过将相应的标记、段和位置嵌入相加而构建的。 图2是这种结构的可视化图。

预训练BERT

BERT整体是一个自编码语言模型(Autoencoder LM),它设计了两个任务来预训练该模型。第一个任务是采用 MaskLM 的方式来训练语言模型,随机屏蔽一定比例的输入标记,然后预测这些被屏蔽的标记。
第二个任务在双向语言模型的基础上额外增加了一个句子级别的连续性预测任务,即预测输入 BERT 的两段文本是否为连续的文本,引入这个任务可以更好地让模型学到连续的文本片段之间的关系。
任务1:Masked LM(带掩码的语言模型)

深度双向模型严格来说比从左到右的模型或从左到右的模型和从右到左的模型的浅层串联更强大。不幸的是,标准的条件语言模型只能从左到右或从右到左进行训练,因为双向调节将允许每个词间接地 “看到自己”,并且该模型可以在多层次的背景下简单地预测目标词。

为了训练深度双向表征,我们只需随机屏蔽一定比例的输入标记,然后预测这些被屏蔽的标记。我们把这个过程称为 “masked LM”(MLM),常被称为Cloze任务。

在这种情况下,对应于掩码标记的最终隐藏向量被送入词汇的输出softmax,就像在标准LM中一样。在我们所有的实验中,我们随机屏蔽了每个序列中15%的所有WordPiece标记。我们只预测被屏蔽的词,而不是重建整个输入。

尽管这使我们能够得到一个双向的预训练模型,但缺点是我们在预训练和微调之间产生了不匹配,因为[MASK]标记在微调期间没有出现。

为了缓解这种情况,我们并不总是用实际的[MASK]标记来替换 "被屏蔽 "的单词。训练数据生成器随机选择15%的标记位置进行预测。如果选择了第i个令牌,我们就用(1)80%的概率替换成[MASK]标记(2)10%的概率随机标记(3)10%的概率未改变。然后,Ti将被用来预测具有交叉熵损失的原始标记。
在这里插入图片描述

任务二:下一句预测(NSP)

许多重要的下游任务,如问答(QA)和自然语言推理(NLI)都是基于对两个句子之间关系的理解,而语言建模并不能直接捕捉到这种关系。 为了训练一个能够理解句子关系的模型,我们对一个二进制的下一句预测任务进行了预训练,该任务可以从任何单语语料库中简单地生成。 具体来说,在为每个预训练例子选择句子A和B时,50%的概率B是A后面的实际下一句(标记为IsNext),50%的概率是语料库中的一个随机句子(标记为NotNext)。 针对这一任务的预训练对QA和NLI都非常有益。
在这里插入图片描述
图2:BERT输入表示。输入嵌入是标记嵌入、分段嵌入和位置嵌入的总和。

微调BERT

微调是直接的,因为Transformer中的自我注意机制允许BERT通过替换适当的输入和输出来模拟许多下游任务,无论它们涉及单个文本还是文本对。对于涉及文本对的应用,一个常见的模式是在应用双向交叉注意力之前对文本对进行独立编码。

BERT则使用自我注意机制来统一这两个阶段,因为用自我注意对串联的文本对进行编码,有效地包括两个句子之间的双向交叉注意力。

对于每个任务,我们只需将特定任务的输入和输出插入BERT,并对所有参数进行端到端的微调。在输入端,预训练中的句子A和句子B类似于(1)转述中的句子对,(2)必然性中的假设-前提对,(3)问题回答中的问题-段落对,和(4) 文本分类或序列标签中的退化文本-∅对。在输出层,标记表征被送入输出层,用于标记级任务,如序列标签或问题解答,而[CLS]表征被送入输出层,用于分类,如包含关系或情感分析。

与预训练相比,微调的成本很低。从完全相同的预训练模型开始,最多只需1小时就可以在一个独立的云TPU上完成所有的结果,或者在一个GPU上多花几个小时。

BERT用在下游任务

GLUE(一个自然语言任务集合)

一般语言理解评估(GLUE)基准是一个多样化自然语言理解任务的集合。为了在GLUE上进行微调,我们按照上文所述表示输入序列(对于单句或句子对),并使用与第一个输入标记([CLS])对应的最终隐藏向量C∈RH作为总体表示。在微调过程中引入的唯一新参数是分类层权重W∈RK×H,其中K是标签的数量。我们用C和W计算一个标准的分类损失,即log(softmax(CW T ))。
在这里插入图片描述
表1:GLUE测试结果,由评估服务器打分,每个任务下面的数字表示训练实例的数量。
在这里插入图片描述

SQuAD v1.1(QA数据集)

斯坦福大学问题回答数据集(SQuAD v1.1)是一个由10万个众包问题/答案对组成的集合。如图1所示,在问题回答任务中,我们将输入的问题和答案表示为一个单一的打包序列,其中问题使用A embedding,段落使用B embedding。
在这里插入图片描述
表2:SQuAD 1.1的结果。BERT组合是7个系统,使用不同的预训练检查点和微调seeds。

SQuAD v2.0

SQuAD 2.0任务扩展了SQuAD 1.1的问题定义,允许在提供的段落中不存在简短的答案,使问题更加现实。

我们使用一个简单的方法来扩展SQuAD v1.1的BERT模型来完成这项任务。我们将没有答案的问题视为有一个答案跨度,其起点和终点在[CLS]标记处。开始和结束答案跨度位置的概率空间被扩展到包括[CLS]标记的位置。
在这里插入图片描述
表3:SQuAD 2.0的结果。我们排除了将BERT作为其组成部分之一的条目。

SWAG

有对抗性的情况(SWAG) 数据集包含11.3万个句子对组合的例子,评估接地气的常识性推理。

在SWAG数据集上进行微调时,我们构建了四个输入序列,每个序列都包含给定句子(句子A)和可能的续篇(句子B)的连接。

唯一引入的特定任务参数是一个向量,其与[CLS]标记代表C的点积表示每个选择的分数,该分数用softmax层归一化。 结果见表4。 BERTLARGE比作者的基准ESIM+ELMo系统高出27.1%,比OpenAI GPT高出8.3%。
在这里插入图片描述

表4:SWAG开发和测试准确性。正如SWAG论文中报道的那样,人类的表现用100个样本进行了测量。

消融实验

在本节中,我们对BERT的一些方面进行了消融实验,以便更好地了解其相对重要性。
在这里插入图片描述
表5:使用BERTBASE架构对预训练任务的消融。"No NSP "是在没有下句预测任务的情况下进行训练。"LTR & No NSP “被训练为从左到右的LM,没有下句预测,就像OpenAI的GPT。”+BiLSTM "在微调期间在 "LTR + No NSP "模型的基础上增加了一个随机初始化的BiLSTM。

预训练任务的影响

我们通过使用与BERTBASE完全相同的预训练数据、微调方案和超参数评估两个预训练目标来证明 BERT 深度双向性的重要性:

No NSP:(去掉下一句预测)
一个双向模型,它使用 “遮蔽的语言模型”(MLM)进行训练,但没有 “下句预测”(NSP)任务。

LTR & No NSP:(去掉下一句预测并且不用带掩码的语言模型)
一个仅有左边语境的模型,它使用标准的从左到右(LTR)的LM进行训练,而不是使用MLM。

在微调时也应用了纯左约束,因为去除该约束后,会出现预训练/微调不匹配的情况,使下游性能下降。

此外,这个模型在没有NSP任务的情况下进行了预训练。这与OpenAI的GPT有直接的可比性,但使用了我们更大的训练数据集、我们的输入表征和我们的微调方案。我们首先检查了NSP任务带来的影响。在表5中,去除NSP后,QNLI、MNLI和SQuAD 1.1的性能明显下降。

接下来,我们通过比较 "No NSP "和 "LTR&No NSP "来评估训练双向表示的影响。LTR模型在所有任务上的表现都比MLM模型差,在MRPC和SQuAD上有很大的下降。对于SQuAD来说,直觉上很清楚,LTR模型在标记预测上的表现会很差,因为标记级的隐藏状态没有右侧上下文。

为了真诚地尝试加强LTR系统,我们在上面添加了一个随机初始化的BiLSTM。这确实大大改善了SQuAD的结果,但结果仍然比预训练的双向模型差很多。

BiLSTM损害了GLUE任务的性能。我们认识到,也可以像ELMo那样,单独训练LTR和RTL模型,并将每个标记表示为两个模型的连接。然而:
(1)这比单一的双向模型要贵一倍;
(2)这对于像QA这样的任务是不直观的,因为RTL模型不能对问题的答案进行调节;
(3)这严格来说不如深度双向模型强大,因为它可以在每一层使用左和右的上下文。

模型大小的影响

在本节中,我们探讨了模型大小对微调任务准确性的影响。我们训练了一些具有不同层数、隐藏单元和注意头的BERT模型,除此之外,还使用了与前面所述相同的超参数和训练步骤。
在这里插入图片描述
表6:BERT模型尺寸上的消融。#L =层数;#H =隐藏的大小;#A =关注头的数量。LM (ppl)是held-out训练数据的遮蔽的LM困惑度。

留出法(held-out)
留出法的含义是:直接将数据集D划分为两个互斥的集合,其中一个集合作为训练集S,另外一个作为测试集T,即D=S∪T,S∩T=0。在S上训练出模型后,用T来评估其测试误差,作为对泛化误差的评估。其中T也叫held-out data。

困惑度是用来衡量语言概率模型优劣的一个方法,困惑度越小,句子概率越大,语言模型越好。

选定的GLUE任务的结果显示在表6中。在这个表中,我们报告了5次随机重启微调的平均Dev集准确率。我们可以看到,更大的模型在所有四个数据集上都导致了严格的准确性提高,即使是只有3600个标记的训练例子的MRPC,也与训练前的任务有很大的不同。

同样令人惊讶的是,我们能够在相对于现有文献已经相当大的模型之上实现如此显著的改进。例如,《Attention Is All You Need》探索的最大的Transformer是(L=6,H=1024,A=16),编码器的参数为100M,而我们在文献中发现的最大的Transformer是(L=64,H=512,A=2),参数为235M。相比之下,BERTBASE包含110M参数,BERTLARGE包含340M参数。

众所周知,增加模型规模将导致大规模任务的持续改进,如机器翻译和语言建模,这一点可以通过表6中显示的保持训练数据的LM困惑度来证明。然而,我们认为这是第一个工作令人信服地证明了只要模型经过充分的预训练,扩展到极端的模型规模也会导致在非常小的规模任务上的巨大改进。

Peters等人(2018b)提出了关于将预训练的bi-LM大小从两层增加到四层的下游任务影响的混合结果;Melamud等人顺便提到,将隐藏的维度大小从200增加到600有帮助,但进一步增加到1,000并没有带来进一步改善。 这两个先前的工作都使用了基于特征的方法。

我们假设,当模型直接在下游任务上进行微调,并且只使用非常少的随机初始化的额外参数时,特定任务的模型可以从更大、更有表现力的预训练表征中受益,即使下游任务数据非常小。

基于特征的BERT方法

迄今为止,所有提出的BERT结果都使用了微调方法,即在预训练的模型中加入一个简单的分类层,并在下游任务中共同微调所有的参数

然而,基于特征的方法,即从预训练的模型中提取固定的特征,具有一定的优势。首先,并不是所有的任务都能很容易地用Transformer encoder架构来表示,因此需要增加一个特定任务的模型架构。其次,对训练数据表示进行一次昂贵的预计算,然后在这个表示之上用更便宜的模型进行许多实验,有很大的计算优势。

在本节中,我们通过将BERT应用于CoNLL-2003命名实体识别(NER)任务来比较这两种方法。

在BERT的输入中,我们使用了一个保全的WordPiece模型,并且我们包括了数据提供的最大的文档上下文。
按照标准做法,我们将其制定为一个标签任务,但在输出中不使用CRF层。 我们使用第一个子标记的表示作为对NER标签集的标记级分类器的输入。

不用微调方法,我们应用基于特征的方法,从一个或多个层中提取激活,而不对BERT的任何参数进行微调。 这些上下文嵌入被用作分类层之前随机初始化的两层768维BiLSTM的输入。

结果见表7。 BERTLARGE的表现与最先进的方法相比具有竞争力。表现最好的方法是将预先训练好的Transformer的前四个隐藏层的token表示连接起来,这比微调整个模型只差0.3个F1。 这表明,BERT对微调和基于特征的方法都很有效。
在这里插入图片描述
表7:CoNLL-2003的命名实体识别结果。超参数是用Dev集选择的。报告的Dev和Test分数是使用这些超参数的5次随机重启的平均分数。

结论

最近由于语言模型的迁移学习而带来的经验改进表明,丰富的、无监督的预训练是许多语言理解系统的一个组成部分。 特别是,这些结果使低资源的任务也能从深度单向的架构中受益。

BERT的主要贡献是将这些发现进一步推广到深度双向架构中,使同一预训练模型能够成功地处理一系列广泛的NLP任务。

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

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

相关文章

js对象和原型、原型链的关系

JS的原型、原型链一直是比较难理解的内容,不少初学者甚至有一定经验的老鸟都不一定能完全说清楚,更多的"很可能"是一知半解,而这部分内容又是JS的核心内容,想要技术进阶的话肯定不能对这个概念一知半解,碰到…

[附源码]计算机毕业设计JAVA大学生足球预约信息

[附源码]计算机毕业设计JAVA大学生足球预约信息 项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM myba…

【JavaWeb】HTML学习完整篇

推荐学习专栏:JavaWeb学习专栏 目录1、HTML 语法规范(1)基本语法概述(2)标签关系2、HTML 基本结构标签3、 网页开发工具(1)使用方法(2)VSCode 工具生成骨架标签新增代码&…

Java项目——物业管理系统(附源码+数据库)

今天给小伙伴们分享一个Java项目——物业管理系统(附源码数据库) 感兴趣的小伙伴可以点击下方链接和小编一起学习哟~ https://www.bilibili.com/video/BV1cD4y1s73E/?spm_id_from333.999.0.0&vd_sourcea7816e3b2a3a67ac39dc87f6bf92421chttps://w…

下载和安装vscode教程和配置中文插件(超详细)

前言: vscode主要是用于前端的编程工具,其他编程的语言也可以在vscode里面编程运行。 优点:简洁、占用内存小、界面美观 一、下载步骤 1.到官网根据自己的操作系统进行下载(这是超链接),直接点击下载。…

数据库导入现有的mysql文件和_列的别名_和_去重

一、数据导入指令:source 类的全路径 在命令行客户端登录mysql,使用 source 指令导入 mysql> source d:\mysqldb.sql二、列的别名 重命名一个列便于计算紧跟列名,也可以在列名和别名之间加入关键字AS,别名使用双引号&#x…

3款windows实用软件,免费又良心,真正懂你的需求

闲话少说,干货奉上。 1、RevoUninstaller 一不小心安装了流氓捆绑软件,某安全卫士那它并没有办法,RevoUninstaller这款小白也能使用的卸载工具,支持免费使用,让流氓软件无所遁形。它有一个非常强大的猎人模式功能&…

计算机毕业设计——农产品资源展示平台

一.项目介绍 本项目包含管理员、商家和 用户三种角色 管理员角色包含以下功能: 登录、个人中心、用户管理、商家管理、最新农产品管理、农产品资源管理、特色农产品管理、在售农产品管理、招商合作管理、关于我们、帮助中心、收藏管理、留言管理、系统管理、…

码神之路项目总结(三)

目录 一、评论列表 二、评论 三、发布文章--所有文章分类 四、发布文章--所有文章标签 五、发布文章 六、AOP记录日志 一、评论列表 请求接口: 数据库表结构解析: 思路: 1、首先接收前端的文章id,通过文章id和level1查出第一层评…

SpringBootApplication注解

注解的使用 SpringBootApplication 符合注解:由 SpringBootConfiguration EnableAutoConfiguration ComponentScan 1.SpringBootConfiguration Configuration public interface SpringBootConfiguration { AliasFor( annotation Confi…

spring cloud kubernetes 本地开发环境搭建

背景 在上文Spring Cloud Zookeeper 升级为Spring Cloud Kubernetes 之后,我们由于使用了Kubernetes的服务发现,由于本地不在Kubernetes中,导致本地项目启动失败。所以就只能把代码部署到Kubernetes中才能启动,那么就带来一个新问…

java基于springboot+vue的驾校报名预约管理系统 nodejs

网络的广泛应用给生活带来了十分的便利。所以把驾校报名管理与现在网络相结合,利用java技术建设驾校管理系统,实现驾校报名的信息化。则对于进一步提高驾校报名管理发展,丰富驾校报名管理经验能起到不少的促进作用。 驾校管理系统能够通过互联…

java后端返回给前端对象时去除值为空或NULL的属性

前言 测试接口时发现当返回的对象中属性值为 “” 或 [] 或 null 时,该属性依然会返回,这样数据看起来很不美观并且有时候也会导致前端组件出现一些小的bug。 例如这个下拉框,人事科下面是没有部门的,但是由于接口返回了 child…

数据分析er看过来,五款工具有你需要的

“我想转行做数据分析,但是我只会用Excel,不会其他的工具,有其他的数据分析工具推荐么?“ “我不会python,那我可以做数据分析吗” 大部分人对数据分析的的第一印象就是Excel,python,其实选择一…

Cy5.5 N-羟基琥珀酰亚胺酯,Cy5.5 nhs ester,CAS:1469277-96-0

产品名称:CY5.5琥珀酰亚胺脂,Cy5.5 N-羟基琥珀酰亚胺酯 英文名称:Cyanine5.5 NHS ester,Cyanine5.5 SE,CY5.5 NHS CAS:1469277-96-0 外观:蓝色至深蓝色固体 分子式:C45H48IN3O4 分子量&…

【DropBlock】《DropBlock:A regularization method for convolutional networks》

NIPS-2018 文章目录1 Background and Motivation2 Related Work3 Advantages / Contributions4 DropBlock5 Experiments5.1 ImageNet Classification5.1.1 DropBlock in ResNet-505.1.2 DropBlock in AmoebaNet5.2 Experimental Analysis5.3 Object Detection in COCO5.4 Seman…

vue3新特性 Ⅱ

setup()中使用生命周期函数 在生命周期钩子前加上on来访问 并且需要保持小驼峰的命名方式,setup中的生命周期函数不包括beforeCreate和created。 onMounted:比以前的mounted有优势,以前生命周期函数只能存在一个&#…

发布新闻稿必须了解的几个问题

随着移动互联网的到来,有些企业把营销重心转移到了抖音小红书等新媒体,而传统的媒体营销被一些企业抛在脑后,其实小马识途认为媒体营销是信息源,其实是不可以放弃的,至少要有一定量的布局。 简单来说,新闻媒…

需要多久才能看完linux内核源码?

代码中自由颜如玉! 代码中自有黄金屋! 那么Linux内核代码到底有多少行? 我们需要多久能读完呢? 一、内核行数 Linux内核分为CPU调度、内存管理、网络和存储四大子系统,针对硬件的驱动成百上千。代码的数量更是大的…

kafka详解及集群环境搭建

一、kafka详解 安装包下载地址:https://download.csdn.net/download/weixin_45894220/87020758 1.1Kafka是什么? 1、Kafka是一个开源消息系统,由Scala写成。是由Apache软件基金会开发的一个开源消息系统项目,该项目的目标是为处…