深度学习笔记之BERT(三)RoBERTa
深度学习笔记之RoBERTa
- 引言
- 回顾:BERT的预训练策略
- RoBERTa训练过程分析
- 静态掩码与动态掩码的比较
- 模型输入模式与下一句预测
- 使用大批量进行训练
- 使用Byte-pair Encoding作为子词词元化算法
- 更大的数据集和更多的训练步骤
- RoBERTa配置
引言
本节将介绍一种基于 BERT \text{BERT} BERT改进优化的预训练方法—— RoBERTa \text{RoBERTa} RoBERTa。
回顾:BERT的预训练策略
BERT \text{BERT} BERT的预训练策略包含两个:
-
掩码语言模型训练 ( Masked Language Model,MLM ) (\text{Masked Language Model,MLM}) (Masked Language Model,MLM):将句子中一部分词语进行掩码标记,即使用 [ MASK ] [\text{MASK}] [MASK]对被掩码的词语进行替换。并将掩码部分的长度控制在总句子长度的 15 15 15%。对于一个已被预期处理的示例句子:
[ [ CLS ] , P a r i s , i s , a , b e a u t i f u l , c i t y , [ SEP ] , I , l o v e , P a r i s ] [[\text{CLS}],Paris,is,a,beautiful,city,[\text{SEP}],I,love,Paris] [[CLS],Paris,is,a,beautiful,city,[SEP],I,love,Paris]
掩码标记后的结果示例为:
[ [ CLS ] , P a r i s , i s , a , [ MASK ] , c i t y , [ SEP ] , I , l o v e , [ MASK ] ] [[\text{CLS}],Paris,is,a,[\text{MASK}],city,[\text{SEP}],I,love,[\text{MASK}]] [[CLS],Paris,is,a,[MASK],city,[SEP],I,love,[MASK]]
即便在 BERT \text{BERT} BERT中使用80-10-10规则对 BERT \text{BERT} BERT的预训练进行泛化,但实际上它依然是静态掩码:这些工作均是在数据预处理部分执行的,在训练过程中,每个 [ MASK ] [\text{MASK}] [MASK]部分在句子中的位置是固定的。 -
下句预测 ( Next Sentence Prediction,NSP ) (\text{Next Sentence Prediction,NSP}) (Next Sentence Prediction,NSP):样本集是由两个连接的文档片段 Segment-1,Segment-2 \text{Segment-1,Segment-2} Segment-1,Segment-2组成,并以 50 50 50%的概率:
- 在同一文档中连续采样;
- 不同的文档中采样;
并对采样结果 Segment-1,Segment-2 \text{Segment-1,Segment-2} Segment-1,Segment-2对应的如下格式中:
[ [ CLS ] , Segment-1 , [SEP] , Segment-2 , [SEP] ] [[\text{CLS}],\text{Segment-1},\text{[SEP]},\text{Segment-2},\text{[SEP]}] [[CLS],Segment-1,[SEP],Segment-2,[SEP]]
[ CLS ] [\text{CLS}] [CLS]对应的 BERT \text{BERT} BERT输出 R [CLS] \mathcal R_{\text{[CLS]}} R[CLS]使用 Softmax \text{Softmax} Softmax进行二分类(有关联/无关联)任务。
RoBERTa训练过程分析
静态掩码与动态掩码的比较
对于 BERT \text{BERT} BERT这种现象, RoBERTa \text{RoBERTa} RoBERTa先采用复制数据的方法进行补救:
- 将一个句子复制 10 10 10份,并将 10 10 10个句子进行随机掩码标记:
S 1 : [ [ CLS ] , P a r i s , i s , a , [ MASK ] , c i t y , [ SEP ] , I , l o v e , [ MASK ] ] S 2 : [ [ CLS ] , P a r i s , [ MASK ] , a , b e a u t i f u l , c i t y , [ SEP ] , I , l o v e , P a r i s ] ⋮ S 10 : [ [ CLS ] , [ MASK ] , i s , a , b e a u t i f u l , [ MASK ] , [ SEP ] , I , l o v e , P a r i s ] \begin{aligned} & \mathcal S_1:[[\text{CLS}],Paris,is,a,[\text{MASK}],city,[\text{SEP}],I,love,[\text{MASK}]] \\ & \mathcal S_2:[[\text{CLS}],Paris,[\text{MASK}],a,beautiful,city,[\text{SEP}],I,love,Paris] \\ & \quad \vdots \\ & \mathcal S_{10}:[[\text{CLS}],[\text{MASK}],is,a,beautiful,[\text{MASK}],[\text{SEP}],I,love,Paris] \end{aligned} S1:[[CLS],Paris,is,a,[MASK],city,[SEP],I,love,[MASK]]S2:[[CLS],Paris,[MASK],a,beautiful,city,[SEP],I,love,Paris]⋮S10:[[CLS],[MASK],is,a,beautiful,[MASK],[SEP],I,love,Paris] - 对模型进行 40 Epoch \text{40 Epoch} 40 Epoch的全数据遍历训练,在每个 Epoch \text{Epoch} Epoch训练中,句子被掩盖标记都不同:
Epoch 1: S 1 Epoch 2: S 2 ⋮ Epoch 10: S 10 Epoch 11: S 1 Epoch 12: S 2 ⋮ Epoch 40: S 10 \begin{aligned} & \text{Epoch 1:} \quad \mathcal S_1 \\ & \text{Epoch 2:} \quad \mathcal S_2 \\ & \quad \vdots \\ & \text{Epoch 10:} \quad \mathcal S_{10} \\ & \text{Epoch 11:} \quad \mathcal S_{1} \\ & \text{Epoch 12:} \quad \mathcal S_{2} \\ & \quad \vdots \\ & \text{Epoch 40:} \quad \mathcal S_{10} \\ \end{aligned} Epoch 1:S1Epoch 2:S2⋮Epoch 10:S10Epoch 11:S1Epoch 12:S2⋮Epoch 40:S10
这相当于每一种 MASK \text{MASK} MASK模式被执行了 4 4 4次。虽然这种方法起到很好的泛化作用,但其本质上依然是静态掩码。
而动态掩码并没有在预处理阶段对数据进行 MASK \text{MASK} MASK,而是将数据导入模型过程中进行随机 MASK \text{MASK} MASK。这与上面复制数据的方法相比,它的泛化性更强。因为尤其在训练的 Epoch \text{Epoch} Epoch较大时,静态掩码由于会使同一份掩码结果训练多次,导致在训练过程中机械地记住这个规律。
下面是原文中静态掩码与动态掩码在同一任务中的对比情况。在一些任务中,动态掩码的效果略优于静态掩码。
模型输入模式与下一句预测
BERT \text{BERT} BERT中的 NSP \text{NSP} NSP任务旨在句子层面有更优秀的理解,因此 RoBERTa \text{RoBERTa} RoBERTa针对 NSP \text{NSP} NSP任务设计了几种训练格式,来验证 NSP \text{NSP} NSP策略是否有效:
- Segment-pair +NSP: \text{Segment-pair +NSP:} Segment-pair +NSP: 原始 BERT \text{BERT} BERT使用的模式,其中每个段落 ( Segment ) (\text{Segment}) (Segment)中可能包含多个句子 ( Sentence ) (\text{Sentence}) (Sentence),但 Token \text{Token} Token总长度小于 512 512 512。
- Sentence-pair + NSP: \text{Sentence-pair + NSP:} Sentence-pair + NSP: 将输入段落对改为句子对,正负样本的采样方式分别是从文档中连续采样和文档中单独采样。由于输入句子对 Token \text{Token} Token长度明显小于 512 512 512,因而通过增加 Batch size \text{Batch size} Batch size使 Token \text{Token} Token总量与 Segment-pair \text{Segment-pair} Segment-pair相似,并保留了 NSP \text{NSP} NSP策略。
- Full-sentence: \text{Full-sentence:} Full-sentence: 从一个/多个文档中采样出连续的完整句子, Token \text{Token} Token总长度不超过 512 512 512,并且允许超出文档边界。超出文档边界是指:当采样达到一个文档的末尾时,可以从下一个文档中继续进行采样作为该输入的一部分,但需要在文档之间加入一个额外分隔符,并且该实验删除了 NSP \text{NSP} NSP策略。
- Doc-sentence: \text{Doc-sentence:} Doc-sentence: 与 Full-sentence \text{Full-sentence} Full-sentence采样方式相似,但是不允许超出文档边界。相比于 Full-sentence \text{Full-sentence} Full-sentence,它的 Token \text{Token} Token长度有可能偏少,因此同样通过增加 Batch size \text{Batch size} Batch size使 Token \text{Token} Token总量与 Full-sentence \text{Full-sentence} Full-sentence相似,并同样删除了 NSP \text{NSP} NSP策略。
下面是原文对四种训练格式在若干任务中的效果:
- 比较使用 NSP \text{NSP} NSP策略的 Segment-pair \text{Segment-pair} Segment-pair和 Sentence-pair \text{Sentence-pair} Sentence-pair格式,发现使用 Segment \text{Segment} Segment效果明显由于 Sentence \text{Sentence} Sentence,原因可能是模型很难从单句中学习到长依赖关系。
- 对使用 NSP \text{NSP} NSP策略和未使用 NSP \text{NSP} NSP的角度进行比较,发现:删除 NSP \text{NSP} NSP策略能够略微提高下游任务的性能
- Doc-sentence \text{Doc-sentence} Doc-sentence略优于 Full-sentence \text{Full-sentence} Full-sentence。但由于 Doc-sentence \text{Doc-sentence} Doc-sentence长度不固定,导致 Batch size \text{Batch size} Batch size存在变化,因而后续实验均使用 Full-sentence \text{Full-sentence} Full-sentence格式进行比较。
使用大批量进行训练
原始 BERT \text{BERT} BERT使用 Batch size=256 \text{Batch size=256} Batch size=256进行训练,训练步骤数量为 1M \text{1M} 1M。在保持总计算量基本不变的情况下,将 Batch size \text{Batch size} Batch size由 256 256 256扩展至 2K,8K \text{2K,8K} 2K,8K;对应训练步骤缩减至 125K,31K \text{125K,31K} 125K,31K;并相应地调整学习率 ( lr ) (\text{lr}) (lr):
可以发现: Batch size \text{Batch size} Batch size为 2K \text{2K} 2K时表现效果最好。但考虑到并行更容易,作者均选择 8K \text{8K} 8K作为后续实验的 Batch size \text{Batch size} Batch size。
使用Byte-pair Encoding作为子词词元化算法
RoBERTa \text{RoBERTa} RoBERTa并没有使用 Unicode \text{Unicode} Unicode作为子词次元 ( Subword Unit ) (\text{Subword Unit}) (Subword Unit),而是使用 Bytes \text{Bytes} Bytes进行替代。这种方式可以编码任何输入文本,并且不会引入任何 Unknown \text{Unknown} Unknown标记,这会使 Vocab size \text{Vocab size} Vocab size变得更大,参数更多 ( 30 K ⇒ 50 K ) (30\text{K} \Rightarrow 50\text{K}) (30K⇒50K)。
以句子: It was a great day \text{It was a great day} It was a great day为例,对应 RoBERTa \text{RoBERTa} RoBERTa模型的标记结果如下:
[ it , G ˙ was , G ˙ a , G ˙ great , Gday ˙ ] [\text{it},\dot{\text{G}}\text{was},\dot{\text{G}}\text{a},\dot{\text{G}}\text{great},\dot{\text{G}\text{day}}] [it,G˙was,G˙a,G˙great,Gday˙]
其中 G ˙ \dot{\text{G}} G˙表示一个空格, RoBERTa \text{RoBERTa} RoBERTa词元分析其将所有空格替换为 G ˙ \dot{\text{G}} G˙字符。再以一个句子为例: I had a sudden epiphany \text{I had a sudden epiphany} I had a sudden epiphany(我灵光一闪):
[ I , G ˙ had , G ˙ a , G ˙ sudden , G ˙ ep , iphany ] [\text{I},\dot{\text{G}}\text{had},\dot{\text{G}}\text{a},\dot{\text{G}}\text{sudden},\dot{\text{G}}\text{ep},\text{iphany}] [I,G˙had,G˙a,G˙sudden,G˙ep,iphany]
这种标注结果是因为:未从词表中找到单词 epiphany \text{epiphany} epiphany,从而将其拆解未 ep \text{ep} ep和 iphany \text{iphany} iphany两部分。
更大的数据集和更多的训练步骤
RoBERTa \text{RoBERTa} RoBERTa延用了 BERT-large \text{BERT-large} BERT-large结构 ( L=24,A=16,H=1024 ) (\text{L=24,A=16,H=1024}) (L=24,A=16,H=1024),在 Batch size \text{Batch size} Batch size固定为 8K \text{8K} 8K的情况下,作者进行一系列对比实验:
有点降维打击的意思~数据量大意味着信息更丰富,效果好也在情理之中~
可以发现:
- 即便没有增加数据, RoBERTa \text{RoBERTa} RoBERTa依旧比 BERT-large \text{BERT-large} BERT-large结果优秀。当然总计算量增加了很多 ( Batch size=8K,steps:31K ⇒ 100 K ) (\text{Batch size=8K,steps:31K} \Rightarrow 100\text{K}) (Batch size=8K,steps:31K⇒100K),但这并没有带来过拟合的问题。
- 在训练数据基础上加上 additional Data \text{additional Data} additional Data效果进一步提升;
- 训练过程很稳定:即便 steps=500K \text{steps=500K} steps=500K,依然没有出现过拟合的现象。
RoBERTa配置
综合上面的比对结果,作者给出 RoBERTa \text{RoBERTa} RoBERTa的基本配置:
- 动态掩码;
- 策略: Full-sentence without NSP \text{Full-sentence without NSP} Full-sentence without NSP;
- 更大的 Batch size \text{Batch size} Batch size;
- 使用更大 Vocab size \text{Vocab size} Vocab size,字节级别的 Byte-pair Encoding \text{Byte-pair Encoding} Byte-pair Encoding进行训练
- 训练过程中使用更多的 steps \text{steps} steps和 additional Data \text{additional Data} additional Data;
在 GLUE,SQuAD,RACE \text{GLUE,SQuAD,RACE} GLUE,SQuAD,RACE等任务中的表现结果如下:
- GLUE \text{GLUE} GLUE
- SQuAD \text{SQuAD} SQuAD
- RACE \text{RACE} RACE
Reference \text{Reference} Reference:
论文链接
《BERT基础教程——Transformer大规模实战》
相关文章:

