前言
“授之以鱼不如授之以渔”,网上很多大佬已经对《BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding》这一论文进行解读,也解读的很细致。我重新再读这篇论文的时候,记录一些我自己可能遗漏的小细节。
BERT两阶段
Pre-training
和Fine-Tuning
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Nv0adLuS-1680858958693)(D:\Desktop\论文学习\Bert_1.png)]
符号 | 含义 |
---|---|
[CLS] | 一个添加在每个输入示例前面的特殊符号,对应Transformer输出的分类结,分类标记 |
[SEP] | 一个特殊的分隔符(例如分隔问题/答案),句子间隔标记 |
符号 | 含义 |
---|---|
E E E | 输入嵌入(Input Embedding ) |
C C C | [CLS] 的最终隐藏向量表示(预测B是否为A的下一句) |
T i T_i Ti | 第 i i i个的最终输入隐藏向量表示 |
L L L | Transformer blocks 层数(The number of layers ) |
H H H | 隐藏层大小(Hidden size ) |
A A A | 自注意力数(The number of self-attention heads ) |
B E R T B A S E BERT_{BASE} BERTBASE L = 12 , H = 768 , A = 12 , 总参数 = 110 M L=12,H=768,A=12,总参数=110M L=12,H=768,A=12,总参数=110M
B E R T L A R G E BERT_{LARGE} BERTLARGE L = 24 , H = 1024 , A = 16 , 总参数 = 340 M L=24,H=1024,A=16,总参数=340M L=24,H=1024,A=16,总参数=340M
Pre-training两任务
MLM
和NSP
皆为非监督任务
-
MLM
(Masked LM
) C l o z e − t a s k Cloze-task Cloze−task 完形填空若是标准模型,通过双向,会看到他自己,没有意义。所以采用多层深度双向表示,随机屏蔽
缺点是我们正在创建预训练和微调之间的不匹配,因为[MASK]令牌在微调期间不会出现。为了减轻这个问题,不总是用[MASK]来代替被遮蔽的词。
随机选择的15%
的[MASK]词组成部分:
-)80%
是[MASK],被替换成[MASK]标记
-)10%
随机选择,替换成另一个单词
-)10%
保持不变。
BERT的mask方式:在选择mask的15%的词当中,80%情况下使用mask掉这个词,10%情况下采用一个任意词替换,剩余10%情况下保持原词汇不变。
优点:
1)被随机选择15%的词当中以10%的概率用任意词替换去预测正确的词,相当于文本纠错任务,为BERT模型赋予了一定的文本纠错能力;2)被随机选择15%的词当中以10%的概率保持不变,缓解了finetune时候与预训练时候输入不匹配的问题(预训练时候输入句子当中有mask,而finetune时候输入是完整无缺的句子,即为输入不匹配问题)。
缺点:针对有两个及两个以上连续字组成的词,随机mask字割裂了连续字之间的相关性,使模型不太容易学习到词的语义信息。主要针对这一短板,因此google此后发表了BERT-WWM,国内的哈工大联合讯飞发表了中文版的BERT-WWM。
-
NSP
(Next Sentence Prediction
)
用于下游任务理解句子之间的关系,Question Answering (QA)
和Natural Language Inference (NLI)
二分类预测,为每个训练前的例子选择句子A和B时,50%的B是A后面的实际下一个句子(标记为IsNext
), 50%的B是语料库中的随机句子(标记为NotNext
)。训练语言模型时,选择两个句子,一种是选择语料中真正顺序相连的两个句子;另外一种是第二个句子从语料库中抛色子,随机选择一个拼到第一个句子后面
C C C 用于下一个句子预测(预测B是否为A的下一句), C C C在
NSP
精度可达97%~98%
Input三向量
Token Embedding
(词向量)+ Segment Embedding
(句向量)+ Position Embedding
(位置向量)
- BERT的
tokenize
实际使用的是WordPiece作为最小的处理单元:token,而不是使用单词本身 - 判断两个句子是否相邻这个任务在后来的研究中逐渐被淡化了,比如roberta模型在被提出的时候就不再使用该任务进行预训练了。
Pre-training Data
预训练语料库,使用了BooksCorpus(800M words)
和English Wikipedia(2500M words)
对于Wikipedia
只提取文本段落,忽略列表、表和标题。为了提取长连续序列,使用文档级语料库而不是打乱句子级语料库。
参数共享:word embedding 和 masked language model 的预测权重在初始化过程中都是共享
Fine-Tuning Bert(11任务)
BERT 使用了自我注意机制编码,包含了两个句子之间的双向交叉注意力。微调成本较低。
- GLUE(
The General Language Understanding Evaluation
)多任务的自然语言理解基准和分析平台 SQuAD v1.1
(The Stanford Question Answering Dataset
)斯坦福问答数据集(100K
)SQuAD v2.0
SWAG
(The Situations With Adversarial Generations
)基础常识句子数据(113K
)
GLUE(The General Language Understanding Evaluation
):多任务的自然语言理解基准和分析平台,包含九项NLU
任务,语言均为英语
简称 | 全称 | 目标 |
---|---|---|
MNLI | Multi-Genre Natural Language Inference ,多类型自然语言推理数据库 | 三分类任务,给定一对句子,目标是预测第二个句子相对于第一个句子是蕴含的、矛盾的还是中立的【句子对,一个前提,一个是假设。前提和假设的关系有三种情况:蕴含(entailment),矛盾(contradiction),中立(neutral)】 |
QQP | Quora Question Pairs) ,Quora ,问题对数集 | 二分类任务,目标是确定Quora 上的两个(一对)问题在语义上是否相等(等效、不等效两种情况) |
QNLI | Qusetion-answering Natural Language Inference ,问答自然语言推断(从SQuAD 1.0 转换而来) | 二分类任务,正例是(疑问句、句子)对,其中包含正确答案,反例是来自同一段落的(疑问句),其中不包含答案(判断问题(question)和句子(sentence,维基百科段落中的一句)是否蕴含) |
SST-2 | The Stanford Sentiment Treebank ,斯坦福情感树库 | 二分类任务(单句),从电影评论中提取的句子,以及情感注释。情感分类,正面情感和负面情感二分类 |
CoLA | The Corpus of Linguistic Acceptability | 二分类任务(单句),语言可接受性语料库,目标是预测英语句子在语言上是否“可接受”(合乎语法与不合乎语法二分类) |
STS-B | The Semantic Textual Similarity Benchmark ,语义文本相似性基准测试 | 回归任务,从新闻标题和其他来源提取的句子对的集合,语义相似性分数,从1~5(预测为1-5之间的相似性得分的浮点数) |
MRPC | Microsoft Research Paraphrase Corpus ,微软研究院释义语料库 | 二分类任务,从网上新闻提取的句子对,并且有注释这两个句子对在语义上是否一样(是否释义二分类,是释义,不是释义两类) |
RTE | Recognizing Textual Entailment ,识别文本蕴含数据集 | 二分类任务,判断句子对是否蕴含,句子1和句子2是否互为蕴含 |
WNLI | Winograd NLI ,Winograd自然语言推断 | 二分类任务,小的NLI 数据集,判断句子对是否相关,蕴含和不蕴含 |
总结
BERT论文中的小细节,你是否再重读论文的时候,再次去get到这些技能点呢?
2阶段 + 2任务 + 3向量 + 11任务
以上是我个人在学习过程中的记录所学,希望对正在一起学习的小伙伴有所帮助!!!
如果对你有帮助,希望你能一键三连【关注、点赞、收藏】!!!
TODO
关于其中的BERT中用到的分词器WordPiece
,篇幅较大,下一篇文章将着重进行讲述子词分词器
已完成
NLP–BPE、WordPiece、ULM、SentencePiece子词分词器总结【原理】
参考链接
https://mp.weixin.qq.com/s/gK5dLdomR4eHgCEfmjzRmQ
https://mp.weixin.qq.com/s/cDG7DwHFL1kHErwyYGT4UA
https://github.com/datawhalechina/learn-nlp-with-transformers