NLP预训练模型系列-BERT

2023-11-07



NLP预训练模型系列文章目录

1. BERT

2. GPT

3. GPT-2

4. GPT-3

5. RoBERTa

6. BART

7. XLNet







前言

NLP号称人工智能领域皇冠上的明珠。本系列文章会对NLP经典预训练模型系列论文做一个学习和记录。






从BERT开始

首先从具有深远影响意义的BERT开始。由于网上关于BERT的解读的文章和视频很多了,这里只是重新阅读一下BERT的原文然后做一下记录,记录一些之前没关注的细节即可。

1. Abstract

        从摘要中,我们主要看到的是BERT的创新点是双向语言表示,使用这个预训练的BERT我们可以只添加一个输出层就能创建很多下游任务的sota模型,包括问答,语言推理。  

        BERT的全称是Bidirectional Encoder Representations from Transformers,可以得知BERT是一个Transformer Encoder。

2. Introduction

        在Introduction中,论文提到,目前有两种在下游任务利用预训练语言表示的方法:feature-based和fine-tuning。

  • feature-based方法:如ELMo,使用任务相关的架构,将预训练的表示作为额外的特征。
  • fine-tuning based方法:如GPT,引入少量任务相关的参数,通过简单微调所有预训练的参数,在下游任务进行训练。

        这两种方法使用同一个预训练目标函数,都是单向语言模型。这种方法对句子级别(sentence-level)的任务是次优的,并且对词汇级别(token-level)的任务,如问答,使用fine-tuneing based方法是非常有害的,因为两个方向的上下文都很重要。

        因此,我们提出BERT来提升fine-tuning based方法,减轻了单向的限制。这是通过masked language model(MLM)预训练目标函数实现的(类似于完型填空)。即基于上下文预测随机mask掉的单词的vocab id。

        除了MLM,我们还使用了next sentence prediction(NSP)任务来联合预训练文本对表示。

        论文的contribution:

        (1)证明了双向预训练对语言表征的重要性

        (2)证明了预训练的表示减少了针对特定任务的高度工程化的模型的需要。

        (3)BERT提升了11向NLP任务的sota。

code address:  https://github.com/google-research/bert

3. Related Work

        相关工作包括:

  • 无监督的feature-based方法,如ELMo:上下文敏感的特征,双向LSTM,提升了问答,情感分析,命名实体识别任务。
  • 无监督的fine-tuning based方法,如OpenAI GPT:Left-to-Right LM, 自编码(auto-encoder)目标函数在GLUE中的很多句子级别的任务取得很好的效果。
  • 从有监督数据进行迁移学习:如自然语言推理,机器翻译任务,以及CV中的预训练模型4。

4. BERT

BERT模型图

         贴一下BERT的模型图,模型架构就是一个Transformer Encoder。分为两个步骤:预训练和微调。预训练阶段在无监督数据上训练,微调阶段时,首先用预训练参数初始化,然后所有参数在下游有监督数据上进行微调。注意,每个下游任务都有一个单独微调好的模型,每个任务的模型架构只有很小的区别,即分类头不同。

        BERT报告了两个不同的model size:(L是层数(Transformer blocks, ),H是Hidden Size,A是self-attention的head数)

  • BERT-base: L = 12, H = 768, A = 12, Total Parameters = 110M
  • BERT-large: L = 24, H = 1024, A = 16, Total Parameters = 340M

BERT-base选择和GPT模型大小相同是为了方便比较。

Input/Output Representations: 

        使用WordPiece embeddings, vocab size = 30000。每个sequence的开始是一个[CLS] token,这个token的最后一个隐藏状态作为做聚合的序列表示用于分类任务。句子对也被打包为一个sequence。使用[SEP]区分两个sentence。

        如下图所示,Input Embeddings = Token Embeddings + Segment Embeddings + Posotion Embeddings。

4.1 BERT预训练

两个任务:

  • Masked LM:每个sequence中随机mask15%的 WordPiece tokens,然后预测masked words。这样做导致和下游任务有一个不匹配问题,因为fine-tuning时没有[MASK] token。因此为了缓解这个问题,我们不是总是replace words with [MASK], 而是先随机选择15%的token positions,然后对选中的position进行一下三种操作:(1)80%的时间[MASK] (2) 10%的视觉random token,10%的时间unchanged。然后Ti(即选中位置的最后一层输出的隐藏状态)被用于预测原来的token,使用交叉熵损失。
  • NSP: 许多下游任务是基于理解两个句子间关系的,如问答,自然语言推理,因此我们设置了这样一个next sentence prediction这样的二分类任务。我们选择句子A和句子B,50%的视觉B是真实的下一个句子(IsNext),50%的时间是一个随机的句子(NotNext), [CLS] token的最后一个隐藏状态C用于分类。