深度学习笔记之BERT(三)RoBERTa
深度学习笔记之RoBERTa 引言回顾:BERT的预训练策略RoBERTa训练过程分析静态掩码与动态掩码的比较模型输入模式与下一句预测使用大批量进行训练使用Byte-pair Encoding作为子词词元化算法更大的数据集和更多的训练步骤 RoBERTa配置 引言 本节将介绍一种基于 BERT \t…...
C++知识点总结(59):背包型动态规划
背包型动态规划 一、背包 dp1. 01 背包(限量)2. 完全背包(不限量)3. 口诀 二、例题1. 和是质数的子集数2. 黄金的太阳3. 负数子集和4. NASA的⻝物计划 一、背包 dp 1. 01 背包(限量) 假如有这几个物品&am…...

C++:反向迭代器的实现
反向迭代器的实现与 stack 、queue 相似,是通过适配器模式实现的。通过传入不同类型的迭代器来实现其反向迭代器。 正向迭代器中,begin() 指向第一个位置,end() 指向最后一个位置的下一个位置。 代码实现: template<class I…...
webGL入门教程_04vec3、vec4 和齐次坐标总结
vec3、vec4 和齐次坐标总结 1. vec3 和 vec4 1.1 什么是 vec3 和 vec4? vec3: GLSL 中的三维向量类型,包含 3 个浮点数:(x, y, z)。常用于表示三维坐标、RGB 颜色、法线、方向等。 vec4: GLSL 中的四维向量类型&…...

