参数高效的模型微调笔记
通过指令微调,大语言模型能够更好地学习遵循和执行人类指令。然而,由于大语言模型的参数量巨大,进行全参数微调需要较多的算力资源开销。如何针对大语言模型进行参数高效微调(或者说轻量化微调),旨在减少需要训练的模型参数量,同时保证微调后的模型性能能够与全量微调的表现相媲美。
1、低秩适配微调方法
大语言模型中包含大量的线性变换层,其中参数矩阵的维度通常很高。 模型在针对特定任务进行适配时,参数矩阵往往是过参数化的,其存在一个较低的内在秩。为了解决这一问题,LoRA提出在预训练模型的参数矩阵上添加低秩分解矩阵来近似每层的参数更新,从而减少适配下游任务所需要训练的参数。给定一个参数矩阵𝑾,其更新过程可以一般性地表达为以下形式:
其中,𝑾0是原始参数矩阵,Δ𝑾是更新的梯度矩阵。LoRA的基本思想是冻结原始矩阵𝑾0 ∈R𝐻× 𝐻,通过低秩分解矩阵𝑨∈R𝐻× 𝑅和𝑩∈R𝐻× 𝑅来近似参数更新矩阵Δ𝑾=𝑨·𝑩⊺,其中𝑅≪𝐻是减小后的秩。公式表示如下:
在训练完成后,进一步将原始参数矩阵𝑾0和训练得到的权重𝑨和𝑩进行合并:W=𝑾0+𝑨·𝑩⊺,得到更新后的参数矩阵。因此,LoRA微调得到的模型在解码过程中不会增加额外的开销。
2、LORA变种
在原始的LoRA实现中,每个低秩矩阵的低秩参数𝑅都被设置为固定且相同的数值,并且在训练过程中无法进行调整,这种设定忽略了不同的秩在微调任务中可能产生的差异化影响。因此,通过这种方式训练得到的低秩矩阵往往并非最优解。
改进:①模型在微调过程中通过损失来衡量每个参数矩阵对训练结果的重要性,重要性较高的参数矩阵被赋予比较高的秩,进而能够更好地学习到有助于任务的信息。相对而言,不太重要的参数矩阵被赋予比较低的秩,来防止过拟合并节省计算资源。②QLoRA将原始的参数矩阵量化为4比特,而低秩参数部分仍使用16比特进行训练,在保持微调效果的同时进一步节省了显存开销。
3、适配器微调(AdapterTuning)
在Transformer模型中引入小型神经网络模块。适配器模块首先将原始的特征向量压缩到较低维度,然后使用激活函数进行非线性变换,最后再将其恢复到原始维度。
适配器模块将会被集成到Transformer 架构的每一层中,使用串行的方式分别插入在多头注意力层和前馈网络层之后、层归一化之前。。在微调过程中,适配器模块将根据特定的任务目标进行优化,而原始的语言模型参数在这个过程中保持不变。通过这种方式,可以在微调过程中有效减少需要训练参数的数量。
4、前缀微调
前缀微调在语言模型的每个多头注意力层中都添加了一组前缀参数。这些前缀参数组成了一个可训练的连续矩阵,可以视为若干虚拟词元的嵌入向量,它们会根据特定任务进行学习。公式如下:
经过优化后,映射函数将被舍弃,只保留最终得到的前缀参数𝑷来增强特定任务的
性能。在前缀微调过程中,整个模型中只有前缀参数会被训练,因此可以实现参数高效的模型优化。
5、指示微调
与前缀微调不同,提示微调仅在输入嵌入层中加入可训练的提示向量。在离散提示方法的基础上,提示微调首先在输入文本端插入一组连续嵌入数值的提示词元,这些提示词元可以以自由形式或前缀形式来增强输入文本,用于解决特定的下游任务。在实现中,只需要将可学习的特定任务提示向量与输入文本向量结合起来一起输入到语言模型中。例如P-tuning和PromptTuning等。。在提示微调的训练过程中,只有提示的嵌入向量会根据特定任务进行监督学习,然而由于只在输入层中包含了极少量的可训练参数,有研究工作表明该方法的性能高度依赖底层语言模型的能力。