赞
踩
本文讲解预训练Transformer模型常用的方法:BERT与ERNIE。
本人全部文章请参见:博客文章导航目录
本文归属于:自然语言处理系列
本系列实践代码请参见:我的GitHub
前文:搭建Transformer模型
后文:机器翻译——英译中
BERT(Bidirectional Encoder Representations from Transformers)用于预训练Transformer模型Encoder网络,可以大幅提升Transformer模型的准确率。BERT的核心思想如下:
BERT通过上述两个任务,预训练Transformer模型Encoder网络。
如下图所示,输入句子通过Embedding层将单词映射成Word Embedding,Transformer’s Encoder接收句子对应的Word Embedding输入,生成相同长度的输出序列。
BERT的第一个任务是随机遮挡句子中的一个或多个单词,让Encoder根据句子上下文预测被遮挡的单词。
如图二所示,假设输入句子为【
t
h
e
c
a
t
s
a
t
o
n
t
h
e
m
a
t
the~cat~sat~on~the~mat
the cat sat on the mat】,被随机遮挡的单词为【
c
a
t
cat
cat】。将输入句子中被遮挡的单词替换成
[
M
A
S
K
]
[MASK]
[MASK]符号,
[
M
A
S
K
]
[MASK]
[MASK]符号经过Embedding层被编码成
X
M
X_M
XM。Embedding层输出经过Transformer’s Encoder生成输出序列
U
U
U,将
U
U
U中与
[
M
A
S
K
]
[MASK]
[MASK]位置对应的元素记为
U
M
U_M
UM。
根据前文可知,
U
M
U_M
UM依赖于所有输入
x
i
x_i
xi,因此
U
M
U_M
UM知道整个输入句子信息,即
U
M
U_M
UM包含输入句子上下文信息,因此可以用
U
M
U_M
UM预测被遮挡的单词。
将
U
M
U_M
UM输入
S
o
f
t
m
a
x
Softmax
Softmax分类器,得到概率分布
p
p
p。将输入句子被遮挡单词【
c
a
t
cat
cat】的one-hot vector
e
e
e作为标签,使得概率分布
p
p
p与标签
e
e
e尽可能接近,即令
L
o
s
s
=
C
r
o
s
s
E
n
t
r
o
p
y
(
e
,
p
)
Loss=CrossEntropy(e,~p)
Loss=CrossEntropy(e, p)。使用反向传播算法计算出损失函数关于模型参数的梯度,用梯度下降算法更新模型参数。
从文本数据中生成训练数据集,抽取两个句子,并将两个句子拼接,两个句子中间用 [ S E P ] [SEP] [SEP]符号分隔,在拼接形成的句子前添加一个 [ C L S ] [CLS] [CLS]符号。其中训练集的50%为文本中相邻的两个句子,另外50%为随机抽取的不相邻两个句子。训练集中相邻句子的标签设置为1,不相邻句子的标签设置为0。
[ C L S ] [CLS] [CLS]是用于分类的标记; S E P SEP SEP用于分隔句子。
如上图所示,一条训练数据包含两个句子。两个句子被
[
S
E
P
]
[SEP]
[SEP]符号分隔,在最前面存在一个
[
C
L
S
]
[CLS]
[CLS]符号。将训练数据经过Embedding层后输入Transformer’s Encoder,生成与输入句子长度相同的输出序列,其中符号
[
C
L
S
]
[CLS]
[CLS]对应位置的输出元素为c。
同样,c依赖于所有输入序列所有元素,因此c知道两个输入句子的信息,因此可以用c判断输入的训练数据中两句话是否真实相邻。将c输入一个二分类器,分类器输出一个介于0—1之间的值
f
f
f。使用交叉熵作为损失函数,衡量
f
f
f与真实标签之间的差别。计算损失函数关于模型参数的梯度,使用梯度下降来更新模型参数。
在文本中真实相邻的两句话通常存在某种关联,神经网络可以从海量训练数据中学习到这种相关性。通过上述训练过程,可以让Embedding层中词向量包含这种关联性。
此外,在Encoder网络中存在Self-Attention层,Self-Attention的作用就是确定句子中各单词之间的相关性。通过上述分类任务训练,可以使得Self-Attention有能力捕获这种相关性。
BERT将上述两个任务相结合,用来预训练Transformer’s Encoder。
将两个句子按照2.2中所述方法拼接,并按照2.1中所述方法随机遮挡15%的单词。假设一条训练数据中被遮挡的单词数为2,则总共包含3个损失。第一个损失为分类任务损失
L
o
s
s
1
Loss_1
Loss1,第二和第三个损失为预测被遮挡单词的任务损失
L
o
s
s
2
Loss_2
Loss2和
L
o
s
s
3
Loss_3
Loss3。目标函数是全部损失的加和,即
L
o
s
s
=
L
o
s
s
1
+
L
o
s
s
2
+
L
o
s
s
3
Loss=Loss_1+Loss_2+Loss_3
Loss=Loss1+Loss2+Loss3。
将目标函数关于模型参数求梯度,然后使用梯度下降来更新模型参数。
BERT不需要人工标注训练数据,可以从任何书籍等资料中自动生成训练数据集,这样训练数据要多少有多少,足以训练出一个非常大的模型。BERT论文中使用了英文维基百科,长度是25亿个单词。
BERT想法简单而且效果卓越,但是计算代价非常大。在BERT论文中提出了两个模型:小BERT模型(BERT Base)和大BERT模型(BERT Large)。小BERT模型共1.1亿参数,大BERT模型共2.35亿参数。
论文中提到训练小模型使用了16块TPU,4天时间。训练大模型用了64块TPU,4天时间。而且该训练时间仅仅只是训练一遍,不包含超参数调节。如果调节超参数,则花费的时间还会多很多倍。如果将相应计算资源换算成在线购买的计算资源,从头开始训练一遍小模型大约须耗费1万美元。Attention is all you need事实上是Money is all you need。
Google公司训练完成BERT后,将模型参数公开了。如果想使用BERT,不用从头开始花费大代价训练,可以直接下载相关模型参数。
此外,在训练BERT时,为了不使模型认为 [ M A S K ] [MASK] [MASK]符号原本就归属于训练句子,在随机遮挡单词时采用了将一定数量的 [ M A S K ] [MASK] [MASK]替换成句子中原本的单词,将一定数量的 [ M A S K ] [MASK] [MASK]符号替换成随机单词等等小技巧。由于Self-Attention无法捕捉句子中词序信息,BERT的Embedding层不是简单的Word Embedding,而是混合了Positional Encoding。
ERINE(Enhanced Representation through Knowledge Integration)是百度发布的一个预训练模型。它将BERT中单词级别的MASK拓展成三种级别的Knowledge Masking,从而让模型学习到更多语言知识,在多项任务实践效果上超越了BERT。
训练句子中包含了大量词法、句法、语义信息等语言知识,BERT和ERNIE的目的均是使用预训练任务让模型有效地学习到这些复杂的语言知识。根据理论研究和实践,BERT使用的两个任务并不能让模型学习到那么多复杂的语言知识。特别是后来多个研究者提到Predict Next Sentence任务是比较简单的任务,它实际的作用不大。
ERNIE将语言知识分成了三个类别:单词级别(Basic-Level)、短语级别(Phrase-Level) 和 实体级别(Entity-Level)。通过对这三个级别的对象进行Masking(遮挡),使模型能够学习到语言知识中的语法知识和语义知识。如假设训练句子为【长沙是湖南省的省会城市】,随机遮挡掉地名实体【长沙】,则模型能够在一定程度上学习到【长沙】与【湖南省】的关系,即模型能够学习到更多语义知识。
此外,ERNIE还采用多个异源语料帮助模型训练,例如对话数据,新闻数据,百科数据等等。通过这些改进使模型在字词、语句和语义方面更深入地学习到语言知识。通过这些预训练任务学习之后,ERINE变成了一个比BERT更懂语言知识的预训练模型。
假设输入序列一为
[
C
L
S
]
,
x
1
,
x
2
,
x
3
,
⋯
,
x
m
[CLS],x_1,x_2,x_3,\cdots,x_m
[CLS],x1,x2,x3,⋯,xm,序列二为
[
C
L
S
]
,
x
1
,
x
3
,
x
2
,
⋯
,
x
m
[CLS],x_1,x_3,x_2,\cdots,x_m
[CLS],x1,x3,x2,⋯,xm。两个输入序列第三和第四个元素位置不同。
根据Attention is all you need:剥离RNN,保留Attention一文可知,输出序列
[
C
L
S
]
[CLS]
[CLS]对应位置的元素计算方式为如下:
由于 α c v c + α 1 v 1 + α 2 v 2 + α 3 v 3 + ⋯ + α m v m = α c v c + α 1 v 1 + α 3 v 3 + α 2 v 2 + ⋯ + α m v m \alpha_cv_c+\alpha_1v_1+\alpha_2v_2+\alpha_3v_3+\cdots+\alpha_mv_m=\alpha_cv_c+\alpha_1v_1+\alpha_3v_3+\alpha_2v_2+\cdots+\alpha_mv_m αcvc+α1v1+α2v2+α3v3+⋯+αmvm=αcvc+α1v1+α3v3+α2v2+⋯+αmvm,因此对调句子中单词顺序不会使得输出序列中 [ C L S ] [CLS] [CLS]符号对应位置的值发生改变,因此Self-Attention层无法捕捉句子中词序信息。
根据 α \alpha α和 v v v的计算方式可知,一个输入单词不论在什么位置,对应的 α \alpha α和 v v v是不变的。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。