uniapp中父组件数组更新后与页面渲染数组不一致实战记录
简单描述一下业务场景方便理解: 商品设置功能,支持添加多组商品(点击添加按钮进行增加).可以对任意商品进行删除(点击减少按钮对选中的商品设置进行删除). 问题: 正常添加操作后,对已添加的任意商品删除后,控制台打印数组正常.但是与页面显示不一致.已上图为例,选中尾…...
优化 Conda 下载速度:详细的代理配置和网络管理策略
优化 Conda 下载速度:详细的代理配置和网络管理策略 为了彻底解决使用 Conda 下载 PyTorch 时遇到的速度问题,并确保下载过程稳定可靠,这需要一个详细、综合的技术方案。让我们更深入地分析问题原因,然后详尽地解释采取的解决策略…...

服务器遭受DDoS攻击后如何恢复运行?
当服务器遭受 DDoS(分布式拒绝服务)攻击 后,恢复运行需要快速采取应急措施来缓解攻击影响,并在恢复后加强防护以减少未来攻击的风险。以下是详细的分步指南: 一、应急处理步骤 1. 确认服务器是否正在遭受 DDoS 攻击 …...

MFC音视频播放器-支持电子放大等功能
前言 本播放器在VS2019下开发,使用ffmpegD3D实现视频播放渲染功能。同时本播放器支持录像功能、截图功能、音视频播放功能、码流信息显示、电子放大功能等。D3D的渲染同时支持surface和texture两种方式,电子放大功能是在D3D Texture方式下进行实现。以下…...
c语言编程1.17蓝桥杯历届试题-回文数字
题目描述 观察数字:12321,123321 都有一个共同的特征,无论从左到右读还是从右向左读,都是相同的。这样的数字叫做:回文数字。 本题要求你找到一些5位或6位的十进制数字。满足如下要求: 该数字的各个数位之…...
el-table 纵向 横向 多级表头
<el-table :data"tableData" class"diaTable":span-method"handleSpanMethod"border:header-cell-style"{background:#292929,color:#fff}"><!-- 纵向表头 --><el-table-column label"纵向表头" width"…...

