©PaperWeekly 原创 · 作者|李泺秋
学校|浙江大学硕士生
研究方向|自然语言处理、知识图谱
接上篇,记录一下对 HuggingFace 开源的 Transformers 项目代码的理解。
本文基于 Transformers 版本 4.4.2(2021 年 3 月 19 日发布)项目中,pytorch 版的 BERT 相关代码,从代码结构、具体实现与原理,以及使用的角度进行分析,包含以下内容:
1. BERT Tokenization 分词模型(BertTokenizer)
3. 1. BertEmbeddings
2. BertEncoder
3.1. BertLayer
2.1. BertAttention
2.1. BertIntermediate
2. BertOutput
3. BertEmbeddings
4. BertEncoder
3. BERT-based Models应用模型
4. BertForPreTraining
5. 1. BertForSequenceClassification
2. BertForMultiChoice
3. BertForTokenClassification
4. BertForQuestionAnswering
5. BERT训练与优化
6. BERT训练与优化
7. 1. Pre-Training
2. Fine-Tuning
3. 1. AdamW
2. Warmup
BERT-based Models
基于 BERT 的模型都写在/models/bert/modeling_bert.py
里面,包括 BERT 预训练模型和 BERT 分类模型,UML 图如下:
BERT模型一图流(建议保存后放大查看):
▲ 画图工具:Pyreverse
首先,以下所有的模型都是基于BertPreTrainedModel
这一抽象基类的,而后者则基于一个更大的基类PreTrainedModel
。这里我们关注BertPreTrainedModel
的功能:
用于初始化模型权重,同时维护继承自
PreTrainedModel
的一些标记身份或者加载模型时的类变量。
下面,首先从预训练模型开始分析。
3.1 BertForPreTraining
众所周知,BERT 预训练任务包括两个:
Masked Language Model(MLM):在句子中随机用
[MASK]
替换一部分单词,然后将句子传入 BERT 中编码每一个单词的信息,最终用[MASK]
的编码信息预测该位置的正确单词,这一任务旨在训练模型根据上下文理解单词的意思;Next Sentence Prediction(NSP):将句子对 A 和 B 输入 BERT,使用
[CLS]
的编码信息进行预测 B 是否 A 的下一句,这一任务旨在训练模型理解预测句子间的关系。