# Lora

在机器学习中，我们通常使用一个矩阵来表示一个全连接层，但是这个全连接层往往是[过参数化](https://zhida.zhihu.com/search?content_id=235586149\&content_type=Article\&match_order=1\&q=%E8%BF%87%E5%8F%82%E6%95%B0%E5%8C%96\&zhida_source=entity)的，这意味着我们可以通过计算这个矩阵的秩来确定哪些特征是重要和相关的。换句话说，我们试图找到原始特征空间（或矩阵）中少数维度的（线性）组合，能够捕捉数据集中大部分的信息且一旦我们找到了足够解决问题的参数空间，再增加这个参数空间的大小并不会显著提升模型的性能。**所以只要调整这一部分的参数可以达到调整所有参数同样的效果同时减少GPU使用量**

<figure><img src="https://1903566598-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FMy3UM3ETEgStWh9K2Or2%2Fuploads%2FWu9lK0DAPVQxlByEc0lU%2F%E5%B1%8F%E5%B9%95%E6%88%AA%E5%9B%BE%202025-06-17%20221547.png?alt=media&#x26;token=5fc32145-0c33-4946-b25f-4c94aad858ce" alt=""><figcaption><p>原理图</p></figcaption></figure>

**原理:**

在大模型的矩阵$$W\in R^{d\times k}$$旁插入多一个$$\Delta W$$但是由于可以低秩分解于是可以分解成$$AB=\Delta W$$ ,其中$$A \in R^{d \times r}$$ ,$$B \in R^{r \times k}$$ ,然后我们只要训练$$A$$和$$B$$即可最后把$$AB$$加到$$W$$中即可。



$$A$$使用高斯初始化，$$B$$使用零矩阵进行初始化,这样当数据第一次通过网络时和与训练结果是一致的，从而保证了模型在初始阶段便有一个不错的效果。但是这带来了不对称问题,其实我们也可以使用两个非全0矩阵进行初始化，但是需要事先将预训练权重减去初始化的值,即:

$$
W=W_0-B_0A_0+BA
$$

**Transformer 中的LoRA**

最好的方式是在所有的权值矩阵$$W_q$$ ,$$W_k$$ ,$$W_v$$,$$W_o$$都加上$$LoRA$$因为这样有利于模型捕捉到所有矩阵的关键信息.(**实际操作中，应当将可微调参数分配到多种类型权重矩阵中，而不应该用更大的秩单独微调某种类型的权重矩阵.**)

**秩的大小（r=1,2,4,8,64)**

多任务的学习对于LoRA来说比较困难，除非把它们当成同一个任务。\
\
**其余学习资料**

* [ ] \[**QLora(>7B的模型)**]\([https://zhuanlan.zhihu.com/p/648239462](https://zhuanlan.zhihu.com/p/648239462))
