当前位置: 首页 > article >正文

STRUCTBERT:将语言结构融入预训练以提升深度语言理解

【摘要】最近,预训练语言模型BERT(及其经过稳健优化的版本RoBERTa)在自然语言理解(NLU)领域引起了广泛关注,并在情感分类、自然语言推理、语义文本相似度和问答等各种NLU任务中达到了最先进的准确率。受到Elman [8] 线性化探索工作的启发,我们在BERT的基础上提出了一种新模型StructBERT,通过在预训练过程中融入语言结构来提升表现。具体而言,我们为StructBERT设计了两个辅助任务,以充分利用单词和句子的顺序信息,从而在词级和句子级别上利用语言结构。这使得新模型能够适应下游任务所需的不同层次的语言理解能力。在引入结构化预训练后,StructBERT在多个下游任务上取得了出色的实验结果。例如,在GLUE基准测试中达到89.0的分数(超越所有已发布模型),在SQuAD v1.1问答任务中F1分数达到93.0,在SNLI数据集上的准确率达到91.7。

1,引言

预训练语言模型(LM)是许多自然语言理解(NLU)任务的关键组件,例如语义文本相似度 [4]、问答 [21] 和情感分类 [25]。为了获得可靠的语言表示,神经语言模型利用自监督学习来定义文本中单词序列的联合概率分布。与传统的基于单词的嵌入方法不同(即为每个标记分配一个全局表示),近年来的研究(如 Cove [16]、ELMo [18]、GPT [20] 和 BERT [6])通过在大规模文本语料库上训练语言模型,生成上下文化的单词向量。这些模型已被证明在许多下游NLU任务中具有良好的效果。

在上下文敏感的语言模型中,BERT(及其经过稳健优化的版本RoBERTa [15])席卷了NLP领域。BERT的设计旨在通过在所有层中同时考虑左右上下文来预训练双向表示,并仅通过上下文来预测被掩码的单词,以学习语言表示。然而,它并未充分利用潜在的语言结构。

根据 Elman [8] 的研究,循环神经网络(RNN)在处理简单句子时对单词顺序的规律性表现出敏感性。由于语言的流畅性取决于单词和句子的排序,因此在许多自然语言处理(NLP)任务(如机器翻译和自然语言理解 [9])中,找到一组单词和句子的最佳排列方式是一个关键问题。近年来,单词排序被视为基于语言模型(LM)的线性化任务,仅依赖语言模型进行处理 [24]。Schmaltz 的研究表明,即使没有显式的句法信息,带有长短时记忆(LSTM)单元的循环神经网络语言模型(RNN-LM)[17] 也能有效地完成单词排序任务。

在本文中,我们介绍了一种新的上下文表示方式——StructBERT,它通过提出两种新的线性化策略,将语言结构引入到BERT的预训练中。具体而言,除了现有的掩码策略外,StructBERT 还利用结构信息来扩展 BERT,包括词级顺序和句级顺序。我们在模型预训练过程中分别针对句内结构和句间结构引入了两个新的结构化目标。通过这种方式,语言学特征在预训练过程中得到了显式捕捉。通过结构化预训练,StructBERT 在上下文化表示中编码了单词之间以及句子之间的依赖关系,从而使模型具有更好的泛化能力和适应性。

  • 我们提出了一种新颖的结构化预训练方法,通过引入词级结构目标和句级结构目标扩展 BERT,在上下文化表示中利用语言结构。这使得 StructBERT 能够显式建模语言结构,并通过强制模型重建正确的单词和句子顺序来进行准确预测。

  • StructBERT 在各种自然语言理解(NLU)任务上显著超越了所有已发布的最新模型。该模型扩展了 BERT 的优势,并在语义文本相似度、情感分析、文本蕴含和问答等语言理解应用中提升了性能。

2,StructBERT 模型预训练

