LoRA 简介
简介
LoRA,英文全称Low-Rank Adaptation of Large Language Models,直译为大语言模型的低阶适应,这是微软的研究人员为了解决大语言模型微调而开发的一项技术。 如果想让一个预训练大语言模型能够执行特定领域内的任务,一般需要做fine-tuning,但是目前推理效果好的大语言模型参数维度非常非常大,有些甚至是上千亿维,如果直接在大语言模型上做fine-tuning,计算量会非常的大,成本也会非常的高。LoRA的做法是冻结预训练好的模型参数,然后在每个Transformer块里注入可训练的层,由于不需要对模型的参数重新计算梯度,所以,会大大的减少计算量。
Motivation:
目前大模型动辄十亿乃至百亿千亿的参数(例如GPT3,1750亿),如果直接进行微调,不仅训练开销巨大,而且参数的存储也会占据较大空间。因此需要一种针对大模型高效调参的方法,一则减少训练过程中的计算和显存开销,二则减少调参之后的参数存储。
原理
具体如下图所示,核心思想是在原始预训练模型增加一个旁路,做一个降维再升维的操作。训练的时候固定预训练模型的参数,只训练降维矩阵A与升维矩阵B。而模型的输入输出维度不变,输出时将BA与预训练语言模型的参数叠加。用随机高斯分布初始化 A,用0矩阵初始化B。这样能保证训练时,新增的旁路BA=0,从而对模型结果没有影响。在推理时,将左右两部分的结果加到一起,即h=Wx+BAx=(W+BA)x,所以,只要将训练完成的矩阵乘积BA跟原本的权重矩阵W加到一起作为新权重参数替换原始预训练语言模型的W即可,不会增加额外的计算资源。LoRA的最大优势是训练速度更快,使用的内存更少。
在部署时,A和B可以通过重参数化做到 W里,这样inference和之前是一致的。
应用Lora到Stable Diffusion:
Lora可以应用到任何一个神经网络的子集中。在Transformer架构里Lora经常应用在self-attention模块和MLP模块中。在 Stable Diffusion模型里,Lora被用在condition和图像表示建立关联的Cross-Attention层,即下图的黄色区域中。
Diffusers目前已经支持Lora的训练和推理,详见:https://huggingface.co/docs/diffusers/training/lora
civitai到diffuser格式的转换:https://github.com/huggingface/diffusers/blob/main/scripts/convert_lora_safetensor_to_diffusers.py
参考文档:
https://zhuanlan.zhihu.com/p/616198265