再谈BERT

三次讲到了BERT。第一次是nlp中的经典深度学习模型(二),第二次是transformer & bert &GPT,这是第三次。

文章目录

  • 1 关于预训练模型
    • 1.1预训练概念
    • 1.2 再谈语言模型
    • 1.3 ELMo
    • 1.4 GPT
  • 2 BERT
    • 2.1 BERT特点
    • 2.2架构
    • 2.3 预训练任务
      • 2.3.1 masked language model
      • 2.3.2 next sentence prediction
      • 2.3.4 Subword
    • 2.4 微调fine-tuning
  • 3后记

1 关于预训练模型

1.1预训练概念

预训练模型最早用于CV领域。
深度学习模型就是一个y=fθ(x)y=f_{\theta}(x)y=fθ(x)查找最优θ\thetaθ的过程。如果参数θ\thetaθ初始值合适的话,会加快模型训练进度。
预训练就是在任务上优化参数,最后得出一套参数。这套参数可以作为下游任务的初始值。
为什么预训练模型可以提升模型的精度?
用一个例子来说明。厨师需要做很多种菜,例如:宫保鸡丁、鱼香肉丝、地三鲜。厨师可以每次对每个菜选择不同的原材料、加工,成菜。厨师也可以先把菜加工成半成品,例如煮好的鸡肉、胡萝卜丝、切好的土豆块。有了这些半成品,可以加快出菜速度。可以把预训练得到的参数理解为半成品。

1.2 再谈语言模型

语言模型就是 计算一个句子出现概率的模型。
P(x1,x2...xn)=P(x1)∗P(x2∣x1)∗P(x3∣x1,x2)...P(xn∣x1,x2,,,xn−1)P(x_1,x_2...x_n)= P(x_1)*P(x_2|x_1)*P(x_3|x_1,x_2)...P(x_n|x_1,x_2,,,x_{n-1})P(x1,x2...xn)=P(x1)P(x2x1)P(x3x1,x2)...P(xnx1,x2,,,xn1)
各种算法,模型就是去无限逼近右边式子中的条件概率 。
使用语言模型做预训练,训练得到的参数,可以用于其他任务中。

1.3 ELMo

预训练在nlp中正式提出是在ELMo中。
ELMo是一个三层的网络结构:

  • 字符CNN
  • 一个正向语言模型
  • 一个逆向语言模型

训练了一个正向和逆向的语言模型。
逆向语言模型是在计算:P(x1,x2,...xn)=P(xn)P(xn−1∣xn)P(xn−2∣xn,xn−1)...P(x1)P(x_1,x_2,...x_n)= P(x_n)P(x_{n-1}|x_n)P(x_{n-2}|x_n,x_{n-1})...P(x_1)P(x1,x2,...xn)=P(xn)P(xn1xn)P(xn2xn,xn1)...P(x1)

1.4 GPT

GPT是使用transformer替换了ELMo中的LSTM。
训练了一个从左到右的语言模型任务。

GPT2和GPT3是使用了更多的参数,有些情况下layer normal放在了Attention之前。得到了更好的效果。

2 BERT

2.1 BERT特点

BERT: Bidirectional Encoder Representations from Transformers
bert相比较其他框架的优点是:
1 与GPT相比,GPT也使用了transformer,但GPT只训练了一个从左到右的模型。
2 与ELMo相比,ELMo使用的是LSTM,训练的是两个独立的从左到右,和从右到左两个模型。
在这里插入图片描述
3 bert是在无标注的数据集上做预训练,在每一层都包含左右的context信息。
4 应用于其他任务的时候只需要再加一层输出层即可。
5 应用于其他任务,不需要修改bert的架构。

2.2架构

在这里插入图片描述
横线表示了堆叠起来的transformer模型。
bert模型输入的是两个句子的拼接或者一个单独的句子。例如[CLS] my do is cute[SEP] he likes play ##ing[SEP]
bert模型的输入= token embedding + position embedding + segment embedding
token embedding:是经过wordpiece之后的一个一个token。
position embedding :表示不同的位置,要求就是不同位置用不同的数值表示即可。
segment embedding:表示两个句子。例如第一个句子用EAE_AEA表示,第二个句子用EBE_BEB表示。

在这里插入图片描述

bert模型的输出:表示[CLS]的隐状态C,表示第i个token隐状态的YiY_iYi

bert有两个版本:
Bert-base:L=12(有12层),H=768(隐状态的大小是768),A=12(multi self Attention的head有12个)
Bert-base:L=24(有24层),H=1024(隐状态的大小是1024),A=16(multi self Attention的head有16个)

2.3 预训练任务

预训练任务有2个:masked language model 和 next sentence prediction。
预训练的数据集是BooksCorpus (800M words) 和 English Wikipedia (2,500M words)。

2.3.1 masked language model

bert想要训练一个深度的双向语言模型。所以设计了MLM任务。
不要预测下一个词,而是预测上下文。
问题:如何防止模型拷贝答案?
方法:masked。将数据集中15%的词标记为mask,模型去预测这些被mask的词。这样做的好处是在预测一个词的时候会同时用到这个词的左右的信息。这种方式可以更好的建模词左右的上下文信息。

