[RoBERTa]论文实现:RoBERTa: A Robustly Optimized BERT Pretraining Approach

本文主要是介绍[RoBERTa]论文实现:RoBERTa: A Robustly Optimized BERT Pretraining Approach,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

    • 一、完整代码
    • 二、论文解读
      • 2.1 模型架构
      • 2.2 参数设置
      • 2.3 数据
      • 2.4 评估
    • 三、对比
    • 四、整体总结

论文:RoBERTa:A Robustly Optimized BERT Pretraining Approach
作者:Yinhan Liu, Myle Ott, Naman Goyal, Jingfei Du, Mandar Joshi, Danqi Chen, Omer Levy, Mike Lewis, Luke Zettlemoyer, Veselin Stoyanov
时间:2019
地址:https://github.com/pytorch/fairseq

一、完整代码

这里我们使用python代码进行实现

# 完整代码在这里
# 有时间再做

二、论文解读

RoBERTa,这个论文名字我刚听到的时候,我以为是加了旋转编码的BERT,没想到是A Robustly Optimized BERT Pretraining Approach,其只是对BERT的一种探索和优化,其主要探索在以下几个方面:

  1. 训练更长的时间,使用更大的批次,处理更多的数据可以显著提高性能;
  2. NSP任务效果并不显著,在训练的时候可以删除;
  3. 训练更长的sentence;
  4. 动态mask相较于静态mask其提升并不是很大,但是RoBERTa还是采用了这种做法;

2.1 模型架构

BERT完全一致,是transformerencoder层构成的;

2.2 参数设置

Adam: β 1 = 0.9 , β 2 = 0.999 , ϵ = 1 e − 6 \beta_1=0.9, \beta_2=0.999, \epsilon=1e-6 β1=0.9,β2=0.999,ϵ=1e6 L 2 = 0.01 L_2=0.01 L2=0.01
dropout: d r o p o u t − r a t e = 0.1 dropout-rate=0.1 dropoutrate=0.1
updates: 1000000 1000000 1000000
batch_size: 256 256 256
token_size: 512 512 512
attention_activation: G E L U GELU GELU

2.3 数据

为了扩大数据量,这里使用了下面这四个数据;

  • BOOKCORPUS (Zhu et al., 2015) plus English WIKIPEDIA. This is the original data used to train BERT. (16GB).
  • CC-NEWS, which we collected from the English portion of the CommonCrawl News dataset (Nagel, 2016). The data contains 63 million English news articles crawled between September 2016 and February 2019. (76GB after filtering).
  • OPENWEBTEXT (Gokaslan and Cohen, 2019), an open-source recreation of the WebText corpus described in Radford et al. (2019). The text is web content extracted from URLs shared on Reddit with at least three upvotes. (38GB).
  • STORIES, a dataset introduced in Trinh and Le(2018) containing a subset of CommonCrawl data filtered to match the story-like style of Winograd schemas. (31GB).

2.4 评估

这里介绍了三个benchmarks,分别是:GLUESQuADRACE

GLUE:通用语言理解评估(GLUE)基准测试(Wang et al.,2019b)是一个用于评估自然语言理解系统的9个数据集的集合。6个任务被定义为单个句子分类或句子对分类任务。GLUE的组织者提供了培训和开发数据的分割,以及一个提交服务器和排行榜,允许参与者在私人保留的测试数据上评估和比较他们的系统。

SQuAD:斯坦福问题回答数据集(SQuAD)提供了一段上下文和一个问题。任务是通过从上下文中提取相关的跨度来回答这个问题。有了两个版本的SQuAD: V1.1和V2.0(Rajpurkar等人,2016,2018)。在V1.1中,上下文总是包含一个答案,而在V2.0中的一些问题在所提供的上下文中没有设有回答,这使得任务更具挑战性。

RACE:从考试中获得的阅读理解(RACE)(Lai et al.,2017)任务是一个大规模的阅读理解数据集,有超过28000篇文章和近10万个问题。该数据集收集自专为中高中生设计的中国英语考试。在竞赛中,每一段都与多个问题相关联。对于每个问题,这个任务是从四个选项中选择一个正确的答案。种族比其他流行的阅读理解数据集的背景要长得多,需要推理的问题比例非常大

三、对比

Static Masking 和 Dynamic Masking

可以发现其实提升并不明显,有的还降了,但是作者硬是认为也没办法,transformer用静态怎么可能没考虑动态呢,硬是水;

Model Input Format, Next Sentence Prediction 和 TrainBatch

这里先解释一下:

SEGMENT-PAIR+NSP:这遵循了BERT(Devlin et al.,2019)中使用的原始输入格式,有NSP丢失。每个输入都有一对片段,每个片段可以包含多个自然句子,但总的组合长度必须小于512个标记。

SENTENCE-PAIR+NSP:每个输入包含一对自然句子,要么从一个文档的连续部分中采样,要么从单独的文档中采样。由于这些输入明显短于512个令牌,我们增加批大小,使令牌的总数保持与SEGMENT-PAIR+NSP相似。我们保留了NSP的损失。

