[预训练语言模型专题] SpanBERT: 抽取式问答的利器

2023-11-05

本文为预训练语言模型专题的第16篇。

 

快速传送门   

1-4:[萌芽时代][风起云涌][文本分类通用技巧] 、 [GPT家族]

5-8:[BERT来临][浅析BERT代码][ERNIE合集]、[MT-DNN(KD)]

9-12:[Transformer][Transformer-XL][UniLM][Mass-Bart]

13-14:[跨语种模型][XLNet][RoBERTa]

知乎关注:https://zhuanlan.zhihu.com/naiveAI

感谢清华大学自然语言处理实验室对预训练语言模型架构的梳理,我们将沿此脉络前行,探索预训练语言模型的前沿技术,红框中为已介绍的文章,绿框中为本期介绍的模型,欢迎大家留言讨论交流

 

 

SpanBERT: Improving Pre-training by Representing and Predicting Spans(2020)

spanBERT是专门设计来更好地表示和预测文本的区间的,顾名思义它是BERT的一种扩展。相对于BERT,SpanBERT做了如下的改动。

  1. 相比于BERT是对于随机的token进行masking,spanBERT会对连续的span进行masking。

  2. spanBERT通过训练span的边界的表示,来对整个被mask的span来进行预测,而非其中的单个token。具体的说,文章引入了span-boundary objective(SPO),来鼓励模型将span层面的信息存储在其边界的token表示上,以在finetune阶段获得更好的效果。

由于这两个机制,spanBERT在span选择的任务上明显地比BERT表现要好,包括问答匹配和指代消岐。同时在SQuAD和OntoNotes上都取得了state-of-the-art的效果。在SQuAD上,相比于BERT,SpanBERT降低了27%的误差,在各种抽取式问答benchmark(NewsQA, TriviaQA, SearchQA, HotpotQA, Natural Questions) 也观察到了类似的收益。

另外作者发现,在单个的片段上进行预训练,比两个一半长的片段预训练(带NSP)效果要好,所以,作者在预训练的时候选择在单个片段上进行,对比的BERT baseline也是在单个片段上预训练的BERT,效果是比原来的BERT baseline上是提高的。

相比于其他approach通过增加训练的数据和加大模型的尺寸来提升性能。SpanBERT通过优化预训练模型的训练目标来提升效果。比如下图中展现了一个实例,被mask的是“an American football game"。SBO目标,就是用蓝色的x4(was)和x9(to)作为边界表示来预测被mask的每个token。从式子中可以看出MLM与SPO loss的区别,MLM利用x7的编码表示来预测football这个token,而SBO会利用,这个span(x5-x8)的边界 -> x4,x9和p3(从x4开始第三个token的位置embedding) 来进行预测。

Span Masking

对一个序列X = (x1, x2, . . . , xn), 我们选取它的一个子集Y进行mask。通过不断地选取span,直到选够了X中15%的token。选取的方法是,首先通过几何分布选取span的长度L,会微倾向于选取较短的span,然后,半随机地选取span的起始位置。我们经常会去sample一个完整的单词或短语,所以开始的位置一般选在单词的开始。选取长度时,官方的设置是 L ∼Geo(0.2),同时裁剪L使Lmax=10,于是span长度的分布如下,平均值为3.8。span masking,指的式对span中的每一个token都替换成[MASK]。

 

Span Boundary Objective(SBO)

SBO引入了目标函数来预测span内被mask的每一个token,只通过在span边界上被观察到的token的表示和其在span内的位置来进行预测。如果span内的token为 (xs, . . . , xe),(s, e)是其起始的位置和结束的位置,那么我们就会使用其外部的边界表示 xs−1 和 xe+1,以及目标token的位置embedding即Pi−s+1来对其进行表示。一般会用两层的线性层加非线性激活来得到logits以计算其cross-entropy loss。

Single-Sequence Training

BERT的预训练方法是每个样本包含两个片段序列 (XA, XB),训练目标包括MLM(masked language model) 以及NSP (next sentence prediction)。训练中可以用NSP去预测XA,XB是否是连接的。作者发现,这种训练方法几乎总是比单纯只用MLM去训练单个片段序列样本更差。他认为有如下原因

  • 用单个片段序列时,片段序列会更长,模型可以从中收益。

  • 有时候,XA,XB来自不同文档,会将噪声加入到masked language model中

因此,在SpanBERT的训练中,只用了单个长512的序列片段。

总结一下这三点就是,SpanBERT通过

  1. 通过几何分布抽样span长度,均匀分布寻找span的起始位置,并将其中的token全部mask。

  2. 除了MLM目标外,新添了SPO目标进行优化,使抽取能力更强。

  3. 使用了单个片段序列进行训练和预测,稳定提升。

