跳到主要内容

全量微调

全量微调

在老模型的基础上,使用新的、特定任务的数据集对模型进行全参数的进一步训练,从而全面调整模型的所有权重和参数。

可以理解为矩阵的加法,老模型一个矩阵,新模型一个矩阵,那么老模型的矩阵加一个矩阵等于新模型的矩阵,全量微调调的就是这个矩阵。假如说一个模型需要100亿参数,那么有100亿的老参数就需要100亿的新参数。

可以看出全量微调的思路比较传统和直接,同时也非常复杂。它使用的优化算法是梯度下降法(过拟合预警)。如果数据量够,算力资源丰富,可以考虑用全量微调。

应用全量微调还是比较麻烦,怎么办呢?好在我们不止有全量微调这一种手段。

LoRA(Low-Rank Adaptation)微调

PAPER: https://arxiv.org/abs/2106.09685

Video: https://www.youtube.com/watch?v=DhRoTONcyZE

通过在预训练模型中引入一个额外的低秩矩阵,并使用特定任务的数据来微调这个矩阵,达到LoRa微调的效果。

在预训练模型的基础上,增加一个可训练的线性层(两个矩阵组成),在微调过程中只更新该线性层的参数。

这个过程有点类似于“狸猫换太子”。

LoRA将模型的权重矩阵分解为两个低秩矩阵的乘积:

将高维的权重矩阵WW表示为两个低秩矩阵AABB的乘积:

即:

WABW ≈ A·B

有很高的秩,意味着它可以表示非常复杂的线性变换。高维的权重矩阵WW就具有很高的秩。

原始的权重矩阵WW是一个1000×10001000×1000的高维矩阵,意味着10001000=10000001000*1000=1000000个参数。

在LoRA中,我们用两个低秩矩阵A和B来近似权重矩阵WW,使得WABW ≈ A·B。假设AA是一个1000×101000×10的矩阵,有1000101000*10个参数。假设BB是一个10×100010×1000的矩阵,有10100010*1000个参数。

因此,AABB的总参数数量为100010+101000=200001000*10+10*1000=20000个参数。这意味着,LoRA可以将10000001000000个参数的权重矩阵WW压缩到2000020000个参数的AABB矩阵中。

只更新低秩矩阵A和B的参数,由于AABB的参数数量远小于WW,这就显著减少了需要学习的参数数量,从而降低了计算成本。

LoRA过于简洁的实现方式,导致它对复杂任务表现得并不太好,LoRA对于A和B的结构非常敏感。