【LLM】大语言模型学习笔记-4(Lora学习笔记理论篇2)
发布网友
发布时间:2024-10-06 08:31
我来回答
共1个回答
热心网友
时间:2024-11-20 08:35
LORA是一种优化方法,用于在预训练模型的基础上适应新任务。在LORA中,冻结预训练模型的参数,同时注入可以训练的秩分解矩阵,实际上就是用BA的矩阵*近变化△w。具体实现代码如下:
代码首先定义了输入维度`input_dim`和输出维度`output_dim`,通常对应于预训练模型的隐藏层大小和层的输出大小。接着创建了两个可训练的张量参数`W_A`和`W_B`,分别用于表示LoRA权重A和权重B,形状分别为`input_dim x rank`和`rank x output_dim`。`rank`是一个超参数,表示对权重进行分解时的低秩维度,用于在模型复杂性、适应能力和欠拟合或过拟合风险之间进行权衡。
在LORA的实现中,`W_A`使用`nn.init.kaiming_uniform_`初始化,这是一种初始化方法,旨在确保良好的权重初始化,有助于训练的稳定性;`W_B`初始化为全零。接着定义了两个函数`regular_forward_matmul`和`lora_forward_matmul`,分别用于执行常规的矩阵乘法和LORA的矩阵乘法。在`lora_forward_matmul`函数中,先执行常规的矩阵乘法,然后添加了LoRA适应的部分,这部分计算是将`x`与缩放后的LoRA权重`W_A @ W_B`相乘,并用缩放因子`alpha`进行调整。
综合起来,这段代码展示了如何在适应新任务时使用低秩适应方法来修改预训练模型的权重,以便更好地适应新任务的特征。这可以帮助提高模型在新任务上的性能和收敛速度。
在进行LORA操作时,会注意到Q中的参数从4096*12288变为4096*16和16*12288。这种变化是通过取出原始模型的各个层的参数并进行冻结来实现的。在模型训练过程中,通过冻结参数来提高训练的稳定性和效果。
接着,设置Lora参数,使用PEFT库创建和配置PEFT模型。PEFT是对Transformer模型的一种改进,使用了低秩近似来提高模型的效率和可扩展性。创建`LoraConfig`实例并配置模型参数,如低秩近似、输出缩放、dropout等。设置任务类型为"CAUSAL_LM",即因果语言模型。然后将Lora参数注入到原始模型中,使用`get_peft_model`函数创建PEFT模型,并将其赋值给变量`model`。
最后,将数据模型放在`Trainer`中进行训练。创建`Trainer`实例,传入训练数据集、配置的训练参数(如批大小、梯度累积步数、学习率等)、数据收集器(用于处理数据批次),然后调用`trainer.train()`启动模型训练。