一起来学习BERT常见的几个变体
引言
本文我们会学习几种常见的BERT变体,如ALBERT1,RoBERTa2,ELECTRA3和SpanBERT4。
ALBERT
A Lite version of BERT(ALBERT)1想解决的是BERT模型参数量过多的问题,相比BERT它是一个精简版的。它使用下面两种技术来减少参数量:
- 跨层参数共享(Cross-layer parameter sharing)
- 嵌入层参数分解(Factorized embedding layer parameterization )
跨层参数共享
跨层参数共享是一种减少参数量的有趣的方法。我们知道,BERT包含NNN层编码器层。比如BERT-base包含12个编码器层,在训练时,需要学习所有编码器层的参数。而使用跨层参数共享的方法,我们只需要学习第一个编码器层的参数,然后让其他所有层共用这套参数。
下图显示了有N个编码器层的BERT,为了简便我们只展开第一层:
我们知道其中每一层的结构都是相同的,即它们都包含叫做多头注意力和前馈神经网络的子层。在应用跨层参数共享时有几种不同的方式:
- All-shared: 共享第一个编码器层的所有子层参数到其他编码器层
- Shared feedforward network:只共享第一个编码器层的前馈神经网络层参数到其他编码器层(的前馈神经网络)
- Shared attention:只共享第一个编码器层的多头注意力层参数到其他编码器层(的多头注意力层)
ALBERT模型使用All-shared模式。
嵌入层参数分解
在BERT中,使用WordPiece分词器创建WordPiece标记。其WordPiece标记的嵌入大小被设成和隐藏层嵌入大小(向量表示大小)一样。而WordPiece嵌入是上下文无关的表示,它是从词表中的独热编码向量学习的。而隐藏层嵌入是由编码器返回的有上下文信息的表示。
我们记词表大小为VVV。我们知道BERT的词表大小为30000。我们记隐藏层嵌入大小为HHH,WordPiece嵌入大小为EEE。
为了编码更多的信息到隐藏层嵌入中,我们通常需要设置一个很大的隐藏层嵌入大小。比如,在BERT-base中,其隐藏层嵌入大小HHH为768。那么隐藏层嵌入的维度是V×H=30000×768V \times H = 30000 \times 768V×H=30000×768。因为WordPiece嵌入大小EEE被设成预隐藏层嵌入大小一样,所有它的大小也为768。这样,WordPiece嵌入层的维度为V×E=30000×768V \times E =30000 \times 768V×E=30000×768。也就是说,增加隐藏层嵌入大小HHH也会同时增加WordPiece嵌入大小EEE。
那么我们如何避免这个问题?我们可以使用嵌入层参数分解方法将嵌入矩阵分解为更小的矩阵。
我们将WordPiece嵌入大小设为隐藏层嵌入大小,因为我们可以直接投影独热向量到隐藏层空间。基于分解(将EEE和HHH分离,即让它们相互独立),我们首先将独热向量投影到低维嵌入空间V×EV \times EV×E,然后再将该低维嵌入投影到隐藏空间E×HE \times HE×H,而不是直接投影独热向量到隐藏空间(V×HV \times HV×H)。即,我们不是直接投影V×HV \times HV×H,而是将这步分解为V×EV \times EV×E和E×HE \times HE×H。
举个例子,假设我们词表大小V=30000V=30000V=30000,我们将EEE和HHH分离。假设我们将WordPiece嵌入大小设置为较小的维度,假设E=128E=128E=128。同时隐藏层大小保持不变,还是H=768H=768H=768。现在我们通过以下步骤来投影V×HV \times HV×H:
- 我们将one-hot向量投影到低维WordPiece嵌入向量空间V×E=30000×128V \times E = 30000 \times 128V×E=30000×128
- 我们接着投影WordPiece嵌入空间到隐藏空间E×H=128×768E \times H = 128 \times 768E×H=128×768
这样,我们将V×H=30000×768V \times H=30000 \times 768V×H=30000×768分解为 V×E=30000×128V \times E=30000 \times 128V×E=30000×128和E×H=128×768E \times H=128 \times 768E×H=128×768。如此一来,我们可以随意调整隐藏层维度,而无需担心导致模型参数量增加过多。
我们已经知道了ALBERT是如何减少参数量的,我们下面来学习如何训练ALBERT模型。
训练ALBERT模型
与BERT类似,ALBERT模型也使用英文维基百科和Toronto BookCorpus数据集训练。我们知道BERT基于掩码语言建模(masked language modeling,MLM)和下一句预测(next sentence prediction,NSP)任务来预训练的。类似地,ALBERT也使用MLM任务,但没有使用NSP任务,而是使用一个新任务,叫句子顺序预测(sentence order prediction,SOP)。
ALBERT的作者指出基于NSP任务进行预训练并不是真的有效,它与MLM任务相比并不是一个很难的任务。同时,NSP结合了主题预测和连贯性预测到一个任务中。为了解决这个问题,他们引入了SOP任务,SOP基于句子间的连贯性而不是主题预测。我们来看下SOP任务的细节。
句子顺序预测
类似NSP,SOP也是一个二分类任务。在NSP中,我们训练模型去预测某个句子对是属于isNext
还是notNext
类别,而在SOP任务中,我们训练模型去预测给定句子对中的句子顺序是否被交换过。还是以一个例子来理解,考虑下面的句子对:
Sentence 1: She cooked pasta
Sentence 2: It was delicious
我们可以看出句子2和句子1是有连续关系的,因此我们把它们分为正例。现在我们创建一个负例,只要简单地交换这两个句子的顺序即可:
Sentence 1: It was delicious
Sentence 2: She cooked pasta
上面句子对中的句子顺序是交换过了的,我们把它们分为负例。
这样,我们可以使用任意语言的语料库创建SOP任务的数据集。假设我们有一些文本,我们简单地从某个文本中抽取连续的两个句子标记为正例。然后,交换它们的顺序就变成了一个负例。
对比ALBERT和BERT
类似BERT,ALBERT也基于不同的配置进行预训练。在所有的配置中,ALBERT相比BERT具更好的参数。下表显示了BERT和ALBERT模型不同配置的比较。我们看到在同样的配置下,ALBERT相比BERT少了很多参数。比如,BERT-large有334M参数,而ALBERT-large只有18M参数:
在训练之后,我们也能在任何下游任务上微调预训练的ALBERT模型。ALBERT-xxlarge模型比BERT-base和BERT-large在一些语言基准数据集上效果有不少的提升,其中包括SQuAD1.1、SQuAD2.0、MNLI SST-2和RACE数据集。
抽取ALBERT的嵌入
使用
一起来学习BERT常见的几个变体相关推荐
- Unity Shader 学习笔记(5)Shader变体、Shader属性定义技巧、自定义材质面板
写在之前 Shader变体.Shader属性定义技巧.自定义材质面板,这三个知识点任何一个单拿出来都是一套知识体系,不能一概而论,本文章目的在于将学习和实际工作中遇见的问题进行总结,类似于网络笔记之用 ...
- 深入理解深度学习——BERT派生模型:XLM(Cross-lingual Language Model)
分类目录:<深入理解深度学习>总目录 BERT本应在语义理解上具有绝对优势,但其训练语料均为英语单语,受限于此,早期的BERT只在英语文本理解上有优势.随着全球化进程的加速,跨语言的预训练 ...
- 上手!深度学习最常见的26个模型练习项目汇总
作者:沧笙踏歌 转载自AI部落联盟(id:AI_Tribe) 今天更新关于常见深度学习模型适合练手的项目.这些项目大部分是我之前整理的,基本上都看过,大概俩特点:代码不长,一般50-200行代码,建议 ...
- 深度学习计算机视觉常见的29道面试题及解析
点击上方,选择星标或置顶,不定期资源大放送! 阅读大概需要15分钟 Follow小博主,每天更新前沿干货 作者丨我要鼓励娜扎@知乎 来源丨https://zhuanlan.zhihu.com/p/89 ...
- Python语言学习之常见语句命令那些事:python和常见语句命令(条件语句、pass语句)使用方法之详细攻略
Python语言学习之常见语句命令那些事:python和常见语句命令(条件语句.pass语句)使用方法之详细攻略 目录 Python常见语句命令 1.python的条件语句 2.Python之pass ...
- ML之模型文件:机器学习、深度学习中常见的模型文件(.h5、.keras)简介、h5模型文件下载集锦、使用方法之详细攻略
ML之模型文件:机器学习.深度学习中常见的模型文件(.h5..keras)简介.h5模型文件下载集锦.使用方法之详细攻略 目录 ML/DL中常见的模型文件(.h5..keras)简介及其使用方法 一. ...
- 深度学习中常见的损失函数
文章来源于AI的那些事儿,作者黄鸿波 2018年我出版了<TensorFlow进阶指南 基础.算法与应用>这本书,今天我把这本书中关于常见的损失函数这一节的内容公开出来,希望能对大家有所帮 ...
- mybatis学习笔记--常见的错误
原文来自:<mybatis学习笔记--常见的错误> 昨天刚学了下mybatis,用的是3.2.2的版本,在使用过程中遇到了些小问题,现总结如下,会不断更新. 1.没有在configurat ...
- 深度学习中常见的打标签工具和数据集资源
深度学习中常见的打标签工具和数据集资源 一.打标签工具 1. labelimg/labelme 1.1 搭建图片标注环境(win10) (1) 安装anaconda3 (2) 在anaconda环境p ...
- NN:神经网络学习,常见激活和损失函数的Python实现
NN:神经网络学习,常见激活和损失函数的Python实现 激活函数 1.sigmoid # sigmoid # sigmoid输出总是大于零,因此前一层对后一层的神经元输入也总是大于零出现了漂移 de ...
最新文章
- Linux进程突然挂死,当主进程突然死亡时,我该如何杀死linux spawnProcess?
- RK3399 Ubuntu修改任务栏为自动隐藏和修改桌面背景
- 面试题:二叉树的深度
- 使用littleTools简化docker/kubectl的命令
- 机器人动力学(Basic Newton-Euler Mechanics)
- python爬虫学习第一章
- linux内核3.14.4,Linux内核4.14.14,4.9.77,4.4.112和3.18.92更新发布
- 转载:使用 frida hook 插件化 apk ( classloader )
- apache php 500,apache出现500错误的原因是什么
- POJ3614 Sunscreen【贪心】
- php 重写sessionid,PHP 重置 phpsessionid
- 利用纯真ip库搭建ip查询服务
- vant制作首页的加载中和暂无数据
- ico生成工具ico制作工具ico在线制作
- 计算机日志文件事件ID,系统日志出现事件 ID:16001来源:AFD的警告
- 前程无忧招聘信息数据清洗+聚类分析
- Intelligent Reflecting Surface Assisted Secrecy Communication via Joint Beamforming and Jamming
- matlab fisher检验,模式识别中Fisher分类器的Matlab实现及测试
- verilog写的三分频
- python字母转换_python中字母与ascii码的相互转换