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方式,若以以下两种服务器启动方式:
- 命令bert-serving-start -model_dir filrpath -num_worker=1
- 命令bert-serving-start -pooling_strategy None -model_dir filrpath -num_worker=1
from bert_serving.client import BertClient
bc = BertClient()
bc.encode([“今天天气真好”])
上述编码会分别生成一下维度的表示:
- 1*768 [CLS]的representation 即句子的向量表示;
- 25*768 所有token的representation,当然,这里token的representation也是具有上下文语义信息的。