引言

本文我们会学习几种常见的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嵌入大小设为隐藏层嵌入大小,因为我们可以直接投影独热向量到隐藏层空间。基于分解(将EEEHHH分离,即让它们相互独立),我们首先将独热向量投影到低维嵌入空间V×EV \times EV×E,然后再将该低维嵌入投影到隐藏空间E×HE \times HE×H,而不是直接投影独热向量到隐藏空间(V×HV \times HV×H)。即,我们不是直接投影V×HV \times HV×H,而是将这步分解为V×EV \times EV×EE×HE \times HE×H

举个例子,假设我们词表大小V=30000V=30000V=30000,我们将EEEHHH分离。假设我们将WordPiece嵌入大小设置为较小的维度,假设E=128E=128E=128。同时隐藏层大小保持不变,还是H=768H=768H=768。现在我们通过以下步骤来投影V×HV \times HV×H

  1. 我们将one-hot向量投影到低维WordPiece嵌入向量空间V×E=30000×128V \times E = 30000 \times 128V×E=30000×128
  2. 我们接着投影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×128E×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常见的几个变体相关推荐

  1. Unity Shader 学习笔记(5)Shader变体、Shader属性定义技巧、自定义材质面板

    写在之前 Shader变体.Shader属性定义技巧.自定义材质面板,这三个知识点任何一个单拿出来都是一套知识体系,不能一概而论,本文章目的在于将学习和实际工作中遇见的问题进行总结,类似于网络笔记之用 ...

  2. 深入理解深度学习——BERT派生模型:XLM(Cross-lingual Language Model)

    分类目录:<深入理解深度学习>总目录 BERT本应在语义理解上具有绝对优势,但其训练语料均为英语单语,受限于此,早期的BERT只在英语文本理解上有优势.随着全球化进程的加速,跨语言的预训练 ...

  3. 上手!深度学习最常见的26个模型练习项目汇总

    作者:沧笙踏歌 转载自AI部落联盟(id:AI_Tribe) 今天更新关于常见深度学习模型适合练手的项目.这些项目大部分是我之前整理的,基本上都看过,大概俩特点:代码不长,一般50-200行代码,建议 ...

  4. 深度学习计算机视觉常见的29道面试题及解析

    点击上方,选择星标或置顶,不定期资源大放送! 阅读大概需要15分钟 Follow小博主,每天更新前沿干货 作者丨我要鼓励娜扎@知乎 来源丨https://zhuanlan.zhihu.com/p/89 ...

  5. Python语言学习之常见语句命令那些事:python和常见语句命令(条件语句、pass语句)使用方法之详细攻略

    Python语言学习之常见语句命令那些事:python和常见语句命令(条件语句.pass语句)使用方法之详细攻略 目录 Python常见语句命令 1.python的条件语句 2.Python之pass ...

  6. ML之模型文件:机器学习、深度学习中常见的模型文件(.h5、.keras)简介、h5模型文件下载集锦、使用方法之详细攻略

    ML之模型文件:机器学习.深度学习中常见的模型文件(.h5..keras)简介.h5模型文件下载集锦.使用方法之详细攻略 目录 ML/DL中常见的模型文件(.h5..keras)简介及其使用方法 一. ...

  7. 深度学习中常见的损失函数

    文章来源于AI的那些事儿,作者黄鸿波 2018年我出版了<TensorFlow进阶指南 基础.算法与应用>这本书,今天我把这本书中关于常见的损失函数这一节的内容公开出来,希望能对大家有所帮 ...

  8. mybatis学习笔记--常见的错误

    原文来自:<mybatis学习笔记--常见的错误> 昨天刚学了下mybatis,用的是3.2.2的版本,在使用过程中遇到了些小问题,现总结如下,会不断更新. 1.没有在configurat ...

  9. 深度学习中常见的打标签工具和数据集资源

    深度学习中常见的打标签工具和数据集资源 一.打标签工具 1. labelimg/labelme 1.1 搭建图片标注环境(win10) (1) 安装anaconda3 (2) 在anaconda环境p ...

  10. NN:神经网络学习,常见激活和损失函数的Python实现

    NN:神经网络学习,常见激活和损失函数的Python实现 激活函数 1.sigmoid # sigmoid # sigmoid输出总是大于零,因此前一层对后一层的神经元输入也总是大于零出现了漂移 de ...

最新文章

  1. Linux进程突然挂死,当主进程突然死亡时,我该如何杀死linux spawnProcess?
  2. RK3399 Ubuntu修改任务栏为自动隐藏和修改桌面背景
  3. 面试题:二叉树的深度
  4. 使用littleTools简化docker/kubectl的命令
  5. 机器人动力学(Basic Newton-Euler Mechanics)
  6. python爬虫学习第一章
  7. linux内核3.14.4,Linux内核4.14.14,4.9.77,4.4.112和3.18.92更新发布
  8. 转载:使用 frida hook 插件化 apk ( classloader )
  9. apache php 500,apache出现500错误的原因是什么
  10. POJ3614 Sunscreen【贪心】
  11. php 重写sessionid,PHP 重置 phpsessionid
  12. 利用纯真ip库搭建ip查询服务
  13. vant制作首页的加载中和暂无数据
  14. ico生成工具ico制作工具ico在线制作
  15. 计算机日志文件事件ID,系统日志出现事件 ID:16001来源:AFD的警告
  16. 前程无忧招聘信息数据清洗+聚类分析
  17. Intelligent Reflecting Surface Assisted Secrecy Communication via Joint Beamforming and Jamming
  18. matlab fisher检验,模式识别中Fisher分类器的Matlab实现及测试
  19. verilog写的三分频
  20. python字母转换_python中字母与ascii码的相互转换

热门文章

  1. phpmailer 与 mail
  2. 将文件保存到数据库中
  3. java day10【接口、多态】
  4. Scrapy爬虫框架的安装和使用
  5. 金数据表单接口请求(php)
  6. POJ 3311 Hie with the Pie (状压DP)
  7. 解决图片三像素的问题
  8. Spring学习总结(2)- AOP
  9. 【原创】k8s源代码分析-----kubelet(3)ContainerGC
  10. perl 安装 ZooKeeper模块