预训练语言模型学习笔记

Bert解决长序列问题 架构设计

为了能让机器可以读非常长的序列,Transformer-XL 可以让机器读跨越片段的内容。为了让自注意力的计算复杂度变小,从 O(T²) 变成了 O(TlogT),甚至更低, Reformer 使用了局部敏感性的哈希注意力。为了让自注意力的空间复杂度也变小,从O(T²)变小,Longformer 用注意力模式来稀疏完整的注意力矩阵。

 

预训练语言模型要如何做不同任务呢?(Bert)

如果输入是两个句子,中间用 [SEP] 分隔符分开,输出接一个MLP分类,端到端训练下来就结束了。如果输出是一个类别,有两种做法。一种是直接对 [CLS] 这个 token 的嵌入接 MLP 进行分类。另一种是把所有位置的嵌入接 MLP 进行分类。如果输出是每个位置一个类别,则对非 [CLS] 的 token 各接一个MLP,输出分类。

 

如果输出需要复制部分的输入,比如抽取式机器阅读理解。则输出接两个 MLP,一个输出答案的开始位置,一个输出答案的结尾位置。见下图:

预训练语言模型学习笔记

 

 

 

预训练语言模型要如何进行微调呢?

一种方法是固定住预训练语言模型,让它作为一个特征提取器。训练的时候,只训练下面接的 MLP 的参数。另一种是不固定住预训练语言模型,对整个模型进行训练微调。第二种方法实践中会好很多。

预训练语言模型学习笔记

如果我们现在采取的是对整个模型进行微调,这个模型在不同的任务里面会变得不同。每个任务我们都要存一个巨大的模型,显然是行不通的。所以我们需要一个 Adaptor 的结构,来让我们微调的时候,不是更新整个预训练语言模型的参数,而是只需要更新其中很小一部分的 Adaptor Layer 的参数,就可以获得和更新整个模型参数一样好的效果。这样,我们对不同任务模型储存的时候,就只需要把这一小部分 Adaptor 的参数给储存下来。用的时候,把它放到原版的 BERT 中就可以了。这样就会比每一个任务都要存一个很大的预训练语言模型要小得多。其实模型参数的储存并不是一个大问题。问题是当我们要做集成学习的时候,只储存 Adaptor 的参数会非常方便。见下图:

预训练语言模型学习笔记