https://arxiv.org/pdf/2402.18039.pdf
在ResLoRA框架中,添加残差路径是为了在训练过程中加速损失函数的减少,同时在推理时保持模型的简洁性。残差路径的添加主要涉及以下几个步骤:
- 设计残差结构 :ResLoRA提出了三种类型的残差结构,分别是输入残差(input-shortcut, is)、块残差(block-shortcut, bs)和中间残差(middle-shortcut, ms)。这些结构在不同的位置上添加了残差路径,以优化训练过程。
- 输入残差(is):在不同LoRA块的输入向量之间直接添加残差路径。
- 块残差(bs):在LoRA块的权重之间添加残差路径,类似于DenseNet结构。
- 中间残差(ms):在LoRA块的中间结果(即A矩阵的输出)上添加残差路径。
-
实现残差连接 :在LoRA块中,残差连接是通过将前一层的输出向量(或其变换)添加到当前层的输入向量中来实现的。例如,在输入残差结构中,当前LoRA块的输入向量会加上前一层LoRA块的输入向量。在块残差结构中,当前层的输入向量会同时使用当前和之前的LoRA块的权重。
-
训练时的权重更新 :在训练过程中,原始模型的权重保持冻结,只有新添加的残差路径中的权重(如A和B矩阵)会被更新。这样,残差路径可以帮助模型更快地适应特定任务,同时避免梯度消失或爆炸问题。
-
推理时的路径合并 :为了在推理时保持模型的简洁性,ResLoRA使用特定的合并方法将训练时添加的残差路径消除。这些合并方法会根据残差路径的类型(is、bs或ms)来调整权重,以确保在推理时模型的前向传播与原始LoRA模型相同。
- 确定合并策略 :根据残差路径的类型(输入残差、块残差或中间残差),设计相应的合并策略。这些策略需要确保在合并后,模型的前向传播与原始模型一致,且不引入额外的计算成本。
- 计算缩放因子(α) :为了合并残差路径,需要计算一个缩放因子α,它用于调整残差路径中的权重,以确保合并后的权重与原始模型的权重相匹配。这个缩放因子可以通过输入向量的Frobenius范数来估计,或者基于ResLoRA块的权重来估计。
- 应用合并公式 :对于每种残差结构,应用相应的合并公式来更新权重。例如,对于块残差结构,合并公式可能涉及到将前一层的权重与当前层的权重相加,然后乘以缩放因子α。对于输入残差结构,可能需要更复杂的计算,因为涉及到输入向量的调整。
- 更新权重 :根据合并策略和缩放因子,更新LoRA块中的权重。这通常涉及到将训练阶段更新的权重与原始模型的权重相结合。
- 移除残差路径 :在权重更新后,移除训练阶段引入的所有残差路径,使模型恢复到原始LoRA的结构。这样,模型在推理时的计算复杂度与原始模型相同。
- 验证模型性能 :在合并后,验证模型在推理时的性能,确保合并过程没有导致显著的性能下降。如果有必要,可以进一步调整合并策略以优化性能。
- 保持模型性能 :尽管合并残差路径可能会引入一些精度损失,但ResLoRA通过精心设计的合并策略,确保了在不增加额外训练参数的情况下,模型在推理时仍然能够保持或提高性能。