目录

1. 背景

2. 什么是 Bert 及原理?

3. 论文内容《BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding》

3.1 BERT模型输入

3.2 BERT模型预训练任务

3.2.1 Masked LM(MLM):双向的语言模型任务

3.2.2 Next Sentence Prediction(NSP):连贯性判断任务

3.3 模型比较

4. BERT模型对NLP的影响

5. 其他模型

5.1 ELMo

5.2 ULMFiT

5.3  GPT

5.4  BERT

5.5 ERNIE

6. 总结

参考文献


  BERT 项目地址:

  https://github.com/google-research/bert#fine-tuning-with-bert

  BERT 项目论文:

  https://arxiv.org/abs/1810.04805

1. 背景

早在2015年的时候,微软研究院的何凯明和他的同事们发表了残差网络的论文,第一次通过残差的方式将卷积神经网络推进到了100层以上,并在图像识别的任务上刷新了当时的最高纪录。自那以后起,随着网络不断地加深,效果也在不断提升。然而大量的数据训练出来的大型网络虽然效果更好,但随着网络的加深以及数据集的不断扩大,完全重新训练一个模型所需要的成本也在不断地增加。

因此在计算机视觉处理中,人们越来越多地采用预训练好的大型网络来提取特征,然后再进行后续任务。目前这种处理方式已经是图像处理中很常见的做法了。

相比之下,自然语言处理目前通常会使用预训练的词向量来进行后续任务。但词向量是通过浅层网络进行无监督训练,虽然在词的级别上有着不错的特性,但却缺少对连续文本的内在联系和语言结构的表达能力。因此大家也希望能像图像领域那样,通过大量数据来预训练一个大型的神经网络,然后用它来对文本提取特征去做后续的任务,以期望能得到更好的效果。这一方向的研究一直在持续,直到AllenAI提出的ELMo,由于其在后续任务上的优异表现获得了不小的关注。

2. 什么是 Bert 及原理?

  BERT 是一种对语言表征进行预训练的方法,换句话说,是经过大型文本语料库(如维基百科)训练后获得的通用「语言理解」模型,该模型可用于我们最在乎的 NLP 下游任务(如问答)。BERT 之所以表现得比过往的方法要好,是因为它是首个用于进行 NLP 预训练的无监督、深度双向系统。

BERT:一个语言表征模型,利用transformer的encoder来进行预训练。BERT模型的全称是Bidirectional Encoder Representations from Transformers,它是一种新型的语言模型。之所以说是一种新型的语言模型,是因为它通过联合调节所有层中的双向Transformer来训练预训练深度双向表示。作者通过在33亿文本的语料上训练语言模型,再分别在不同的下游任务上微调,这样的模型在不同的任务均得到了目前为止最好的结果,并且有一些结果相比此前的最佳成绩得到了幅度不小的提升。