uniapp开发微信小程序笔记8-uniapp使用vant框架
前言:其实用uni-app开发微信小程序的首选不应该是vant,因为vant没有专门给uni-app设置专栏,可以看到目前Vant 官方提供了 Vue 2 版本、Vue 3 版本和微信小程序版本,并由社区团队维护 React 版本和支付宝小程序版本。 但是vant的优…...
分布式项目使用Redis实现数据库对象自增主键ID
hello。大家好,我是灰小猿,一个超会写bug的程序猿! 在分布式项目中,数据表的主键ID一般可能存在于UUID或自增ID这两种形式,UUID好理解而且实现起来也最容易,但是缺点就是数据表中的主键ID是32位的字符串&a…...
npm-运行项目报错:A complete log of this run can be found .......npm-cache_logs\
1.问题 没有找到对应的某种依赖,node_modules出现问题。 2.解决 (1)查看对应依赖是否引入或者是由于合并分支错误 引入js或依赖不存在。谨慎删除依赖包 (2)查找对应引入依赖进行安装最后解决方法-删除依赖包清除缓存 npm cache clean --force (2)重新向同事引入…...

SolarCube: 高分辨率太阳辐照预测基准数据集
太阳能作为清洁能源在减缓气候变化中的作用日益凸显,其稳定的供应对电网管理至关重要。然而,太阳辐照受云层和天气变化的影响波动较大,给光伏电力的管理带来挑战,尤其是在调度、储能和备用系统管理方面。因此,精确的太…...