问题:预训练阶段能看到mask标记,但是调优阶段是看不到这个标记的,这在一定程度上影响了准确率。
方法:不要总是标记为mask。在确定第i个位置是mask之后。1. 80%的概率标记为mask,2. 10%的概率保持不变,3. 10%的概率改为其他字符。
如果只有mask,对于其他词(被masked的词)不能学习到好的表达。
如果只有mask和其他字符,那就学不到正确的词。
如果只用mask和正确的词,那模型可能会只记住单词,不学习。

模型输出:被mask位置的词的上下文词向量,以及[CLS]位置的句子表示。

2.3.2 next sentence prediction

输入是句子对(A,B)
生成句子对A和B,50%的情况B是A真正的下一句,50%是随机选择的一个句子。

ps:后续实际中证明这个任务对下游任务并没有帮助。没有它,下游任务效果可能会更好。但是这个任务对于句子对分类任务是有帮助的。
在RoBera中抛弃了这个任务。

2.3.4 Subword

传统词表示不能解决未看到的词。
bert中使用的token方式是subword,使用BPE(Byte-Pair Encoding)的方式生成token。

e.g. subword = sub + word

学习方式:Byte Pair Encoding(BPE)
参考链接:https://zhuanlan.zhihu.com/p/86965595
https://huggingface.co/transformers/tokenizer_summary.html
在中文中直接以字进行训练就可以。

2.4 微调fine-tuning

nlp中所有的任务都是分类任务。
在这里插入图片描述

将bert模型应用于单个句子的分类中,使用CLS的隐状态参与分类得到分类标签。

3后记

今天早上一直不明白怎么用bert的输出作为下游的起始。一直在想它做预测的只是被mask的部分,那学到的词向量只是部分词向量呢?而且作为词向量应该是前面一些层的参数,不会是最后输出层。
后来听老师讲预训练模型训练才发现自己的思维被前面的词向量模型固定了。
预先训练模型,再使用有两种策略:feature-based 和 fine-tuning.
feature-based :skip-gram cbow ELmo都是这种策略。在一个语言模型的任务上训练,得到词向量表示。词向量用于下游任务。
fine-tuning: GPT、bert是这种策略。这种策略是预先训练一个模型。在下游任务的时候,在模型上面继续加层,实现目标。这个模型的整体架构不发生大的变化。在下游任务训练的时候,所有的参数都以预训练的的参数为基准。这就类似于CNN在图像分类上的预训练-微调模式一样。
在下游任务中可以固定前面的模型参数不变,也可以前面部分的参数一起参与训练。这个看效果而定。

所以bert被下游使用的是整个网络结构,以及所有结构中的参数。当然参与变化层运算的是最后一层的输出。
这类似于使用CNN的GoogleNet预训练,训练自己的图像分类器。只是修改最后一层输出分类的个数,就变成自己的模型了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/424001.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

第一百三十三期:MySQL锁会不会,你就差看一看咯

本文章向大家介绍MySQL锁详细讲解,包括数据库锁基本知识、表锁、表读锁、表写锁、行锁、MVCC、事务的隔离级别、悲观锁、乐观锁、间隙锁GAP、死锁等等,需要的朋友可以参考一下。 作者:php自学中心 本文章向大家介绍MySQL锁详细讲解&#xff…

[导入][你必须知道的.NET]第十回:品味类型---值类型与引用类型(下)-应用征途...

摘要: 本文将值类型和引用类型的讨论从应用示例角度来进一步做以延伸,可以看作是对前两回的补充性探讨。我们从类型定义、实例创建、参数传递、类型判等、垃圾回收等几个方面来简要的对上两回的内容做以剖析,并以一定的IL语言和内存机制来说明&#xff0…

云开发新能力,支持 HTTP 调用 API

今天来上班打开电脑,总感觉微信开发文档哪里有点不太一样,研究了半天原来是云开发又多了神级功能——HTTP API! HTTP API是什么?简单来说就是通过云开发HTTP API,可以不需要通过微信小程序或云开发控制台,就…

mac下pip install 安装只能选择python2.7的问题

mac自带python2.7。 我用brew install安装过python3:brew install python3 我安装了anaconda3。因为它自带了很多包。所以我无论是用pycharm编程还是jupyter notebook一直都用的是anaconda3带的python。 后来发现用pip install 安装的包,在pycharm工程中用不了。更有…

第一百三十四期:MySQL分页查询方法及优化

在MySQL中,分页查询一般都是使用limit子句实现,limit子句声明如下:LIMIT子句可以被用于指定 SELECT 语句返回的记录数。 作者:青芽草 分页查询方法: 在MySQL中,分页查询一般都是使用limit子句实现&#x…

One2One主键关联的实现

主键关联&#xff0c;产生主键的是A类&#xff0c;与A相同主键的是B类 主键对应的A类&#xff0c;hbm.xml文件与.cs文件均无任何特别&#xff0c;与单表相同 与A相同的主键B类&#xff0c; Hbm.xml文件&#xff1a; <id name"Id"column"ID"type"Gu…