StructBERT 基于 BERT 架构,后者使用多层双向 Transformer 网络 [26]。给定一个单独的文本句子或一对文本句子,BERT 将它们打包成一个令牌序列,并为每个令牌学习一个上下文化的向量表示。每个输入令牌的表示是基于该词、位置以及它所属的文本片段。接下来,输入向量被送入一堆多层双向 Transformer 块,这些块使用自注意力机制,通过考虑整个输入序列来计算文本表示。

原始的 BERT 引入了两个无监督的预测任务来预训练模型:即掩码语言模型(Masked LM)任务和下一个句子预测任务。与原始 BERT 不同,我们的 StructBERT 通过在单词掩码后打乱一定数量的令牌并预测正确的顺序,增强了掩码语言模型任务的能力。此外,为了更好地理解句子之间的关系,StructBERT 随机交换句子顺序,并预测下一个句子和前一个句子,作为一种新的句子预测任务。通过这种方式,新的模型不仅显式地捕捉了每个句子中细粒度的词语结构,还以双向的方式正确地建模了句间结构。一旦通过这两个辅助任务预训练了 StructBERT 语言模型,我们就可以在任务特定数据上进行微调,以适应广泛的下游任务。

2.1,输入表示

每个输入 x 是一系列词元,可以是一个单独的句子,也可以是两个句子组成的对。输入表示遵循 BERT [6] 中使用的方式。对于每个输入词元 t_i,其向量表示 x_i 是通过将对应的词元嵌入、位置嵌入和段落嵌入相加来计算的。我们总是将一个特殊的分类嵌入([CLS])作为每个序列的第一个词元,并在每个段落的末尾添加一个特殊的序列结束标记([SEP])。文本通过 WordPiece [30] 被分词为子词单元,绝对位置嵌入是通过支持的最大序列长度(最多 512 个词元)进行学习的。此外,段落嵌入用于区分一对句子,就像 BERT 中一样。

2.2,Transformer Encoder

我们使用多层双向 Transformer 编码器 [26] 来对输入表示进行上下文信息编码。给定输入向量 X=\left \{ x_i \right \}_{i=1}^N,使用 L 层 Transformer 对输入进行编码,表示为:

H^l=Transformer_{l}(H^{l-1})

其中:l\in[1,L]H^0=XH^L=[h_1^L,...,h_N^L]。我们使用隐藏向量 h_i^L 作为输入词元 t_i的上下文化表示。

2.3,预训练目标

为了充分利用语言中丰富的句内和句间结构,我们在原始 BERT 的预训练目标基础上进行了两方面的扩展:

  • 词汇结构目标(主要用于单句任务)

  • 句子结构目标(主要用于句子对任务)

我们将这两个辅助目标与原始的掩码语言模型(LM)目标一起,在统一的模型中进行预训练,以利用语言的固有结构。

【词汇结构目标】尽管原始 BERT 在各种自然语言理解(NLU)任务中取得了成功,但它无法显式地建模自然语言中词语的顺序和高阶依赖关系。给定一组随机顺序的词汇,理想的语言模型应该能够通过重构这些词汇的正确顺序来恢复原句。为了在 StructBERT 中实现这一想法,我们在 BERT 的训练目标基础上增加了一个新的词汇结构目标,使模型具备了重构某些故意打乱顺序的词元正确顺序的能力。这个新的词汇目标与 BERT 的原始掩码语言模型(LM)目标一起联合训练。

上图展示了联合训练新的词汇目标和掩码 LM 目标的过程。在每个输入序列中,我们首先像 BERT [6] 中一样随机掩码 15% 的所有词元。由双向 Transformer 编码器计算的掩码词元对应的输出向量 h_i^L 被输入到 softmax 分类器中,以预测原始词元。

接下来,新的词汇目标开始发挥作用,考虑词语顺序。鉴于词元洗牌的随机性,词汇目标相当于最大化将每个洗牌词元放置到其正确位置的概率。更正式地,这个目标可以被表述为:

arg\, \underset{\theta}{max}\sum log\,P(pos_1=t_1,pos_2=t_2,...,pos_K=t_K[t_1,t_2,...,t_K,\theta])

