赞
踩
BERT的基础transformer结构(encoder部分):
输入部分:
对于transformer来说,输入部分会进行两个操作,包括Input Embedding和Positional Encoding两部分。
Input Embedding就是将输入转为词向量,可以是随机初始化,也可以是使用word2vec。
Positional Encoding就是位置编码,用正余弦三角函数来代表它。
以上是输入部分进行的操作,那么输入又是什么呢?
实际上输入由三部分组成:Input = token embedding + segment embedding + position embedding
首先看Input部分,重点关注两个部分:
最开始那张图仅仅是基础结构,因为在原论文中使用的是多个encoder堆叠在一起,如BERT-BASE结构是通过12个encoder堆叠在一起。
分为MLM(Mask Language Model)和NSP(Next Sentence Prediction)两步
BERT在预训练时使用的是大量的无标注语料,所以预训练任务要考虑用无监督学习来做。
无监督目标函数:
例如有语句:【我爱吃饭】
AR: P ( 我 爱 吃 饭 ) = P ( 我 ) P ( 爱 ∣ 我 ) P ( 吃 ∣ 我 爱 ) P ( 饭 ∣ 我 爱 吃 ) P(我爱吃饭) = P(我)P(爱|我)P(吃|我爱)P(饭|我爱吃) P(我爱吃饭)=P(我)P(爱∣我)P(吃∣我爱)P(饭∣我爱吃)
AE:mask之后:【我爱mask饭】
P
(
我
爱
吃
饭
∣
我
爱
m
a
s
k
饭
)
=
P
(
m
a
s
k
=
吃
∣
我
爱
饭
)
P(我爱吃饭|我爱mask饭) = P(mask = 吃|我爱饭)
P(我爱吃饭∣我爱mask饭)=P(mask=吃∣我爱饭)
打破了原本文本,让他进行文本重建,模型要从周围文本中不断学习各种信息,努力地让他能够预测或无限接近mask这里应该填“吃”。
但mask模型也有缺点:
若mask后【我爱mask mask】
优化目标:
P
(
我
爱
吃
饭
∣
我
爱
m
a
s
k
m
a
s
k
)
=
P
(
吃
∣
我
爱
)
P
(
饭
∣
我
爱
)
P(我爱吃饭|我爱mask mask) = P(吃|我爱)P(饭|我爱)
P(我爱吃饭∣我爱maskmask)=P(吃∣我爱)P(饭∣我爱)
这里“吃”和“饭”模型会认为是相互独立的,但实际上我们知道“吃”和“饭”这两个词并不是独立的,室友一定关联的。
下面将介绍mask的具体过程:
随机mask 15%的单词,但并不是这些单词都要替换成mask。这15%的单词中,选出其中80%的单词直接替换成mask,其中10%的单词原封不动,剩下10%替换成其他单词,可以看代码更好地理解一下:
for index in mask_indices:
# 80% of the time, replace with [MASK]
if random.random() < 0.8:
masked_token = "[MASK]"
else:
# 10% of the time, keep original
if random.random() < 0.5:
masked_token = tokens[index]
# 10% of the time, replace with random word
else:
masked_token = random.choice(vocab_list)
NSP样本如下:
(a)句子对分类:也可以说是文本匹配任务,把两个句子拼接起来,用CLS输出判断,如0—不相似,1—相似;
(b)单个句子分类:用CLS输出做分类;
©问答
(d)序列标注任务:把每一个Token输入,做一个softmax,看他属于哪一个。
最简单的步骤:
再改进一些(四步骤,以做微博文本情感分析为例):
一般情况下,先 Domain transfer,再进行 Task transfer,最后 Fine-tune,性能是最好的。
如何在相同领域数据中进行further pre-training
参数:
Batch size:16,32——影响不太大
Learning rate(Adam):5e-5,3e-5,2e-5,尽可能小一点,避免灾难性遗忘
Number of epoch:3,4
Weighted decay修改后的Adam,使用warmup,搭配线性衰减
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。