模型细节

大部分设置和BERT相同,不同点有如下

  • 相比于BERT对每个样本进行十种不同的mask,然后进行40个epoch的训练,SpanBERT会在每个epoch都对序列进行不同的masking。

  • 移除了BERT的短句训练的策略,原来BERT会以0.1的概率用短文本进行训练,同时前90%的训练会以长128的序列来训练。

  • 模型会跑2.4M步, AdamW的epsilon 使用 1e-8,因为这样收敛得更好。

  • SBOloss中使用的位置编码为200维,对应离span最左侧的距离。

  • 预训练使用了32张V100,花了15天完成。

接着作者在一些数据集上进行了一些比较。

结论

作者在17个任务上比较了SpanBERT和BERT,几乎所有任务上SpanBERT都更好。并且,SpanBERT由于其目标的机制,其更擅长抽取式问答。最后,使用单个片段序列的预测和训练好过,带有NSP的双片段样本进行训练,这让作者有点惊讶,因为BERT论文中的对比实验,显示NSP是有收益的。不过编者介绍的前篇推送中也讲到了,RoBERTa的研究中也认为NSP会降低模型的性能。

未完待续

本期的论文就给大家分享到这里,感谢大家的阅读和支持,下期我们会给大家带来其他预训练语言模型的介绍,敬请大家期待!

欢迎关注朴素人工智能,这里有很多最新最热的论文阅读分享,有问题或建议可以在公众号下留言。

●  [预训练语言模型专题] RoBERTa: 捍卫BERT的尊严

● [预训练语言模型专题] Transformer-XL 超长上下文注意力模型

●  [预训练语言模型专题] XLNet:公平一战!多项任务效果超越BERT

●  [预训练语言模型专题] Huggingface简介及BERT代码浅析

● [预训练语言模型专题] 结合HuggingFace代码浅析Transformer

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

