1 BERT

双向的Transformer预训练语言模型,使用fine-tuning用于下游任务(用于下游任务的策略有两种,基于特征和微调)。主要是用Masked LM实现双向自编码,摒弃先前的自回归方式(自左向右或自右向左预测下一个单词,无法同时利用上下文信息),实现了上下文信息的利用。

BERT输入

输入格式:[cls] Text-A [SEP] Text-B [SEP]
(源码有自动处理的过程)
对于每一个token,它的输入表示为Token Embeddings+Segment Emdeddings+Position Embeddings。
自然语言理解系列论文笔记
图1 BERT输入表示

预训练

BERT预训练中使用的两大方法为:Mask LM和Next Sentence Prediction。Mask LM为最为重要的贡献。

Masked LM

如图2左图所示,Masked LM用于与训练过程中,Masked LM也是一些文献中的Cloze task–完形任务。

  • 随机mask每个句子的15%
  • 对于选择的15%的token,每个token:
    80% 被替换为[token]
    10% 替换为一个随机的token (增加了泛化能力)
    10% 不改变 (缓解预训练与微调的不匹配)

自然语言理解系列论文笔记
图2 BERT预训练和微调

Next Sentence Prediction

该文章认为,例如QA、NLI任务是基于对两个句子关系的理解,故预训练了一个二分类,判断句子B是不是句子A的下一句。
用于预测的句子表示使用[CLS]经过Transformer的深度encoding的最后一个隐藏状态。为什么使用[CLS]代表整个句子的表示?
个人理解:[CLS]本身没有语义信息,只是为句子的开头,并且在预训练时不会被mask,[CLS]面向整个序列的做 attention,[CLS]的输出足够表达整个句子的信息;而每个token 对应的 embedding 更关注该 token 的语义语法及上下文信息表达。

Fine-tuning

如图2右图为Fine-tuning过程,该过程中不再使用Masked LM,也就是上面提到的和预训练不匹配。
其输出,token representations用于token-level的下游任务,[CLS] representation 用于分类。

Bert使用

附上链接:https://cloud.tencent.com/developer/article/1461418
这里说明一下,对于bert-as-service方式,若以以下两种服务器启动方式:

  1. 命令bert-serving-start -model_dir filrpath -num_worker=1
  2. 命令bert-serving-start -pooling_strategy None -model_dir filrpath -num_worker=1

from bert_serving.client import BertClient
bc = BertClient()
bc.encode([“今天天气真好”])

上述编码会分别生成一下维度的表示:

  1. 1*768 [CLS]的representation 即句子的向量表示;
  2. 25*768 所有token的representation,当然,这里token的representation也是具有上下文语义信息的。

相关文章:

  • 2021-09-06
  • 2022-12-23
  • 2022-12-23
  • 2021-11-08
  • 2021-08-11
  • 2022-12-23
  • 2021-10-06
  • 2021-12-04
猜你喜欢
  • 2021-10-01
  • 2021-12-29
  • 2021-09-28
  • 2021-09-11
  • 2021-11-05
  • 2021-10-17
  • 2021-07-03
相关资源
相似解决方案