本项目将追踪最新的预训练语言模型,并进行实际任务的复现和对比。
- ELMo
- BERT
- GPT
- ENRIE
- RoBERTa
- Albert
- XLNet
- T5
- ELECTRA
- 任务描述
- 数据
- 任务描述
- 数据
Embedding from Language Model
ELMo希望得到这样的词向量:1.具有语义和句法信息,2.具有上下文信息。第一点Word2vec和Glove已经解决,ELMo主要解决第二个问题。
其它关注上下文词向量的工作
- context2vec
- CoVe
- 双向语言模型(
biLM)
- 训练目标是同时最大化前向和后向极大似然
其中前向概率和后向概率均使用LSTM建模,前向LSTM和后向LSTM不共享参数。
- ELMo
ELMo输出的词向量是biLM中间层隐藏向量的线性组合,加权系数可训练。
其中$h^{LM}_{k,j}是第j层LSTM第k步的隐藏向量,$$s^{task}$是加权向量,$\gamma^{task}$是缩放因子(原文说类似于layer normalization)
使用无监督语料训练好biLM之后,有如下使用方法。其中biLM既可以采用固定权重的方式也可以采用fine-tuning的方式。
-
直接和输入的词向量进行拼接: $$ X --> (X,ELMO(X)) $$
-
和中间某一层LSTM的输出拼接: $$ LSTM_{task}(X) --> (LSTM_{task}(X),ELMO(X)) $$
代码链接为:https://github.com/allenai/bilm-tf
Bidirectional Encoder Representations from Transformers
- 深层双向语言模型
- 统一的
fine-tuning框架
- GPT是单向语言模型,ELMO是LTR和RTL两个单向语言模型。传统语言模型无法使用深层双向模型。
BERT原文:Unfortunately, standard conditional language models can only be trained left-to-right or right-to-left, since bidirec- tional conditioning would allow each word to in- directly “see itself”, and the model could trivially predict the target word in a multi-layered context.
- ELMO是
feature-based的思路。feature-based式的思路使用预训练模型的输出作为额外特征,需要针对任务设计不同的模型结构。而fine-tuning模式则直接在预训练模型的基础上加入简单的输出层一起训练即可。
BERT遵循pre-training和fine-tuning两阶段模式,fine-tuning阶段模型只是在pre-training阶段模型的基础上加入了输出层。
- 输入
为了统一模型结构,对样本对输入进行拼接。如
(A,B)则处理成[CLS]+A+[SEP]+B。同时输入表示由三部分组成:position embedding,segment embedding和token embedding。
Mask LM
模型主体为多层双向
Transformer。不同于传统语言模型的训练模式,BERT将部分token替换成[MASK]标记,同时预测目标也从Left-to-Right或Right-to-Left模式的依次预测变成了预测[MASK]处的token,避免了前文提到的问题。
[MASK]机制也进行了精心设计。由于fine-tuning阶段输入没有[MASK]标记,为了避免pre-training和fine-tuning两阶段的不一致性,进行如下[MASK]替换:
- 随机选15%的
token进行替换- 选中的
token有如下替换模式:80%替换成[MASK]标志,10%替换成随机token,10%不改变。
NSP(Next Sentence Prediction)
许多重要的下游任务如问答和自然语言检索等需要理解两个句子间的关系,而这部分无法通过语言模型刻画。因此BERT设置了NSP的预训练任务,训练样本也很容易从无监督语料中生成。样本生成模式如下:50%是服从前后关系的句子对,50%将后置句子替换成随机句子。
注:NSP任务取[CLS]标记在最后一层的输出,Mask LM取被替换token对应位置在最后一层的输出。
在fine-tuning阶段主要注意数据格式的整理即可。值得注意的有两点:
- 拼接输入对的意义:拼接后
Transformer会同时建模句子内的上下文信息和句子间的相关信息,和单独建模句子+句子间注意力机制的意义相同。 fine-tuning的时效性:在得到预训练语言模型后,使用fine-tuning来训练下游任务将十分快。




