首页 > 其他分享 >回顾一下bert-bert详解

回顾一下bert-bert详解

时间:2022-12-02 17:45:50浏览次数:59  
标签:bert Transformer 回顾 SEP 模型 详解 output BERT CLS

1、Bert(encoder of transformer)

BERT全称为 Bidirectional Encoder Representation from Transformer,是 Google 以无监督的方式利用大量无标注文本「炼成」的语言模型,其架构为 Transformer 中的 Encoder(BERT=Encoder of Transformer)

我在 Transformer回顾详解中已经详细的解释了所有Transformer的相关概念,这里就不再赘述。

以往为了解决不同的 NLP 任务,我们会为该任务设计一个最合适的神经网络架构并做训练,不同的 NLP 任务通常需要不同的模型,而设计这些模型并测试其 performance 是非常耗成本的(人力,时间,计算资源)。如果有一个能直接处理各式 NLP 任务的通用架构该有多好?随着时代演进,不少人很自然地有了这样子的想法,而 BERT 就是其中一个将此概念付诸实践的例子。

Google 在预训练 BERT 时让它同时进行两个任务:

  • 漏字填空(完型填空),学术点的说法是 Masked Language Model
  • 判断第 2 个句子在原始本文中是否跟第 1 个句子相接(Next Sentence Prediction)

接下来我会分别详细介绍论文中这两个任务的设计细节

BERT 语言模型任务一:Masked Language Model

在 BERT 中,Masked LM(Masked Language Model)构建了语言模型,简单来说,就是随机遮盖或替换一句话里面的任意字或词,然后让模型通过上下文预测那一个被遮盖或替换的部分,之后做 Loss 的时候也只计算被遮盖部分的 Loss,这其实是一个很容易理解的任务,实际操作如下:
(1)随机把一句话中 15% 的 token(字或词)替换成以下内容:

  • 这些 token 有 80% 的几率被替换成 [MASK],例如 my dog is hairy→my dog is [MASK];
  • 有 10% 的几率被替换成任意一个其它的 token,例如 my dog is hairy→my dog is apple
  • 有 10% 的几率原封不动,例如 my dog is hairy→my dog is hairy
    (2)之后让模型预测和还原被遮盖掉或替换掉的部分,计算损失的时候,只计算在第 步里被随机遮盖或替换的部分,其余部分不做损失,其余部分无论输出什么东西,都无所谓。
    这样做的好处是,BERT 并不知道 [MASK] 替换的是哪一个词,而且任何一个词都有可能是被替换掉的,比如它看到的 apple 可能是被替换的词。这样强迫模型在编码当前时刻词的时候不能太依赖当前的词,而要考虑它的上下文,甚至根据上下文进行 "纠错"。比如上面的例子中,模型在编码 apple 时,根据上下文 my dog is,应该把 apple 编码成 hairy 的语义而不是 apple 的语义

BERT 语言模型任务二:Next Sentence Prediction

我们首先拿到属于上下文的一对句子,也就是两个句子,之后我们要在这两个句子中加一些特殊的 token:[CLS]上一句话[SEP]下一句话[SEP]。也就是在句子开头加一个 [CLS],在两句话之间和句末加 [SEP],具体地如下图所示:

可以看到,上图中的两句话明显是连续的。如果现在有这么一句话:[CLS]我的狗很可爱[SEP]企鹅不擅长飞行[SEP],可见这两句话就不是连续的。在实际训练中,我们会让这两种情况出现的数量为 1:1

Token Embedding 就是正常的词向量,即 PyTorch 中的 nn.Embedding()

Segment Embedding 的作用是用 embedding 的信息让模型分开上下句,我们给上句的 token 全 0,下句的 token 全 1,让模型得以判断上下句的起止位置,例如:

[CLS]我的狗很可爱[SEP]企鹅不擅长飞行[SEP]
 0   0 0 0 0 0 0 0  1 1 1 1 1 1 1 1

Position Embedding 和 Transformer 中的不一样,不是三角函数,而是学习出来的

Multi-Task Learning

BERT 预训练阶段实际上是将上述两个任务结合起来,同时进行,然后将所有的 Loss 相加,例如

Input:
[CLS] calculus is a branch of math [SEP] panda is native to [MASK] central china [SEP]
Targets: false, south

Input:
[CLS] calculus is a [MASK] of math [SEP] it [MASK] developed by newton and leibniz [SEP]
Targets: true, branch, was

Fine-Tuning

BERT 的 Fine-Tuning 共分为 4 中类型,以下内容、图片均来自李宏毅老师课程(以下内容 图在上,解释在下)

如果现在的任务是 classification,首先在输入句子的开头加一个代表分类的符号 [CLS],然后将该位置的 output,丢给 Linear Classifier,让其 predict 一个 class 即可。整个过程中 Linear Classifier 的参数是需要从头开始学习的,而 BERT 中的参数微调就可以了。

