BERT知识点

1.介绍BERT

在这里插入图片描述
 BERT是一种预训练语言模型,是基于Transformer encoder的双向编码器,本质是一个denoised auto encoding(去噪自动编码)模型,它能基于上下文得到文本的表示。它是一个两阶段模型,即预训练-微调。预训练任务包括MLM(掩码语言模型)和NSP。对于下游任务,只需要额外增加一些结构,并对模型进行微调。
 
 

2.为什么需要CLS

 因为CLS token无明显语义,可以作为整句话的语义表示,从而用于下游任务。
 
 

3.BERT有几种输出

 BERT有二种输出:
 一种是get_pooled_out(),就是上述[CLS]的表示,输出shape是[batch size,hidden size]。它是将cls取出后过一个pooler层(输入是768,输出也是768,激活函数是tanh的全连接层)。
 一种是get_sequence_out(),获取的是整个句子所有token的向量表示,输出shape是[batch_size, seq_length, hidden_size],这里也包括[CLS]。
 
 

4.在BERT的MLM任务中,token分3种情况做mask,分别的作用是什么?

  在 BERT 的 Masked LM 训练任务中, 会对语料中 15% 的词进行mask,在这15%被mask的词中:
  80%的token被替换为 [MASK]。意义:在不泄露label的情况下,通过被mask的单词的上下文,预测该单词,训练模型和词向量。问题:下游任务中不会出现 [MASK],导致预训练和微调不一致
  10% 的 token会称替换为随机的 token。意义:减弱了预训练和微调不一致给模型带来的影响。同时让模型知道,当单词不是[MASK]标记时,仍然需要输出,就迫使模型尽量在每一个token(即使该词不是mask)上都学习基于上下文的表示,这也是解决一词多义的关键。问题:模型可能会认为要预测的词永远不会是该位置原本的词。
  10% 的 tokens 会保持不变但需要被预测。意义:让模型知道要预测的词有可能是该位置原本的词,而不是永远都是随机单词。
  如果没有mask,直接用交叉熵损失的训练数据预测输入序列的每个单词,学习任务是微不足道的。该网络事先知道它需要预测什么,因此它可以很容易地学习权值。(知道输入什么词,还要预测该词)
 
 

5.BERT中的NSP任务

  每个样本都是由两句话构成。正样本:句子2是句子1的下一句;负样本:句子2不是句子1的下一句,句子2为语料中的其他随机句子。在样本集合中,两种情况的样本占比均为50%。改进的SOP任务中,正样本是正常的前后两个句子,负样本是将正样本的两个句子颠倒顺序。
 
 

6.BERT中的前馈层

  前馈层由两层全连接层构成,第一层全连接层的W的维度为[768,3072],bias的维度为[3072],输出再经过GeLU激活函数;第二层的全连接层的W的维度为[3072,768],bias的维度为[768]。
 
 

7.BERT中的优化器

  BERT中的AdamW(挨登W)类似Adam优化器加上L2正则,但加L2正则的位置不一样,AdamW选择将L2正则项加在了Adam的m、v等参数被计算完之后、在与学习率lr相乘之前;Adam+L2的L2正则项加在参数的梯度上(增大梯度,让参数变得更小)。所以这也表明了weight_decay和L2正则虽目的一致、公式一致,但用法还是不同,二者有着明显的差别。
在这里插入图片描述λ 即为权重衰减因子,常见的设置为 0.005/0.01。
AdamW就是Adam优化器加上L2正则,来限制参数值不可太大
 
 

8.针对各种下游任务,BERT怎么做fine-tuning?

  句子是否相似(双句):将CLS的输出,接线性层后,softmax做分类
  多标签分类(单句):同上
  机器翻译:生成式任务似乎不合适。BERT主要是提供基于上下文的句子表示,这对于各种NLP任务都应该有用。 应该用GPT做生成任务
  阅读理解:在微调期间引入一个起始向量S(768,)和一个结束向量E(768,).(输入是[CLS]question[SEP]paragraph[SEP])