scroll

因为想赶紧开始敲考核任务的&#xff0c;所以就跳着来学 1. window.pageYOffset可以获取滚动了的高度 2.转载于:https://www.cnblogs.com/lijingjaj/p/11206841.html

第一百三十五期:如何模拟一次阿里双11秒杀场景的实现?程序员必看

秒杀活动可以说在互联网上随处可见&#xff0c;从12306抢票&#xff0c;到聚划算抢购&#xff0c;我们生活的方方面面都可以看到秒杀的身影。 作者&#xff1a;IT技术管理那些事儿 秒杀活动可以说在互联网上随处可见&#xff0c;从12306抢票&#xff0c;到聚划算抢购&#xf…

什么是“中台”

“中台”概念起源于军事范畴&#xff0c;其精髓是“大平台支撑精兵作战”&#xff0c;即前线小团队作战&#xff0c;后方建设强大的火力平台和信息化指挥系统机动支撑。企业中台战略随着Supercell、阿里巴巴、腾讯、华为等国内外科技巨头的应用和宣传&#xff0c;近年来在国内被…

第一百三十六期:详细讲解 Redis 的两种安装部署方式

Redis 是一款比较常用的 NoSQL 数据库&#xff0c;我们通常使用 Redis 来做缓存&#xff0c;这是一篇关于 Redis 安装的文章&#xff0c;所以不会涉及到 Redis 的高级特性和使用场景&#xff0c;Redis 能够兼容绝大部分的 POSIX 系统。 作者&#xff1a;平头哥 Redis 是一款比…

知识图谱需要解决的问题

1 知识图谱应用场景 1、数据可视化 2、基于图谱的问答系统 3、基于图谱的关系推理 4、便捷的关系查询&#xff0c;给模型提供更多数据特征 2 知识图谱的构建 非结构化数据源中的实体识别&#xff1a;一般来说是一个sequence labeling的任务。 非结构化数据源中的关系抽取&am…

spring mvc学习(43):处理静态资源

上图是目录结构&#xff0c;本节是有问同学的&#xff0c;当好好总结 pom.xml <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation"http://maven.apache.org/POM/4.0.…

每天学一点flash(14) as3.0 处理xml (官方)

把官方的教程贴上来&#xff0c;我觉得还是不错的说得很有条理&#xff1a; 转载于:https://www.cnblogs.com/guoyiqi/archive/2007/08/21/2069585.html

Spring AOP学习笔记

需明确的几个概念: l 通知(Advice)&#xff1a;用于告知系统将有哪些新的行为。l 切入点(Pointcut):定义了通知应该在应用到那些连接点。l 目标对象(Target)&#xff1a;被通知的对象。l 代理(Proxy)&#xff1a;将通知应用到目标对象后创建的…

spring mvc学习(44):springMVC运行原理

springMVC处理请求的流程 SpringMVC的工作原理图&#xff1a; SpringMVC流程 1、 用户发送请求至前端控制器DispatcherServlet。 2、 DispatcherServlet收到请求调用HandlerMapping处理器映射器。 3、 处理器映射器找到具体的处理器(可以根据xml配置、注解进行查找)&…

一段按页自动滚动文字或图片的Js代码

<div iddemo style"position:relative;padding:10px;border:solid 1px green;BACKGROUND: #ffffff; OVERFLOW: hidden; WIDTH: 510px; COLOR: red; HEIGHT: 100px"><div id"demo1"style"position:relative;">您的图片或者要滚动的内…

spring mvc学习(45):springMVC的三大组件

SpringMvc框架结构图 处理器映射器&#xff1a;用户请求路径到Controller方法的映射处理器适配器&#xff1a;根据handler(controlelr类&#xff09;的开发方式&#xff08;注解开发/其他开发&#xff09; 方式的不同区寻找不同的处理器适配器 视图解析器&#xff1a;根据hand…

[NLP-CNN] Convolutional Neural Networks for Sentence Classification -2014-EMNLP

1. Overview 本文将CNN用于句子分类任务 (1) 使用静态vector CNN即可取得很好的效果&#xff1b;> 这表明预训练的vector是universal的特征提取器&#xff0c;可以被用于多种分类任务中。 (2) 根据特定任务进行fine-tuning 的vector CNN 取得了更好的效果。 (3) 改进模型架…

知识图谱中三元组抽取

内容来自七月算法nlp课程。 这是要解决知识图谱中的其中一个问题&#xff1a;从非结构文本中抽取三元组。 要解决这个问题&#xff0c;总体思路有通过模板抽取、通过模型抽取。 三元组工业界一般都存储在neo4j中&#xff0c;学术界会采用RDF形式存储。 1结构化数据抽取 定义…

spring mvc学习(46):自定义配置类

上图是目录结构&#xff0c;本节是有问同学的&#xff0c;当好好总结 pom.xml <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation"http://maven.apache.org/POM/4.0.…