这里李宏毅老师有一点没讲到,就是为什么要用第一个位置,即 [CLS] 位置的 output。这里我看了网上的一些博客,结合自己的理解解释一下。因为 BERT 内部是 Transformer,而 Transformer 内部又是 Self-Attention,所以 [CLS] 的 output 里面肯定含有整句话的完整信息,这是毋庸置疑的。但是 Self-Attention 向量中,自己和自己的值其实是占大头的,现在假设使用\(w_{1}\)的 output 做分类,那么这个 output 中实际上会更加看重\(w_{1}\),而\(w_{1}\)又是一个有实际意义的字或词,这样难免会影响到最终的结果。但是 [CLS] 是没有任何实际意义的,只是一个占位符而已,所以就算 [CLS] 的 output 中自己的值占大头也无所谓。当然你也可以将所有词的 output 进行 concat,作为最终的 output。

如果现在的任务是 Slot Filling(槽填充,比如命名实体识别),将句子中各个字对应位置的 output 分别送入不同的 Linear,预测出该字的标签。其实这本质上还是个分类问题,只不过是对每个字都要预测一个类别。 如果现在的任务是 NLI(自然语言推理)。即给定一个前提,然后给出一个假设,模型要判断出这个假设是正确、错误还是不知道。这本质上是一个三分类的问题,和Case 1差不多,对 [CLS] 的 output 进行预测即可。 如果现在的任务是 QA(问答),举例来说,如上图,将一篇文章和一个问题(这里的例子比较简单,答案一定会出现在文章中)送入模型中,模型会输出两个数s,e,这两个数表示这个问题的答案落在文章的第 s 个词到第 e 个词。具体流程我们可以看下面这幅图: 首先将问题和文章通过 [SEP] 分隔,送入 BERT 之后,得到上图中黄色的输出。此时我们还要训练两个 vector,即上图中橙色和黄色的向量。首先将橙色和所有的黄色向量进行 dot product,然后通过 softmax,看哪一个输出的值最大,例如上图中$d_{2}$对应的输出概率最大,那我们就认为 s=2 同样地,我们用蓝色的向量和所有黄色向量进行 dot product,最终预测得$d_{3}$的概率最大,因此 e=3。最终,答案就是 s=2,e=3

你可能会觉得这里面有个问题,假设最终的输出 s>e 怎么办,那不就矛盾了吗?其实在某些训练集里,有的问题就是没有答案的,因此此时的预测搞不好是对的,就是没有答案。

参考:
1、https://wmathor.com/index.php/archives/1456/
2、http://speech.ee.ntu.edu.tw/~tlkagk/courses_ML19.html

后续实战会补充,请耐心等待,打赏二维码:

标签:bert,Transformer,回顾,SEP,模型,详解,output,BERT,CLS
From: https://www.cnblogs.com/edkong/p/16945070.html

相关文章

  • VUE $refs 与 $el 详解
    $refs与$el是什么?作用是什么?ref,$refs,$el,三者之间的关系是什么?ref(给元素或者子组件注册引用信息)就像你要给元素设置样式,就需要先给元素设定一个class一样,同理......
  • 【Django】Django model中的 class Meta 详解
     Model元数据就是"不是一个字段的任何数据"--比如排序选项,admin选项等等.下面是所有可能用到的Meta选项.没有一个选项是必需的.是否添加classMeta到你......
  • Bert源码学习
    文章目录​​前言​​​​1.bert模型网络modeling.py​​​​1.1整体架构BertModel(object):​​​​1.2embedding层​​​​1.2.1embedding_lookup​​​​1.2.2词向......
  • OpenCV4之C++入门详解
    OpenCV4之C++入门详解1、VisualStudio安装及环境配置与搭建1.下载地址:https://my.visualstudio.com/Downloads?q=Visual,下载后按照说明安装即可登录账号下载即可,建议下......
  • Java方法详解
    何为方法Java方法是语句的集合,他们在一起执行一个功能方法是解决一类问题的步骤的有序组合方法包含于类或对象中方法在程序中被创建,在其他地方被引用设计......
  • 苹果App Store上传应用流程详解
    在向AppStore提交应用之前,开发者首先要成为苹果iOS开发者项目的成员,每年向苹果缴纳99美元或199美元的费用(具体申请方法后期更新)。其次创建相应的证书Development是开发环境......
  • Hbase协处理器详解
    Hbase协处理器一、简述二、协处理器类型    2.1Observer协处理器    2.2Endpoint协处理器三、协处理的加载方式四、静态加载与卸载    4.1静态加......
  • 苹果App Store上传应用流程详解
    在向AppStore提交应用之前,开发者首先要成为苹果iOS开发者项目的成员,每年向苹果缴纳99美元或199美元的费用(具体申请方法后期更新)。其次创建相应的证书Development是开发环......
  • 详解ASP.NET4 GridView新增4大排序样式
    原文发表在:http://tech.it168.com/a2010/1012/1112/000001112829.shtml上与ASP.NET的其他Web控件一能够,Gridview控件拥有很多不同的CSS样式属性设......
  • (翻译)详解2010年最佳开源企业应用软件
    偶翻译的一篇文,原文发表在​​​http://publish.itpub.net/a2010/0907/1100/000001100373.shtml​​​自从RichardStallman发布了他的文字编辑器,......