深度学习:lora微调

本文介绍了Lora(低秩适应)技术,一种在保持大模型原始参数不变的情况下,通过添加少量可训练参数进行微调的方法。通过使用小矩阵表示权重增量,减少资源消耗并控制过拟合风险。Lora_rank的选择对效果至关重要。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  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

注意:lora微调加入的参数默认精度是FP16

### 关于机器学习中的LoRA模块介绍与应用 #### 参数高效微调技术概述 在现代深度学习模型中,参数量巨大使得训练成本高昂。为了降低资源消耗并提高效率,研究者提出了多种参数高效的微调方法。其中一种有效的方法是低秩自适应(Low-Rank Adaptation, LoRA),该方法通过引入额外的可训练矩阵来调整预训练模型的关键部分,在保持原有性能的同时显著减少了需要更新的参数数量[^1]。 #### LoRA的工作原理 具体来说,LoRA假设原始权重矩阵可以分解成两个较小规模矩阵乘积的形式,并仅对这两个新加入的小型矩阵执行梯度下降操作。这种做法不仅能够减少计算开销,还能够在一定程度上防止过拟合现象的发生。对于大型语言模型而言,采用这种方式可以在不牺牲太多精度的情况下实现快速有效的迁移学习过程。 #### 实际应用场景举例 当涉及到物联网(IoT)领域时,像Arduino Sense这样的设备可以通过集成支持LoRa通信协议的数据收发组件(RYLR896),与其他节点建立远距离无线连接。而作为网关端点运行的操作系统平台比如树莓派,则负责处理接收到的信息流以及向云端转发重要指令或传感器读数等任务。值得注意的是,在整个过程中,由于采用了基于AES加密算法的安全机制,因此即使在网络层面上截获到传输包也难以破解其真实含义,从而保障了系统的整体安全性[^2]。 ```python import torch.nn as nn class LowRankAdapter(nn.Module): def __init__(self, input_dim, output_dim, rank=4): super(LowRankAdapter, self).__init__() self.down_project = nn.Linear(input_dim, rank) self.up_project = nn.Linear(rank, output_dim) def forward(self, x): z = self.down_project(x) y = self.up_project(z) return y + x # Residual connection def apply_lora_to_model(model, adapter_class, target_layers=None): """Apply LoRA to specified layers of a given model.""" if not target_layers: target_layers = ['attention', 'mlp'] for name, module in model.named_modules(): if any(layer_name in name.lower() for layer_name in target_layers): setattr(module, f"{name}_lora", adapter_class(module.in_features, module.out_features)) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值