微信扫码
与创始人交个朋友
我要投稿
在深度学习中,模型的精度通常与模型的复杂度和参数数量有关。更多的参数,意味着模型可以捕捉到更复杂的特征,同时,也需要更多的计算资源来训练和推理。因此,计算资源有限的情况下,部署大模型可能会跑不起来,通过使用LoRA,我们可以在保持模型精度的同时,减少计算资源的需求。
LoRA通过引入低秩矩阵(参考前文:从零开始学大模型 | LoRA竟然这么简单,只要5分钟就能理解了!)来调整权重,在不显著增加参数数量的前提下,有效地调整和优化模型。这种方法在图像分类、自然语言处理和推荐系统等任务中特别有用。
微调的核心原理如上图,在针对特定领域做微调,我们在训练模型的过程中,冻结模型原始参数,引入 B(d * 1) A (1 * k) 矩阵,新加的参数其实只有 d + k 个,在微调训练过程时,前向传播,将原始矩阵与 A×B相加,得到新的输出;反向传播过程,不计算原始权重矩阵W的梯度,不更新原始矩阵W的参数,仅仅更新 B,A,从而避免对原来的 d * k 参数做全量调整。
微调后,我们仅需要保存 B, A 就可以,后续在使用模型时,我们可以外挂LoRA,甚至是外挂不同类型的LoRA。模型原来的参数会保持不变,比如7B的模型,微调后,后续推理阶段,启用LoRA,仅仅在原来模型的基础上,增加 d + k个参数,就可以让模型在特定场景下,得到微调后的结果。
class RichBoyNet(nn.Module):
def __init__(self, hidden_size_1=1000, hidden_size_2=2000):
super(RichBoyNet,self).__init__()
self.linear1 = nn.Linear(28*28, hidden_size_1)
self.linear2 = nn.Linear(hidden_size_1, hidden_size_2)
self.linear3 = nn.Linear(hidden_size_2, 10)
self.relu = nn.ReLU()
def forward(self, img):
x = img.view(-1, 28*28)
x = self.relu(self.linear1(x))
x = self.relu(self.linear2(x))
x = self.linear3(x)
return x
net = RichBoyNet().to(device)
class LoRAParametrization(nn.Module):
def __init__(self, features_in, features_out, rank=1, alpha=1, device='cpu'):
super().__init__()
# Section 4.1 of the paper:
# We use a random Gaussian initialization for A and zero for B, so ∆W = BA is zero at the beginning of training
self.lora_A = nn.Parameter(torch.zeros((rank,features_out)).to(device))
self.lora_B = nn.Parameter(torch.zeros((features_in, rank)).to(device))
nn.init.normal_(self.lora_A, mean=0, std=1)
# Section 4.1 of the paper:
# We then scale ∆Wx by α/r , where α is a constant in r.
# When optimizing with Adam, tuning α is roughly the same as tuning the learning rate if we scale the initialization appropriately.
# As a result, we simply set α to the first r we try and do not tune it.
# This scaling helps to reduce the need to retune hyperparameters when we vary r.
self.scale = alpha / rank
self.enabled = True
def forward(self, original_weights):
if self.enabled:
# Return W + (B*A)*scale
return original_weights + torch.matmul(self.lora_B, self.lora_A).view(original_weights.shape) * self.scale
else:
return original_weights
53AI,企业落地应用大模型首选服务商
产品:大模型应用平台+智能体定制开发+落地咨询服务
承诺:先做场景POC验证,看到效果再签署服务协议。零风险落地应用大模型,已交付160+中大型企业
2024-08-13
2024-03-30
2024-05-28
2024-05-10
2024-04-26
2024-04-12
2024-04-25
2024-07-25
2024-05-06
2024-05-14