其中,\theta 表示 StructBERT 的可训练参数集,K 表示每个打乱子序列的长度。从技术上讲,较大的 K 会迫使模型能够重建更长的序列,同时注入更多干扰的输入。相反,当 K 较小的时候,模型获得更多未受干扰的序列,但在恢复长序列方面的能力较差。我们决定使用三元组(即 K = 3)进行子序列打乱,以平衡语言重建能力和模型的鲁棒性。

具体来说,如上图所示,我们随机选择一定比例的三元组来自未屏蔽的标记,并在每个三元组内打乱三个词(例如图中的 t2、t3 和 t4)。通过双向 Transformer 编码器计算的打乱标记的输出向量,然后输入到一个 softmax 分类器中,以预测原始标记。新的词目标与掩蔽语言模型(LM)目标一起在统一的预训练模型中共同学习,并赋予相等的权重。

【句子结构目标】原始 BERT 模型认为下一个句子预测任务比较简单(BERT 在此任务中的预测准确率可以轻松达到 97%-98% [6])。因此,我们通过预测下一个句子和上一个句子,扩展了句子预测任务,以使预训练语言模型以双向的方式意识到句子的顺序。如上图所示,给定一对句子(S1,S2)作为输入,我们预测 S2 是紧随 S1 之后的下一个句子,还是在 S1 之前的上一个句子,或者是来自不同文档的随机句子。具体来说,对于句子 S1,1/3 的时间我们选择紧随 S1 之后的文本片段作为第二个句子 S2,1/3 的时间选择 S1 之前的上一个句子,1/3 的时间则随机从其他文档中抽取一个句子作为 S2。这两个句子被连接在一起,形成一个输入序列,并在中间使用分隔符标记 [SEP],如同 BERT 中的做法。我们通过取对应于第一个标记 [CLS] 的隐藏状态来汇聚模型输出,并将 [CLS] 的编码向量输入到一个 softmax 分类器中进行三类预测。

2.4,预训练设置

训练目标函数是词汇结构目标和句子结构目标的线性组合。对于掩蔽语言模型(Masked LM)目标,我们采用了与BERT [6] 相同的掩蔽率和设置,选择5%的三元组进行随机打乱。我们使用了来自英文维基百科(2,500M词)和BookCorpus [35] 的文档作为预训练数据,遵循了[6]中的预处理和WordPiece分词方法。输入序列的最大长度设置为512。

我们使用Adam优化器,学习率设置为1e-4,β1 = 0.9,β2 = 0.999,L2权重衰减为0.01,前10%总步骤进行了学习率预热,学习率采用线性衰减。每层设置了0.1的dropout概率。激活函数使用了gelu [10],与GPT [20]相同。

我们将Transformer块的层数记为L,隐藏向量的大小记为H,自注意力头数记为A。按照BERT的做法,我们主要报告两种模型规模的实验结果:

  • StructBERTBase:L = 12,H = 768,A = 12,参数数量 = 1.1亿

  • StructBERTLarge:L = 24,H = 1024,A = 16,参数数量 = 3.4亿

StructBERT的预训练是在一个由64个Tesla V100 GPU卡组成的分布式计算集群上进行的。对于StructBERTBase,我们进行了40轮预训练,耗时大约38小时;而StructBERTLarge的训练大约花费了7天完成。

3,结论

在本文中,我们提出了一种新颖的结构化预训练方法,将词汇结构和句子结构纳入BERT的预训练中。我们引入了词汇结构目标和句子结构目标,作为两种新的预训练任务,用于在不同粒度上深度理解自然语言。实验结果表明,新的StructBERT模型在多种下游任务中取得了新的最先进的结果,包括流行的GLUE基准、SNLI语料库和SQuAD v1.1问答任务。

相关文章:

STRUCTBERT:将语言结构融入预训练以提升深度语言理解

【摘要】最近,预训练语言模型BERT(及其经过稳健优化的版本RoBERTa)在自然语言理解(NLU)领域引起了广泛关注,并在情感分类、自然语言推理、语义文本相似度和问答等各种NLU任务中达到了最先进的准确率。受到E…...

