BERT提出
BERT全称: Pre-training of Deep Bidirectional Transformers for Language Understanding
BERT可以完形填空情感分析等等,很容易联想到这与之前的模型bi-lstm功能类似。但是区别在于lstm是基于特征的,而不是深度双向。Fedus等人(2018)表明完形填空可以用来提高文本生成的鲁莽性质(文本鲁莽可以理解成翻译的直白,生硬)
BERT模型理解
在自然语言处理(NLP)中,BERT(Bidirectional Encoder Representations from Transformers)是一种基于Transformer架构的预训练语言模型。BERT的设计初衷是通过在大规模未标记的文本数据上进行预训练,使其能够学习到丰富的语言表示。
BERT输入部分解读
BERT的输入部分是Transformer中的Encoder堆叠而成。(本人学习时网上很多人说“由Transformer堆叠而成”,其实是不准确的)
对比:BERT Transformer使用双向自关注,而GPT Transformer使用约束自关注,其中每个令牌只能关注其左侧的上下文
论文原文部分引用:
BERT input representation. The input embeddings are the sum of the token embeddings, the segmentation embeddings and the position embeddings
[CLS]
在BERT模型中,每个输入序列的开头会添加一个特殊的标记,称为[CLS]标记,表示“类别”。[CLS]标记与其他词汇一样,都会经过Transformer的编码器进行处理。不同的是,[CLS]标记的最终表示(也就是经过编码器之后的向量)会被用作整个句子的表示。
这个[CLS]向量在BERT模型中有多种用途。其中最常见的用途是将其输入到分类任务的分类器中,从而进行文本分类。例如,可以使用[CLS]向量进行情感分析、文本匹配等任务。
需要注意的是,[CLS]标记的表示并不是单纯由[CLS]标记本身决定的,它会受到其他词汇的影响。这是因为在Transformer模型中,每个词汇的表示都会相互影响,而不仅仅是[CLS]标记,另外[CLS]并不代表原本句子的信息,论文中也没有提到,网上这样的说法是错误的。
Token Embeddings
普通的Embedding嵌入层
Segment Embeddings
对两个句子进行区分:第一个句子都标记成0,第二个句子都标记成1(后续操作有用)
Position Embeddings
BERT的关键输入,采用的是随机初始化,让BERT模型自己去学习这里的Embedding应该是什么,至于为什么是这样,本人没有看到比较科学的解释,个人认为这样一定程度上可以降低对训练集的敏感程度,增强应用能力吧。
有区别于原本Transformer,它采用的是正余弦函数操作。
预训练任务理解
过去的模型都是根据文本自身。
从开始的从左往右读取信息的RNN,LSTM,到左右开弓的BI-LSTM。
后来从全文开始同时提取信息的Self-Attention自注意机制,以及用上掩码自注意机制的Transformer都采用这种形式。而BERT提出了全新的方式:MLM。
什么是MLM?
BERT提出了全新的方式:MLM(Masked Language Model)
![](https://i-blog.csdnimg.cn/blog_migrate/8d2a5e62726f70c6bba2bc88f6e04865.png)
实现:
对于所有的原文本词,15%的的概率随机挑选一些词出来;
对于被随机挑选出来的部分:
10% 替换成其他部分
10%原封不动
剩下的80%替换成mask
这样就打破了原有的文本信息,在预训练的时候对文本进行重建,训练的额时候让出现的词无限地接近原本地词语,这样一定程度上可以遏制对训练集地敏感性
训练方式基于上下文的词,与左右模型不同,MLM目标使表示能够融合上下文,使得预训练更加具有深度
具体为什么要这样,论文和网上都没有科学的解释。要么是随机设置的要么是实大量实验的经验。此外,需要注意的一点是,一个词被替换成为了[mask],这个[mask]是有可能被再次替换为新的[mak]的,所谓随机针对的是整个文本,代码一看就能懂。
实现的代码:
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)
MLM的目标是通过在输入文本中随机遮盖(mask)一些单词或词片段,然后让模型预测被遮盖部分的原始内容。通过这种方式,模型可以学习到句子中不同单词之间的语义关系和上下文信息
什么是NSP?
NSP(Next Sentence Prediction)是BERT的一种预训练任务
旨在帮助模型理解句子之间的逻辑关系。在NSP任务中,BERT通过观察一对句子来预测它们是否是相邻的(即紧密相关的句子),或者它们是否是随机组合的。这有助于模型学习句子之间的语义和上下文关系。
具体来说,对于输入的一对句子,BERT会通过特殊的分隔符([SEP])将它们连接起来,并将该组合作为输入。然后,模型会学习预测这两个句子是否是原文中相邻的句子。
通过NSP任务,BERT能够学习到对句子之间逻辑关系的理解,例如句子的因果关系、顺序关系、转折关系等。这样的训练有助于提高模型的理解能力,使其更好地应用于各种自然语言处理任务中,如问答系统、文本摘要、对话生成等。
如何提升下游任务效果
"下游"是指在BERT模型预训练之后,将其应用于特定的NLP任务(如文本分类、命名实体识别、情感分析等)时所涉及的任务。这些任务通常需要使用已标记的训练数据来微调预训练的BERT模型,以适应特定任务的要求。
"上游"指的是BERT模型的预训练阶段,即在大规模未标记的数据上使用自监督学习进行训练。而"下游"指的是使用预训练的BERT模型作为特定NLP任务的基础,通过微调或添加额外的层来解决具体的任务。
通过将BERT模型用于下游任务,可以利用BERT所学习到的语言表示来提供更好的特征表示和上下文理解,从而在各种NLP任务中取得更好的性能。这种利用预训练语言模型的方法已被证明在许多NLP任务中非常有效,BERT也成为了自然语言处理领域的一个重要里程碑。
下游中微调BERT
四图对应的任务分别是:句子对分类,单个句子分类,问答,序列标注任务。
万变不离其宗,主要都是做了一个Softmax处理操作
目的都是为了提升BERT在下游任务中的表现,一般我们不会在上游方面,自己搭建一个BERT模型,而是直接调用别人已经做好的,基于具体的任务进行微调,得到更好的性能
另外,相同领域数据中在进行Furter pre-training的时候:
1:动态mask:是训练的时候再去进行mask操作,而不是一直用一样的mask
2:n-grammask 做实体词没有的时候可以这样做(b站网课是这样讲的但是没太明白什么意思)
参数设置:
Batch size 16或32 一般影响不大
Learning rate(Adam):5e-5,3e-5,2e-5,尽量小一些可以避免造成灾难性遗忘
Number of epochs: 3,,4
Weight decay修改后的adam,使用warmup,搭配线性衰减
=========================================================================
如果要学习BERT,论文原文一定要读读,收获良多,链接在下方
参考:
BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding