精华内容
下载资源
问答
  • Bert模型
    2022-02-06 14:29:39

    语言表示

    语言表示有两种类型:

    1、上下文无关的语言表示,例如 Glove 和 Word2vec,其中词汇表中每个标记的嵌入是恒定的,并且不依赖于单词的上下文。

    缺点:具有完全不同含义的同一个词将具有相同的表示

    2、上下文有关的语言表示,例如 Elmo 和 OpenAI-GPT,其中令牌表示取决于使用它的单词的上下文

    BERT 模型有助于生成每个令牌的上下文表示。它甚至能够获取整个句子、句子对或段落的上下文。

    BERT 基本上使用了在非常大的数据集上以无监督的方式对模型进行预训练的概念进行语言建模。在非常大的数据集上预训练的模型能够更好地理解输入句子的上下文。经过预训练后,模型可以在特定任务的监督数据集上进行微调,以取得良好的效果。

    可以应用两种类型的策略:基于特征的策略微调策略

    Elmo 使用基于特征的模型的概念,其中模型架构是特定于任务的。它对不同的任务使用不同的模型,并使用预先训练的模型进行语言表示。BERT 使用微调的概念,任何任务的最终模型都与 BERT 几乎相同。它使用变压器编码器的深层双向层来进行语言理解,因此得名来自Transformer双向编码表示。BERT 应用的总体思路可以从下图描述

    模型概述

    BERT 的模型架构是基于Transformer的。它使用多层双向转换器编码器进行语言表示。基于模型架构的深度,介绍了两种类型的 BERT 模型,分别是 BERT Base和 BERT Large。

    BERT Base 模型使用 12 层变换器块,隐藏大小为 768,自注意力头数为 12,可训练参数约110M

    BERT Large模型使用 24 层变压器块,隐藏大小为 1024,自注意力头数为 16,可训练参数约340M

    BERT 对所有任务使用相同的模型架构,无论是 NLI、分类还是问答,只需进行最小的更改,例如为分类添加输出层

    输入输出格式

     BERT 必须输入一个序列。BERT 使用特殊标记 [CLS] 和 [SEP] 来正确理解输入。

    [SEP] 令牌必须插入到单个输入的末尾。当一项任务需要多个输入(例如 NLI 和 QA 任务)时,[SEP] 标记可帮助模型理解同一序列输入中一个输入的结束和另一个输入的开始。

    [CLS]是一个特殊的分类token,BERT最后一个隐藏状态对应这个token(h [CLS]) 用于分类任务。BERT 使用 Wordpiece 嵌入输入作为标记。

    除了令牌嵌入之外,BERT 还为每个令牌使用位置嵌入和分段嵌入。位置嵌入包含有关令牌在序列中的位置的信息。当模型输入有句子对时,段嵌入会有所帮助。第一个句子的标记将具有 0 的预定义嵌入,而第二个句子的标记将具有 1 的预定义嵌入作为片段嵌入。

    模型架构使用的最终嵌入是令牌嵌入、位置嵌入以及段嵌入的总和。然后将最终的嵌入输入深层双向层以获得输出。BERT 的输出是与输入序列中的每个标记对应的预定义隐藏大小的隐藏状态向量。这些来自 BERT 最后一层的隐藏状态随后用于各种 NLP 任务。

    更多相关内容
  • Python自然语言处理-BERT模型实战课程旨在帮助同学们快速掌握当下NLP领域最核心的算法模型BERT的原理构造与应用实例。通俗讲解BERT模型中所涉及的核心知识点(Transformer,self-attention等),基于google开源BERT...
  • 一个使用keras复现的bert模型库,然后在看bert源码的时候,发现bert官网上的源码对于新手很不友好,大量的代码和繁杂英文,都对新手的理解造成了很大的影响,为此本小白制作了一份使用keras复现的berts的源代码内容...
  • 回顾了经典的文本分析技术,重点介绍了Bert模型的关键技术特点及其两种不同用法。详细描述了利用其中的特征提取方法,进行网站不良信息检测的具体实施方案,并且与传统的TF-IDF模型以及word2vec+LSTM模型进行了对比...
  • bert模型的Python实现

    2019-04-15 17:13:23
    该文档主要是bert论文的Python代码实现,在多个数据集实现较好效果
  • 探究BERT中文基础模型BERT-Base-Chinese)和BERT中文医学预训练模型BERT-Re-Pretraining-Med-Chi)在中文医学文献分类上的分类效果及差异原因。[方法] 本研究以34万篇中文医学文献摘要为医学文本预训练语料,...
  • [Objective] This paper compares the prediction accuracy and efficiency of different machine learning algorithms, aiming to identify new consumers with repeat purchase intentions. It also provides a ...
  • tf2bert 一个使用tf2复现的bert模型
  • BERT学习笔记一:运行BERT模型代码前-附件资源
  • Tensorflow2.0 Bert模型.rar

    2020-08-28 00:07:41
    tensorflow2.o Bert模型 NER
  • 准注意ABSA 用于基于上下文的BERT的代码库,用于基于方面的...您必须下载预训练的BERT模型才能执行微调管道。 我们建议您使用上BERT官方发行版提供的模型 。 请注意,他们的模型采用张量流格式。 要将tensorflow模型
  • 流行BERT模型的一个简单而完整的实现
  • 一、DistilBert for Chinese 海量中文预训练蒸馏Bert模型 拟于12月16日发布 target to release on Dec 16th. 拟发布内容 Contents: 1.1 可下载的蒸馏模型,已经训练过 a pretrained chinese DistilBert, others can...
  • LCFS-BERT 要求 火炬> = 1.0 Pytorch-transformer == 1.2.0 pip install pytorch-transformers==1.2.0 1.数据预处理: 在上下载SemEval数据集 XML文件将转换为文本文件,其中每个输入语句均遵循以下格式: ...
  • BERT模型从训练到部署全流程
  • 基于bert模型的疫情期间网民情绪识别,有代码,数据,可直接运行 --原始数据 基于bert模型的疫情期间网民情绪识别,有代码,数据,可直接运行 --原始数据
  • tensorflow2.0 对实体命名识别的数据预处理 1
  • 使用BERT模型作为句子编码服务,将可变长度句子映射到固定长度向量。
  • BERT模型工程

    2018-11-22 14:55:31
    google 最新推出的BERT模型工程代码,在11个NLP数据集上达到最优效果
  • Tensorflow solution of NER task Using BiLSTM-CRF model with Google BERT Fine-tuning
  • 本项目采用R-BERT模型:对人物关系进行分类,提升效果明显,在测试集上的F1值达到85%。 数据集 共3901条标注样本,训练集:测试集= 8:2 标注样本:亲戚 1837年6月20日,威廉四世辞世,他的侄女维多利亚即位。 ,...
  • 基于python面向工业用途使用BERT模型做文本分类项目实现
  • BERT模型

    万次阅读 2018-11-29 18:19:57
    语言模型的与训练在自然语言处理的任务中有着重要的作用。 1.1 自然语言处理的任务 a.句子层面(sentence-level)=>判断句子之间的关系 自然语言推理(natural language inference) 自然语言改写...

    1、背景

    语言模型的与训练在自然语言处理的任务中有着重要的作用。

    1.1 自然语言处理的任务

    a.句子层面(sentence-level)=>判断句子之间的关系

    • 自然语言推理(natural language inference)
    • 自然语言改写(natural language paraphrasing)

    b.词层面(token-level)

    • 命名实体识别(named entity recognition)
    • 知识问答(SQuADquestion answering)

    1.2 目前将预训练表示(pre-trained representations)用到自然语言处理任务策略

    a.基于特征的方法(feature-based),将预训练的表示向量作为额外特征(作为输入),利用任务相关模型

    b.基于微调的方法(fine-tuning),通过引入少量与任务相关的参数,将预训练的表示向量在模型训练过程的同时进行微调

    1.3 现状与局限

        目前预训练表示(pre-trained representations)的方法都是单向语言模型。也就是说每个词只能利用该词之前的词信息进行训练,这样的约束条件严重限制了pre-trained representations的表示能力。这样得到的pre-trained representations,对于sentence-level的自然语言任务,将会得到局部最优解;而对于token-level的自然语言任务,将会是毁灭性的灾难。因此,本文提出的BERT模型来解决上述约束。并且BERT是一个MASK model。BERT将随机的mask输入序列的词,目标就是利用上下文信息(相对于传统自左向右的语言模型,mask model可以同时使用masked词左右上下文进行预测)预测被mask的词。同时利用masked左右的上下文信息是通过Transformer的双向encoder来实现。这样既可以解决“语言模型是单向的”限制。此外,BERT模型引入“预测是否为下一句”的任务,来共同学习pre-trained representations。因此,BERT pre-trained representations的目标就是同时预测被mask的词是什么预测句子对是否为“下一句”的关系。

    1.4 BERT贡献

    a.BERT利用masked model实现了语言模型的双向性,证明了双向性对语言表示预训练的重要性。如下图,传统的方法如OpenAI GPT是单向语言模型,每个词只能用到该词左边的词信息进行学习(RNN时间序列模型);ELMo是利用双向LSTM,将一层left-to-right 和right-to-left两个单独的LSTM进行结合;而BERT模型是真正意义上的双向语言模型,每个词可以同时利用该词的上下文信息。

    b.BERT是第一个微调模型在sentence-level和token-level自然语言任务都达到了最好效果。证明了pre-trained representations可以缓解了不同任务对特殊模型结构的设计需求。

    c.BERT在11个自然语言处理任务上达到了最好效果。并在BERT的extensive ablations证明了“BERT的双向性”是一个重要的创新。代码在 goo.gl/language/bert

    2.BERT模型

    2.1模型结构

    BERT模型是一个多层的Transformer,具体Transformer模型结构见,一下模型结构根据代码可得

    • embedding层:将input_id转化为word embedding
    • embedding_processor层:word embedding + position embedding(和Transformer一致) +segment embedding(BERT模型创新)
    • Transformer层

      BERT-base: L=12, H=768, A=12, Total Parameters=110M
      BERT-large: L=24, H=1024, A=16, TotalParameters=340M

      BERT-base为了和OpenAI GPT进行对比,所以模型大小与OpenAI GPT设置一致。不同的在于OpenAI GPT使用left-to-right的self-attention,而BERT使用双向self-atten

    2.2 输入表示(Input Representation)

    无论是单个文本还是文本对,输入都是一个token sequence。其中[CLS]表示sequence的开始,[SEP]表示两个文本的分割。输入向量是由词向量,位置向量和分割向量构成的,如下图:

    input embedding= word embedding+ position embedding + segment embedding

    • word embedding用的是WordPiece embeddings,包含30000tokens
    • position embedding是学习得到的,支持最长序列长度为512个tokens
    • [CLS]的隐状态的输出,对于分类问题,可以作为sequence的表示;对于非分类问题,则忽略
    • 句子pair也用一个sequence进行输入。a.利用[SEP]作为两个句子的区分;b.segment embedding可以区分两个句子;对于一个句子的输入,可以只用segment embedding A

     

    2.3 预训练任务

    2.3.1 Task #1: Masked LM

    理论上深度双向模型应该比浅层模型和单向模型的效果好。因为当多层context信息被利用,每个词将会"看到自己",所以标准的语言模型只能单向训练.Unfortunately, standard conditional language models can only be trained left-to-right or right-to-left, since bidirectional conditioning would allow each word to indirectly “see itself” in a multi-layered context.

    为了解决上述问题,采用一种直接的方法。将输入序列按照一定的概率,随机的mask token。本文采用15%的概率进行mask。例如:token(my dog is hairy 选择hairy。但这样做存在两个缺点:

    缺点1:由于[mask]fine-tuning过程中没有遇到,使得Pre-trainningfine-tuning过程不匹配

    解决1

    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 dogis hairy

    缺点2:每个batch只有15%的词被训练到->需要更多次的训练

    2.3.2 Task #2: Next Sentence Prediction
       由于pre-trainning Representation的应用大多是知识问答或者自然语言推理这种判断句子之间关系的任务。因此,本文采用预测“是否为下一句”的任务。

    训练任务:句子B是否为句子A的下一句

    训练数据:

    50%情况下句子B为句子A的下一句

    50%情况下句子B是从语料库中随机选取的一句

     

    最终,预训练的目标函数是:最小化(“预测masked词”的损失+“预测是否为下一句”的损失)

    2.4微调过程

    分类任务:利用Transformer[CLS]位置的输出C,类别概率(softmax)如下,目标函数:Maximize the log probability of the correct label

    非分类任务:利用Transformer的输出向量,设定特定任务的网络结构

    3.小见解

    1.双向?通过self-attention实现的,利用Transformer中的encoder实现的,可以使用当前词前后的词,因此成为双向Transformer(Transformer中由于decoder限制了只能使用当前词之前词的信息,所以decoder是单向的;但是encoder在每一个词输入时,是可以利用前后所有词的信息,因此称为双向)

    2.深层?因为Transformer只是用self-attention,没有使用RNN或者CNN,并且利用了残差网络,因此可以训练深层模型

    3.利用非标注数据?BERT可以利用文档生成“预测是否为下一句”任务的 训练数据,从而不受标注数据量的影响

    4.双向预测?由于BERT是双向的,利用词前后词的信息,所以多层之后就知道了该位置的词是什么,因此采用了mask的方式(个人觉得有点像降噪自编码器)

    5.预训练过程主要解决“预测是否为下一句”的任务,因此目标函数是最小化(mask位置预测损失+是否为下一句分类任务损失)

    展开全文
  • SciBERT是经过科学文字训练的BERT模型。 SciBERT受过SciBERT )的论文训练。 语料库大小为114万张论文,3.1B令牌。 我们在培训中使用论文的全文,而不仅仅是摘要。 SciBERT拥有自己的词汇表( scivocab ),该...
  • 基于python和CSS的BERT模型从训练到部署全流程开发源码
  • Bert 模型学习

    千次阅读 2021-10-15 10:38:54
    BERT 模型的全称是 BidirectionalEncoder Representations from Transformer,基于 Transformer 的双向编码器表示,是一个预训练的语言表征模型,它强调了不再像以往一样采用传统的单向语言模型或者把两个单向语言...

    一、Bert 模型

    BERT 模型的全称是 BidirectionalEncoder Representations from Transformer,基于 Transformer 的双向编码器表示,是一个预训练的语言表征模型,它强调了不再像以往一样采用传统的单向语言模型或者把两个单向语言模型进行浅层拼接的方法进行预训练,而是采用新的 masked language model(MLM),以致能生成深度的双向语言表征。BERT 模型的目标是利用大规模无标注语料训练、获得文本的包含丰富语义信息的 Representation,即:文本的语义表示,然后将文本的语义表示在特定NLP任务中作微调,最终应用于该NLP任务。煮个栗子,BERT模型训练文本语义表示的过程就好比我们在高中阶段学习语数英、物化生等各门基础学科,夯实基础知识;而模型在特定NLP任务中的参数微调就相当于我们在大学期间基于已有基础知识、针对所选专业作进一步强化,从而获得能够应用于实际场景的专业技能。

    BERT是一个预训练的模型,那么什么是预训练呢?

    假设已有 A 训练集,先用 A 对网络进行预训练,在 A 任务上学会网络参数,然后保存以备后用,当来一个新的任务 B,采取相同的网络结构,网络参数初始化的时候可以加载 A 学习好的参数,其他的高层参数随机初始化,之后用 B 任务的训练数据来训练网络,当加载的参数保持不变时,称为 “frozen”,当加载的参数随着 B 任务的训练进行不断的改变,称为 “fine-tuning”,即更好地把参数进行调整使得更适合当前的 B 任务。

    优点:当任务 B 的训练数据较少时,很难很好的训练网络,但是获得了 A 训练的参数,会比仅仅使用 B 训练的参数更优。

    Bert 模型优点:

    1)采用 MLM 对双向的 Transformers 进行预训练,以生成深层的双向语言表征。

    2)预训练后,只需要添加一个额外的输出层进行 fine-tune,就可以在各种各样的下游任务中取得 state-of-the-art 的表现。在这过程中并不需要对 BERT 进行任务特定的结构修改。

    二、Bert 模型的预训练任务

    实际上预训练的概念在 CV(Computer Vision,计算机视觉)中已经是很成熟了,应用十分广泛。CV 中所采用的预训练任务一般是 ImageNet 图像分类任务,完成图像分类任务的前提是必须能抽取出良好的图像特征,同时 ImageNet 数据集有规模大、质量高的优点,因此常常能够获得很好的效果。

    虽然 NLP 领域没有像 ImageNet 这样质量高的人工标注数据,但是可以利用大规模文本数据的自监督性质来构建预训练任务。因此 BERT 构建了两个预训练任务,分别是 Masked Language Model 和 Next Sentence Prediction。

    1、Task #1: Masked LM

    为了训练双向特征,这里采用了 Masked Language Model 的预训练方法,随机 mask 句子中的部分 token,然后训练模型来预测被去掉的 token。

    具体操作是:

    随机 mask 语料中 15% 的 token,然后将 masked token 位置输出的 final hidden vectors 送入 softmax,来预测 masked token。

    这里也有一个小 trick,如果都用标记 [MASK] 代替 token 会影响模型,所以在随机 mask 的时候采用以下策略:

    1)80% 的单词用 [MASK]token 来代替

    my dog is hairy → my dog is [MASK]

    2)10% 单词用任意的词来进行代替

    my dog is hairy → my dog is apple

    3)10% 单词不变

    my dog is hairy → my dog is hairy

    2、Task 2#: Next Sentence Prediction

    为了让模型捕捉两个句子的联系,使模型具备理解长序列上下文的联系的能力,这里增加了 Next Sentence Prediction 的预训练方法,即给出两个句子 A 和 B,B 有一半的可能性是 A 的下一句话,训练模型来预测 B 是不是 A 的下一句话。

    一些如问答、自然语言推断等任务需要理解两个句子之间的关系,而 MLM 任务倾向于抽取 token 层次的表征,因此不能直接获取句子层次的表征。为了使模型能够有能力理解句子间的关系,BERT 使用了 NSP 任务来预训练,简单来说就是预测两个句子是否连在一起。具体的做法是:对于每一个训练样例,我们在语料库中挑选出句子 A 和句子 B 来组成,50% 的时候句子 B 就是句子 A 的下一句(标注为 IsNext),剩下 50% 的时候句子 B 是语料库中的随机句子(标注为 NotNext)。接下来把训练样例输入到 BERT 模型中,用 [CLS] 对应的 C 信息去进行二分类的预测。

    预训练任务总结

    最后训练样例长这样:

    Input1=[CLS] the man went to [MASK] store [SEP] he bought a gallon [MASK] milk [SEP]
    
    Label1=IsNext
    
    Input2=[CLS] the man [MASK] to the store [SEP] penguin [MASK] are flight ##less birds [SEP]
    
    Label2=NotNext
    

    把每一个训练样例输入到 BERT 中可以相应获得两个任务对应的 loss,再把这两个 loss 加在一起就是整体的预训练 loss。(也就是两个任务同时进行训练)

    可以明显地看出,这两个任务所需的数据其实都可以从无标签的文本数据中构建(自监督性质),比 CV 中需要人工标注的 ImageNet 数据集可简单多了。

    三、Bert 的结构

    BERT 模型是基于 Transformer 的 Encoder(编码器),主要模型结构就是 Transformer 的堆叠。
    当我们组建好 Bert 模型之后,只要把对应的 token 喂给 BERT,每一层 Transformer 层吐出相应数量的 hidden vector,一层层传递下去,直到最后输出。模型就这么简单,专治花里胡哨,这大概就是谷歌的暴力美学。
    在这里插入图片描述
    2 种不同大小规模的 BERT 模型都有大量的 Encoder 层(论文里把这些层称为 Transformer Blocks):BASE 版本有 12 层 Encoder,Large 版本有 20 层 Encoder。同时,这些 BERT 模型也有更大的前馈神经网络(分别有 768 个和 1024 个隐藏层单元)和更多的 attention heads(分别有 12 个和 16 个),超过了原始 Transformer 论文中的默认配置参数(原论文中有 6 个 Encoder 层, 512 个隐藏层单元和 8 个 attention heads)。
    Transformer 是组成 BERT 的核心模块,而 Attention 机制又是 Transformer 中最关键的部分

    (1)Attention

    Attention 机制的中文名叫“注意力机制”,顾名思义,它的主要作用是让神经网络把“注意力”放在一部分输入上,即:区分输入的不同部分对输出的影响。这里,我们从增强字/词的语义表示这一角度来理解一下 Attention 机制。
    我们知道,一个字/词在一篇文本中表达的意思通常与它的上下文有关。比如:光看“鹄”字,我们可能会觉得很陌生(甚至连读音是什么都不记得吧),而看到它的上下文“鸿鹄之志”后,就对它立马熟悉了起来。因此,字/词的上下文信息有助于增强其语义表示。同时,上下文中的不同字/词对增强语义表示所起的作用往往不同。比如在上面这个例子中,“鸿”字对理解“鹄”字的作用最大,而“之”字的作用则相对较小。为了有区分地利用上下文字信息增强目标字的语义表示,就可以用到 Attention 机制
    Attention 机制主要涉及到三个概念:Query、Key 和 Value。在上面增强字的语义表示这个应用场景中,目标字及其上下文的字都有各自的原始 Value,Attention 机制将目标字作为 Query、其上下文的各个字作为 Key,并将 Query 与各个 Key 的相似性作为权重,把上下文各个字的 Value 融入目标字的原始 Value 中。如下图所示,Attention 机制将目标字和上下文各个字的语义向量表示作为输入,首先通过线性变换获得目标字的 Query 向量表示、上下文各个字的 Key 向量表示以及目标字与上下文各个字的原始 Value 表示,然后计算 Query 向量与各个 Key 向量的相似度作为权重,加权融合目标字的 Value 向量和各个上下文字的 Value 向量,作为 Attention 的输出,即:目标字的增强语义向量表示
    在这里插入图片描述

    1)Self-Attention:

    对于输入文本,我们需要对其中的每个字分别增强语义向量表示,因此,我们分别将每个字作为 Query,加权融合文本中所有字的语义信息,得到各个字的增强语义向量,如下图所示。在这种情况下,Query、Key 和 Value 的向量表示均来自于同一输入文本,因此,该 Attention 机制也叫 Self-Attention。
    在这里插入图片描述

    2)Multi-head Self-Attention

    为了增强 Attention 的多样性,文章作者进一步利用不同的 Self-Attention 模块获得文本中每个字在不同语义空间下的增强语义向量,并将每个字的多个增强语义向量进行线性组合,从而获得一个最终的与原始字向量长度相同的增强语义向量,如下图所示。
    在这里插入图片描述

    (2)Transformer Encoder

    在 Multi-headSelf-Attention 的基础上再添加一些“佐料”,就构成了大名鼎鼎的 Transformer Encoder。实际上,Transformer 模型还包含一个 Decoder 模块用于生成文本,但由于 BERT 模型中并未使用到 Decoder 模块,因此这里对其不作详述。下图展示了 Transformer Encoder 的内部结构,可以看到,Transformer Encoder 在 Multi-head Self-Attention 之上又添加了三种关键操作:1)残差连接(ResidualConnection):将模块的输入与输出直接相加,作为最后的输出。这种操作背后的一个基本考虑是修改输入比重构整个输出更容易(“锦上添花”比“雪中送炭”容易多了!)。这样一来,可以使网络更容易训练。2)Layer Normalization:对某一层神经网络节点作0均值1方差的标准化。3)线性转换:对每个字的增强语义向量再做两次线性变换,以增强整个模型的表达能力。这里,变换后的向量与原向量保持长度相同。
    在这里插入图片描述

    可以看到,Transformer Encoder 的输入和输出在形式上还是完全相同,因此,Transformer Encoder 同样可以表示为将输入文本中各个字的语义向量转换为相同长度的增强语义向量的一个黑盒

    组装好 TransformerEncoder 之后,再把多个 Transformer Encoder 一层一层地堆叠起来,BERT 模型就大功告成了!

    四、输入输出

    在基于深度神经网络的NLP方法中,文本中的字/词通常都用一维向量来表示(一般称之为“词向量”);在此基础上,神经网络会将文本中各个字或词的一维词向量作为输入,经过一系列复杂的转换后,输出一个一维词向量作为文本的语义表示。特别地,我们通常希望语义相近的字/词在特征向量空间上的距离也比较接近,如此一来,由字/词向量转换而来的文本向量也能够包含更为准确的语义信息。因此,BERT模型的主要输入是文本中各个字/词的原始词向量,该向量既可以随机初始化,也可以利用Word2Vector等算法进行预训练以作为初始值;输出是文本中各个字/词融合了全文语义信息后的向量表示,如下图所示(为方便描述且与BERT模型的当前中文版本保持一致,本文统一以字向量作为输入):
    在这里插入图片描述
    从上图中可以看出,BERT 模型通过查询字向量表将文本中的每个字转换为一维向量,作为模型输入;模型输出则是输入各字对应的融合全文语义信息后的向量表示。此外,模型输入除了字向量,还包含另外两个部分:1)文本向量,该向量的取值在模型训练过程中自动学习,用于刻画文本的全局语义信息,并与单字/词的语义信息相融合;2)位置向量,由于出现在文本不同位置的字/词所携带的语义信息存在差异(比如:“我爱你”和“你爱我”),因此,BERT模型对不同位置的字/词分别附加一个不同的向量以作区分。最后,BERT模型将字向量、文本向量和位置向量的加和作为模型输入。

    1、输入

    bert 的输入部分是个线性序列,两个句子通过分隔符分割,最前面和最后增加两个标识符号。每个单词有三个embedding:位置信息 embedding,这是因为 NLP 中单词顺序是很重要的特征,需要在这里对位置信息进行编码;单词 embedding,这个就是我们之前一直提到的单词 embedding;第三个是句子 embedding,因为前面提到训练数据都是由两个句子构成的,那么每个句子有个句子整体的 embedding 项对应给每个单词。把单词对应的三个 embedding 叠加,就形成了 Bert 的输入。

    在这里插入图片描述
    在 BERT 中,输入的向量是由三种不同的 embedding 求和而成,分别是:

    1)token embedding:单词本身的向量表示。token 是指将单词划分成一组有限的公共子词单元,能在单词的有效性和字符的灵活性之间取得一个折中的平衡。
    2)position embedding:将单词的位置信息编码成特征向量。因为我们的网络结构没有RNN 或者LSTM,因此我们无法得到序列的位置信息,所以需要构建一个position embedding。构建position embedding有两种方法:BERT是初始化一个position embedding,然后通过训练将其学出来;而Transformer是通过制定规则来构建一个position embedding
    3)segment embedding:用于区分两个句子的向量表示。这个在问答等非对称句子中是用区别的。

    2、输出

    Bert 的输出是由四部分组成:

    (1)last_hidden_state:shape 是(batch_size, sequence_length, hidden_size),hidden_size=768,它是模型最后一层输出的隐藏状态(通常用于命名实体识别)。
    (2)pooler_output:shape是(batch_size, hidden_size),这是序列的第一个token(classification token)的最后一层的隐藏状态,它是由线性层和 Tanh 激活函数进一步处理的(通常用于句子分类,至于是使用这个表示,还是使用整个输入序列的隐藏状态序列的平均化或池化,视情况而定)。
    (3)hidden_states:这是输出的一个可选项,如果输出,需要指定 config.output_hidden_states=True,它也是一个元组,它的第一个元素是 embedding,其余元素是各层的输出,每个元素的形状是(batch_size, sequence_length, hidden_size)。
    (4)attentions:这也是输出的一个可选项,如果输出,需要指定 config.output_attentions=True,它也是一个元组,它的元素是每一层的注意力权重,用于计算 self-attention heads 的加权平均值。

    展开全文
  • BERT模型—2.BERT模型预训练与微调

    千次阅读 多人点赞 2021-07-20 15:22:03
      本节将按照思维导图逐步了解BERT语言模型(基于transformer的网络结构)。 一、预训练语言模型   大规模的预训练语言模型模型参数量呈几何倍数的增长趋势。下面我们了解BERT预训练的原理。 1.为什么要进行...

    引言

      本节将按照思维导图逐步了解BERT语言模型(基于transformer的网络结构)。
    在这里插入图片描述
      BERT带来了新的NLP范式。
    在这里插入图片描述

    一、预训练语言模型

      大规模的预训练语言模型的模型参数量呈几何倍数的增长趋势。下面我们了解BERT预训练的原理。

    1.为什么要进行预训练?

      基于词向量为基础的模型并不是在BERT中首次出现。在Word2vec中,词向量表示是有局限性的。这是因为词向量表达固定,无法表达上下文。2017年之前,NLP模型的普遍形态为词向量+encoder
    在这里插入图片描述
    利用LSTM或者Transformer模型通过训练集来学习如何提取上下文信息,最终输出分类标签。这里的训练集指的是具有分类或者NER的标注信息。这种模式有如下缺陷:

    • Encoder部分随机初始化,没有经过预训练,对优化器压力大;
    • 数据集要足够好,足够大,encoder才能学会如何提取上下文信息

    这两个缺陷导致2017年以前的模型非常具有局限性。
      基于上述的缺陷,我们现在想要有效的预训练embedding+编码器。有标签的文本数据获取成本大,相比来说,获取大量无标签的文本数据代价很小。所以如何进行预训练呢?这就涉及到在大量无标签的文本上进行自监督学习(self-supervised training)。

    2. BERT预训练-掩码预测任务

      掩码预测任务与Word2vec中CBOW非常神似,但略有不同。
    在这里插入图片描述
    在这里插入图片描述

    • 一方面,CBOW语言模型输入的是一个时间窗口,并不一定是一个句子;掩码预测任务输入的是一个句子(sentence)
    • 另一方面,CBOW当中被预测的词是不做输入的;但掩码预测任务会遮掩某个词(用”[MASK]"字符替换原词)然后用于输入
    • CBOW中是一句话预测一个词,掩码预测任务一句话可以遮掩多个字

      掩码预测任务中,输入是句子当中遮掩掉几个词(用”[MASK]"字符替换原词),经过BERT网络输出每个字的向量表征。在遮掩的这个字的位置上要经过一个线性层来预测这个位置是哪个字的概率。掩码预测任务存在的问题:在下游任务中,eg:预测一个句子的情感是不会有[Mask]的。因此,在实现掩码任务时,需要遮掩的字只占语料全体的字数的一小部分(15%);在这15%里面:

    • 一部分(80%)被遮掩,也就是替换为[MASK];
    • 一部分(10%)随机替换为其他词(仍然需要预测此处的token应该是什么);
    • —部分(10%)保留原词(仍然需要预测此处的token);

    这样做的目的是使得模型能够区分这个词放在这里是否合理,使得模型具有判断这句话是否合理的能力,加深了模型对语言的理解。BERT模型在经过预训练之后天生就能够做一些下游任务,比如:纠错任务。

    3.BERT预训练-下句预测任务

      下句预测指的是:判断句子B是否是句子A的下文。此时,BERT句子的输入会是[CLS] A sent [SEP] B sent [SEP]格式
    在这里插入图片描述
      我们经常通过句首的第一个token来表示句子整体的语义关系,在上下句预测的任务当中,上下句的关系是保存在输入的[CLS]符号的当中,在预测时使用BertPooler提取整个输入序列的表征:
    在这里插入图片描述
    这里要注意:不是直接拿[CLS]的向量表征;而是要经过BertPooler这个模块,其中包含MLP,tanh操作得到一个向量表示,再输入到2分类层,BertPooler也是参与预训练的,预训练会更新整个bert的模型参数,微调时候其实是可以更新部分参数,后面会有介绍。

    用了 Masked LM 和 Next Sentence Prediction 两种方法分别捕捉词语和句子级别的 representation

    二、BERT的文本处理—subword tokenizer

    1. 为什么要学习subword tokenizer?

      subword tokenizer就是将长的复杂的单词分成成短的简单的单词,eg:句子” play the song little robin redbreast”在输入模型时变为”[CLS] play the song red ##bre ##ast [SEP]”。Tokenizer是预训练时候用了哪个,后面微调就要用哪个。使用subword tokenizer的原因是:

    • 传统词表示方法:是先对各个句子进行分词,然后再统计并选出频数最高的前N个词组成词表·词表一般较大,一是尾部词训练不充分,二是显存占用较大
    • 传统词表示方法无法很好的处理未知或罕见的词汇(OOV问题)
    • 传统词tokenization方法不利于模型学习词缀之间的关系
      E.g.模型学到的“old”, “older”,and “oldest”之间的关系无法泛化到“smart”, “smarter”,and“smartest”。
    • Character embedding作为OOV的解决方法粒度太细,且推理时候显存开销较大:
      一个原本长度为12的句子,采用character embedding,则输入的大小变为12*16 (假设设置词字母长度最
      大为16)
    • Subword粒度在词与字符之间,能够较好的平衡OOV问题

    常见的subword模型:Byte Pair Encoding (BPE), WordPiece

    2. 词表生成与分词

      BPE算法生成词表过程如下:

    1. 准备一个语料库;确定期望的Subword词表大小;
    2. 将单词拆分为成最小单元。比如英文中26个字母加上各种符号,这些作为初始词表;
    3. 在语料上统计单词内相邻单元对的频数,选取频类最高的单元对合并成新的Subword单元;
    4. 重复第3步直到:达到第1步设定的Subword词表大小或下一轮迭代中token最高频数为1

    假设现在语料库中有如下词汇(及其频率):
    在这里插入图片描述

    观察词汇表大小在每一步如何变化
    在这里插入图片描述

      BPE算法编码:得到Subword词表后,针对每一个单词,我们可以采用如下的方式来进行编码:

    • 将词典中的所有子词按照长度由大到小进行排序;
    • 对于要进行分词的单词w,依次遍历排好序的词典。查看当前子词是否是该单词的子字符串(贪婪的最长匹配),如果是,则输出当前子词,并对剩余单词字符串继续匹配;
    • 如果遍历完字典后,仍不匹配,则将剩余字符串替换为特殊符号输出,如””;

      WordPiece算法生成词表的步骤与BPE类似;加上”##”前缀表示token不作为一个完整单词的开始部分。与BPE的最大区别在于,如何选择两个子词进行合并∶BPE选择频数最高的相邻子词合并,而WordPiece选择能够提升语言模型概率最大的相邻子词加入词表;

    • 假设句子 S = ( t 1 , t 2 , t n ) S =(t_1, t_2,t_n) S=(t1,t2,tn)由n个子词组成,表示子词,且假设各个子词之间是独立存在的
    • 句子的语言模型似然值等价于所有子词概率的乘积: l o g P ( S ) = ∑ i = 1 n P ( t i ) logP(S)= \sum_{i=1}^nP(t_i) logP(S)=i=1nP(ti)
    • 假设把相邻位置的 i i i j j j两个子词进行合并,合并后产生的子词记为 z z z,此时句子似然值的变化可表示为:
      l o g P ( t z ) − ( l o g P ( t x ) + l o g P ( t y ) ) = l o g P ( t z ) P ( t x ) P ( t y ) logP(t_z)- (logP(t_x)+ logP(t_y)) =log\frac{P(t_z)}{P(t_x)P(t_y)} logP(tz)(logP(tx)+logP(ty))=logP(tx)P(ty)P(tz)
      很容易发现,似然值的变化就是两个子词之间的互信息。

    简而言之,WordPiece每次选择合并的两个子词,他们具有最大的互信息值,也就是两子词在语言模型上具有较强的关联性,它们经常在语料中以相邻方式同时出现。
    Wordpiece举例:

    • 英文:采用BERT-base-uncased tokenizer
      30522个单词;英文转化为小写
      eg:
      句子“play the song little robin redbreast”经过BERT的wordpiece tokenizer后变为”[‘play’, ‘the’, ‘song’, ‘little’, ‘robin’, ‘red’, ‘##bre’, '##ast ]”
    • 中文:采用Google Chinese BERT-base-uncased
      21128个单词;不区分大小写;
      中文汉字拆开(split_Chinese_character);
      eg:
      句子”我很喜欢一首歌: yesterday once more.”处理为['我,‘很’,‘喜’, ‘欢’,'一,'首, ‘歌’, ‘:’,‘yes’, ‘##ter’, ‘##day’, ‘on’, ‘##ce’, ‘more’, ‘.’]

    三、BERT embedding

      BERT的嵌入层包含三种embedding

    • Token embedding
      对应着Subword词表分词后的每一个单词
    • Segmentation embedding
      将句子的上一句与下一句进行区分对待,涉及到预训练任务当中的下句预测
    • Position embedding
      位置编码,为了能够让模型反映句子的顺序信息,位置编码研究前沿如今是相对位置编码

    在这里插入图片描述

    四、BERT微调—句子分类任务

      句子分类任务就是把文本按照一定的规则分门别类,文本分类有以下应用场景:
    在这里插入图片描述
      那么,在下游任务中,如何进行BERT句子分类任务的微调?不妨以单个句子分类为例(还有句子对分类,判定句子对是否同义),比如,我们现在想要对“想看黑寡妇”进行情感分类,首先将“想看黑寡妇”转换成BERT模型的输入形式,在句前加[CLS]符号,句尾加[SEP]符号,使用subword tokenizer进行分词,将这样处理好的文本输入到BERT模型中,得到句子的向量表征(句子中的每个字均有向量表征),通过BertPooler模块,取[CLS]的向量表征,经过MLP,tanh操作后得到一个整句的向量表征,再经过分类层得到分类结果。
    在这里插入图片描述
    由于NLP中句子是不定长的,所以可以通过Pooling层将变长的向量转换成特定的size。除了使用BertPooler模块,还可以增加一个Pooling操作,将句子表征转化成句子级别的向量。这里的Pooling操作指:

    • Max-Pooling
    • Average-Pooling
    • Attention-Pooling

    在这里插入图片描述
      分类任务微调的损失函数:假设模型对分类任务的训练样本为 ( x , y ) (x,y) (x,y),预测类别为 c c c的概率为 p c p_c pc,则损失函数为
    C E ( P C , X ) = − I ( y = c ) ∗ l o g ( p c ) CE(P_C,X)=-I(y=c)*log(p_c) CE(PC,X)=I(y=c)log(pc)

    有了损失函数就可以利用梯度的更新做网络的训练。
      分类任务微调的原理与一般的网络训练没有区别。微调时,如果不固定参数,所有层的参数会更新。你可以选择固定某些层的参数,比如:embedding层。

    五、BERT微调—序列标注任务

      序列标注任务指的是对于待标注的一段序列 x = { x 1 , x 2 , . . . , x n } x=\{x_1, x_2,..., x_n\} x={x1x2...xn},我们需要给每个 x i x_i xi预测一个标签 ( t a g ) y i (tag)y_i (tag)yi,标签 ( t a g ) (tag) (tag)集合是 T = { t 1 , t 2 , . . . , t m } T=\{t_1,t_2,...,t_m\} T={t1,t2,...,tm}。在不同的序列标注任务中对应的标签不一样。

    • 中文分词任务
      定义的标签 ( t a g ) (tag) (tag)集合是 { B e g i n   M i d d l e   E n d   S i n g l e } \{Begin \ Middle\ End\ Single\} {Begin Middle End Single}
      eg:“风险基因协同的神经生物学作用”被分词为
      风险 基因 协同 的 神经 生物学 作用,转化为序列标注任务为:风/B险/E基/B因/E协/B同/E的/s神/B经/E生/B物/M学/E作/B用/E。
    • 命名实体识别:标出句子中的实体;使用BIO标注模式;
      定义的标签 ( t a g ) (tag) (tag)集合是实体类型包括 { P E R , O R G } \{PER,ORG\} {PER,ORG}
      eg:乔/B-PER布/I-PER斯/I-PER 就/O职/O于/O苹/B-ORG 果/I-ORG 公/I-ORG司/I-ORG
    • 词性标注(Part-of-speech, POS tagging):标注出词语的词性;使用BIO标注模式
        BERT序列标注任务微调方法有两种:
    • 方法一:每个token的向量表示经过线性层+softmax
      具体过程为:将BERT模型格式将句子输入到BERT模型当中,然后给出每个词的向量表征,经过线性层+softmax,然后给出每个词的NER标签
      在这里插入图片描述
    • 方法二:BERT+CRF层
      在BERT模型还没有出现以前,解决这个问题的通用方式是’BiLSTM-CRF’模型。CRF层通过学习标签之间转移的模式来规避’B-PER,I-ORG’这样的问题;
      在这里插入图片描述

    六、BERT微调—关系分类任务

      关系分类任务就是从非结构化文本中抽取出结构化知识;具体为:区分出头实体与尾实体之间的语义关系,比如:
    在这里插入图片描述
      关系分类任务最直接的应用是构建知识图谱。
    在这里插入图片描述
      BERT关系分类任务微调方法有三种:

    • 方法一:将句子输入到BERT模型中,然后分别拿到头实体与尾实体的向量表征(实体多个词的表征经过pooling得到),然后将头尾实体向量拼接,再经过线性层分类
      在这里插入图片描述
    • 方法二:BERT的embedding层中加入关系位置编码。在方法一的基础上加上关系位置编码,告诉BERT模型何处为头实体何处为尾实体。
      在这里插入图片描述
    • 方法三:在句子中加入新定义的字符(unusedtoken),标识出头尾实体位置;
      在这里插入图片描述

    七、BERT微调—样本不均衡问题Focal loss

      在自然语言处理应用场景中,经常出现样本不均衡场景的问题,这是因为在自然语言的语料库中,一个单词出现的频率与它在频率表里的排名成反比,即频率越高的单词,出现的次数越多。碰到样本不均衡问题时,需要对训练方法做一定的改变。

    • 方法一:重采样
      假设 C C C是数据集类别数, n n n是类别 i i i的样本数量,则从类别 i i i中采样一个样本的概率:
      instance-balanced sampling:每个样本被等概率的抽到,即
      p i = n i ∑ j = 1 C n j p_i=\frac{n_i}{{\sum_{j=1}^Cn_j}} pi=j=1Cnjni
      Class balanced sampling:每个类别被抽到的概率都相等
      p i = 1 ∑ j = 1 C 1 p_i=\frac{1}{{\sum_{j=1}^C1}} pi=j=1C11
      一般重采样,假设 q ∈ ( 0 , 1 ) q∈(0,1) q(0,1)
      n i q ∑ j = 1 C n j q \frac{n_i^q}{{\sum_{j=1}^Cn_j^q}} j=1Cnjqniq
    • 方法二:重加权(re_weighting):以二分类为例
      正常的交叉熵损失为:
      C E ( P C , X ) = − I ( y = c ) ∗ l o g ( p c ) CE(P_C,X)=-I(y=c)*log(p_c) CE(PC,X)=I(y=c)log(pc)
      通过增加一个系数(添加的系数与难度相关),来控制少数类别的样本对总loss的贡献
      C E ( P C , X ) = − α ( c ) ∗ I ( y = c ) ∗ l o g ( p c ) CE(P_C,X)=-\alpha(c)*I(y=c)*log(p_c) CE(PC,X)=α(c)I(y=c)log(pc)
      Focal loss:
      C E ( P C , X ) = − ( 1 − p c ) γ I ( y = c ) ∗ l o g ( p c ) CE(P_C,X)=-(1-p_c)^{\gamma}I(y=c)*log(p_c) CE(PC,X)=(1pc)γI(y=c)log(pc)
      Focal loss+类别的重加权:
      C E ( P C , X ) = − α ( c ) ( 1 − p c ) γ I ( y = c ) ∗ l o g ( p c ) CE(P_C,X)=-\alpha(c)(1-p_c)^{\gamma}I(y=c)*log(p_c) CE(PC,X)=α(c)(1pc)γI(y=c)log(pc)
      在这里插入图片描述

    如果对您有帮助,麻烦点赞关注,这真的对我很重要!!!如果需要互关,请评论或者私信!
    在这里插入图片描述


    展开全文
  • BERT模型的详细介绍

    万次阅读 多人点赞 2021-04-01 14:49:06
    BERT模型的详细介绍 1.BERT 的基本原理是什么? BERT 来自 Google 的论文Pre-training of Deep Bidirectional Transformers for Language Understanding,BERT 是“Bidirectional Encoder Representations from ...
  • 图解BERT模型:从零开始构建BERT

    万次阅读 多人点赞 2020-06-05 21:07:25
    本文首先介绍BERT模型要做什么,即:模型的输入、输出分别是什么,以及模型的预训练任务是什么;然后,分析模型的内部结构,图解如何将模型的输入一步步地转化为模型输出;最后,我们在多个中/英文、不同规模的数据...
  •   这一节学习BERT模型如何在ner任务上进行微调。项目代码框架如下: 争取做到每一行代码每一行注释!!! 一、项目环境配置 python>=3.6 torch==1.6.0 transformers==3.0.2 seqeval==0.0.12 pytorch-crf==...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 28,268
精华内容 11,307
关键字:

bert模型

友情链接: pb_test.zip