华为小米苹果三星移动设备访问windows共享文件夹windows11
如果移动设备和windows电脑都在同一个局域网内,可以用移动设备访问windows11的共享文件夹 1、设置共享文件夹 2、添加everyone用户即可 3、查看ip地址 4、在华为手机上点击文件管理,里面有个网上邻居 5、正常情况下,华为手机会扫描到同一局域…...
网络安全三防指南:只防病毒不安全
5月17日,瑞星全球反病毒监测网截获一个恶性病毒,由于该病毒的破坏能力和当年著名的CIH病毒几乎完全一样,因此瑞星将该病毒命名为“新CIH”病毒。被“新CIH”感染的电脑,主板和硬盘数据将被破坏,致使电脑无法启动&#…...

论文概览 |《Urban Analytics and City Science》2023.05 Vol.50 Issue.4
本次给大家整理的是《Environment and Planning B: Urban Analytics and City Science》杂志2023年5月第50卷第4期的论文的题目和摘要,一共包括19篇SCI论文! 论文1 Data analytics and sustainable urban development in global cities 全球城市的数据…...

【ROS2】ROS2 C++版本 与 Python版本比较
ROS 系列学习教程(总目录) ROS2 系列学习教程(总目录) 目录 一、功能包的构建方式二、功能包组织结构三、代码编写四、性能与效率五、兼容性六、应用场景 目前ROS开发主要使用 C 和 Python 语言,这里会分别实现并讲解。 相较于ROS1,ROS2的 C 和 Python …...

