BERT
论文地址:BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding
提出了一个基于transformer的预训练模型,引领了在大规模数据上预训练深度模型,在下游任务上微调的风潮,其主要贡献在两点
- 引领了预训练模型的风潮
- 特殊的训练机制,实现了”真”双向语言模型
论文结构
明显该论文的工作是基于ELMo和GPT改进,内容组织也是围绕着 前人工作+自己改进+实验效果展开的
摘要 Abstract
提了一下 GPT和ELMo,强调BERT是区别于两者的基于transformer的“真”双向模型,并列举实验效果
介绍 Intro
主要是围绕着直接解决的问题以及相对于前人解决方案的优越性进行阐述
- 首先强调 sentence-level 和 token-level 两种不同类型任务,需要聚焦于不同level的模型
- 又介绍了目前两种主要的预训练应用手段,一是特征提取,用预训练模型做特征提取,输入到下游任务模型;二是微调,预训练模型在下游任务数据上继续训练,微调参数
- 然后列举GPT和ELMo主流预训练模型存在的问题: 局限于语言模型的特性,无法实现真”双向”
- 引出了自己通过MLM+“next sentence prediction”,实现真双向,同时解决sentence level和token level两个问题
自己提出问题,自己解决问题,自圆其说
相关工作 Related Word
从三个方面介绍了预训练相关工作情况,主要还是为了增加自己工作的可信度
bert
- 模型架构
- 输入
- 预训练的两个target
没细讲模型结构,主要强调思路,把有些难懂的细节放在了附录
实验 Experiments
列举了包括GLUE、SQuAD、SWAG四个任务上的微调的效果,验证了bert模型在token-level、sentence-level不同类型任务上的有效性
对比试验 Ablation Studies
通过控制变量实验验证MLM和NSP对于提升模型特征抽取能力是有效的
不同模型深度对于模型效果的影响
bert用于特征抽取时,下游任务的效果(CoNLL-2003 命名实体识别任务的实验)
结论
Our major contribution is further generalizing these findings to deep bidirectional architectures, allowing the same pre-trained model to successfully tackle a broad set of NLP tasks
简单强调了一下自己的主要贡献,即探索了深度双向架构预训练模型在解决一系列NLP任务中的作用。
MLM & NSP
bert通过设计MLM和NSP这两个预训练目标,使得bert既能解决token-level,又能解决sentence-level的一系列NLP任务。
Masked LM
由于语言模型本身约束,为了避免当前词看到未来词,只能训练单向语言模型,或者将两个方向的单向模型拼接在一起近似双向,bert在与训练过程中,将一部分词替换掉,训练模型预测被替换的词
替换掉序列中 15%的 WordPiece token(还得保证替换之后,预训练预料和finetuning语料分布差距不会过大)
- 其中 80% 替换为 [mask]
10% 替换为词表中的任意一个词
- 10% 保持原词不变
在附录中的对比实验中,通过语言模型和NER两个任务效果对比,确定了8:1:1的比率设置
使用替换位置的最后一层隐藏状态,预测原词
will be used to predict the original token with cross entropy loss.
通过Mask LM任务,bert具备了双向特征提取能力(bidirectional)
NSP
为了使得BERT能够具备建模sentence level的任务(例如 QA,自然语言推断),预训练过程中增加 Next Sentence Prediction任务
- 输入两个句子:A和B,其中 50% 训练数据 B为A的next(labeled as IsNext),50%训练数据 A和B随机抽取组合(labeled as NotNext),两句子拼接,中间使用特殊字符 [SEP]分隔
- 两个句子的token长度和小于512
- 使用 [CLS] token最后一层输出做概率预测
The training loss is the sum of the mean masked LM likelihood and the mean next sentence prediction likelihood.
在预训练过程中,两个任务并行训练,训练损失为 平均mask概率 + 平均NSP概率 损失
Embedding
BERT预训练输入词向量包括三个不同Embeddings求和,三种Embeddings层均在训练中得到
- Token Embeddings 词嵌入,首先经过WordPieces模型分词后,在预训练模型中训练词嵌入
- Segment Embeddings 段嵌入,与NSP任务相关,区分两个句子中的token,在预训练模型中训练得到
- Position Embeddings 位置嵌入,也采用了 训练得到,未使用transformer中的正弦周期函数
模型训练参数
- batch size=256, 每个batch的seq_length最长为512,训练了 40 epochs,大约1000000步
- Adam优化器,lr= $1e^{-4}$ ,$\beta_1=0.9$, $\beta_2 = 0.999$ , weight decay $0.01$ ,dropout = 0.1
- 学习率随着训练epoch线性下降
- 使用 gelu实现替代了transformer中的relu函数
特殊的训练trick
由于训练数据token长度分布大部分长度为128,为了加快收敛速度,在与训练过程中分为两阶段
- 首先使用 128作为每个batch的seq_length 训练90%的step
- 再使用 seq_length=256 训练10%的step,用来学习position embedding(没太理解这么做的原因)