Before LoRA 2: Sparse Projection, Fastfood, and SAID
从 dense Gaussian projection 的存储问题出发,理解 Sparse projection、Fastfood 和 SAID。
系列
LoRA上一篇讨论了 intrinsic dimension:我们把训练限制在一个低维随机子空间中,然后观察模型至少需要多少 degrees of freedom,才能达到 direct training 的 性能。
构造这个子空间时,上一篇使用的是 dense Gaussian projection。它会产生一个 的矩阵 ,其中 是完整模型的参数量, 是低维空间的维度。
这个矩阵很难存储。例如,当 时, 中需要保存的标量数量就是原模型参数量的 倍。
两种高效的随机投影#
原论文为 dense Gaussian projection 的存储和计算问题提供了两种近似方法:Sparse projection 和 Fastfood。
Sparse projection#
Sparse projection 使用了一个很巧妙的办法来构造近似 orthogonal 的随机投影矩阵。它不再让 中的每个元素都非零,而是按照下面的分布独立采样:
每个元素以 的概率被设为非零。一旦被选中,它就以相同概率取正值或负值,并且正负值的绝对值相同;其余元素为 。完成采样后,再把 的每一列归一化为单位长度。
也就是说,每个元素非零的概率只有 。
因为非零元素的密度是 ,一个 的矩阵平均只有 个非零元素。理论上,存储和计算 的复杂度都可以从 降到 。
但是,这种方法并没有像预期一样在实际实现中降低那么多计算量。原论文使用 TensorFlow SparseTensor 时,实际加速更接近固定的十倍,而没有达到理论上的 倍。稀疏矩阵中的索引也会占用额外内存,所以它仍然不容易扩展到更大的模型。
Fastfood#
Fastfood 的想法是不显式构造 ,而是用一组结构简单、计算便宜的矩阵,近似一个 dense Gaussian random matrix。
一个 Fastfood 变换可以写成 ,其中:
- ,负责随机改变每个坐标的符号;
- 是 Hadamard 矩阵;
- 是随机排列矩阵;
- ,其中 ,负责加入 Gaussian scaling。
它的过程可以按从右到左理解。 先随机改变输入坐标的符号,第一个 对所有坐标进行混合, 再打乱坐标的对应关系, 加入随机幅度,最后一个 再进行一次混合。
、归一化后的 和 都保持 orthogonal 结构, 则提供 Gaussian 随机性。把它们组合起来,就可以近似 dense Gaussian projection 的统计行为。
更直观地说,Fastfood 就是用几个计算比较便宜的矩阵,完成随机符号变化、全局混合、随机排列和 Gaussian scaling,从而避免显式保存一个巨大的 dense matrix。
Hadamard transform 可以通过 Fast Walsh–Hadamard Transform 计算。对于一个 维向量, 的计算复杂度可以从 降到 。
一个 Fastfood block 的输入和输出都是 维。如果完整模型有 个参数,就堆叠大约 个独立的 block,把输出扩展到 维。这样,完整的 不需要保存 个标量,只需要 的存储,计算复杂度是 。
需要注意, 近似的是 Gaussian random matrix,而不是严格的 orthogonal matrix。因为 会随机缩放各个方向,所以整个变换本身不保持长度。
| 方法 | 投影矩阵 | 存储复杂度 | 计算 |
|---|---|---|---|
| Dense Gaussian | |||
| Sparse projection | 非零密度为 | ||
| Fastfood | 堆叠多个 |
把 intrinsic dimension 用到预训练模型#
有了 Fastfood 以后,就可以把 intrinsic dimension 的测量方法应用到参数量很大的预训练语言模型上。
Armen Aghajanyan, Sonal Gupta, Luke Zettlemoyer
ACL-IJCNLP 2021
这篇论文提出了 Structure-Aware Intrinsic Dimension(SAID)。它想把 intrinsic dimension 的概念用到具有多层结构的网络上。
论文把之前不考虑网络层结构的方法称为 Direct Intrinsic Dimension(DID)。DID 在整个模型中共享同一个低维随机投影向量,没有区分不同层可能承担的不同功能。
SAID 在这个共享的低维向量上,为每一层增加一个可学习的缩放系数。第 层的参数可以写成 。
其中, 是 pretrained checkpoint 中第 层的初始参数, 是随机投影后属于第 层的参数更新, 是这一层自己的可学习缩放系数。
如果模型共有 层,SAID 会从原来的 个低维参数中拿出 个位置来保存这些缩放系数。因此,它实际训练的是 个共享的低维参数和 个 ,总数仍然是 。
这样,不同层就可以获得不同大小的参数更新。某一层如果对当前任务更重要,可以学习更大的 ;如果某一层不需要太多变化,也可以学习较小的 。
论文使用 SAID 和 DID 做了一系列实验。在给出的数据集和模型上,SAID 的结果都不差于 DID,并且多数情况下可以在达到相同性能时使用更小的 intrinsic dimension。
这里测量的 是什么#
这里的 intrinsic dimension 指的是预训练模型在某个下游任务上的微调维度。
实验首先选择一个已经完成预训练的 checkpoint 作为参数起点 ,并把它固定。随后指定一个候选维度 ,只训练低维参数;在 SAID 中,还会同时训练每一层对应的缩放系数。固定的 Fastfood projection 再把这些低维参数映射成完整模型的参数更新。
对于每个候选 ,模型都会在具体的下游任务上重新进行一次低维微调,并把结果和标准 full fine-tuning 的性能进行比较。研究者不断改变 ,寻找能够达到 full fine-tuning 性能 的最小维度,并把它记为 。
因此, 表示的不是“训练出整个模型需要多少维”,而是“从当前 pretrained checkpoint 出发,为了适配某个下游任务,至少需要多少个有效的 trainable degrees of freedom”。
它依赖 pretrained checkpoint、下游任务、随机投影、优化器和性能阈值,是一个实验得到的估计值,而不是模型本身固定不变的属性。