bert技术

author author     2023-03-10     416

关键词:

参考技术A google在2018年10月底公布BERT在11项nlp任务中的卓越表现,NLP任务的两个衡量指标上全面超越人类,并且还在11种不同NLP测试中创出最佳成绩,包括将GLUE基准推至80.4%(绝对改进7.6%),MultiNLI准确度达到86.7% (绝对改进率5.6%)等,此后,BERT(Bidirectional Encoder Representation from Transformers)就成为NLP领域大火、整个ML界略有耳闻的模型。

BERT的出现,彻底改变了预训练产生词向量和下游具体NLP任务的关系,提出龙骨级的训练词向量概念。

词向量,就是用一个向量的形式表示一个词。

(1)one-hot编码:词的符号化。

(2)词的分布式表示:词的语义由其上下文决定。以(CBOW)为例,如果有一个句子“the cat sits one the mat”,在训练的时候,将“the cat sits one the”作为输入,预测出最后一个词是“mat”。分布式表示的较大优点在于它具有非常强大的表征能力,比如n维向量每维k个值,可以表征k的n次方个概念。

其中,词嵌入就是分布式表示的一种:基于神经网络的分布表示一般称为词向量、词嵌入( word embedding)或分布式表示( distributed representation)。核心依然是上下文的表示以及上下文与目标词之间的关系的建模。本质:词向量是训练神经网络时候的隐藏层参数或者说矩阵。

两种训练模式:CBOW (Continuous Bag-of-Words Model)和Skip-gram (Continuous Skip-gram Model)

NLP任务分成两部分,一是预训练产生词向量,二是对词向量操作实现特定功能。而词向量模型是一个工具,可以把抽象存在的文字转换成可以进行数学公式操作的向量,而对这些向量的操作,才是NLP真正要做的任务。从word2vec到ELMo到BERT,做的其实主要是把下游具体NLP任务的活逐渐移到预训练产生词向量上。

(1)word2vec:上下文概率的一种表示,但无法对一词多义进行建模

(2)ELMo:用的是一个双向的LSTM语言模型,由一个前向和一个后向语言模型构成,目标函数就是取这两个方向语言模型的最大似然。

在预训练好这个语言模型之后,ELMo就是根据下面的公式来用作词表示,其实就是把这个双向语言模型的每一中间层进行一个求和。最简单的也可以使用最高层的表示来作为ELMo。

然后在进行有监督的NLP任务时,可以将ELMo直接当做特征拼接到具体任务模型的词向量输入或者是模型的最高层表示上。总结一下,不像传统的词向量,每一个词只对应一个词向量,ELMo利用预训练好的双向语言模型,然后根据具体输入从该语言模型中可以得到上下文依赖的当前词表示(对于不同上下文的同一个词的表示是不一样的),再当成特征加入到具体的NLP有监督模型里。

(3)bert

word2vec——>ELMo:

  结果:上下文无关的static向量变成上下文相关的dynamic向量,比如苹果在不同语境vector不同。

  操作:encoder操作转移到预训练产生词向量过程实现。

ELMo——>BERT:

  结果:训练出的word-level向量变成sentence-level的向量,下游具体NLP任务调用更方便,修正了ELMo模型的潜在问题。

  操作:使用句子级负采样获得句子表示/句对关系,Transformer模型代替LSTM提升表达和时间上的效率,masked LM解决“自己看到自己”的问题。

(1)bert模型证明了双向预训练对于语言表示的重要性。与采用单向语言模型进行预训练的模型不同,BERT使用masked language models 进行预训练的深层双向表示。

(2)经过预训练的模型表示解决了许多为特定任务而设计架构的需要。BERT是第一个基于微调的表示模型,它在一系列句子级和词级别的任务上实现了最先进的性能,优于许多具有特定任务架构的系统。

bert架构由两步实现:预训练和模型微调;在预训练阶段,基于无标注数据通过多轮预训练任务完成。在微调阶段,bert模型由预训练的参数进行初始化,然后由待下游的任务数据进行参数微调。

bert模型是多层双向transformer编码器。将层的数量(Transformer blocks)表示为L,隐藏的大小表示为H,而self-attention heads 为A。在所有的情况下,我们将feed-forward/filter大小设置为4H,即H=768时,为3072, H=1024时,为4096.

bert的两种格式:

BERTBASE : L=12, H=768, A=12, Total Parameter=110M,

BERTLARGE : L=24, H=1024, A=16, Total Parameters=340M

为了使用bert可以应对各式各样的下游任务,bert的输入为token序列,它可以表示一个句子或句子对(比如对话)。使用该方案,输入可以是任意跨度的相邻文本,即一个token序列可以是单个句子,也可以是多个句子。

具体地说,bert使用30000个词的词级别的embeddings。每个序列的起始token是[CLS]。句子对被打包在一个序列中,用两种方式区别句子。方法一,使用特殊token[SEP];方法二,在每个标记中添加一个学习过的嵌入,表示它是属于句子A还是句子B。

两个无监督任务对BERT进行训练。

