NLP基础及其代码-BERT系列
1.基础知识
BERT系列RoBERTa ALBERT ERINE详解与使用学习笔记-腾讯云开发者社区-腾讯云 (tencent.com)
2.BERT
分词:wordpiece
预训练:
mask:选择15%的分词进行mask(80%mask 10%随机替换分词 10%分词保持不变)
NSP:判断前后句子是否连续
3. RoBERTa
Robustly optimized BERT approach
更多的数据
采用动态【MASK】
BERT:对15%的分词进行mask,对于同一文本,在训练过程中mask位置一直保持不变
Roberta:对15%的分词进行mask,对于同一文本,在训练过程中mask的位置会重新挑选
去掉下一句预测的NSP任务
RoBERTa去掉NSP任务
更大的batch_size
BERT的batch_size是256,一共训练了1M步
RoBERTa的batch_size是8k
4. ALBERT
A Lite BERT
大家常说刷榜的ALBERT,其实是xxlarge版本,普通的large版本性能是比BERT的large版本要差的
矩阵分解
通过一个矩阵分解去代替本来的embedding矩阵
参数共享
12层的attention层和全连接层层共享参数
全共享(attention层和全连接层都共享)是比单纯共享attention层的效果要差的,但是全共享d减少的参数实在太多了,所以作者采用的为全共享
SOP代替NSP
将负样本换成了同一篇文章中的两个逆序的句子
n-gram MASK
根据公式取1-gram、2-gram、3-gram的概率分别为6/11,3/11,2/11。越长概率越小
5.ERINE 1.0
Knowledge Integration
把MASK分成三部分
Basic-level Masking:与BERT一样
Entity-level Masking:把实体作为一个整体MASK,例如J.K.Rowling这个词作为一个实体,被一起【MASK】
Phrase-Level Masking:把短语作为一个整体MASK,如a series of作为一个短语整体,被一起【MASK】
Dialogue Language Model(DLM)
增加了对话数据的任务,多轮问答的数据,即可以是QQR、QRQ等等
把里面的单token、实体、短语【MASK】掉,然后预测它们
在生成数据的时,有一定几率用另外的句子替代里面的问题和答案,预测是否是真实的问答对
6.ERINE 2.0
连续多任务学习
策略一,Multi-task Learning,就是让模型同时学这3个任务,具体的让这3个任务的损失函数权重相加,然后一起反向传播
策略二,先训练任务1,再训练任务2,再训练任务3,这种策略的缺点是容易遗忘前面任务的训练结果,如最后训练出的模型容易对任务3过拟合
策略三:连续多任务学习,即第一轮的时候,先训练任务1,但不完全让他收敛训练完,第二轮,一起训练任务1和任务2,同样不让模型收敛完,第三轮,一起训练三个任务,直到模型收敛完
多任务学习,模型输入的时候额外多了一个Task embedding
词法级别
Knowledge Masking Task:把一些字、短语、实体【MASK】掉,预测【MASK】词语。
Capitalization Prediction Task:预测单词是大写还是小写,大写出现在实体识别等,小写可用于其他任务。
Token-Document Relation Prediction Task:在段落A中出现的token,是否在文档的段落B中出现。
语言结构级别
Sentence Reordering Task:把文档中的句子打乱,识别正确顺序。
Sentence Distance Task:分类句子间的距离(0:相连的句子,1:同一文档中不相连的句子,2:两篇文档间的句子)
语句级别
Discourse Relation Task:计算两句间的语义和修辞关系。
IR Relevance Task:短文本信息检索关系,搜索数据(0:搜索并点击,1:搜素并展现,2:无关)
7.ELECTRA
Efficiently Learning an Encoder that Classifies Token Replacements Auucrately
Generator-Discriminator的架构
对一句话里面的token进行随机的【MASK】,然后训练一个生成器,对【MASK】掉的token进行预测,通常生成器不需要很大(原因在后面的实验部分有论证),生成器对【MASK】掉的token预测完后,得到一句新的话,然后输入判别器,判别器判断每个token,是否是原样本的,还是被替换过的。
权重共享
生成器和判别器的embedding参数共享,而且生成器input层和output层的embedding参数共享(想想为什么可以这样?因为生成器最后是一个全词表的分类,所以可以跟输入时embedding矩阵的维度一致,而判别器最后是一个二分类,所以不能共享输入时的embedding矩阵),其他参数不共享
8.XLNET
[1906.08237] XLNet: Generalized Autoregressive Pretraining for Language Understanding (arxiv.org)
PLM
Permutation Language Modeling
XLNet理解_xlnet模型是现有现有的语言模型(language model)中的( )类型-CSDN博客
预训练模型-XLNet - 知乎 (zhihu.com)
XLNet 详解(看不懂你来骂我)-CSDN博客
XLNet的基本做法是:对于输入序列[x1,x2,x3,x4],假设预测的单词为x3,位置在Position3。怎么在Position1和Position2的位置时看到Position4的信息呢?对序列中的4个单词进行随机排列,得到如图所示的4中示例情况。如果将[x2,x4,x3,x1]、[x1,x4,x2,x3]、[x4,x3,x1,x2]这3种排列作为模型的输入,那么x3就可以同时看到上文和下文的信息
把一部分预测词下文的单词排列在预测词的上文位置中,就同时看到了上文和下文的信息,但是形式上仍然是从左到右预测一个单词
令长度为T的序列为[1,2,…,T],ZT表示可能的排列序列,zt为第t个元素, z<t 表示排列 z∈ZT 的前 t−1 个元素
Two-Stream Self-Attention
最通俗易懂的XLNET详解-CSDN博客
表示由模型计算得到的上文表示, 是模型的参数,表示在时间步 t 之前的输入数据,是输入x的嵌入表示。
h只包含内容,g包含位置
content representation
不包含位置信息,包含上下文和自身的信息
query representation
包含位置信息,只包含上下文信息,不包含自身的信息
最后我们看下总的计算过程,首先,第一层的查询流是随机初始化了一个向量即,内容流是采用的词向量即,self-attention的计算过程中两个流的网络权重是共享的,最后在微调阶段,只需要简单的把query stream移除,只采用content stream即可。
集成Transformer-XL
片段循环机制
有一个长度为1000的序列,如果我们设置transformer的最大序列长度是100,那么这个1000长度的序列需要计算十次,并且每一次的计算都没法考虑到每一个段之间的关系,如果采用transformer-xl,首先取第一个段进行计算,然后把得到的结果的隐藏层的值进行缓存,第二个段计算的过程中,把缓存的值拼接起来再进行计算。该机制不但能保留长依赖关系还能加快训练,因为每一个前置片段都保留了下来,不需要再重新计算,在transformer-xl的论文中,经过试验其速度比transformer快了1800倍。
相对位置编码
在BERT等传统的Transformer模型中,位置编码是绝对的,即每个位置都有一个固定的编码,这个编码是基于其绝对位置的。对于序列中的每个单词,绝对位置编码提供了该单词在序列中的唯一标识。
这种编码方式在处理较长的序列时会遇到问题,尤其是在序列被拆分成片段时,因为绝对位置编码无法明确区分不同片段中的相同位置。
相对位置编码解决了绝对位置编码的局限性。它关注的是位置之间的相对关系而不是绝对位置。这使得模型能够更好地处理长序列和片段。
在Transformer-XL等模型中,引入了相对位置编码来捕捉序列中元素之间的相对距离,这样即使序列被拆分成多个片段,模型仍然能够保持对相对位置的感知。
-
位置编码的计算:
- 给定两个位置 i 和 j,相对位置编码被表示为 sij。
- 如果 i 和 j 属于同一个片段,则相对位置编码为 sij=s+。
- 如果 i 和 j 不在同一个片段里,则相对位置编码为 sij=s−,其中 s+ 和 s− 是在训练过程中学习得到的编码。
-
计算注意力权重:
-
在传统的Transformer中,注意力权重的计算公式是:
其中 Q 是查询矩阵,K是键矩阵,V 是值矩阵,d是嵌入维度。
-
引入相对位置编码后,计算方式有所调整。首先计算相对位置编码与查询向量的内积:
其中 qi 是位置 i 的查询向量,b是一个需要训练的偏置量,Ssj 是相对位置编码。
-
然后,将相对位置编码计算结果 aij与传统注意力权重的计算结果相加,得到最终的注意力权重。
-
xlnet:XLNet: Generalized Autoregressive Pretraining for Language Understanding - GitCode