前言说明
BERT模型是欠训练的,作者提供了一个超参优化的BERT训练模型RoBERTa, 即稳健优化的BERT方法(Robustly Optimized BERT Pretraining Approach)
优化的点包括:
- 训练时间更长,更大的batch,更多的数据
- 去掉了NSP训练(BERT的两个语言训练分别是MLM和NSP)
- 训练更长的句子
- 在MLM训练时,动态改变masking pattern
RoBERTa方法在GLUE(文本分类)和SQuAD(阅读理解)上面都刷新或者达到当前最好的水平。最重要的是,RoBERTa只是沿用BERT原有的MLM训练模型,没有用新的结构。
BERT简介
结构
BERT,顾名思义,bidirectional encoder representation transformer, 是以transformer中编码器(encoder)为基础构建结构(参加我画的这个图),训练方法采用MLM进行双向语言模型(有点像CBOW)。
输入
输入的数据是两个上下文句子,我以为是为了更好理解句子间的关系。输入数据形式是 [ C L S ] x 1 , x 2 , . . . , x N , [ S E P ] , y 1 , y 2 , . . . , y M , [ E O S ] [CLS] x_1, x_2, ..., x_N, [SEP], y_1, y_2,...,y_M,[EOS] [CLS]x1,x2,...,xN,[SEP],y1,y2,...,yM,[EOS]。这里的[SEP]是区分上下文,[CLS]是句子的便签,用于做分类。大部分BERT模型都是有文本长度限制的。
训练目标
MLM
就是完形填空(CLOZE),利用交叉熵损失函数来优化结果。在masking patteren的选择上,我们筛选15%的词作为可能盖住的词,这其中80%替换为[MASK](需要预测),10%不变,10%随机换成其他词。
当然这里注意,这里masking patteren的选择是在训练之初就确定的,在整个训练过程不会发生变动
NSP
还记得输入形式么,就是利用上文判断下文,具体形式是一个是/否分类问题,正样本就是连续的上下文,负样本是在不同文档中随机选择的句子。NSP的设计是为了提升特定下游任务的准确率,如自然语义推断。
优化
采用Adam优化方法,同时学习率采用了预热机制,比较重要的是采用了GELU这个函数。
Adam
关于Adam可以参考这篇文章优化算法浅析
g
t
=
∇
f
(
x
)
g_t = \nabla f(x)
gt=∇f(x)
m
t
=
β
m
t
−
1
+
(
1
−
β
)
g
t
m_t = \beta m_{t-1} + (1-\beta)g_t
mt=βmt−1+(1−β)gt
V
t
=
β
V
t
−
1
+
(
1
−
β
)
∑
j
t
g
j
2
V_t = \beta V_{t-1} + (1-\beta) \sum_j^t g_j^2
Vt=βVt−1+(1−β)∑jtgj2
w
t
+
1
=
w
t
−
α
m
t
V
t
w_{t+1} = w_t - \alpha \frac{m_t}{V_t}
wt+1=wt−αVtmt
GELU
Gaussian Error Linear Units
G
E
L
U
(
X
)
=
x
P
(
X
≤
x
)
=
x
Φ
(
x
)
,
Φ
(
x
)
∼
Z
GELU(X) = xP(X \leq x) = x\Phi(x), \Phi(x)\thicksim Z
GELU(X)=xP(X≤x)=xΦ(x),Φ(x)∼Z
当x减小时,输入会以一个更高概率被dropout,激活变换随机依赖于输入,详细参见GELU说明
数据
采用BOOKCorPLUS + English WIKIPEEDIA
数据量大约16G
相融实验
动态OR静态掩码
原始BERT在MLM目标训练中只考虑在开头进行一次掩码。
静态掩码是复制十次数据,每个复制组随机掩码,所以一个句子就有十种不同的掩码
动态掩码每次训练都随机重新掩码
结果如图,静态和动态掩码效果都好于原始方法,后续实现都采用动态掩码。
模型输入格式和NSP loss
BERT原作者Devlin et al(2019)在不改变模型输入格式的前提下,比较有无NSP,发现有NSP效果更好。
RoBERTa作者同时修改输入格式和NSP loss
- SEGMENT-PAIR + NSP:原始BERT
- SENTENCE-PAIR + NSP:只输入单个句子
- FULL-SENTENCES: 连续随机从文档(一个文档)中抽句子作为输入,直到长度达到512tokens,如果跨文档,要加[SEP]
- DOC-SENTENCES 同上,只不过不跨文档,动态调整batch_size
在调整数据输入情况下,没有NSP效果更好,与Devlin et al(2019)差异来源数据格式是否修改。
下面操作将采用FULL-SENTENCES,因为动态调整batch-size比较麻烦。
Batch size
最好是2K,但是作者选了8K,考虑并行处理
文本编码
作者将编码格式从unicode改为bytes,同时将token从30K扩大到50K,参数因此增加15M-20M。
但是没什么效果,甚至有下降。但是作者觉得统一编码的好处大于效果下降。
RoBERTa
结合上文,RoBERTa配置为:动态掩码+FULL-SENTENCE+8K batch size + 50K bytes tokens
此外,还有两个待验证超参数:预训练数据量+训练时间
结论:
大力出奇迹,更多数据,更大batchsize,没有NSP loss+动态掩码,更长文本,更长时间训练,效果更好,截止目前还没有出现过拟合,如果更多,效果会更好。
钞能力真香