【万字总结】前端全方位性能优化指南(八)——Webpack 6调优、模块联邦升级、Tree Shaking突破

构建工具深度优化——从机械配置到智能工程革命 当Webpack配置项突破2000行、Node进程内存耗尽告警时,传统构建优化已触及工具链的物理极限:Babel转译耗时占比超60%、跨项目模块复用催生冗余构建、Tree Shaking误删关键代码引发线上事故……构建流程正从「工程问题」演变为「…...

单例模式(懒汉模式/饿汉模式)

相关概念参考&#xff1a;【C】C 单例模式总结&#xff08;5种单例实现方法&#xff09;_单例模式c实现-CSDN博客 #include<iostream>class LazySingle{ public:static LazySingle& getInstance(){static LazySingle instance;return instance;}void hello(){std::c…...

16-CSS3新增选择器

知识目标 掌握属性选择器的使用掌握关系选择器的使用掌握结构化伪类选择器的使用掌握伪元素选择器的使用 如何减少文档内class属性和id属性的定义&#xff0c;使文档变得更加简洁&#xff1f; 可以通过属性选择器、关系选择器、结构化伪类选择器、伪元素选择器。 1. 属性选择…...

C语言pthread库的线程休眠和唤醒的案例

一、代码如下 #include<stdio.h> #include<pthread.h> // 定义独占锁 pthread_mutex_t mutex; // 定义条件信号对象 pthread_cond_t condition; // 初始化函数 void init(){ int code pthread_mutex_init(&mutex, NULL); printf("共享锁初…...

Spring Boot 2.x 到 3.x 迁移实战:Redis 配置篇

前言 随着 Spring Boot 3.x 的发布&#xff0c;其对 Java 17 的支持和 模块化架构 的深化&#xff0c;Redis 配置与集成方式发生了显著变化。今天简单讲下redis的变化 一、Redis 配置前缀的模块化演进&#xff1a;从 spring.redis 到 spring.data.redis 1.1 Spring Boot 2.x&…...

SQL Server:用户权限

目录 创建 & 删除1. 创建用户命令整理创建 admin2 用户创建 admin_super 用户 2. 删除用户命令删除 admin2 用户删除 admin_super 用户 3. 创建时权限的区别admin2 用户权限admin_super 用户权限 查看方法一&#xff1a;使用对象资源管理器&#xff08;图形化界面&#xff…...

Windows .gitignore文件不生效的情况排查

概述 今天下班在家里捣腾自己的代码&#xff0c;在配置.gitignore文件忽略部分文件的时候&#xff0c;发现死活不生效 问题根源 经过一通分析和排查才发现&#xff0c;是.gitignore文件的编码错了&#xff0c;刚开始还没注意到&#xff0c;因为是在Windows下开发&#xff0c…...

cJSON 处理 JSON(轻量级 C 语言库)(二)

第二部分:cJSON 处理 JSON(轻量级 C 语言库) 📢 快速掌握 cJSON!文章 + 视频双管齐下 🚀 如果你觉得阅读文章太慢,或者更喜欢 边看边学 的方式,不妨直接观看我录制的 cJSON 课程视频!🎬 视频里会用更直观的方式讲解 cJSON 的核心概念、实战技巧,并配有动手演示…...

服务器数据恢复—误格式化NTFS文件系统分区别慌,NTFS数据复活秘籍

NTFS文件系统下格式化在理论上不会对数据造成太大影响&#xff0c;但有可能造成部分文件目录结构丢失的情况。下面介绍一个人为误操作导致服务器磁盘阵列中的NTFS文件系统分区被格式化后的服务器数据恢复案例。 服务器数据恢复过程&#xff1a; 1、将故障服务器连接到一台备份…...

《Linux运维总结:基于银河麒麟V10+ARM64架构CPU源码编译部署单实例redis7.2.6》