token i 作为答案范围开始和结束的概率计算为 token i (768,)和S(768,)、E(768,)之间的点积/其他所有token和S、E之间的点积。从位置 i 到位置 j 的候选跨度的得分定义为 S·Token i + E·Token j
 
 

9.BERT非线性的来源在哪里?

  1. 四处dropout。1.BERT输入是三种嵌入的相加,相加之后会做layernorm以及dropout(进block前);2.在计算注意力分数时,softmax后会dropout(自注意力层);3.对自注意力层的输出(自注意力层);4.对前馈层的输出(前馈层)
  2. 前馈层的GeLU激活函数
 
 

10.BERT是如何区分一词多义的?

  同一个词在转换为BERT的输入之后,embedding的向量是一样,但是通过BERT中的多层transformer encoder之后,关注不同的上下文,就会导致不同句子输入到BERT之后,相同字输出的字向量是不同的,这样就解决了一词多义的问题。
 
 

11.为什么要用WordPiece进行token化

  通过将词拆分,可以处理OOV问题,BERT_base在处理英文文本的时候仅需要存储30,522 个词。
 
 

12.BERT的分词过程

  1. 读取文本中的一行,将文本转化成unicode编码(假设输入是utf-8)并去掉开头和结尾的空格
  2. 使用basic_tokenizer,根据空格等进行分词,包括unicode变化,移除’\t’制表符和空白字符,对中文字符按字分开。在原版的BERT中,要将大写转为小写。
  3. 使用WordpieceTokenizer。即使用贪婪的最长匹配优先算法,根据词表进行分词。
 
 

13.BERT中的词表是怎么来的

  Wordpiece算法构建的,BERT也用该算法进行分词,WordPiece算法可以看作是BPE的变种。不同点在于,WordPiece基于概率生成新的subword而不是最高频字节对。
 
 

14.BERT序列长度为什么是512

  因为BERT使用的是训练式的固定位置编码。
如果你使用的是谷歌开源的预训练模型,那么这个序列长度将会被限制在512(无论base还是large),预训练时token序列最长就是512(训练出来的位置向量就512个),多的会被截断(如果自己继续调,去掉截断,效果可能会很差,并且可能无法运行(比512多的位置向量取不到??))。
  要突破这个限制,那就拿更长的句子重新预训练,并设置更多的位置向量。
 
 

15.BERT遇到更长的句子如何解决

  1. 直接截断。从长文本中截取一部分,具体截取哪些片段需要观察数据,如新闻数据一般第一段比较重要就可以截取前边部分;
  2. 抽取重要片段。抽取长文本的关键句子作为摘要,然后进入BERT。
  3. transformer-xl 等模型
 
 

16.BERT和Transformer encoder的差异有哪些?

  1. token种类不同,BERT增加了特殊的token(CLS, SEP)
  2. 位置编码不同,Transformer中的position embedding由 sin/cos 函数交替生成的固定的值。而BERT中是初始化后,可以训练的。
  3. 输入不同,BERT多了segment embedding
 
 

17.BERT的优点

  1. 相较于之前的ELMo,Elmo看似用了两端信息,但是也是分别学习再拼接的,这限制了与训练模型的表达能力,而bert真正的学到了bidirectional的信息。此外Transformer的提取特征能力强于双向LSTM。
  2. BERT加入了Next Sentence Prediction来和Masked-LM一起做联合训练,可以获取比词更高级别的句子级别的语义表征。
  3. BERT 模型是将预训练模型和下游任务模型结合在一起的,也就是说在做下游任务时仍然是用BERT模型,不需要对模型做修改。
  4. 较小的微调成本。
 
 

