BERT从零学习心得体会

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)

论文原文部分;MLM的提出

实现:

对于所有的原文本词,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

什么是BERT

BERT从零详细解读视频

  • 12
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值