总结&#xff1a;整理不易&#xff0c;如果对你有帮助&#xff0c;可否点赞关注一下&#xff1f; 更多详细内容请参考&#xff1a;《Linux运维篇&#xff1a;Linux系统运维指南》 一、环境信息 环境信息如下&#xff1a; 主机IP 操作系统 Redis版本 CPU架构 192.168.1.111 K…...

华为云对象存储服务(OBS)

华为云对象存储服务&#xff08;OBS&#xff09; 前言 华为云为开发者提供了丰富的 Java SDK&#xff0c;借助这些 SDK 能够方便地与华为云的各类服务进行交互。下面以 华为云对象存储服务&#xff08;OBS&#xff09; 的 Java SDK 为例&#xff0c;介绍其使用步骤。 华为云…...

【3】数据结构的双向链表章

目录标题 双向链表的定义双向链表的初始化双向链表的创建插入操作删除操作 双向链表总代码与调试 双向链表的定义 结点结构组成&#xff1a;数据域&#xff08;data&#xff09;、指针域&#xff08;pre&#xff09;、指针域&#xff08;next&#xff09;。其中&#xff0c; da…...

分布式环境下的主从数据同步

目录 1. 数据同步的推/拉方式 1.1 主节点推送 1.2 从节点拉取 1.3 常见组件的推拉方式 2.复制方式 2.1 同步复制 2.2 异步复制 2.3 半同步复制 2.4 常见组件的同步方式 3.日志格式 3.1 基于语句复制 SBR 3.2 基于行复制 RBR 3.3 基于预写日志 WAL 3.4 基于触发器…...

蓝桥杯杯赛-日期模拟

知识点 处理日期 1. 按天枚举日期&#xff1a;逐天遍历起始日期到结束日期范围内的每个日期。 2. 处理闰年&#xff1a;正确判断闰年条件。闰年定义为&#xff1a;年份 满足以下任意一个条件&#xff1a;(闰年的2月只有29天) 满足下面一个条件就是闰年 1> 是 400 的倍数…...

【SQL】MySQL基础2:视图,存储过程,游标,约束,触发器

文章目录 1. 视图2. 存储过程2.1 创建存储过程2.2 执行存储过程 3. 游标4. 约束4.1 主键约束4.2 外键约束4.3 唯一约束4.4 检查约束 5. 触发器 1. 视图 视图是虚拟的表&#xff0c;它是动态检索的部分。使用视图的原因&#xff1a;避免重复的SQL语句&#xff1b;使用表的部分而…...

【TS学习】(15)分布式条件特性

在 TypeScript 中&#xff0c;分布式条件类型&#xff08;Distributive Conditional Types&#xff09; 是一种特殊的行为&#xff0c;发生在条件类型作用于裸类型参数&#xff08;Naked Type Parameter&#xff09; 时。这种特性使得条件类型可以“分布”到联合类型的每个成员…...

Android 小组件

小部件的布局文件支持如下布局&#xff1a; FrameLayout LinearLayout RelativeLayout GridLayout 以及如下控件 AnalogClock Button Chronometer ImageButton ImageView ProgressBar TextView ViewFlipper ListView GridView StackView AdapterViewFlipper 应该不止这些有空…...

搭建开源笔记平台:outline

折腾的意义 为什么要自己搭建一个笔记平台&#xff1f;没理由&#xff0c;就是突然想试试。有时候突然有个想法&#xff0c;搜了一下正好有合适的方案&#xff0c;就顺手试一下。 其实已经有很多成熟的笔记软件&#xff0c;例如Notion/OneNote&#xff0c;但谁不想要一个数据完…...

Unity编辑器功能及拓展(2) —Gizmos编辑器绘制功能

Unity中的Gizmos功能是用于在场景视图中绘制辅助图形或图标的工具&#xff0c;帮助开发者在编辑模式下直观调试和可视化游戏对象的位置、范围、方向等信息。 一.定义概述 Gizomsd 概述 Gizoms是Unity提供的一个API&#xff0c;或者叫做一个工具类&#xff0c;包含一系列静态…...

电脑屏幕亮度随心控,在Windows上自由调整屏幕亮度的方法