任务一:Masked LM语言模型。

为了训练双向表示模型,随机按百分比的方式(一般选15%)屏蔽输入序列中的部分词,然后预测那些屏蔽词。在这种情况下,屏蔽词的最终隐向量经softmax运算后输出。有点类似于中文的完形填空。

虽然如些操作可以获得一个双向的预训练模型,但这在预训练和微调之间创建了一个不匹配,因为在微调过程中从来没有见过[MASK]词。为了减轻这一点,我们并不总是用实际的[MASK]词替换被屏蔽的词。相反,生成随机选择15%的词进行预测,例如在句子 my dog is hairy 选择了 hairy。接着执行下面的过程:

数据生成器不会总是用[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。

每一轮使用交叉熵损失来预测原始词。

任务二:下一句的预测;

许多重要的下游任务,如问答(QA)和自然语言推理(NLI),都基于理解两个文本句之间的关系,而语言建模并不能直接捕获到这两个文本句之间的关系。为了训练一个理解句子关系的模型,我们预训练了一个二分类的预测下一个句子的任务,该任务可以由任何单语语料库生成。

具体来说,在为每个训练前的例子选择句子A和B时,50%的时间B是A后面的实际下一个句子,50%的时间B是来自语料库的随机句子。例如:

Input =[CLS] the man went to [MASK] store [SEP],he bought a gallon [MASK] milk [SEP]

Label = IsNext

Input = [CLS] the man [MASK] to the store [SEP],penguin [MASK] are flight ##less birds [SEP]

Label = NotNext

我们完全随机选择NotNext 句子,最终预测模型在这个任务中达到97%-98%的准确率。

预训练数据:预训练过程很大程度上依赖现有语言模型的数据。从维基百科上抽取文本信息,忽略列表,表格和标题。对于预训练过程来说,使用文档级别的语料库而不是经过乱序后的句子级语料库来提取长的连续序列是很重要的。

对于序列级别分类任务,BERT微调很简单。BERT使用self-attention机制来统一两个过程。因为编码文本序列中,使用self-attention有效地包含了两上句子之间双向交叉的attention。

微调过程,就是对于每一个任务,简单地将特定的输入和输出接入bert,然后端到端地调节全部参数即可。在输入端,句子A和句子B类似于(1)语义句子对(2)假设前提(3)问答中的问句(4)文本分类或序列标记中文本。在输出端,token向量被传递给token级别任务的输出层,例如,序列标签,问答对的答案。[CLS]向量被传递给分类的输出层,用于分类或情感分析。

相对于预训练,微调要相对容易。大多数模型超参数与预训练相同,除了批的大小、学习率和训练轮数。

可以通过一个额外的输出层对预训练的BERT表示进行微调,以创建适用于各种任务的最先进模型,比如问答和语言推断,无需对特定与任务的架构进行实质性修改。

第一,如果NLP任务偏向在语言本身中就包含答案,而不特别依赖文本外的其它特征,往往应用Bert能够极大提升应用效果。

第二,Bert特别适合解决句子或者段落的匹配类任务。就是说,Bert特别适合用来解决判断句子关系类问题,这是相对单文本分类任务和序列标注等其它典型NLP任务来说的,很多实验结果表明了这一点。

第三,Bert的适用场景,与NLP任务对深层语义特征的需求程度有关。感觉越是需要深层语义特征的任务,越适合利用Bert来解决

第四,Bert比较适合解决输入长度不太长的NLP任务,而输入比较长的任务,典型的比如文档级别的任务,Bert解决起来可能就不太好。

【引用】:

bert论文:BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding

https://www.cnblogs.com/robert-dlut/p/8638283.html

https://blog.csdn.net/DarrenXf/article/details/89184225

https://www.cnblogs.com/xlturing/p/10824400.html

https://www.cnblogs.com/ylHe/p/10193166.html

从wordembedding到bert模型—自然语言处理中的预训练技术发展史

...语言处理中的预训练过程,会大致说下NLP中的预训练技术是一步一步如何发展到Bert模型的,从中可以很自然地看到Bert的思路是如何逐渐形成的,Bert的历史沿革是什么,继承了什么,创新了什么,为什么效... 查看详情

自然语言处理动手学bert文本分类

...手学Bert文本分类Bert作为目前自然语言处理领域最流行的技术之一,文本分类作为自然语言处理领域最常见的任务之一,Pytorch作为目前最流程的深度学习框架之一,三者结合在一起将会产生什么样的花火,本套课程基于Pytorch最... 查看详情

自然语言处理动手学bert文本分类

...手学Bert文本分类Bert作为目前自然语言处理领域最流行的技术之一,文本分类作为自然语言处理领域最常见的任务之一,Pytorch作为目前最流程的深度学习框架之一,三者结合在一起将会产生什么样的花火,本套课程基于Pytorch最... 查看详情

这就是华为速度:2.69分钟完成bert训练!新发cann5.0加持,还公开了背后技术

金磊萧箫发自凹非寺量子位报道|公众号QbitAI快,着实有点快。现在,经典模型BERT只需2.69分钟、ResNet只需16秒。啪的一下,就能完成训练!这是华为全联接2021上,针对异构计算架构CANN5.0放出的最新性能“预热... 查看详情

【论文笔记】融合标签向量到bert:对文本分类进行改进

参考技术A随着BERT等预先训练模型获得越来越多的关注,从数据增强实验到改进模型数学原理,大量的研究已经进一步提高了它们的性能。在本文中,作者提出了一种简洁有效的方法,在保持几乎相同的计算成本的情况下,利用... 查看详情

bert模型

参考技术ABERT有两部分:pre-training和fine-tuning。在pre-training阶段,会在没有标注数据且不同预训练任务上训练模型;在fine-tuning阶段,BERT会根据预训练模型的参数初始化,然后在下游任务的标注数据进行fine-tuned。BERT是一个多层双... 查看详情

2.69分钟完成bert训练!新发cann5.0加持

...度:2.69分钟完成BERT训练!新发CANN5.0加持,还公开了背后技术​​》,作者:昇腾CANN。快,着实有点快。现在,经典模型BERT只需2.69分钟、ResNet只需16秒。啪的一下,就能完成训练!这是华为全联接2021上,针对异构计算架构CA 查看详情

bert预训练模型及文本分类(代码片段)

BERT预训练模型及文本分类介绍如果你关注自然语言处理技术的发展,那你一定听说过BERT,它的诞生对自然语言处理领域具有着里程碑式的意义。本次试验将介绍BERT的模型结构,以及将其应用于文本分类实践。知识点语言模型和... 查看详情

bert原码解析(embedding)

参考技术A    写这篇文章的起因是看ALBERT的时候,对其中参数因式分解,减少参数的方式不理解,后来通过原码来了解原理。后来想到虽然平时基于bert的nlp任务做的挺多的,但对原理还是一知半解的,所以在此记... 查看详情

k-bert理解

参考技术ABERT它是一种从大规模语料库中学得语言表征的模型,但是,在专业领域表现不佳。为了解决该问题,作者提出了一个基于知识图谱的语言表示模型K-BERT.但是,过多的考虑领域知识可能导致语句语义出现错误,这个问题... 查看详情

为何训练后的bert模型不能够很容易的实现模型泛化?

...同层施以不同的权重,来很容易地实现多任务学习。参考技术A既然藏了就做好被发现的准备,不过可以买一个特别小的自己随时带到身上,就不会很容易被发现 参考技术B过去的就放下不去想在感情里错过的从来都不属于自己努... 查看详情

TF-Keras 中的 BERT 额外预训练

...在开发一个涉及序列多标签分类的项目。由于我使用的是技术含量高的数据集,因此我认为在对分类部分进行微调之前对BERT进行额外的预训练会是有益的。但是我找不到任何指南来一起使用Huiggingface转换器和Keras来预训练模型。... 查看详情

bert加bilstm和crf做ner的意义

参考技术Abert为什么加不加crf都行,加crf好处在哪?加crf:相当于是显式地去捕捉标签之间的依赖关系。但是为什么很多人说bert和bert+crf效果差不多,我觉得bert能够表达的语义空间足够丰富,去捕捉到标签之间的依赖关系。也有... 查看详情

bert关系抽取之r-bert模型

参考技术A前期知识准备:RNN,CNN,BERT,SemEval-2010Task8数据集,F1值关系分类是一个重要的NLP任务,其主要目标是提取出实体之间的关系。最先进的关系分类方法主要是基于CNN或RNN。最近,预训练BERT模型在许多NLP的分类和序列标注任务... 查看详情

踩坑笔记(pytorch-bert,dataframe,交叉熵)

参考技术A1、pytorchbert输出的问题。2、dataframe的筛选问题。输出:值为False的列没有被选中。3、交叉熵损失函数可以直接认为是这样的一个概率和,如果是多分类,假设真实标签[0,1,2,1,1,2,1]那就是 查看详情

广告行业中那些趣事系列6:bert线上化albert优化原理及项目实践(附github)

...派生产品ALBERT来完成BERT线上化服务。ALBERT使用参数减少技术来降低内存消耗从而最终达到提高BERT的训练速度,并且在主要基准测试中均名列前茅,可谓跑的快,还跑的好。希望对需要将BERT线上化感兴趣的小伙伴有些许帮助。目... 查看详情

【nlp】bert常见问题汇总

参考技术Abert结构大体上可分为输入、N层transformer的encoder和输出三部分组成。输入由tokenembedding、segmentembedding和positionembedding三部分相加组成;N层transformer的encoder,在bert_base中N=12,bert_large中N=24输出有model.get_sequence_out()和model.get... 查看详情

bert结构与原理(1)--embedding

参考技术A  BERT主要是多个Transformer的Encoder作为主题,主要包含Embedding层,Encoder层。  BERT中的Embedding主要有3种:  TokenEmbedding是对词向量进行编码。原始的输入是[batch,seq_len]。经过TokenEmbedding后数据的维... 查看详情