赞
踩
lora微调是大模型常用的微调方法。
lora(Low-Rank Adaptation的缩写)在保持原始模型参数不变的同时,在模型中添加了一小部分可训练参数。
正常神经网络:输入x -> 全连接层(w) -> 输出y,训练时输入x,y数据来更新参数w,使得loss最小,w达到最优。但在大模型中,参数量都是几十几百亿,计算量极大,在进行梯度计算时,内存硬件都无法支持。
而lora并不是修改全部参数,而是加个“外挂“,即原来是y = wx +b ,现在是y = wx + w’x +b,梯度下降时,只修改 w’ 以起到对矩阵w改变的作用。只需要修改很小的w’(这是我们加上的),这个技术就叫lora技术。(w’是指微调过程中产生的更新量(权重增量),而这个权重增量使用两个矩阵表示)
例如:输入x的维度为d维,输出y的维度为d维,那么权重维度维d*d。而外挂则是两个矩阵A*B(A、B矩阵维度为r*d,d*r),可以发现A*B=d*d,和w矩阵一样,但参数量变成了2*d*r(r一般为8,10,12,…),参数量的变化远远小于原来的变化。
其实就是将一个d*d矩阵,拆成了两个小矩阵:r*d和d*r。参数量变成了d*r + d*r,并且r<<d,所以参数变化远远小于原来,达到了减少资源消耗。
而所谓的lora_rank就是这个r,在代码的实际运用中可以自己设置。r越大,自身数据对模型起到的作用越大,r越小,自身数据对模型起到的作用越小
(增加秩会增加可训练参数的数量,LoRA 微调中的秩大小并不是越大越好,对于小型数据集如果r=1就可以达到很不错的效果,即便增加r得到的结果也没有太大差别,还会导致更高程度的过拟合,增加运行时间成本。因此选一个合适的lora_rank十分重要)
LoRA 的基本原理是冻结预训练好的模型权重参数,在冻结原模型参数的情况下,通过往模型中加入额外的网络层,并只训练这些新增的网络层参数(原来参数不改变,改变并联的参数,但并联的参数也太多了怎么办?就用两个小矩阵表示)
y = wx +b -> y = wx + w’x +b -> y = wx +A*B*x +b
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。