预训练表征可能无上下文语境,也可能有上下文语境,有上下文语境的系统可以进一步划分成单向的或者双向的。以 word2vec ( https://www.tensorflow.org/tutorials/representation/word2vec  ) 和 GloVe ( https://nlp.stanford.edu/projects/glove/  )为例,无上下文语境的模型为词汇表中的每个单词生成单个「词嵌入」表征,因此「 bank 」在「 bank deposit 」和「 river bank 」中可能存在同样的表征。反之,有上下文语境的模型会根据整句话生成词的表征。

   BERT 建立在近期一些上下文预训练语境表征工作的基础上,包括半监督序列学习( https://arxiv.org/abs/1511.01432  )、预训练生成模型( https://blog.openai.com/language-unsupervised/  )、ELMo ( https://allennlp.org/elmo  )以及 ULMFit ( http://nlp.fast.ai/classification/2018/05/15/introducting-ulmfit.html  ),但以上模型要么是单向的,要么是浅层双向的,这意味着每个单词只能与其左边(或右边)的单词进行语境化结合。以「  I made a bank deposit 」为例,由于是单向表示,「 bank 」只能基于左边「  I made a 」而不是与关联性更强的「 deposit 」生成语境。过去有一些工作试图打造出一个能够结合上下文语境的生成模型,然而这些工作目前看来都较「 浅层  」。BERT 真正做到了结合上下文语境来生成「  bank 」,兼顾到「  I made a 」和「  deposit 」,从深度神经网络的最底层开始,拥有深度双向属性。

想深入了解BERT模型,首先应该理解语言模型。预训练的语言模型对于众多自然语言处理问题起到了重要作用,比如SQuAD问答任务、命名实体识别以及情感识别。目前将预训练的语言模型应用到NLP任务主要有两种策略,一种是基于特征的语言模型,如ELMo模型;另一种是基于微调的语言模型,如OpenAI GPT这两类语言模型各有其优缺点而BERT的出现,似乎融合了它们所有的优点,因此才可以在诸多后续特定任务上取得最优的效果。

3. 论文内容《BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding》

这个题目有五个关键词,分别是 Pre-training、Deep、Bidirectional、Transformers、和 Language Understanding。其中 pre-training 的意思是,作者认为,确实存在通用的语言模型,先用文章预训练通用模型,然后再根据具体应用,用 supervised 训练数据,精加工(fine tuning)模型,使之适用于具体应用。为了区别于针对语言生成的 Language Model,作者给通用的语言模型,取了一个名字,叫语言表征模型 Language Representation Model。
          语言表征模型 Language Representation Model:能实现语言表征目标的模型,作者提议,用 Deep Bidirectional Transformers 模型。

3.1 BERT模型输入

输入表示可以在一个词序列中表示单个文本句或一对文本(例如,[问题,答案])。对于给定的词,其输入表示是可以通过三部分Embedding求和组成。Embedding的可视化表示如下图所示:

  • token Embeddings:表示的是词向量,第一个单词是CLS标志,可以用于之后的分类任务,对于非分类任务,可以忽略词向量;
  • Segment Embeddings:句子向量,用来区别两种句子,因为预训练不只做语言模型还要做以两个句子为输入的分类任务;
  • Position Embeddings:位置向量,是通过模型学习得到的。

3.2 BERT模型预训练任务

预训练 pre-training,训练结束后的 Transformer 模型,包括它的参数,是作者期待的通用的语言表征模型。BERT模型使用2个新的无监督预测任务对BERT进行预训练,分别是Masked LM和Next Sentence Prediction

3.2.1 Masked LM(MLM):双向的语言模型任务

解决单向的LM的问题,进行双向的信息编码。

为了训练深度双向Transformer表示,采用了一种简单的方法:随机掩盖部分输入词,然后对那些被掩盖的词进行预测,此方法被称为“Masked LM”(MLM)。预训练的目标是构建语言模型,BERT模型采用的是bidirectional Transformer。那么为什么采用“bidirectional”的方式呢?因为在预训练语言模型来处理下游任务时,我们需要的不仅仅是某个词左侧的语言信息,还需要右侧的语言信息。

在训练的过程中,随机地掩盖每个序列中15%的token,并不是像word2vec中的cbow那样去对每一个词都进行预测。MLM从输入中随机地掩盖一些词,其目标是基于其上下文来预测被掩盖单词的原始词汇。与从左到右的语言模型预训练不同,MLM目标允许表示融合左右两侧的上下文,这使得可以预训练深度双向Transformer。Transformer编码器不知道它将被要求预测哪些单词,或者哪些已经被随机单词替换,因此它必须对每个输入词保持分布式的上下文表示。此外,由于随机替换在所有词中只发生1.5%(15%*10%),所以并不会影响模型对于语言的理解。

把一篇文章中,15% 的词汇遮盖,让模型根据上下文全向地预测被遮盖的词。假如有 1 万篇文章,每篇文章平均有 100 个词汇,随机遮盖 15% 的词汇,模型的任务是正确地预测这 15 万个被遮盖的词汇。通过全向预测被遮盖住的词汇,来初步训练 Transformer 模型的参数。

BERT 的方法很简单:一开始先屏蔽掉输入词汇的 15%,然后通过深度双向的 Transformer 编码器运行整个序列,最后预测屏蔽的单词。举个例子:

Input: the man went to the [MASK1] . he bought a [MASK2] of milk.

Labels: [MASK1] = store; [MASK2] = gallon

BERT有哪些“反直觉”的设置?

(1) 用比语言模型更简单的任务来做预训练。直觉上,要做更深的模型,需要设置一个比语言模型更难的任务,而BERT则选择了两个看起来更简单的任务:完形填空和句对预测。

(2) 完形填空任务在直观上很难作为其它任务的预训练任务。在完形填空任务中,需要mask掉一些词,这样预训练出来的模型是有缺陷的,因为在其它任务中不能mask掉这些词。而BERT通过随机的方式来解决了这个缺陷:80%加Mask,10%用其它词随机替换,10%保留原词。这样模型就具备了迁移能力。

数据生成器将执行以下操作,而不是始终用[MASK]替换所选单词:

80%的时间:用[MASK]标记替换单词,例如,my dog is hairy → my dog is [MASK]
              10%的时间:用一个随机的单词替换该单词,例如,my dog is hairy → my dog is apple
              10%的时间:保持单词不变,例如,my dog is hairy → my dog is hairy. 这样做的目的是将表示偏向于实际观察到的单词。

3.2.2 Next Sentence Prediction(NSP):连贯性判断任务

       连贯性判断任务,即句子级别的连续性预测任务,预测输入BERT的两段文本是否为连续的文本。

很多句子级别的任务如自动问答(QA)和自然语言推理(NLI)都需要理解两个句子之间的关系,譬如上述MLM任务中,经过第一步的处理,15%的词汇被遮盖。那么在这一任务中我们需要随机将数据划分为等大小的两部分,一部分数据中的两个语句对是上下文连续的,另一部分数据中的两个语句对是上下文不连续的。然后让Transformer模型来识别这些语句对中,哪些语句对是连续的,哪些语句对不连续。

然后,用第二个步骤继续训练模型的参数。譬如从上述 1 万篇文章中,挑选 20 万对语句,总共 40 万条语句。挑选语句对的时候,其中 2*10 万对语句是连续的两条上下文语句,另外 2*10 万对语句不是连续的语句。然后让 Transformer 模型来识别这 20 万对语句,哪些是连续的,哪些不连续。

为了让模型学习到句子之间的关系,我们特意将模型放在可以从任意单语语料库里生成的简单任务中进行训练:给出两个句子 A 和 B,句子 B 究竟是句子 A 的下一个衔接句,亦或只是语料库中随机生成的句子?

Sentence A: the man went to the store .

Sentence B: he bought a gallon of milk .

Label: IsNextSentence

Sentence A: the man went to the store .

Sentence B: penguins are flightless .

Label: NotNextSentence

除了模型结构,模型大小和数据量也很重要

以上的描述涵盖了BERT在模型结构和训练目标上的主要创新点,而BERT的成功还有一个很大的原因来自于模型的体量以及训练的数据量

BERT训练数据采用了英文的开源语料BooksCropus 以及英文维基百科数据,一共有33亿个词。同时BERT模型的标准版本有1亿的参数量,与GPT持平,而BERT的large版本有3亿多参数量,这应该是目前自然语言处理中最大的预训练模型了。

当然,这么大的模型和这么多的数据,训练的代价也是不菲的。谷歌用了16个自己的TPU集群(一共64块TPU)来训练large版本的BERT,一共花了4天的时间。对于是否可以复现预训练,作者在Reddit上有一个大致的回复,指出OpenAI当时训练GPT用了将近1个月的时间,而如果用同等的硬件条件来训练BERT估计需要1年的时间。不过他们会将已经训练好的模型和代码开源,方便大家训练好的模型上进行后续任务。

3.3 模型比较

ELMo、GPT、BERT都是近几年提出的模型,在各自提出的时候都取得了不错的成绩。并且相互之间也是相辅相成的关系。

3个模型比较如下:

再往前看,在NLP中有着举足轻重地位的模型和思想还有Word2vec、LSTM等。

Word2vec作为里程碑式的进步,对NLP的发展产生了巨大的影响,但Word2vec本身是一种浅层结构,而且其训练的词向量所“学习”到的语义信息受制于窗口大小,因此后续有学者提出利用可以获取长距离依赖的LSTM语言模型预训练词向量,而此种语言模型也有自身的缺陷,因为此种模型是根据句子的上文信息来预测下文的,或者根据下文来预测上文,直观上来说,我们理解语言都要考虑到左右两侧的上下文信息,但传统的LSTM模型只学习到了单向的信息。

4. BERT模型对NLP的影响

BERT,再次验证了预训练在NLP当中是很有用的,其次继续验证了Transformer的拟合能力真的很强

总体上,BERT模型的成功还在于是一种表示学习,即通过一个深层模型来学习到一个更好的文本特征。这种非RNN式的模型是非图灵完备的,无法单独完成NLP中推理、决策等计算问题。当然,一个好的表示会使得后续的任务更简单。

BERT能否像ResNet那样流行还取决于其使用的便利性,包括模型实现、训练、可迁移性等,可能有好的模型出现,但类似的预训练模型会成为NLP任务的标配,就像Word2vec,Glove那样。

最后,BERT也打开了一个思路:可以继续在无标注数据上挖潜,而不仅限于语言模型。

5. 其他模型

5.1 ELMo

ELMo中是通过双向的两层LSTM结构对两个方向进行建模,但两个方向的loss计算相互独立

5.2 ULMFiT

在ELMo获得成功以后不久FastAI就推出了ULMFiT,其大体思路是在微调时对每一层设置不同的学习率。此后OpenAI又提出了GPT。追一科技在文本蕴含、观点型阅读理解等任务中,就采用了GPT模型作为预训练方案。预训练的语言模型是在百度15亿词文本的语料上进行的,模型参数选择了12层,12 head的Transformer结构。然后采用此模型直接在子任务上微调来进行后续任务。

5.3  GPT

GPT利用Transformer的decoder的结构来进行单向语言模型的训练,所谓的语言模型其实是自然语言处理中的一种基础任务,其目标是给定一个序列文本,预测下一个位置上会出现的词。

从论文的结果以及学界和工业界的反馈来看,这种使用大量的语料进行预训练,然后再在预训练好的模型上进行后续任务训练,虽然训练方式各有不同,但在后续任务都有不同程度的提高。

学习资料:https://baijiahao.baidu.com/s?id=1641821820866788182&wfr=spider&for=pc

5.4  BERT

利用Transformer的encoder来进行预训练,BERT就是在OpenAIGPT的基础上对预训练的目标进行了修改,并用更大的模型以及更多的数据去进行预训练,从而得到了目前为止最好的效果。

BERT对GPT的第一个改进就是引入了双向的语言模型任务:MLM

此前其实也有一些研究在语言模型这个任务上使用了双向的方法,例如在ELMo中是通过双向的两层LSTM结构对两个方向进行建模,但两个方向的loss计算相互独立。

BERT的作者指出这种两个方向相互独立或只有单层的双向编码可能没有发挥最好的效果,我们可能不仅需要双向编码,还应该要加深网络的层数。

BERT的作者提出了采用MLM的方式来训练语言模型:通俗地说就是在输入一句话的时候,随机地选一些要预测的词,然后用一个特殊的符号来代替它们。尽管模型最终还是会看到所有位置上的输入信息,但由于需要预测的词已经被特殊符号代替,所以模型无法事先知道这些位置上是什么词,这样就可以让模型根据所给的标签去学习这些地方该填的词了。

然而这里还有一个问题,就是我们在预训练过程中所使用的这个特殊符号,在后续的任务中是不会出现的。因此,为了和后续任务保持一致,作者按一定的比例在需要预测的词位置上输入原词或者输入某个随机的词。当然,由于一次输入的文本序列中只有部分的词被用来进行训练,因此BERT在效率上会低于普通的语言模型,作者也指出BERT的收敛需要更多的训练步数。

BERT另外一个创新:NSP

是在双向语言模型的基础上额外增加了一个句子级别的连续性预测任务。这个任务的目标也很简单,就是预测输入BERT的两段文本是否为连续的文本,作者指出引入这个任务可以更好地让模型学到连续的文本片段之间的关系。在训练的时候,输入模型的第二个片段会以50%的概率从全部文本中随机选取,剩下50%的概率选取第一个片段的后续的文本。

5.5 ERNIE

学习链接:https://blog.csdn.net/PaddlePaddle/article/details/102713947

ERNIE 基本上是 transformer 的encoder 部分,并且encoder 在结构上是全部一样的,但是并不共享权重,具体区别如下:

  • Transformer: 6 encoder layers, 512 hidden units, 8 attention heads

  • ERNIE Base: 12 encoder layers, 768 hidden units, 12 attention heads

  • ERNIE Large: 24 encoder layers,1024 hidden units, 16 attention heads

ERNIE是基于持续学习的语义理解预训练框架,使⽤多任务学习增量式构建预训练任务。新构建的预训练任务类型可以⽆缝加⼊训练框架,持续进⾏语义理解学习。

相比于BERT, ERNIE 1.0 改进了两种 masking 策略,一种是基于phrase (在这里是短语 比如 a series of, written等)的masking策略,另外一种是基于 entity(在这里是人名、位置、组织、产品等名词,比如Apple, J.K. Rowling)的masking 策略。在ERNIE 中,将由多个字组成的phrase 或者entity 当成一个统一单元,相比于bert 基于字的mask,这个单元当中的所有字在训练的时候,统一被mask。对比直接将知识类的query 映射成向量然后直接加起来,ERNIE 通过统一mask的方式可以潜在地学习到知识的依赖以及更长的语义依赖让模型更具泛化性

ERNIE 2.0 中有一个很重要的概念便是连续学习(Continual Learning),连续学习的目的是在一个模型中顺序训练多个不同的任务,以便在学习下个任务当中可以记住前一个学习任务学习到的结果。通过使用连续学习,可以不断积累新的知识,模型在新任务当中可以用历史任务学习到参数进行初始化,一般来说比直接开始新任务的学习会获得更好的效果。在连续学习的过程中,ERNIE 2.0 框架可以不断更新并记住以前学习到的知识,可以使得模型在新任务上获得更好的表现。需要注意的是,在连续训练之前,首先用一个简单的任务来初始化模型,在后面更新模型的时候,用前一个任务训练好的参数来作为下一个任务模型初始化的参数。这样不管什么时候,一个新的任务加进来的时候,都用上一个模型的参数初始化保证了模型不会忘记之前学习到的知识

ERNIE 通过对训练数据中的词法结构、语法结构、语义信息进行统一建模,极大地增强了通用语义表示能力,在多项任务中均取得了大幅度超越BERT的效果!!

三个预训练任务:

(1) 构建词法级别的预训练任务,来获取训练数据中的词法信息

  • 1: knowledge masking task,即 ERNIE 1.0 中的entity mask 以及 phrase entity mask 来获取phrase 以及entity的先验知识,相较于 sub-word masking, 该策略可以更好的捕捉输入样本局部和全局的语义信息。
  • 2: Capitalization Prediction Task,大写的词比如Apple相比于其他词通常在句子当中有特定的含义,所以在ERNIE 2.0 加入一个任务来判断一个词是否大写。
  • 3: Token-Document Relation Prediction Task,类似于tf-idf,预测一个词在文中的A 段落出现,是否会在文中的B 段落出现。如果一个词在文章当中的许多部分出现一般就说明这个词经常被用到或者和这个文章的主题相关。通过识别这个文中关键的的词, 这个任务可以增强模型去获取文章的关键词语的能力。

(2)构建语法级别的预训练任务,来获取训练数据中的语法信息

  • 1:  Sentence Reordering Task,在训练当中,将paragraph 随机分成1 到m 段,将所有的组合随机shuffle。我们让pre-trained 的模型来识别所有的这些segments正确的顺序。这便是一个k 分类任务。通常来说,这些sentence 重排序任务能够让pre-trained 模型学习到document 中不同sentence 的关系。
  • 2: Sentence Distance Task, 构建一个三分类任务来判别句子的距离,0表示两个句子是同一个文章中相邻的句子,1表示两个句子是在同一个文章,但是不相邻,2表示两个句子是不同的文章。通过构建这样一个三分类任务去判断句对 (sentence pairs) 位置关系 (包含邻近句子、文档内非邻近句子、非同文档内句子 3 种类别),更好的建模语义相关性。

(3)构建语义级别的预训练任务,来获取训练数据中的语义任务

  • 1: Discourse Relation Task,除了上面的distance task,ERNIE通过判断句对 (sentence pairs) 间的修辞关系 (semantic & rhetorical relation),更好的学习句间语义。
  • 2: IR Relevance Task,在这里主要是利用baidu 的日志来获取这个关系,将query 作为第一个sentence,title 作为第二个 sentence。0 表示强关系, 1 表示弱关系,2表示无关系,通过类似google-distance 的关系来衡量 两个query之间的语义相关性,更好的建模句对相关性。

6. 总结

语言模型的每一次进步都推动着NLP的发展,从Word2vec到ELMo,从OpenAI GPT到BERT。通过这些发展我们也可以洞悉到,未来表征学习(Deep learning is representation learning)将会越来越多的应用到NLP相关任务中,它们可以充分的利用目前海量的数据,然后结合各种任务场景,去训练出更为先进的模型,从而促进AI项目的落地。

参考文献

1. [NLP自然语言处理]谷歌BERT模型深度解析 https://blog.csdn.net/qq_39521554/article/details/83062188

2. 华尔街见闻:NLP历史突破 https://wallstreetcn.com/articles/3419427

3. OPENAI-Improving Language Understanding with Unsupervised Learning:https://blog.openai.com/language-unsupervised/

4. https://gluebenchmark.com/leaderboard:https://gluebenchmark.com/leaderboard

5. 知乎讨论:如何评价 BERT 模型?https://www.zhihu.com/question/298203515

6.  ELMo算法原理解析:https://www.cnblogs.com/huangyc/p/9860430.html

7. OpenAI GPT算法原理解析:https://www.cnblogs.com/huangyc/p/9860181.html

预训练模型:BERT深度解析《BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding》相关推荐

  1. Paper:《BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding用于语言理解的深度双向Tr

    Paper:<BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding用于语言理解的深度双 ...

  2. bert论文解析——BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding

    BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding 前言 bert是google在NLP方 ...

  3. BERT(一)--论文翻译:BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding

    转载请注明出处:https://blog.csdn.net/nocml/article/details/124860490 传送门: BERT(一)–论文翻译:BERT: Pre-training o ...

  4. 《BERT:Pre-training of Deep Bidirectional Transformers for Language Understanding》

    目录 <BERT:Pre-training of Deep Bidirectional Transformers for Language Understanding> 1.Bert研究意 ...

  5. 【论文阅读笔记】BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding

    BERT的出现使我们终于可以在一个大数据集上训练号一个深的神经网络,应用在很多NLP应用上面. BERT: Pre-training of Deep Bidirectional Transformer ...

  6. 论文阅读——BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding

    BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding Abstract 作者引入了一种新的语 ...

  7. 论文阅读笔记:BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding

    提示:阅读论文时进行相关思想.结构.优缺点,内容进行提炼和记录,论文和相关引用会标明出处. 文章目录 前言 介绍 背景知识 相关工作 具体实现结构 Pre-training BERT Fine-tun ...

  8. 【文本分类】BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding

    ·阅读摘要:   Bert是继Transformer之后的又一杰出的模型.Bert是一种预训练语言模型,是在GPT.Elmo.Transformer的基础上提出的.基于Bert的多个NLP领域任务都取 ...

  9. BERT论文阅读(一): Pre-training of Deep Bidirectional Transformers for Language Understanding

    BERT三大核心: pre-training bidirectional==>alleviates the unidirectionality constriant of fine-tuning ...

最新文章

  1. 硬盘格式化与快速格式化的区别
  2. 2018-2019-2 20189215 《网络攻防技术》第九周作业
  3. 环形均分纸牌问题(中位数)
  4. [css] 什么是逐帧动画?
  5. Hadoop 中zoo_数据分析中的Excel、R、Python、SPSS、SAS和SQL
  6. linux 系统让服务后台运行
  7. linux内核源码只有makefile文件没有c文件,linux内核代码的编写初步以及makefile的配置...
  8. 一、初识函数定义与调用
  9. 罗永浩语出惊人怼iPhone;人机大战柯洁再败;三星深圳工厂整体裁撤| CSDN极客头条...
  10. java课设超市收银系统_超市收银系统java课程设计.doc
  11. 经济寒冬之后,是人工智能的春天
  12. Gitee项目分享——学之思开源考试系统
  13. 实现ins照片的爬取
  14. Excel 2013 如何分列操作
  15. 机器学习案例之Python中通过RF预测红酒质量
  16. mysql50条必看语句,对MySql经常使用语句的全面总结(必看篇)
  17. 浏览器缓存机制(强缓存和协商缓存)
  18. 手机虚拟视频替换摄像头_利用OBS虚拟摄像头实现假装开会
  19. c++ map unordered_map使用大全
  20. html 获取文本框中的内容

热门文章

  1. Golang精编100题
  2. JS对象与Dom对象与jQuery对象之间的区别
  3. Android --- .gradle文件夹的路径
  4. 简易航空订票系统_基于C++实现简易航空票务,飞机订票系统!
  5. 计算机的磁盘地址格式,如何查看电脑硬盘是GPT分区还是MBR分区
  6. # 管道已结束_CIPP内衬紫外线固化法用于污水管道非开挖修复
  7. 新基建之数据中心2020
  8. 西藏最大云计算数据中心明年投入试运营
  9. 高低配系统直流控制电源技术知识点
  10. 数据中心进行数字化转型的2019年