> For the complete documentation index, see [llms.txt](https://kerasnoone.gitbook.io/garnet/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://kerasnoone.gitbook.io/garnet/shen-jing-wang-luo/yu-xun-lian-mo-xing/yu-xun-lian-guo-cheng-de-duo-zhong-ren-wu.md).

# 预训练过程的多种任务

## 分类任务

### NSP

NSP(Next Sentence Prediction)任务是给定两个句子A和B, 判断这句子B是否是句子A紧邻的下一句. NSP任务是BERT预训练的标准任务, NSP的loss为BCE.

#### 训练语料

在预训练BERT时, 每个输入样本都是由两个句子组成的, 在组织训练样本时, 选定一个A, 以50%的概率选取语料中下一个句子作为B, 以50%的概率在语料中随机选取一个句子作为B.

#### 问题

训练NSP任务的目的是加强模型理解句子间的关系信息, 弥补语言模型能力的缺失. 但相比于BERT中另一个任务, MLM(Masked Language Model), NSP任务可以说太简单了, 在训练过程中经过`1~2`个epoch之后分类的准确率就能达到`98%~99%`.

因此在后续的模型中, 如RoBERTa, ALBERT等, 去掉了NSP任务, 或者使用其他的任务来代替NSP.

### DLM

DLM(Dialogue Language Model)在ERNIE 1.0 (Baidu)中部分代替NSP任务. ERNIE的预训练语料中有多轮对话的语料(百度贴吧语料), 对于这部分语料, 除了训练MLM模型(当然与BERT相比, mask的策略不同), 还会将3个句子拼接在一起, DLM任务就是判断这个组合代表的多轮对话是真实的还是伪造的.

#### 训练语料

ERNIE将3个句子组合成`[CLS]S1[SEP]S2[SEP]S3[SEP]`来表示多轮对话. 输入除了`token embedding`和`position embedding`, 还使用了`dialogue embedding`. `dialogue embedding`的输入只有`Q`和`R`两种, 分别代表**提问**和**回答**, 因此与`segment embedding`是一致的.

3个句子组成的多轮对话可以是`QRQ`, `QRR`, `QQR`等形式, 在组织负样本时, 随机替换R.

![](https://1942165044-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MI7KRyeBH5dlW-CkUtn%2Fsync%2F94ef0427621f499ecdf7c248a907e02923dd458f.jpg?generation=1622027486215160\&alt=media)

### SOP

SOP(Sentence Order Prediction)是ALBERT中使用的用来代替NSP的任务. 在使用了该损失函数后, ALBERT能显著提升下游多**句子编码**任务的性能.

分析BERT中的NSP任务, 预测是否是下一句的任务实际上是将**主题预测**和**连贯性预测**结合到单个任务中, 这是由于它构造正负样本的方法决定的. 构造负样本时, 基本是使用不同文档的两个句子搭配在一起进行判断, 但不同文档的topic不同, 很容易就能预测出来不相关. 主题预测比连贯性预测简单得多, 且与MLM学习到的语言模型信息是有重合的.

ALBERT认为, 句间建模在语言理解中是非常重要的, 因此提出了判断**语言连贯性**的任务和对应的损失函数. 语言连贯与否的情况是复杂的, 因此任务难度较高, 避免了NSP过于简单的情况.

在构造训练样本时, 将同一文档内的两个正向顺序的连续的segments作为正样本, 将这两个segments位置交换作为负样本. 由于两个segments出自同一个文档, 因此消除掉了主题预测的内容. 计算Inter-sentence coherence loss, 其实也是BCE, 只是换了个名字, 相当于只是换了一种正负样本的采样方式.

## 语言模型任务

### MLM

MLM(Masked Language Model)任务是一种无监督任务, 是将句子中某些片段在输入时Mask掉, 然后使用它的上下文预测出它自己. MLM克服传统单向语言模型的缺陷, 结合了双向的信息.

原始的BERT模型使用的是**静态Mask**机制. 随机遮盖或替换一句话里面任意token, 随机把一句话中15%的token替换成以下内容:

* 80%的概率被替换成`[MASK]`
* 10%的概率被替换成随机的另外一个token
* 10%的概率不做任何操作

然后对这15%的内容进行预测, 计算预测结果和真实值的差距作为loss. 每个被标记的位置都会做一个softmax, 类别的数目是词表的大小, 计算softmax cross entropy得到每个标记位置的损失, 将所有样本所有标记位置的值汇总在一起, 得到MLM任务的损失.

原始的BERT在中文里, 以字为粒度进行Mask. 后续又有如WWM等优化的Mask方法, 更多Mask方法可以参考: [预训练过程的Mask机制](/garnet/shen-jing-wang-luo/yu-xun-lian-mo-xing/yu-xun-lian-guo-cheng-de-mask-ji-zhi.md). 但无论如何Mask, MLM的损失计算方法是不变的.