FULL-SENTENCES:每个输入都包含了从一个或多个文档中连续采样的完整句子,因此总长度最多为512个标记。输入可以跨越文档边界。当我们到达一个文档的结尾时,我们就开始从下一个文档中采样句子,并在文档之间添加一个额外的分隔符标记。我们消除了NSP的损失。

DOC-SENTENCES:输入的构造类似于FULL-SENTENCES,只是它们可能不会跨越文档边界。在文档末尾附近采样的输入可能小于512个标记,因此我们在这些情况下动态地增加批处理大小,以实现与全句相似的总标记数量。我们消除了NSP的损失。

从这里我们可以发现:NSP影响不显著,使用DOC要比FULL要略好;

TrainBatch

从这里我们可以发现,batch越大,能力越强;这里lr不同也许造成了一点干扰;

分词编码方式采取的是BPE,原来是30k,这里变大了,变成50k;

效果

这也许表示了模型越大越好;

四、整体总结

RoBERTa只是对transformer的一种探索,结果是模型越大效果越好;

这篇关于[RoBERTa]论文实现:RoBERTa: A Robustly Optimized BERT Pretraining Approach的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/475416

相关文章

c++ 类成员变量默认初始值的实现

《c++类成员变量默认初始值的实现》本文主要介绍了c++类成员变量默认初始值,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录C++类成员变量初始化c++类的变量的初始化在C++中,如果使用类成员变量时未给定其初始值,那么它将被

Qt使用QSqlDatabase连接MySQL实现增删改查功能

《Qt使用QSqlDatabase连接MySQL实现增删改查功能》这篇文章主要为大家详细介绍了Qt如何使用QSqlDatabase连接MySQL实现增删改查功能,文中的示例代码讲解详细,感兴趣的小伙伴... 目录一、创建数据表二、连接mysql数据库三、封装成一个完整的轻量级 ORM 风格类3.1 表结构

基于Python实现一个图片拆分工具

《基于Python实现一个图片拆分工具》这篇文章主要为大家详细介绍了如何基于Python实现一个图片拆分工具,可以根据需要的行数和列数进行拆分,感兴趣的小伙伴可以跟随小编一起学习一下... 简单介绍先自己选择输入的图片,默认是输出到项目文件夹中,可以自己选择其他的文件夹,选择需要拆分的行数和列数,可以通过

Python中将嵌套列表扁平化的多种实现方法

《Python中将嵌套列表扁平化的多种实现方法》在Python编程中,我们常常会遇到需要将嵌套列表(即列表中包含列表)转换为一个一维的扁平列表的需求,本文将给大家介绍了多种实现这一目标的方法,需要的朋... 目录python中将嵌套列表扁平化的方法技术背景实现步骤1. 使用嵌套列表推导式2. 使用itert

Python使用pip工具实现包自动更新的多种方法

《Python使用pip工具实现包自动更新的多种方法》本文深入探讨了使用Python的pip工具实现包自动更新的各种方法和技术,我们将从基础概念开始,逐步介绍手动更新方法、自动化脚本编写、结合CI/C... 目录1. 背景介绍1.1 目的和范围1.2 预期读者1.3 文档结构概述1.4 术语表1.4.1 核

在Linux中改变echo输出颜色的实现方法

《在Linux中改变echo输出颜色的实现方法》在Linux系统的命令行环境下,为了使输出信息更加清晰、突出,便于用户快速识别和区分不同类型的信息,常常需要改变echo命令的输出颜色,所以本文给大家介... 目python录在linux中改变echo输出颜色的方法技术背景实现步骤使用ANSI转义码使用tpu

Python使用python-can实现合并BLF文件

《Python使用python-can实现合并BLF文件》python-can库是Python生态中专注于CAN总线通信与数据处理的强大工具,本文将使用python-can为BLF文件合并提供高效灵活... 目录一、python-can 库:CAN 数据处理的利器二、BLF 文件合并核心代码解析1. 基础合

Python使用OpenCV实现获取视频时长的小工具

《Python使用OpenCV实现获取视频时长的小工具》在处理视频数据时,获取视频的时长是一项常见且基础的需求,本文将详细介绍如何使用Python和OpenCV获取视频时长,并对每一行代码进行深入解析... 目录一、代码实现二、代码解析1. 导入 OpenCV 库2. 定义获取视频时长的函数3. 打开视频文

golang版本升级如何实现

《golang版本升级如何实现》:本文主要介绍golang版本升级如何实现问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录golanwww.chinasem.cng版本升级linux上golang版本升级删除golang旧版本安装golang最新版本总结gola

SpringBoot中SM2公钥加密、私钥解密的实现示例详解

《SpringBoot中SM2公钥加密、私钥解密的实现示例详解》本文介绍了如何在SpringBoot项目中实现SM2公钥加密和私钥解密的功能,通过使用Hutool库和BouncyCastle依赖,简化... 目录一、前言1、加密信息(示例)2、加密结果(示例)二、实现代码1、yml文件配置2、创建SM2工具