tensorflowgpu使用情况:预训练小模型也能拿下13项NLP任务
tensorflowgpu使用情况:预训练小模型也能拿下13项NLP任务我们先看看 ALBERT 的的参数量,简直是预训练语言模型中的「一股清流」。论文地址:https://openreview.net/pdf?id=H1eA7AEtvS通常而言,在预训练自然语言表征时增加模型大小可以提升模型在下游任务中的性能。但在某些情况下,由于 GPU/TPU 内存限制、训练时间延长以及意外的模型退化等原因,进一步增加模型大小的难度也随之增加。所以,为了解决这些问题,来自谷歌的研究者提出通过两种参数精简技术来降低内存消耗,加快 BERT 的训练速度。值得注意的是,ALBERT 模型在 GLUE、RACE 和 SQuAD 基准测试上都取得了新的 SOTA 效果,并且参数量还少于 BERT-large。要知道,目前 BERT-Large 已经在 GLUE 基准排到了 16 名,而 ALBERT 这个新模型竟然以更少的参数量荣登榜首。ALBERT 已经投递到了 ICLR 202
选自openreview.net
机器之心编译
机器之心编辑部
在预训练语言模型中,小模型也有出头的一天?大力出奇迹这道坎也能轻松跨越?看看谷歌最新提出来的 GLUE 榜首模型:A LITE BERT。
通常而言,在预训练自然语言表征时增加模型大小可以提升模型在下游任务中的性能。但在某些情况下,由于 GPU/TPU 内存限制、训练时间延长以及意外的模型退化等原因,进一步增加模型大小的难度也随之增加。
所以,为了解决这些问题,来自谷歌的研究者提出通过两种参数精简技术来降低内存消耗,加快 BERT 的训练速度。
值得注意的是,ALBERT 模型在 GLUE、RACE 和 SQuAD 基准测试上都取得了新的 SOTA 效果,并且参数量还少于 BERT-large。要知道,目前 BERT-Large 已经在 GLUE 基准排到了 16 名,而 ALBERT 这个新模型竟然以更少的参数量荣登榜首。ALBERT 已经投递到了 ICLR 2020,目前正处于双盲审阶段。
论文地址:https://openreview.net/pdf?id=H1eA7AEtvS
我们先看看 ALBERT 的的参数量,简直是预训练语言模型中的「一股清流」。
表 2:本文中用到的 BERT 和 ALBERT 模型配置。
就这样参数量的语言模型,也能克服大力出奇迹这道坎?事实证明,ALBERT 通过为下游任务共享所有层的所有参数,即使训练数据集不大,也能拿个 GLUE 基准榜首。
当前 GLUE 基准的结果。
研究者表明,通过对词嵌入矩阵进行因式分解,再为下游任务共享不同层的所有参数,这样可以大大降低 BERT 的参数量。我们再也不要担心 GPU 动不动就报错「out of memory」,下游应用也能更轻松一些。此外,研究者还提出了一种新型句间连贯性损失函数,它可以强迫模型学习句间的连贯性表达,从而有利于各种下游 NLP 任务。
总体而言,通过三大改造,ALBERT 这种小模型也能登绝顶。
曾经,预训练是大模型的天下
预训练已经促使语言表征学习领域取得了一系列突破。诸多不凡的 NLP 任务,包括那些训练数据有限的任务,都大大受益于这些预训练模型。
语言表征学习领域的这些进展表明,大模型对于实现 SOTA 性能表现极其重要。预训练大模型,并在实际应用中将它们提炼成更小的模型已经成为一种常见的做法。考虑到模型大小的重要性,研究者提出一个问题:建立更好的 NLP 模型像构建更大的模型一样容易吗?
解答该问题的难点在于可用硬件的内存会受到限制。考虑到当前的 SOTA 模型常常包含数亿甚至数十亿参数,扩展模型时很容易受到内存的限制。
研究者还观察到,仅仅增加 BERT-large 等模型的隐藏层大小也会导致性能下降。如下表 1 和图 1 所示,研究者将 BERT-large 的隐藏层大小增加一倍,该模型(BERT-xlarge)在 RACE 基准测试上的准确率显著降低。
表 1:增加 BERT-large 的隐藏层大小,模型在 RACE 上的表现变差。
图 1:BERT-large 和 BERT-xlarge 的训练损失(左)和 dev mask 的 LM 准确率(右)。模型增大之后,其 mask LM 准确率降低了,同时没有出现明显的过拟合迹象。
现在,小模型也已崛起
为了解决上述问题,谷歌的研究者设计了「一个精简的 BERT」(A Lite BERT,ALBERT),参数量远远少于传统的 BERT 架构。
ALBERT 通过两个参数削减技术克服了扩展预训练模型面临的主要障碍。第一个技术是对嵌入参数化进行因式分解。研究者将大的词汇嵌入矩阵分解为两个小的矩阵,从而将隐藏层的大小与词汇嵌入的大小分离开来。这种分离使得隐藏层的增加更加容易,同时不显著增加词汇嵌入的参数量。
第二种技术是跨层参数共享。这一技术可以避免参数量随着网络深度的增加而增加。两种技术都显著降低了 BERT 的参数量,同时不对其性能造成明显影响,从而提升了参数效率。ALBERT 的配置类似于 BERT-large,但参数量仅为后者的 1/18,训练速度却是后者的 1.7 倍。这些参数削减技术还可以充当某种形式的正则化,可以使训练更加稳定,而且有利于泛化。
为了进一步提升 ALBERT 的性能,研究者还引入了一个自监督损失函数,用于句子级别的预测(SOP)。SOP 主要聚焦于句间连贯,用于解决原版 BERT 中下一句预测(NSP)损失低效的问题。
基于这些设计,ALBERT 能够扩展为更大的版本,参数量仍然小于 BERT-large,但性能可以显著提升。研究者在知名的 GLUE、SQuAD 和 RACE 自然语言理解基准测试上都得到了新的 SOTA 结果:在 RACE 上的准确率为 89.4%,在 GLUE 上的得分为 89.4,在 SQuAD 2.0 上的 F1 得分为 92.2。
ALBERT 的三大改造
前面已经展示了小模型的优势,以及 ALBERT 的核心思想,那么 ALBERT 具体结构又是怎么样的。在这一部分中,我们将简要介绍 ALBERT 的三大模块,并提供与标准 BERT 的量化对比。
ALBERT 架构的骨干网络与 BERT 是相似的,即使用 Transformer 编码器和 GELU 非线性激活函数。现在先约定一下 BERT 的表示方式,即指定词嵌入大小为 E、编码器层数为 L、隐藏层大小为 H。与 Devlin 等人的研究一样,这篇论文将前馈网络/滤波器大小设置为 4H,将注意力 Head 的数量设置为 H/64。
如下将介绍 ALBERT 最为独特的三大结果。
嵌入向量参数化的因式分解
在 BERT 以及后续的 XLNet 和 RoBERTa 中,WordPiece 词嵌入大小 E 和隐藏层大小 H 是相等的,即 E ≡ H。由于建模和实际使用的原因,这个决策看起来可能并不是最优的。
从建模的角度来说,WordPiece 词嵌入的目标是学习上下文无关的表示,而隐藏层嵌入的目标是学习上下文相关的表示。通过上下文相关的实验,BERT 的表征能力很大一部分来自于使用上下文为学习过程提供上下文相关的表征信号。因此,将 WordPiece 词嵌入大小 E 从隐藏层大小 H 分离出来,可以更高效地利用总体的模型参数,其中 H 要远远大于 E。
从实践的角度,自然语言处理使用的词典大小 V 非常庞大,如果 E 恒等于 H,那么增加 H 将直接加大嵌入矩阵的大小,这种增加还会通过 V 进行放大。
因此,对于 ALBERT 而言,研究者对词嵌入参数进行了因式分解,将它们分解为两个小矩阵。研究者不再将 one-hot 向量直接映射到大小为 H 的隐藏空间,而是先将它们映射到一个低维词嵌入空间 E,然后再映射到隐藏空间。通过这种分解,研究者可以将词嵌入参数从 O(V × H) 降低到 O(V × E E × H),这在 H 远远大于 E 的时候,参数量减少得非常明显。
跨层参数共享
对于 ALBERT,研究者提出了另一种跨层参数共享机制来进一步提升参数效率。其实目前有很多方式来共享参数,例如只贡献前馈网络不同层之间的参数,或者只贡献注意力机制的参数,而 ALBERT 采用的是贡献所有层的所有参数。
这种机制之前也是有的,但研究者的度量发现词嵌入的 L2 距离和余弦相似性是震荡而不是收敛。如下图 2 展示了每一层输入与输出嵌入矩阵间的 L2 距离与余弦相似性。
图 2:BERT-Large 与 ALBERT-Large 每一层输入嵌入与输出嵌入间的 L2 距离与余弦相似性。
研究者发现 ALBERT 从一层到另一层的转换要比 BERT 平滑得多,结果表明,权重共享有效地提升了神经网络参数的鲁棒性。即使相比于 BERT 这两个指标都有所下降,但在 24 层以后,它们也不会收敛到 0。
句间连贯性损失
除了自编码语言建模损失外,BERT 还是用了额外的下一句预测损失。下一句预测损失本来是为了提升下游任务的性能,但是后来很多研究者发现这种机制并不是很高效,因此决定去除它。
研究者猜测,下一句预测任务低效的原因,主要是它的难度太小。因为下一句预测将主题预测和连贯性预测结合到单个任务中,然而主题预测比连贯性预测简单得多,因此它与语言建模损失函数学到的内容是有重合的。
研究者表示,句间建模在语言理解中是非常重要的,因此他们提出了一种基于语言连贯性的损失函数。对于 ALBERT,研究者使用了一个句子顺序预测(SOP)损失函数,它会避免预测主题,而只关注建模句子之间的连贯性。
具体的损失函数表达式读者可以查阅原论文,但研究者表示,在使用了该损失函数后,ALBERT 能显著提升下游多句子编码任务的性能。
ALBERT 效果如何
为了进行更公平的对比,研究者在原始 BERT 的配置下训练试验模型效果。研究者使用了 BOOKCORPUS 和 English Wikipedia 共计 16GB 的纯文本作为预训练任务的数据。它们在 Cloud TPU V3 上训练所有的模型,TPU 数量从 64 到 1024 会根据模型大小进行选择。
如下表 3 所示,只有 BERT-Large 70% 的参数量,ALBERT-xxlarge 能实现显著的性能提升。
表 3:模型在 BOOKCORPUS 和 Wikipedia 数据集训练 125k 步后的开发集结果。
如上所示,ALBERT 相比 BERT 有更高的数据吞吐量,其中最慢的就是 BERT-xLarge,它也作为了基线结果。随着模型越来越大,BERT 和 ALBERT 之间的差别也越来越大。
前面介绍过嵌入矩阵分解的优势,如下表 4 展示了修改词嵌入大小 E 带来的影响,它们的参数量及下游任务效果也都展示在内。
表 4:ALBERT-base 随词嵌入大小的改变,其性能与参数量的变化。
对于 ALBERT 的第二个基础——跨层参数共享,下面表 5 展示了该机制的效果,其同样使用 ALBERT-base 作为示例模型。
表 5:跨层参数共享策略的效果,此处用到的模型是 ALBERT-base。
对于 ALBERT 的第三大基础——句间连贯性损失(SOP),下表 6 展示了其与下一句预测损失(NSP)的对比效果。
表 6:句子预测损失、NSP、SOP 的效果。 表 3 中的加速结果表明,BERT-large 的数据吞吐量是 ALBERT-xxlarge 的 3.17 倍。我们知道,延长训练时间通常能提升模型的表现,因此研究者决定让模型训练差不多相同的时间来观察其表现。下图 7 展示了实验结果:
表 7:BERT-large 和 ALBERT-xxlarge 在控制训练时间时的效果。
在训练了差不多相同的时间之后,ALBERT-xxlarge 明显优于 BERT-large。
上述实验都是在 Wikipedia 和 BOOKCORPUS 数据集上进行的,那么,如果增加额外的数据会对结果产生怎样的影响?
图 3a:在训练期间添加额外数据的影响。
图 3a 表明,添加额外数据后,模型的开发集 MLM 准确率显著提升。
此外,研究者还观察了添加额外数据后模型在下游任务中的性能情况,如下表 8 所示:
表 8:有/无额外训练数据的结果,此处使用的模型是 ALBERT-base。
研究者还注意到,即使在训练了 100 万步之后,最大的模型仍然没有过拟合。因此,他们决定删除 dropout,以进一步提高模型能力。如下图 3b 所示,去掉 dropout 可以显著提高 MLM 准确度。
图 3b:移除 dropout 前后的模型性能。
表 9:移除 dropout 前后的结果,此处使用的模型是 ALBERT-xxlarge。
除了上述实验之外,ALBERT 在 GLUE、SQuAD 和 RACE 基准测试中都取得了 SOTA 结果,如下图 10、11 所示:
表 10:ALBERT 在 GLUE 基准上的 SOTA 结果。
表 11:ALBERT 在 SQuAD 和 RACE 基准上的 SOTA 结果。