Bert核心内容

Bert 2018年10月 出现传送门

Bert
原文: BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding
代码: google-research/bert

关于Bert已经有很多人都详细地写过它的原理,给大家推荐一个知友写的总结Bert的相关论文和代码的文章:Pan Yang:BERT相关论文、文章和代码资源汇总

 

1. Pre-training预训练之Marked LM

Bert在预训练的过程中使用的是多个transformer encoder层

为什么都说Bert采用的是双向语言模型,就是因为Bert采用transformer encoder层,而encoder层是前后词都会考虑进去。相对而言,GPT/GPT-2采用类似与decoder层,是只考虑前面出现的词,因此GPT/GPT-2采用的是单向语言模型~

问题1:可是为什么Bert要采用双向语言模型呢?

因为我们正常情况下是通过前文预测下一个词,但是我们却忽略了该词后面的内容也对该词起决定性作用啊~因此Bert说那我就前后文都用上,来预测当前的词不就得了~这样前后文的信息就都不会丢失,都被我利用起来啦

问题2:但是这样又会有一个大问题,我前后文都利用上,那我还预测什么啊?我都知道下个词是啥啦,你还让我预测啥!

Bert说这……不是问题!我可以学习完形填空啊,我把一些词给你藏起来,那我预测的时候这些词我就不知道,就可以正常预测啦~因此Bert引入了一个新概念:Marked LM,掩码语言模型,就是将文章中的一些词进行掩盖,然后再训练~

Bert是将训练文本15%的词进行掩码操作的,不过对于15%这些需要掩码的词如何掩盖(Marked LM)也是有说法的:

  • 有80%的概率用“[mask]”标记来替换
  • 有10%的概率用随机采样的一个单词来替换
  • 有10%的概率不做替换

问题3:为什么要这么复杂的做掩码模型呢,直接100%替换不就得了?

答:比如我们在训练时需要将100个词进行掩码替换,也就是用“[mask]”来替换~但是如果100个词都用“[mask]”来替换啦,那是不是相当于告诉计算机,只要碰到“[mask]”就是我需要预测的词,如果不是“[mask]”那就不用预测了~但是真实情况不是这样啊,我是需要将整篇文章都要进行预测的吖!而且在fine-tuning阶段,文章中是不会出现“[mask]”标记的,那计算机是不是就不需要预测,不需要处理啦!

所以,Bert采用上面的掩码方式,就是告诉计算机,不是只有碰到“[mask]”才要预测,每个位置都需要预测哦~

那剩下20%不用“[mask]”替换的,就可以采用随便哪个词来替换了,都无所谓啦~至于其中10%不做替换,我觉得就是个机制,如果20%都用随机词替换也是可以的~

2. Pre-training预训练之Next Sentence Prediction

Bert引入一个新的概念:Next Sentence Prediction,预测下一句是否是上一句的下一句,即:这两句是否可以作为上下句的关系。Bert采用50%是上下句的句对,以及50%不是上下句的句对进行训练,训练时两个句子之间加入“[SEP]”进行分隔,从而使两个句子合并成一个句子。

采用Next Sentence Prediction可以解决问答、句子相似性、复述等问题,解决了句间关系问题。

3. fine-tuning微调

Bert的下游任务可以大体上分为四类:单句分类、句对分类、序列标注、问答任务~

单句分类:直接对输入句子采用Bert训练模型,得到第一个标记[CLS]对应的向量作为下游分类任务的输入。

句对分类:将句对用“[SEP]”进行分隔,然后当成一个句子,就可以当做单句分类一样进行后续操作。

序列标注:将输入句子进行Bert训练模型进行处理后,将第一个标记[CLS]以后的所有位置对应的输出向量作为下游任务的输入。

问答任务:将问题与多个答案进行拼接,可以得到多个句子对,这些句子对的第一个句子都是该问题。将这些句子对通过Bert训练模型进行处理后,将第二个句子对应的输出向量作为下游二分类任务的输入。【二分类任务:是否可以作为第一个句子的回答~】

对于问答任务举个例子:

就是对于一个问题,从一个长文本中提取出某句作为它的回答。具体做法就是将该问题与该长文本中所有句子都拼接成句子对的形式,然后对于每个句子对都放入Bert训练模型中,得到每个句子对中第二个句子的输出向量,然后再做二分类问题,判断第二个句子是否可以作为第一个句子的回答。

4. 输入向量

最后再来说一下Bert的输入向量,在transformer中我们可以知道它的输入向量是token embedding + position embedding。而对于Bert来说,它的输入向量在此基础上又增加了一个句子向量(segment embedding)~

问题:为什么要加入句子向量(segment embedding)?

答:因为Bert会处理句对分类、问答等任务,这里会出现句对关系,而两个句子是有先后顺序关系的,如果不考虑,就会出现词袋子之类的问题(如:武松打虎 和 虎打武松 是一个意思了~),因此Bert加入了句子向量。

句子向量就是这句话是属于第一句还是第二句,所以它只有两种形式。

因此Bert的输入向量 = token embedding + position embedding + segment embedding~

到此,Bert的核心内容就简要介绍完了

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值