调整电脑屏幕的亮度对于保护视力和适应不同环境光线条件非常重要。无论是在白天强光下还是夜晚昏暗环境中&#xff0c;合适的屏幕亮度都能让您的眼睛更加舒适。本文中简鹿办公小编将向您介绍几种在 Windows 系统中调整屏幕亮度的方法。 方法一&#xff1a;使用快捷键 大多数笔…...

presto行转列

presto的行列转换和spark、hive一样也是通过外链语句实现的&#xff0c;只不过语法和关键子有点不同&#xff0c;如下 with tmp1 as (select 1,2,3 as a1,4,5,6 as a2 ) select * from tmp1 cross join unnest(split(tmp1.a1, ,),split(tmp1.a2, ,) ) as b(a1s,a2s) 结果如下...

MySQL 5.7 Online DDL 技术深度解析

14.13.1 在线DDL操作 索引操作主键操作列操作生成列操作外键操作表操作表空间操作分区操作 索引操作 下表概述了对索引操作的在线DDL支持情况。星号表示有附加信息、例外情况或依赖条件。有关详细信息&#xff0c;请参阅语法和使用说明。 操作原地执行重建表允许并发DML仅修…...

【汽车功能安全:软件与硬件缺一不可】

随着汽车变得越来越智能&#xff0c;功能安全就成为汽车电子系统不可回避的标准体系&#xff0c;日益复杂的功能导致了汽车中电子元件的数量和复杂性的指数级增长&#xff08;Leen&#xff09;。如今高级别汽车拥有多达90个电子控制单元&#xff08;ECU&#xff09;&#xff0c…...

docker打包使用有头模式playwright

1.打包镜像 创建Dockerfile文件如下 # playywright 官方镜像 FROM mcr.microsoft.com/playwright:v1.37.0-jammy# 设置非交互式环境变量和时区 ENV DEBIAN_FRONTENDnoninteractive ENV TZEtc/UTC# 安装 Python 3.9 和 pip&#xff08;修复时区阻塞问题&#xff09; RUN apt-g…...

TCP/IP协议的应用层与传输层

TCP/IP协议簇是互联网的核心通信框架&#xff0c;定义了数据如何在网络中封装、寻址、传输和路由&#xff08;确定数据包从源主机到目标主机的传输路径的过程&#xff09;。 应用层 直接面向用户和应用&#xff0c;负责实现网络服务的具体功能&#xff08;如网页浏览、文件传输…...

51c自动驾驶~合集15

我自己的原文哦~ https://blog.51cto.com/whaosoft/11720657 #DRAMA 首个基于Mamba的端到端运动规划器&#xff08;新加坡国立&#xff09; 运动规划是一项具有挑战性的任务&#xff0c;在高度动态和复杂的环境中生成安全可行的轨迹&#xff0c;形成自动驾驶汽车的核心能…...

拼多多 anti-token unidbg 分析

声明: 本文章中所有内容仅供学习交流使用&#xff0c;不用于其他任何目的&#xff0c;抓包内容、敏感网址、数据接口等均已做脱敏处理&#xff0c;严禁用于商业用途和非法用途&#xff0c;否则由此产生的一切后果均与作者无关&#xff01; 逆向分析 版本7.3-7.4 都试过加密没什…...

【Git】5 个分区的切换方式及示例

目录 1. **工作区&#xff08;Working Directory&#xff09;**2. **缓存区&#xff08;Stage/Index&#xff09;**3. **本地仓库&#xff08;Local Repository&#xff09;**4. **远程仓库&#xff08;Remote Repository&#xff09;**5. **贮藏区&#xff08;Stash&#xff0…...

Java高频面试之并发编程-02

hello啊&#xff0c;各位观众姥爷们&#xff01;&#xff01;&#xff01;本baby今天来报道了&#xff01;哈哈哈哈哈嗝&#x1f436; 面试官&#xff1a;进程和线程的区别是什么&#xff1f; 1. 资源分配与独立性 进程&#xff1a; 独立性&#xff1a;每个进程拥有独立的内存…...