输入“/”快速插入内容

O-LoRA: 针对LLM的“灾难遗忘”解决方案

2024年7月25日修改
作者:王枭
大家好!今天来介绍下我们最近在持续学习方向的一篇工作 ——《Orthogonal Subspace Learning for Language Model Continual Learning》。这篇论文介绍了一个全新的持续学习方法:正交低秩适应(O-LoRA)。
问题背景
我们都知道,大型语言模型(LLM)在语言理解和生成方面已经取得了非常出色的成绩。但随着LLMs越来越多地融入我们的日常应用,我们期待它们在领域知识、多语言、处理复杂任务和使用工具等能力上都能够更上一层楼。如果每次都为新技能重新去做预训练/alignment,成本过于高昂,所以如何增量地增强LLM成为大家关心的一个方向。不过,有个棘手的问题:当LLM尝试学习多个连续任务时,它们好像有点“健忘”,容易忘记之前学到的东西,这就是我们所说的“灾难性遗忘”。因此,如何在保留先前知识的基础上增量地增强LLM,即进行持续学习,至关重要。
O-LoRA
在提出我们的方法前,我们有两个观察:
1.
过去的方法中,所有任务都是在相同的向量空间中更新模型参数的,这样很容易破坏过去学会的任务表示。
基于第一点观察很容易会想,是否有可能朝着不影响过去任务的loss的梯度方向更新模型参数呢?但是要如何保证更新的梯度和过去的任务都正交呢?难不成保留过去任务的样本,每次在新任务上更新前都算一遍梯度在过去任务上的投影吗?这样不仅有数据隐私的问题,效率也极低。
2. LoRA的低秩假设,即预训练模型的finetune在一个低秩的子空间中进行。
然后第二点观察就发挥了作用,LoRA的低秩假设,即模型的finetune过程往往在低秩的子空间中进行更新。所以LoRA的矩阵参数,不仅代表了对原始模型的数值更新,也捕获了模型参数的更新方向。基于此,我们提出核心假设: 过去任务的LoRA矩阵的子空间可以用来近似其梯度空间
基于这个假设,我们提出了 O-LoRA,即学习新任务的时候,约束其LoRA子空间与过去任务的LoRA子空间正交 。子空间的正交必然会使得存在各自空间中的向量正交,从而保证了新任务的梯度更新不会对过去任务的输出造成影响。为了帮助大家更直观地理解 O-LoRA,这是我们的初版草图
️ 实现
对于每一个任务,我们学习了一组LoRA参数,表示为 {𝐴𝑡,𝐵𝑡} ,其中 𝐴∈𝑅𝑑×𝑟,𝐵∈𝑅𝑟×𝑘 ,且秩r远小于 min(𝑑,𝑘) 。我们用A_t的列向量来近似第t个任务的参数更新子空间 𝑈𝑡 :
𝐴𝑡=[𝑎𝑡1,𝑎𝑡2,...,𝑎𝑡𝑟]
𝑈𝑡=span{𝑎𝑡1,𝑎𝑡2,...,𝑎𝑡𝑟}
令 𝐵𝑡=[𝑏𝑡1,𝑏𝑡2,...,𝑏𝑡𝑟] ,其中 𝑏𝑡𝑖∈𝐵𝑡 代表了 𝐴𝑡 的列向量的线性权重系数。
为确保子空间 𝑈 与子空间 𝑊 之间的正交性,我们需要满足:
<𝑢,𝑤>=0,∀𝑢∈𝑈,𝑤∈𝑊.
因此,任务i的LoRA子空间( 𝑈𝑖 )与任务t的LoRA子空间( 𝑈𝑡 )之间的正交性可以表达为:
𝑂𝑖,𝑡=𝐴𝑖𝑇𝐴𝑡=0.
最后,我们的训练目标被定义为:
∑𝑥,𝑦∈𝐷𝑡log⁡𝑝Θ(𝑦∣𝑥)+𝜆1∑𝑖=1𝑡−1𝐿𝑜𝑟𝑡ℎ(𝐴𝑖,𝐴𝑡)
𝐿𝑜𝑟𝑡ℎ(𝐴𝑖,𝐴𝑡)=∑𝑗,𝑘‖𝑂𝑖,𝑡[𝑗,𝑘]‖2
其中 𝑂𝑖,𝑡[𝑗,𝑘] 表示 𝑂𝑖,𝑡 的第j行和第k列的元素, 𝜆1 是正交性损失的权重。在训练过程中,我们固定之前的LoRA参数 {𝐴𝑖,𝐵𝑖|𝑖<𝑡} 。
尽管在训练过程中,随着任务数量的增加,LoRA参数的数量也会增加,但我们可以将对应于LoRA参数的更新合并到初始参数中,从而固定住模型推理时的成本。
𝑊𝑖𝑛𝑖𝑡:=𝑊𝑖𝑛𝑖𝑡+∑𝑖=1𝑡𝐴𝑖𝐵𝑖
O-LoRA的优势
1.
数据隐私友好 :不需要存储历史数据进行replay。
2.
模型参数友好 :受益于LoRA的设计,我们的方法只引入了很小的额外参数。
3.
泛化友好 :与基于动态网络的方法不同,O-LoRA无需在推理时依赖于任务ID,而是基于Instruction tuning设计,通过follow 指令的形式,保留了LLM对未见任务的泛化能力。