18.BERT的缺点

  1. 因为BERT用于下游任务微调时, MASK标记不会出现,它只出现在预训练任务中。这就造成了预训练和微调之间的不匹配,只将80%的词替换为[mask],但这也只是缓解、不能解决。
  2. 相较于传统语言模型,BERT的每批次训练数据中只有15%的标记被预测,这导致模型需要更多的训练步骤来收敛。
  3. 可能只对完整词一部分进行mask。为了解决OOV的问题,我们通常会把一个词切分成更细粒度的WordPiece。BERT在预训练的时候是随机Mask这些WordPiece的,这就可能出现只Mask一个词的一部分的情况。这样的话,模型会更依靠语法和专用词的组合进行预测而不是上下文语义,会让预测变得容易。比如颐和园,mask和字
  4. NSP任务过于简单,取另一个文章的句子作为第二句,只需要分清主题即可,而不需要知道语义,对模型训练帮助不大。
5.静态MASK问题。BERT的MASK方式为静态MASK,即15%的token一旦选择就不再改变,也就是说一开始随机选择了15%的token进行MASK处理,在接下来的N个epoch阶段中不再改变(以后的轮次一直预测这些MASK)。
  6. BERT是基于自编码的语言模型,在生成方面的NLP任务上表现效果不是很好。
 
 

19.针对BERT缺陷的改进

  1. 针对可能只对完整词一部分进行mask的问题,使用全词掩码把完整词mask或是类似spanBERT把一整段token都mask。Google原版的全词掩码直接将word和属于它的##xxx一起mask。
  2. 针对NSP任务过于简单的问题,使用SOP预训练任务。
  3. 针对静态MASK的问题,RoBERTa中对BERT的静态MASK方法进行改进,使用动态MASK,即每个epoch动态选取被MASK的Tokens。BERT在预处理阶段就进行了MASK处理。
 
 

20.为什么transformer用LayerNorm而不用BatchNorm

  1. 每个批次内句子的长度要一致,对于短的句子要进行padding,padding到该批次中最长句子的长度,导致有些嵌入是没有意义的。不应该让padding的内容影响到这一维度的分布。
  2. layernorm抹掉了不同token间的分布差异,但是保留了一个token内不同特征之间的差异。nlp关注的是一个一个的token,自然不同token间的分布相同好。
 
 

21.BERT做二分类,全连接层后,接sigmoid还是softmax?

  Bert输出层需要通过一个nn.Linear()全连接层压缩至2维,然后接Softmax(Pytorch的做法,就是直接接上torch.nn.CrossEntropyLoss)

  • 0
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
知识图谱BERT源码是指实现了BERT模型的代码。BERT(Bidirectional Encoder Representations from Transformers)是由Google研究团队开发的一种自然语言处理模型。它基于Transformer架构,具有双向编码能力,能够更好地理解和表达句子的语义。 知识图谱BERT源码的主要作用是实现BERT模型的训练和预测功能。通过预训练数据和任务特定数据的训练,BERT模型能够提取出句子中的语义信息,并生成句子的表示向量。这些表示向量可以用于各种自然语言处理任务,如文本分类、命名实体识别和句子相似度计算等。 知识图谱BERT源码的实现通常基于深度学习框架,如TensorFlow或PyTorch。它主要包括模型的网络结构定义、损失函数的定义以及训练和预测的代码逻辑。在训练阶段,源码会加载预训练的BERT模型参数,并根据具体的任务数据进行微调。在预测阶段,源码会根据输入的文本,通过前向传播得到句子的表示向量,并根据具体任务的需求,进行相应的后续处理。 知识图谱BERT源码的使用需要一定的编程知识和对深度学习的理解。使用者可以根据自身的需求进行源码的修改和扩展,以适应不同的任务和数据。此外,为了获得更好的性能和效果,使用者还需要对模型的超参数进行调优,如学习率、批量大小等。 总之,知识图谱BERT源码是实现BERT模型的代码,它可以用于训练和预测自然语言处理任务,帮助我们更好地理解和处理文本数据。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值