物联网射频识别和RFID开发(一):RFID基础—概念、应用
一、RFID的发展历史 二、RFID与物联网 (一)物联网与RFID的关系 物联网的基本思想是美国麻省理工学院在1999年提出的,其核心思想是为全球每个物品提供唯一的电子标识符。这种电子标识符就是现在经常提到的“电子产品编码(Electronic Product …...

JVM:即时编译器,C2 Compiler,堆外内存排查
1,即时编译器 1.1,基本概念 常见的编译型语言如C,通常会把代码直接编译成CPU所能理解的机器码来运行。而Java为了实现“一次编译,处处运行”的特性,把编译的过程分成两部分,首先它会先由javac编译成通用的…...

国防科技大学计算机基础课程笔记02信息编码
1.机内码和国标码 国标码就是我们非常熟悉的这个GB2312,但是因为都是16进制,因此这个了16进制的数据既可以翻译成为这个机器码,也可以翻译成为这个国标码,所以这个时候很容易会出现这个歧义的情况; 因此,我们的这个国…...
Linux链表操作全解析
Linux C语言链表深度解析与实战技巧 一、链表基础概念与内核链表优势1.1 为什么使用链表?1.2 Linux 内核链表与用户态链表的区别 二、内核链表结构与宏解析常用宏/函数 三、内核链表的优点四、用户态链表示例五、双向循环链表在内核中的实现优势5.1 插入效率5.2 安全…...

基于FPGA的PID算法学习———实现PID比例控制算法
基于FPGA的PID算法学习 前言一、PID算法分析二、PID仿真分析1. PID代码2.PI代码3.P代码4.顶层5.测试文件6.仿真波形 总结 前言 学习内容:参考网站: PID算法控制 PID即:Proportional(比例)、Integral(积分&…...
条件运算符
C中的三目运算符(也称条件运算符,英文:ternary operator)是一种简洁的条件选择语句,语法如下: 条件表达式 ? 表达式1 : 表达式2• 如果“条件表达式”为true,则整个表达式的结果为“表达式1”…...

微服务商城-商品微服务
数据表 CREATE TABLE product (id bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 商品id,cateid smallint(6) UNSIGNED NOT NULL DEFAULT 0 COMMENT 类别Id,name varchar(100) NOT NULL DEFAULT COMMENT 商品名称,subtitle varchar(200) NOT NULL DEFAULT COMMENT 商…...

深入解析C++中的extern关键字:跨文件共享变量与函数的终极指南
🚀 C extern 关键字深度解析:跨文件编程的终极指南 📅 更新时间:2025年6月5日 🏷️ 标签:C | extern关键字 | 多文件编程 | 链接与声明 | 现代C 文章目录 前言🔥一、extern 是什么?&…...

前端开发者常用网站
Can I use网站:一个查询网页技术兼容性的网站 一个查询网页技术兼容性的网站Can I use:Can I use... Support tables for HTML5, CSS3, etc (查询浏览器对HTML5的支持情况) 权威网站:MDN JavaScript权威网站:JavaScript | MDN...
鸿蒙HarmonyOS 5军旗小游戏实现指南
1. 项目概述 本军旗小游戏基于鸿蒙HarmonyOS 5开发,采用DevEco Studio实现,包含完整的游戏逻辑和UI界面。 2. 项目结构 /src/main/java/com/example/militarychess/├── MainAbilitySlice.java // 主界面├── GameView.java // 游戏核…...

Linux-进程间的通信
1、IPC: Inter Process Communication(进程间通信): 由于每个进程在操作系统中有独立的地址空间,它们不能像线程那样直接访问彼此的内存,所以必须通过某种方式进行通信。 常见的 IPC 方式包括&#…...

高保真组件库:开关
一:制作关状态 拖入一个矩形作为关闭的底色:44 x 22,填充灰色CCCCCC,圆角23,边框宽度0,文本为”关“,右对齐,边距2,2,6,2,文本颜色白色FFFFFF。 拖拽一个椭圆,尺寸18 x 18,边框为0。3. 全选转为动态面板状态1命名为”关“。 二:制作开状态 复制关状态并命名为”开…...