预训练数据:

BookCorpus(800M words)和English Wikipedia(2500M words)。Wikipedia只抽取了文本段,忽略了表格和标题。

5 Experiments

GLUE

GLUE是General Language Understanding Evaluation benchmark

batch size = 32, 每个GLUE task fine-tune 3 个epochs。

此外BERT-large在小数据集上有时不稳定。

GLUE测试结果如下表所示:

SQuAD v1.1

Stanford Question Answering Dataset(SQuAD v1.1)包含100k众包问答对,给定问题和来自Wikipedia的包含答案的文章,该任务是预测文章中的answer text span。

结果如下:

SQuAD v2.0 

SWAG

The Situations With Adversarial Generations (SWAG) dataset包含113k句子对对抗样本,用于品谷常识推理,结果如下:

6  Ablation Studies

消融实验主要评估了预训练任务的影响,Model Size的影响,使用BERT做feature-based的方法的实验说明BERT用于feature-based和fine-tuning based方法都很高效。

7. Conclusion

本文提出了BERT,使用了双向架构,使得相同的模型能成功处理大量不同的NLP任务。

BERT论文链接






总结

以上对BERT原论文做了较为详细的阅读记录,确实多了解了一些之前没考虑过的细节。BERT最大的贡献在于它的双向语言建模能力,不同于GPT的单向语言建模。这种双向建模能力是通过设计预训练任务MLM和Transformer Encoder架构实现的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

