深度学习笔记之RoBERTa
- 引言
- 回顾:BERT的预训练策略
- RoBERTa训练过程分析
- 静态掩码与动态掩码的比较
- 模型输入模式与下一句预测
- 使用大批量进行训练
- 使用Byte-pair Encoding作为子词词元化算法
- 更大的数据集和更多的训练步骤
- RoBERTa配置
引言
本节将介绍一种基于 BERT \text{BERT} BERT改进优化的预训练方法—— RoBERTa \text{RoBERTa} RoBERTa。
回顾:BERT的预训练策略
BERT \text{BERT} BERT的预训练策略包含两个:
-
掩码语言模型训练 ( Masked Language Model,MLM ) (\text{Masked Language Model,MLM}) (Masked Language Model,MLM):将句子中一部分词语进行掩码标记,即使用 [ MASK ] [\text{MASK}] [MASK]对被掩码的词语进行替换。并将掩码部分的长度控制在总句子长度的 15 15 15%。对于一个已被预期处理的示例句子:
[ [ CLS ] , P a r i s , i s , a , b e a u t i f u l , c i t y , [ SEP ] , I , l o v e , P a r i s ] [[\text{CLS}],Paris,is,a,beautiful,city,[\text{SEP}],I,love,Paris] [[CLS],Paris,is,a,beautiful,city,[SEP],I,love,Paris]
掩码标记后的结果示例为:
[ [ CLS ] , P a r i s , i s , a , [ MASK ] , c i t y , [ SEP ] , I , l o v e , [ MASK ] ] [[\text{CLS}],Paris,is,a,[\text{MASK}],city,[\text{SEP}],I,love,[\text{MASK}]] [[CLS],Paris,is,a,[MASK],city,[SEP],I,love,[MASK]]
即便在 BERT \text{BERT} BERT中使用80-10-10规则对 BERT \text{BERT} BERT的预训练进行泛化,但实际上它依然是静态掩码:这些工作均是在数据预处理部分执行的,在训练过程中,每个 [ MASK ] [\text{MASK}] [MASK]部分在句子中的位置是固定的。 -
下句预测 ( Next Sentence Prediction,NSP ) (\text{Next Sentence Prediction,NSP}) (Next Sentence Prediction,NSP):样本集是由两个连接的文档片段 Segment-1,Segment-2 \text{Segment-1,Segment-2} Segment-1,Segment-2组成,并以 50 50 50%的概率:
- 在同一文档中连续采样;
- 不同的文档中采样;
并对采样结果 Segment-1,Segment-2 \text{Segment-1,Segment-2} Segment-1,Segment-2对应的如下格式中:
[ [ CLS ] , Segment-1 , [SEP] , Segment-2 , [SEP] ] [[\text{CLS}],\text{Segment-1},\text{[SEP]},\text{Segment-2},\text{[SEP]}] [[CLS],Segment-1,[SEP],Segment-2,[SEP]]
[ CLS ] [\text{CLS}] [CLS]对应的 BERT \text{BERT} BERT输出 R [CLS] \mathcal R_{\text{[CLS]}} R[CLS]使用 Softmax \text{Softmax} Softmax进行二分类(有关联/无关联)任务。
RoBERTa训练过程分析
静态掩码与动态掩码的比较
对于 BERT \text{BERT} BERT这种现象, RoBERTa \text{RoBERTa} RoBERTa先采用复制数据的方法进行补救:
- 将一个句子复制
10
10
10份,并将
10
10
10个句子进行随机掩码标记:
S 1 : [ [ CLS ] , P a r i s , i s , a , [ MASK ] , c i t y , [ SEP ] , I , l o v e , [ MASK ] ] S 2 : [ [ CLS ] , P a r i s , [ MASK ] , a , b e a u t i f u l , c i t y , [ SEP ] , I , l o v e , P a r i s ] ⋮ S 10 : [ [ CLS ] , [ MASK ] , i s , a , b e a u t i f u l , [ MASK ] , [ SEP ] , I , l o v e , P a r i s ] \begin{aligned} & \mathcal S_1:[[\text{CLS}],Paris,is,a,[\text{MASK}],city,[\text{SEP}],I,love,[\text{MASK}]] \\ & \mathcal S_2:[[\text{CLS}],Paris,[\text{MASK}],a,beautiful,city,[\text{SEP}],I,love,Paris] \\ & \quad \vdots \\ & \mathcal S_{10}:[[\text{CLS}],[\text{MASK}],is,a,beautiful,[\text{MASK}],[\text{SEP}],I,love,Paris] \end{aligned} S1:[[CLS],Paris,is,a,[MASK],city,[SEP],I,love,[MASK]]S2:[[CLS],Paris,[MASK],a,beautiful,city,[SEP],I,love,Paris]⋮S10:[[CLS],[MASK],is,a,beautiful,[MASK],[SEP],I,love,Paris] - 对模型进行
40 Epoch
\text{40 Epoch}
40 Epoch的全数据遍历训练,在每个
Epoch
\text{Epoch}
Epoch训练中,句子被掩盖标记都不同:
Epoch 1: S 1 Epoch 2: S 2 ⋮ Epoch 10: S 10 Epoch 11: S 1 Epoch 12: S 2 ⋮ Epoch 40: S 10 \begin{aligned} & \text{Epoch 1:} \quad \mathcal S_1 \\ & \text{Epoch 2:} \quad \mathcal S_2 \\ & \quad \vdots \\ & \text{Epoch 10:} \quad \mathcal S_{10} \\ & \text{Epoch 11:} \quad \mathcal S_{1} \\ & \text{Epoch 12:} \quad \mathcal S_{2} \\ & \quad \vdots \\ & \text{Epoch 40:} \quad \mathcal S_{10} \\ \end{aligned} Epoch 1:S1Epoch 2:S2⋮Epoch 10:S10Epoch 11:S1Epoch 12:S2⋮Epoch 40:S10
这相当于每一种 MASK \text{MASK} MASK模式被执行了 4 4 4次。虽然这种方法起到很好的泛化作用,但其本质上依然是静态掩码。
而动态掩码并没有在预处理阶段对数据进行 MASK \text{MASK} MASK,而是将数据导入模型过程中进行随机 MASK \text{MASK} MASK。这与上面复制数据的方法相比,它的泛化性更强。因为尤其在训练的 Epoch \text{Epoch} Epoch较大时,静态掩码由于会使同一份掩码结果训练多次,导致在训练过程中机械地记住这个规律。
下面是原文中静态掩码与动态掩码在同一任务中的对比情况。在一些任务中,动态掩码的效果略优于静态掩码。
模型输入模式与下一句预测
BERT \text{BERT} BERT中的 NSP \text{NSP} NSP任务旨在句子层面有更优秀的理解,因此 RoBERTa \text{RoBERTa} RoBERTa针对 NSP \text{NSP} NSP任务设计了几种训练格式,来验证 NSP \text{NSP} NSP策略是否有效:
- Segment-pair +NSP: \text{Segment-pair +NSP:} Segment-pair +NSP: 原始 BERT \text{BERT} BERT使用的模式,其中每个段落 ( Segment ) (\text{Segment}) (Segment)中可能包含多个句子 ( Sentence ) (\text{Sentence}) (Sentence),但 Token \text{Token} Token总长度小于 512 512 512。
- Sentence-pair + NSP: \text{Sentence-pair + NSP:} Sentence-pair + NSP: 将输入段落对改为句子对,正负样本的采样方式分别是从文档中连续采样和文档中单独采样。由于输入句子对 Token \text{Token} Token长度明显小于 512 512 512,因而通过增加 Batch size \text{Batch size} Batch size使 Token \text{Token} Token总量与 Segment-pair \text{Segment-pair} Segment-pair相似,并保留了 NSP \text{NSP} NSP策略。
- Full-sentence: \text{Full-sentence:} Full-sentence: 从一个/多个文档中采样出连续的完整句子, Token \text{Token} Token总长度不超过 512 512 512,并且允许超出文档边界。超出文档边界是指:当采样达到一个文档的末尾时,可以从下一个文档中继续进行采样作为该输入的一部分,但需要在文档之间加入一个额外分隔符,并且该实验删除了 NSP \text{NSP} NSP策略。
- Doc-sentence: \text{Doc-sentence:} Doc-sentence: 与 Full-sentence \text{Full-sentence} Full-sentence采样方式相似,但是不允许超出文档边界。相比于 Full-sentence \text{Full-sentence} Full-sentence,它的 Token \text{Token} Token长度有可能偏少,因此同样通过增加 Batch size \text{Batch size} Batch size使 Token \text{Token} Token总量与 Full-sentence \text{Full-sentence} Full-sentence相似,并同样删除了 NSP \text{NSP} NSP策略。
下面是原文对四种训练格式在若干任务中的效果:
- 比较使用 NSP \text{NSP} NSP策略的 Segment-pair \text{Segment-pair} Segment-pair和 Sentence-pair \text{Sentence-pair} Sentence-pair格式,发现使用 Segment \text{Segment} Segment效果明显由于 Sentence \text{Sentence} Sentence,原因可能是模型很难从单句中学习到长依赖关系。
- 对使用 NSP \text{NSP} NSP策略和未使用 NSP \text{NSP} NSP的角度进行比较,发现:删除 NSP \text{NSP} NSP策略能够略微提高下游任务的性能
- Doc-sentence \text{Doc-sentence} Doc-sentence略优于 Full-sentence \text{Full-sentence} Full-sentence。但由于 Doc-sentence \text{Doc-sentence} Doc-sentence长度不固定,导致 Batch size \text{Batch size} Batch size存在变化,因而后续实验均使用 Full-sentence \text{Full-sentence} Full-sentence格式进行比较。
使用大批量进行训练
原始
BERT
\text{BERT}
BERT使用
Batch size=256
\text{Batch size=256}
Batch size=256进行训练,训练步骤数量为
1M
\text{1M}
1M。在保持总计算量基本不变的情况下,将
Batch size
\text{Batch size}
Batch size由
256
256
256扩展至
2K,8K
\text{2K,8K}
2K,8K;对应训练步骤缩减至
125K,31K
\text{125K,31K}
125K,31K;并相应地调整学习率
(
lr
)
(\text{lr})
(lr):
可以发现:
Batch size
\text{Batch size}
Batch size为
2K
\text{2K}
2K时表现效果最好。但考虑到并行更容易,作者均选择
8K
\text{8K}
8K作为后续实验的
Batch size
\text{Batch size}
Batch size。
使用Byte-pair Encoding作为子词词元化算法
RoBERTa \text{RoBERTa} RoBERTa并没有使用 Unicode \text{Unicode} Unicode作为子词次元 ( Subword Unit ) (\text{Subword Unit}) (Subword Unit),而是使用 Bytes \text{Bytes} Bytes进行替代。这种方式可以编码任何输入文本,并且不会引入任何 Unknown \text{Unknown} Unknown标记,这会使 Vocab size \text{Vocab size} Vocab size变得更大,参数更多 ( 30 K ⇒ 50 K ) (30\text{K} \Rightarrow 50\text{K}) (30K⇒50K)。
以句子:
It was a great day
\text{It was a great day}
It was a great day为例,对应
RoBERTa
\text{RoBERTa}
RoBERTa模型的标记结果如下:
[
it
,
G
˙
was
,
G
˙
a
,
G
˙
great
,
Gday
˙
]
[\text{it},\dot{\text{G}}\text{was},\dot{\text{G}}\text{a},\dot{\text{G}}\text{great},\dot{\text{G}\text{day}}]
[it,G˙was,G˙a,G˙great,Gday˙]
其中
G
˙
\dot{\text{G}}
G˙表示一个空格,
RoBERTa
\text{RoBERTa}
RoBERTa词元分析其将所有空格替换为
G
˙
\dot{\text{G}}
G˙字符。再以一个句子为例:
I had a sudden epiphany
\text{I had a sudden epiphany}
I had a sudden epiphany(我灵光一闪):
[
I
,
G
˙
had
,
G
˙
a
,
G
˙
sudden
,
G
˙
ep
,
iphany
]
[\text{I},\dot{\text{G}}\text{had},\dot{\text{G}}\text{a},\dot{\text{G}}\text{sudden},\dot{\text{G}}\text{ep},\text{iphany}]
[I,G˙had,G˙a,G˙sudden,G˙ep,iphany]
这种标注结果是因为:未从词表中找到单词
epiphany
\text{epiphany}
epiphany,从而将其拆解未
ep
\text{ep}
ep和
iphany
\text{iphany}
iphany两部分。
更大的数据集和更多的训练步骤
RoBERTa
\text{RoBERTa}
RoBERTa延用了
BERT-large
\text{BERT-large}
BERT-large结构
(
L=24,A=16,H=1024
)
(\text{L=24,A=16,H=1024})
(L=24,A=16,H=1024),在
Batch size
\text{Batch size}
Batch size固定为
8K
\text{8K}
8K的情况下,作者进行一系列对比实验:
有点降维打击的意思~数据量大意味着信息更丰富,效果好也在情理之中~
可以发现:
- 即便没有增加数据, RoBERTa \text{RoBERTa} RoBERTa依旧比 BERT-large \text{BERT-large} BERT-large结果优秀。当然总计算量增加了很多 ( Batch size=8K,steps:31K ⇒ 100 K ) (\text{Batch size=8K,steps:31K} \Rightarrow 100\text{K}) (Batch size=8K,steps:31K⇒100K),但这并没有带来过拟合的问题。
- 在训练数据基础上加上 additional Data \text{additional Data} additional Data效果进一步提升;
- 训练过程很稳定:即便 steps=500K \text{steps=500K} steps=500K,依然没有出现过拟合的现象。
RoBERTa配置
综合上面的比对结果,作者给出 RoBERTa \text{RoBERTa} RoBERTa的基本配置:
- 动态掩码;
- 策略: Full-sentence without NSP \text{Full-sentence without NSP} Full-sentence without NSP;
- 更大的 Batch size \text{Batch size} Batch size;
- 使用更大 Vocab size \text{Vocab size} Vocab size,字节级别的 Byte-pair Encoding \text{Byte-pair Encoding} Byte-pair Encoding进行训练
- 训练过程中使用更多的 steps \text{steps} steps和 additional Data \text{additional Data} additional Data;
在 GLUE,SQuAD,RACE \text{GLUE,SQuAD,RACE} GLUE,SQuAD,RACE等任务中的表现结果如下:
-
GLUE
\text{GLUE}
GLUE
-
SQuAD
\text{SQuAD}
SQuAD
-
RACE
\text{RACE}
RACE
Reference
\text{Reference}
Reference:
论文链接
《BERT基础教程——Transformer大规模实战》