背景简介
近年来,大型语言模型的发展突飞猛进。 BERT 成为最流行、最高效的模型之一,可以高精度地解决各种 NLP 任务。 BERT 之后,一系列其他模型随后出现,也表现出了出色的效果。
一个很容易观察到的明显趋势是,随着时间的推移,大型语言模型(LLM)往往会变得更加复杂,其参数和训练数据的数量会呈指数级增长。深度学习研究表明,这种技术通常能带来更好的结果。不幸的是,机器学习领域已经处理了一些有关 LLM 的问题,可扩展性已成为有效训练、存储和使用 LLM 的主要障碍。
因此,最近开发出了新的 LLM 来解决可扩展性问题。本文将讨论 ALBERT,它发明于 2020 年,目的是大幅降低 BERT 参数。
ALBERT
要了解 ALBERT 的基本机制,我们将参考其官方文件。在大多数情况下,ALBERT 采用了与 BERT 相同的架构。在模型结构的选择上有三个主要区别,下面将对其进行讨论和解释。
ALBERT 的训练和微调程序与 BERT 类似。与 BERT 一样,ALBERT 也在英语维基百科(2.5 亿词)和 BookCorpus(8 亿词)上进行预训练。
因式参数嵌入(Factorized Parameter Embedding)
当输入序列被标记化后,每个标记都会被映射到其中一个词汇嵌入。这些嵌入词将用于 BERT 的输入。
假设 V 是词汇量(可能的嵌入式总数量),H 是嵌入式维度。那么,对于每一个 V 嵌入,我们都需要存储 H 个值,从而形成一个 V x H 的嵌入矩阵。实际上,这个矩阵的大小通常很大,需要大量内存来存储。但一个更全面的问题是,大多数情况下,嵌入矩阵的元素都是可训练的,模型需要大量资源来学习适当的参数。
例如,让我们以 BERT 基础模型为例:它有 3 万个词库,每个词库由 768 个分量嵌入表示。这总共需要存储和训练 2300 万个权值。对于更大的模型,这个数字甚至更大。
使用矩阵因式分解可以避免这个问题。原始词汇矩阵 V x H 可以分解成一对较小的矩阵,大小分别为 V x E 和 E x H。
因此,分解只需 O(V x E + E x H)个权重,而不需要 O(V x H)个参数。显然,当 H >> E 时,这种方法是有效的。
矩阵因式分解的另一个优点是,它不会改变获取标记嵌入的查找过程:左分解矩阵 V x E 的每一行都以与原始矩阵 V x H 相同的简单方式将标记映射到相应的嵌入。
然而,在分解矩阵的情况下,为了获得 BERT 的输入,映射嵌入需要投影到隐藏的 BERT 空间:这是通过将左矩阵的相应行乘以右矩阵的列来实现的。
跨层参数共享(Cross-layer Parameter Sharing)
减少模型参数的方法之一是使参数可共享。这意味着所有参数都共享相同的值。在大多数情况下,这只是减少了存储权重所需的内存。不过,反向传播或推理等标准算法仍需在所有参数上执行。
当权重位于模型中不同但相似的区块时,是共享权重的最佳方式之一。将它们放在相似的区块中,可以提高在前向传播或反向传播过程中对可共享参数进行相同计算的几率。这就为设计高效的计算框架提供了更多机会。
ALBERT 实现了上述想法,它由一组具有相同结构的Transformer模块组成,从而提高了参数共享的效率。事实上,在跨层Transformer中存在多种参数共享方式:
- 只共享注意力参数;
- 只共享前向神经网络(FNN)参数;
- 共享所有参数(在 ALBERT 中使用)。
一般来说,可以将所有Transformer层划分为 N 组,每组大小为 M,其中每组共享其拥有的层内参数。研究人员发现,分组 M 越小,效果越好。然而,减小 M 组的规模会导致总参数的显著增加。
句序预测(Sentence Order Prediction)
在预训练时,BERT 重点掌握两个目标:屏蔽语言建模(MSM)和下句预测(NSP)。一般来说,MSM 的目的是提高 BERT 获取语言知识的能力,而 NSP 的目标则是提高 BERT 在特定下游任务中的表现。
然而,多项研究表明,取消 NSP 目标可能是有益的,这主要是因为与 MLM 相比,NSP 更为简单。根据这一想法,ALBERT 的研究人员也决定取消 NSP 任务,代之以句子顺序预测(SOP)问题,其目标是预测两个句子的顺序是正确的还是相反的。
说到训练数据集,所有正向输入句子对都是在同一文本段落中按顺序收集的(与 BERT 的方法相同)。对于负句,除了两个句子的顺序相反外,原则是一样的。
实验表明,以 NSP 为目标训练的模型无法准确解决 SOP 任务,而以 SOP 为目标训练的模型在 NSP 问题上表现良好。这些实验证明,ALBERT 比 BERT 更适合解决各种下游任务。
BERT 对比 ALBERT
BERT 和 ALBERT 的详细比较如下图所示。
BERT 和 ALBERT 模型不同变体之间的比较。在相同配置下测得的速度显示了模型迭代训练数据的速度。每个模型的速度值都是相对的(BERT 大模型作为基线,其速度等于 1x)。准确度分数是在 GLUE、SQuAD 和 RACE 基准上测量的。
以下是最有趣的观察结果:
- ALBERT xxlarge 版本的参数只有 BERT large 的 70%,因此在下游任务中性能更佳。
- 与 BERT large 相比,ALBERT large 的性能相当,但由于压缩了大量参数,速度快了 1.7 倍。
- 所有 ALBERT 模型的嵌入大小均为 128。正如论文中的消融研究所示,这是最佳值。增加嵌入大小,例如增加到 768,可以改善指标,但绝对值不超过 1%,这与模型复杂度的增加关系不大。
- 虽然 ALBERT xxlarge 处理单次迭代数据的速度比 BERT large 慢 3.3 倍,但实验表明,如果训练这两个模型的时间相同,那么 ALBERT xxlarge 在基准测试中的平均性能要比 BERT large 好得多(88.7% 对 87.2%)。
- 实验表明,具有较宽隐藏大小(≥ 1024)的 ALBERT 模型并不能从增加层数中获益很多。这也是为什么层数从 ALBERT large 的 24 层减少到 xxlarge 版本的 12 层的原因之一。
随着层数的增加,ALBERT large(1800 万参数)的性能。图中层数≥ 3 的模型是从上一个模型的检查点开始微调的。可以看出,在达到 12 层后,性能提升速度变慢,在 24 层后逐渐下降。
随着隐藏层大小的增加,也出现了类似的现象。如果增加的数值大于 4096,模型的性能就会下降。
随着隐藏大小的增加,ALBERT large(上图中的 3 层配置)的性能。4096 的隐藏大小是最佳值。
结论
乍一看,ALBERT 似乎是比原始 BERT 模型更好的选择,因为它在下游任务中的表现优于原始 BERT 模型。然而,由于结构较长,ALBERT 需要更多的计算。ALBERT xxlarge 就是一个很好的例子,它有 235M 个参数和 12 个编码器层。这 235M 个权重中的大部分属于一个变压器块。然后,12 层中的每一层都共享权重。因此,在训练或推理过程中,算法必须在超过 20 亿个参数上执行!
由于这些原因,ALBERT 更适用于以速度换取更高精度的问题。归根结底,NLP 领域的发展从未停止,并在不断向新的优化技术迈进。在不久的将来,ALBERT 的速度很可能会得到提高。论文作者已经提到稀疏注意力和块注意力等方法是 ALBERT 加速的潜在算法。
本文暂时没有评论,来添加一个吧(●'◡'●)