NLP预训练模型系列-BERT 的相关文章

  • word2vec中单词的向量代表什么?

    word2vec https code google com p word2vec 是 Google 的开源工具 它为每个单词提供一个浮点值向量 它们到底代表什么 还有一篇论文关于段落向量 http cs stanford edu quoc
  • python 中单词的动名词形式

    我想获得字符串的动名词形式 我还没有找到调用库来获取动名词的直接方法 我应用了以 ing 结尾的单词的规则 但是因为异常导致我收到了一些错误 然后 我检查 cmu 单词以确保生成的动名词单词正确 代码如下 import cmudict im
  • 如何计算两个文本文档之间的相似度?

    我正在考虑使用任何编程语言 尽管我更喜欢 Python 来从事 NLP 项目 我想获取两个文档并确定它们的相似程度 常见的方法是将文档转换为 TF IDF 向量 然后计算它们之间的余弦相似度 任何有关信息检索 IR 的教科书都涵盖了这一点
  • target_vocab_size 在方法 tfds.features.text.SubwordTextEncoder.build_from_corpus 中到底意味着什么?

    根据这个链接 https www tensorflow org datasets api docs python tfds features text SubwordTextEncoder build from corpus target
  • 将单引号替换为双引号并排除某些元素

    我想用双引号替换字符串中的所有单引号 但出现的情况除外 例如 n t ll m 等 input the stackoverflow don t said hey what output the stackoverflow don t sai
  • 如何训练斯坦福 NLP 情感分析工具

    地狱大家 我正在使用斯坦福核心 NLP 包 我的目标是对推文直播进行情感分析 按原样使用情感分析工具对文本 态度 的分析非常差 许多积极因素被标记为中性 许多消极因素被评为积极 我已经在文本文件中获取了超过一百万条推文 但我不知道如何实际获
  • 如何确保用户只提交英文文本

    我正在构建一个涉及自然语言处理的项目 由于nlp模块目前只处理英文文本 所以我必须确保用户提交的内容 不长 只有几个单词 是英文的 是否有既定的方法来实现这一目标 首选 Python 或 Javascript 方式 如果内容足够长我会推荐一
  • Node2vec 的工作原理

    我一直在读关于node2vec https cs stanford edu jure pubs node2vec kdd16 pdf嵌入算法 我有点困惑它是如何工作的 作为参考 node2vec 由 p 和 q 参数化 并通过模拟来自节点的
  • 将复数名词转换为单数名词

    如何使用 R 将复数名词转换为单数名词 我使用 tagPOS 函数来标记每个文本 然后提取所有标记为 NNS 的复数名词 但是如果我想将这些复数名词转换为单数该怎么办 library openNLP library tm acq o lt
  • 快速NLTK解析成语法树

    我正在尝试将数百个句子解析为语法树 我需要快速完成 问题是如果我使用 NLTK 那么我需要定义一个语法 而我不知道我只知道它会是英语 我尝试使用this https github com emilmont pyStatParser统计解析器
  • openNLP 与 Solr 集成时出现异常

    我正在尝试将 openNLP 与 Solr 6 1 0 集成 我配置了架构和 solrconfig 文件 详细信息请参见 wiki 链接 https wiki apache org solr OpenNLP https wiki apach
  • SpaCy 中的自定义句子边界检测

    我正在尝试在 spaCy 中编写一个自定义句子分段器 它将整个文档作为单个句子返回 我编写了一个自定义管道组件 它使用以下代码来执行此操作here https github com explosion spaCy issues 1850 但
  • 如何在Python中使用多处理来加速循环执行

    我有两个清单 列表 A 包含 500 个单词 列表 B 包含 10000 个单词 我正在尝试为列表 A 找到与 B 相关的相似单词 我正在使用 Spacy 的相似函数 我面临的问题是计算需要很长时间 我是多处理使用的新手 因此请求帮助 如何
  • 如何将标记化中的多单词名称保留在一起?

    我想使用 TF IDF 特征对文档进行分类 一种方法是 from sklearn feature extraction text import TfidfVectorizer import string import re import n
  • 用于词性标记的优秀 Java 库是什么? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 使用 SciKit-learn 和大型数据集进行文本分类

    首先 我昨天开始学习Python 我正在尝试使用 SciKit 和大型数据集 250 000 条推文 进行文本分类 对于该算法 每条推文都将表示为 4000 x 1 向量 因此这意味着输入为 250 000 行和 4000 列 当我尝试在
  • spacy 如何使用词嵌入进行命名实体识别 (NER)?

    我正在尝试使用以下方法训练 NER 模型spaCy识别位置 人 名和组织 我试图理解如何spaCy识别文本中的实体 但我无法找到答案 从这个问题 https github com explosion spaCy issues 491在 Gi
  • 对产品列表进行分类的算法? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我有一个代表或多或少相同的产品的列表 例如 在下面的列表中 它们都是希捷硬盘 希捷硬盘 500Go 适用于笔记本电脑的希捷硬盘 120
  • R 中带有变音符号的字符列表

    我试图将字符串中的电话 字符 出现次数制成表格 但变音符号单独作为字符制成表格 理想情况下 我有一个国际音标的单词列表 其中包含大量变音符号以及它们与基本字符的几种组合 我在这里给出了仅包含一个单词的 MWE 但对于单词列表和更多类型的组合
  • 在 Python 中识别大型字符串列表中的项目之间的文本相似性的最有效方法是什么?

    下面的代码实现了我想要实现的结果 有一个称为 引理 的字符串列表 其中包含特定类别单词的可接受形式 另一个列表称为 形式 包含在不同时期和特定语言的不同方言的大量文本中发现的单词的许多拼写变体 对于 forms 中的每个单词 我想获取 le