[预训练语言模型专题] SpanBERT: 抽取式问答的利器 的相关文章

  • 通过 add_subplot 添加子图后如何共享轴?

    我有一个像这样的数据框 df pd DataFrame A 0 3 0 2 0 5 0 2 B 0 1 0 0 0 3 0 1 C 0 2 0 5 0 0 0 7 D 0 6 0 3 0 4 0 6 index list abcd A B
  • sklearn 估计器管道的参数无效

    我正在实现 O Reilly 书中的一个示例 Python 机器学习简介 使用 Python 2 7 和 sklearn 0 16 我正在使用的代码 pipe make pipeline TfidfVectorizer LogisticRe
  • 键入的完整命令行

    我想获得输入时的完整命令行 This join sys argv 在这里不起作用 删除双引号 另外 我不想重新加入已解析和拆分的内容 有任何想法吗 你太迟了 当键入的命令到达 Python 时 您的 shell 已经发挥了它的魔力 例如 引
  • Keras model.predict 函数给出输入形状错误

    我已经在 Tensorflow 中实现了通用句子编码器 现在我正在尝试预测句子的类概率 我也将字符串转换为数组 Code if model model type universal classifier basic class probs
  • 将 Python Pandas DataFrame 写入 Word 文档

    我正在努力创建一个使用 Pandas DataFrames 的 Python 生成的报告 目前我正在使用DataFrame to string 方法 但是 这会作为字符串写入文件 有没有办法让我实现这一目标 同时将其保留为表格 以便我可以使
  • 查找正在导入哪些 python 模块

    从应用程序中使用的特定包中查找所有 python 模块的简单方法是什么 sys modules是将模块名称映射到模块的字典 您可以检查其键以查看导入的模块 See http docs python org library sys html
  • App Engine NDB:如何访问属性的 verbose_name

    假设我有这个代码 class A ndb Model prop ndb StringProperty verbose name Something m A m prop a string value 当然 现在如果我打印 m prop 它会
  • 用 Python 绘制直方图

    我有两个列表 x 和 y x 包含字母表 A Z Y 包含它们在文件中的频率 我尝试研究如何在直方图中绘制这些值 但在理解如何绘制它方面没有成功 n bins patches plt hist x 26 normed 1 facecolor
  • 正在使用 PIL 保存损坏的图像

    我遇到一个问题 操作图像像素导致保存损坏的图像 因此 我使用 PIL 打开图像 然后将其转换为 NumPy 数组 image Image open myimage png np image np asarray image 然后 我转置图像
  • Py2exe - Pmw WindowsError:[错误 3]

    我正在尝试使用 Py2exe 构建独立的可执行文件 我已经导入了 Pmw 类 当我运行独立可执行文件时 出现以下错误 Traceback most recent call last File py line 9 in
  • 高级描述熊猫

    有没有像 pandas 那样更高级的功能 通常我会继续这样 r pd DataFrame np random randn 1000 columns A r describe 我会得到一份很好的总结 就像这样 A count 1000 000
  • 为什么将模块级代码放入函数中然后调用该函数在Python中速度更快?

    在亚历克斯 马尔泰利的回应中使 Python 脚本面向对象 https stackoverflow com questions 1813117 making a python script object oriented 他提到在 Pyth
  • python Recipe:列出最接近等于值的项[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 考虑像这样的列表 0 3 7 10 12 15 19 21 我想获得最接近任何值的最近的最小数字 所以如果我通过4 我会得到3 如果我
  • 无法导入QUERY_TERMS

    我正在运行一个网站Python and Django Django filters 2 1 installed Django 2 1 installed 当我运行时 我收到以下错误 importError Could not import
  • Python 2.7 缩进错误[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 这个问题是由拼写错误或无法再重现的问题引起的 虽然类似的问题可能是on topic help on topic在这里 这个问题的解决方式不
  • 无需访问 Internet 即可部署 Django 的简单方法?

    我拥有的是使用 Django 开发的 Intranet 站点的开发版本以及放置在 virtualenv 中的一些外部库 它运行良好 我可以在任何具有互联网连接的计算机上使用相同的参数 使用 pip 轻松设置 virtualenv 但是 不幸
  • python中有没有一种方法可以将存储在列表中的正则表达式模式列表应用到单个字符串?

    我有一个正则表达式模式列表 存储在列表类型中 我想将其应用于字符串 有谁知道一个好方法 将列表中的每个正则表达式模式应用于字符串 和 如果匹配 则调用与列表中该模式关联的不同函数 如果可能的话我想用 python 来做这件事 提前致谢 im
  • 使用 MPI 的 Allreduce 对 Python 对象求和

    我正在使用使用 Python 中的字典和计数器构建的稀疏张量数组操作 我想让并行使用这个数组操作成为可能 最重要的是 我最终在每个节点上都有计数器 我想使用 MPI Allreduce 或另一个不错的解决方案 将其添加在一起 例如 使用计数
  • 在Python中停止ThreadPool中的进程

    我一直在尝试为控制某些硬件的库编写一个交互式包装器 用于 ipython 有些调用对 IO 的影响很大 因此并行执行任务是有意义的 使用 ThreadPool 几乎 效果很好 from multiprocessing pool import
  • Biopython 可以执行 Seq.find() 来解释歧义代码吗

    我希望能够在 Seq 对象中搜索考虑歧义代码的子序列 Seq 对象 例如 以下内容应该是正确的 from Bio Seq import Seq from Bio Alphabet IUPAC import IUPACAmbiguousDNA

随机推荐

  • mysql和c#在类型转换的问题

    1 char 36 和string mysql在将char 36 类型的会转成System GUID 如果char 36 字段里存的不是guid 最好不要用char 36 改成char 37 这样的就没事了 在 net开放中 asp net
  • 李晓波

    一 大败局 第一部 这套书 真的写出来改革开放以来 中国比较出名的企业的生存与失败 这套书可以指导我十年吧 这几本书应该每两年翻阅一遍 1 秦池酒的成功与失败 中国标王 广告对普通人的影响 公关 品牌营销 2013 11 20 二 中国经济
  • cygwin环境编译 致命错误:stddef.h:can not found

    最近需要在linux下运行代码 为了省去搭建环境的时间 就使用了cygwin这一工具 但它在编译过程中 出现了can not found stddef h的问题 原因是库文件sttdef h没有找到 上网查了一下 有的博客写到需要对g 降级
  • 使用MongoDB命令连接远程服务器的MongoDB数据库

    使用MongoDB命令连接远程服务器的MongoDB数据库 MongoDB连接远程服务器的命令格式如下 mongo 远程主机ip或DNS MongoDB端口号 数据库名 u user p password MongoDB连接远程服务器的命令
  • LeetCode 每日一题 2023/9/11-2023/9/17

    记录了初步解题思路 以及本地实现代码 并不一定为最优 也希望大家能一起探讨 一起进步 目录 9 11 630 课程表 III 9 12 1462 课程表 IV 9 13 2596 检查骑士巡视方案 9 14 1222 可以攻击国王的皇后 9
  • AcWing167. 木棒(DFS+剪枝)

    输入样例 9 5 2 1 5 2 1 5 2 1 4 1 2 3 4 0 输出样例 6 5 解析 DFS 搜索顺序 根据木棒的长度从小到大枚举每根木棒 对于每根木棒 枚举可以由哪些木棍拼成 如果所有的木棍拼成了长度相等的多个木棒 说明找到了
  • PGSQL(学习与操作)

    PGSQL操作手册 1 Navicat连接数据库 192 168 31 0 密码 123456 port 5432 2 PGSQL数据库基础学习 1 创建数据库 CREATE DATABASE runoobdb 创建数据库 数据库名为run
  • ubuntu 18 OpenCV 4.5.3 cuda 源码编译

    目录 opencv453 build build sh opencv 4 5 3 opencv contrib 4 5 3 编译命令 创建 build sh 文件 pwd cmake D CMAKE BUILD TYPE RELEASE D
  • 基于蚁群算法求解运钞车路径规划问题(Matlab代码实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 3 Matlab代码实现 4 参考文献 1 概述 车辆路径规划问题 Vehicle Rout
  • 【factoryio】虚拟工厂 的安装和使用

    文章目录 目录 文章目录 前言 一 factoryio是什么 二 factoryio的安装和使用 1 安装 2 激活 3 使用 三 factoryio和西门子PLC进行仿真连接 1 在博途软件中打开工程模板 2 进行仿真连接 3 点动实例
  • 机器学习笔记4-Tensorflow线性模型示例及TensorBoard的使用

    前言 在上一篇中 我简单介绍了一下Tensorflow以及在本机及阿里云的PAI平台上跑通第一个示例的步骤 在本篇中我将稍微讲解一下几个基本概念以及Tensorflow的基础语法 本文代码都是基于API版本r1 4 本文中本地开发环境为Py
  • ubuntu 安装软件idea

    sudo dpkg i sogoupinyin 2 0 0 0072 amd64 deb 把Idea放到你想要方的位置 sudo cp ideaIU 2018 1 6 tar gz usr local 解压 sudo tar zxvf id
  • python自动播放网页视频_[JavaScript] audio在浏览器中自动播放

    audio 在浏览器中自动播放 autoplay 属性 autoplay 属性规定一旦音频就绪马上开始播放 如果设置了该属性 音频将自动播放 使用 autoplay 属性进行播放 使用autoplay属性 var src award wav
  • CVE-2005-1794

    Microsoft Windows远程桌面协议中间人攻击漏洞 CVE 2005 1794 漏洞解决方案 Windows server2003 1 启动 终端服务配置 2 选择 连接 看到 RDP Tcp 在其上右键 选择 属性 3 常规 选
  • 期货开户保持一颗平常心

    在交易中人性的贪婪具体表现 1 重仓进场 频繁更改策略 希望下一分钟的行情如你所愿 实现一夜暴富 2 贪小钱舍大钱 赚钱时 担心下一秒回调 避免损失 急于了结 赔钱时 不愿意小赔离场 紧攥亏损单 期待价格回到开仓价附近赚钱后再平仓 而导致损
  • 五分钟了解最短路径寻路算法:Dijkstra 迪杰斯特拉

    最短路径查找算法 寻路算法在生活中应用十分常见 本文实现的是关于图的最短路径查找算法 该算法比较常见于游戏和室内地图导航 实现 例子 几个节点之间 相连接的线段有固定长度 该长度决就是通过代价 查找到花费最少的路径 该图结构为 mermai
  • conflux.web3j.RpcException:data = “\“network prefix inconsistent in from(net999) and to(cfxtest)\““

    java conflux sdk报错 SLF4J Failed to load class org slf4j impl StaticLoggerBinder SLF4J Defaulting to no operation NOP log
  • 零基础学Java,这些学习要点一定得注意!

    许多年的编码经历 在Java编程的路上磕磕绊绊也算是经历啦许多 今天我向大家分享一些我个人的自学方法 现在在网上报个正经点的班得花几千块钱 线下就更夸张 都是万元起步 我的这些学习方法如果你能用好 跟花几万块钱报班效果一样强大 希望能在编程
  • 数组的push()、pop()、shift()和unshift()方法

    JavaScript的数组是一个拥有堆栈和队列自身优点的global对象 也就是说JavaScript数组可以表现的像栈 LIFO 和队列 FIFO 一样操作 这也是JavaScript数组强大的可操作性的体现 堆栈和队列 栈和队列都是动态
  • [预训练语言模型专题] SpanBERT: 抽取式问答的利器

    本文为预训练语言模型专题的第16篇 快速传送门 1 4 萌芽时代 风起云涌 文本分类通用技巧 GPT家族 5 8 BERT来临 浅析BERT代码 ERNIE合集 MT DNN KD 9 12 Transformer Transformer