ALBERT 清晰解读

BERT 模型参数很多,进一步提升模型规模会受到 GPU/TPU 内存大小的限制。Google 提出了 ALBERT[1][2](A Lite BERT)来解决这个问题。

ALBERT 使用了两项降低参数量的技术,并改进了 NSP 预训练任务:

一、嵌入矩阵分解

不管是 BERT,还是后续在 BERT 基础上改进的模型 XLNet,RoBERTa,他们的嵌入向量维度和隐藏层维度都是相等的,这样能进行残差连接的加和运算。这里以 BERT-base 为例,算下嵌入矩阵的参数量:BERT-base 的词表大小 V=30000,嵌入向量维度 E 和隐藏层维度 H 相等,都是 768,一个嵌入矩阵的参数量就是 V×E,有点大,不好顶。

ALBERT 用了矩阵分解的思想,解开了 E 和 H 的等号限制。它的做法很简单,用时间换空间,在嵌入向量后面紧接着加了一个全连接层,把 E 映射到 H 维度,如下图:

图1 嵌入矩阵分解

这样 E 可以设置成 128 维,全连接层把它映射到 768 维,不影响后续的残差运算。参数量级的变化为:

从 30000×768 = 23,040,000 ≈ 23M 降到了 30000×128 + 128×768 = 3,938,304 ≈ 4M,所以粗略来看,在 BERT-base 情况下,嵌入矩阵参数量降低了 19M,缩到了原先的 17%,感觉还阔以。不过 BERT-base 总参数量为 108M,通过嵌入矩阵砍掉的参数其实只是冰山一角。

作者做了一个实验,他把嵌入矩阵维度从 768 一直往下降,测试模型的效果,如表 1。最后一行就对应着 BERT-base 的参数量,当 E 降低的时候,即使有全连接层进行升维映射,但平均分数也会下降,可见天下没有免费的午餐。E = 128 对应着前面计算的情况,参数量从 108M 降到 89M 缩小了 19M,与前面计算的参数降低量相同。

表1 嵌入矩阵维度 E 对平均分数的影响

二、参数共享

ALBERT 使用的第二个降低参数量的方法是参数共享,这里有三种共享方式:

  • 共享多头注意力层
  • 共享 FFN 层
  • 多头注意力和 FFN 都共享

作者选择了都共享,也就是一份数据在 Transformer 的一个编码层上,来回过 12 遍,如下图:

图2 参数共享

表 2 中,如果共享全部参数,参数量为 12M,是不共享参数时的 13%,参数量降低很多,但平均分数也同样降低很多,最开始均分 82.3,矩阵分解后降到 81.7,现在参数共享后降到 80.1。

表2 参数共享方式对平均分数的影响

三、句子顺序判断

后续的研究发现 BERT 使用的 NSP 预训练任务对于下游微调任务基本没什么作用,删掉 NSP 有时还能有一点提升。仔细分析 NSP 这个任务,它的正样本是选取了两个相邻的 segments,而负样本是选取了两个不同文档的 segments。所以对于模型来说,NSP 有两种方法可以解决:

  • 主题预测。如果两个 segments 主题不同说明来自不同文档,进而判断为负样本。
  • 连贯性预测。这是 BERT 的本意,让模型判断两个 segment 是不是邻接的。

我们希望模型学到后者,但是前者更好学,并且主题预测和 MLM 任务有些重叠了,所以导致 NSP 这个预训练任务效果不好。

ALBERT 提出了 SOP(Sentence-Order Prediction)。SOP 就是让模型预测两个相邻 segments 有没有被调换前后顺序,如下图:

图3 SOP 预训练任务

这样模型就只能通过连贯性来预测 True or False,而不会借助主题信息。

作者做了一个测试,如表 3,用 NSP 作为预训练任务,在不经过任何改动的情况下,它在 SOP 任务上的准确率为 52.0%,比不使用 NSP 的时候还低,接近随机分类(50%)。而使用 SOP 作为预训练任务,它在 NSP 任务上的准确率为 78.9%,这说明 SOP 是真的学到了句间连贯性信息,并且用学到的知识解决了 NSP 问题。而反之则不行,说明 NSP 没有学到句间连贯性信息。同时使用 SOP 后,模型平均分数提高了 1 左右。

表3 SOP对平均分数的影响

四、提分点

以上就是 ALBERT 的三个小创新点。此外,为了屠榜,ALBERT 还做了一些其他操作来提分。

1. 预训练用长句

BERT 在预训练的时候,为了加速,前 90% 的 steps 用长度为 128 的句子,而后 10% 的 steps 用长度为 512 的句子,来训练位置编码。

ALBERT 则是反过来,90%-512,10%-128。

我个人认为,长句能激发模型学习文档级别的表示向量,短句则是让模型学习句级的表示向量,ALBERT 用更多的长句,模型内部的向量会更高级、更抽象,所以效果有所提升。

2. 遮挡多个连续词

ALBERT 借鉴 SpanBERT 中的方法,改进了 BERT 的 MLM 任务,每次不随机遮一个词,而是随机遮连续的多个词,连续多个词具有更完整的语义,提高了预训练的难度,有利于下游微调任务。

3. 扩大模型参数

表4 BERT和ALBERT的参数配置

用于屠榜的 ALBERT 并不是 base 配置,而是 xxlarge 配置。ALBERT-xxlarge 的平均分比 BERT-large 高了 3.5,如表5,参数量是 BERT-large 的 70%,但速度是 0.3 倍。所以可见 ALBERT 通过共享参数把参数量压下来了,但该计算的还得计算,计算量是不会减小的。

表5 BERT和ALBERT的得分

这里需要注意一下,ALBERT-xxlarge 层数是 12,而不是 24,因为作者通过实验发现,当隐藏层维度是 4096 时,24 层和 12 层效果一样,也就是说模型到达了深度极限。

4. 增加预训练数据

BERT 使用的预训练数据是 Wikipedia 和 BOOKCORPUS 两个数据集,而 ALBERT 使用了 XLNet 和 RoBERTa 中都使用到的额外预训练数据集,结果如下表。除了 SQuAD 基准,其他的都有所提升,这是因为 SQuAD 基准是基于 Wikipedia,而 BERT 的预训练数据集已经包括 Wikipedia 了,多加其他数据集对 SQuAD 来说是干扰。

表6 额外数据的影响

5. 去掉 Dropout 层

因为共享参数降低了参数量,参数量下降对模型来说是一种正则化,所以这个时候再搭配 Dropout 效果就会下降,因为有点过度正则化了。ALBERT 在去掉 Dropout 后,平均分数提高了0.3。

表7 Dropout 的影响

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值