随机推荐

  • 伺服控制-canopen

    通迅中断参数设 1 中断 停止 伺服驱动 电机停转 开启抱死动作 1 配置 opration 2 设置 3速度模式 3 设置 伺服松轴 4 设置 伺服使能 运行 1 使能 true 2 启用 true 停止 1 使能 false 2 松轴
  • Linux下安装Nginx服务并设置开机自启动

    目录 一 安装Nginx 二 开机自启动服务配置 一 安装Nginx 系统平台 CentOS Linux release 7 9 2009 Core 64位 Nginx安装版本 liunx 64位 nginx 1 20 2 tar gz 安
  • VSCode进行Lua调试

    1 安装EmmyLua 2 添加配置 3 开始调试 要选择要调试的进程就可以了
  • Docker中快速搭建SFTP

    1 拉docker镜像 docker pull atmoz sftp 2 初始化 创建容器 docker run name internalsftp p 22 22 d atmoz sftp anonymous hello123 opt U
  • 震惊~Signal <XXX> missing in the sensitivity list is added for synthesis purposes在verilog中警告的解决方法

    你是否还在为秃头而烦恼 你是否还在通宵为了赶项目而焦急 朋友 你不是 一个人 看看吧 下面是这个bug的描述 WARNING HDLCompiler 91 F FPGA Doc AD test uart v Line 56 Signal
  • java通过JDBC连接mysql8.0数据库,并对数据库中的表进行增删改查操作

    目录 一 JDBC简介 二 添加依赖 三 JDBC操作数据库的步骤 四 JDBC操作数据库 增删改查 一 新增数据 二 删除数据 三 修改数据 四 查询数据 五 多表连接查询 一 JDBC简介 Java数据库连接 Java Database
  • vue-cli配置sass,使用全局sass变量

    vue cli创建vue2 0项目 安装sass步骤 创建vue2 0项目 vue init webpack 项目名 安装sass步骤 npm install node sass 4 14 1 npm install sass loader
  • JMP、Hook

    include stdio h include tchar h include windows h offset 目标地址 jmp指令起始地址 5 跳转指令解码 0xe9 offset offset 有符号整型 四字节 它等于jmp指令的下
  • 微信小程序——仿盒马鲜生APP

    前段时间 随着马化腾现身全国多地用微信小程序乘坐公交的新闻出现 微信小程序的热度可谓是更上了一层 微信小程序现身至今 因其不用下载就可使用的方便等优点 发展趋势一直良好 盒马鲜生的问世也是充满了热度 实现了快速配送 可谓是阿里巴巴对线下超市
  • 科幻风的卡片视频播放

    上一篇博文展示了卡片中的VR展示 那篇主要是卡片的3D转动来展示未显示的部分图片 这篇 我们来点科幻的 我们在卡片中播放视频的同时来拖动卡片或转动它 像下面那样 这个主要依赖了两个库 具体代码如下
  • 浅谈js宏观任务、微观任务

    js运行机制分为同步异步 异步又分为宏观事件和微观事件 同步异步 js是一门单线程语言 因此js在同一个时间里只能做一件事 单线程意味着 如果在同个时间有多个任务的话 这些任务就需要排队 前一个执行完成才能执行下一个任务 同步任务 同步任务
  • Echarts:象形柱图实现水塔水位的动画、水球图和液位柱子图

    一 象形柱图 1 vue中使用象形柱图 效果图 2 代码实现
  • axios调接口 与缓存

    axios getarr1 let url https www fastmock site mock f5427ab2a4d20236b4aed7a0579d2213 api shop list 调接口 后端给的地址 this axios
  • 【React】手把手学习React - 元素渲染

    前言 大家好 分享了这么多文章发现无论是项目实战还是源码分析或者是基本使用 绝大多数文章都是关于Vue的 还没有关于React的分享 接下来从今天开始我们将一起学习一下React React与vue一样也是一个非常火爆的前端库 关于Reac
  • 设计模式--策略模式

    文章目录 策略 Strategy 模式 策略模式的收银软件 策略模式的特点 使用场景 优缺点 策略模式和工厂模式的结合 策略 Strategy 模式 本质 分离算法 选择实现 策略模式 针对一组算法 将每一个算法封装到具有共同接口的独立的类
  • g2o 学习

    参考文章 如需详细请看原文 SLAM从0到1 6 图优化g2o 从看懂代码到动手编写 长文 yikang的文章 知乎 https zhuanlan zhihu com p 121628349 从零开始一起学习SLAM 理解图优化 一步步带你
  • SSH连接服务器经常被断开解决方法

    SSH连接服务器经常被断开解决方法 vim etc ssh sshd config UseDNS no 修改成功之后 重启SSH服务 service sshd restart 连接服务器超时掉线解决办法 vim etc ssh sshd c
  • 推荐!国外程序员整理的机器学习资源大全

    本文汇编了一些机器学习领域的框架 库以及软件 按编程语言排序 C 计算机视觉 CCV 基于C语言 提供缓存 核心的机器视觉库 新颖的机器视觉库 OpenCV 它提供C C Python Java 以及 MATLAB接口 并支持Windows
  • vrep笔记

    这些天主要对vrep做了一些探索 一些笔记如下 1 urdf机器人模型文件的导入 点击plugins urdf importing即可 2 动力学模型的配置 将此处改成零 大意是以方框的正中心为质心 否则很容易抖 模型导入后坐标系都会被这个
  • NLP预训练模型系列-BERT

    NLP预训练模型系列文章目录 1 BERT 2 GPT 3 GPT 2 4 GPT 3 5 RoBERTa 6 BART 7 XLNet 目录 NLP预训练模型系列文章目录 前言 从BERT开始 1 Abstract 2 Introduct