赞
踩
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 使用的第二个降低参数量的方法是参数共享,这里有三种共享方式:
作者选择了都共享,也就是一份数据在 Transformer 的一个编码层上,来回过 12 遍,如下图:
图2 参数共享
表 2 中,如果共享全部参数,参数量为 12M,是不共享参数时的 13%,参数量降低很多,但平均分数也同样降低很多,最开始均分 82.3,矩阵分解后降到 81.7,现在参数共享后降到 80.1。
表2 参数共享方式对平均分数的影响
后续的研究发现 BERT 使用的 NSP 预训练任务对于下游微调任务基本没什么作用,删掉 NSP 有时还能有一点提升。仔细分析 NSP 这个任务,它的正样本是选取了两个相邻的 segments,而负样本是选取了两个不同文档的 segments。所以对于模型来说,NSP 有两种方法可以解决:
我们希望模型学到后者,但是前者更好学,并且主题预测和 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 还做了一些其他操作来提分。
BERT 在预训练的时候,为了加速,前 90% 的 steps 用长度为 128 的句子,而后 10% 的 steps 用长度为 512 的句子,来训练位置编码。
ALBERT 则是反过来,90%-512,10%-128。
我个人认为,长句能激发模型学习文档级别的表示向量,短句则是让模型学习句级的表示向量,ALBERT 用更多的长句,模型内部的向量会更高级、更抽象,所以效果有所提升。
ALBERT 借鉴 SpanBERT 中的方法,改进了 BERT 的 MLM 任务,每次不随机遮一个词,而是随机遮连续的多个词,连续多个词具有更完整的语义,提高了预训练的难度,有利于下游微调任务。
表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 层效果一样,也就是说模型到达了深度极限。
BERT 使用的预训练数据是 Wikipedia 和 BOOKCORPUS 两个数据集,而 ALBERT 使用了 XLNet 和 RoBERTa 中都使用到的额外预训练数据集,结果如下表。除了 SQuAD 基准,其他的都有所提升,这是因为 SQuAD 基准是基于 Wikipedia,而 BERT 的预训练数据集已经包括 Wikipedia 了,多加其他数据集对 SQuAD 来说是干扰。
表6 额外数据的影响
因为共享参数降低了参数量,参数量下降对模型来说是一种正则化,所以这个时候再搭配 Dropout 效果就会下降,因为有点过度正则化了。ALBERT 在去掉 Dropout 后,平均分数提高了0.3。
表7 Dropout 的影响
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。