LoRA中值得注意的微调细节

LoRA的基本认识

大模型微调技术——LoRA
大模型在预训练完收敛后模型包含很多进行矩阵乘法的稠密层,这些层通常都是满秩的,在微调过程中改变量其实也很小,在矩阵乘法中表现为低秩的改变。所以对于预训练权重矩阵 W 0 ∈ R d × k W_0 ∈R^{d×k} W0Rd×k, 可以用低秩分解表示更新过程: W 0 + ▲ W = W 0 + B A , B ∈ R d × r , A ∈ R r × k , r < < m i n ( d , k ) W_0 +▲W = W_0 +BA,B∈R^{d×r},A∈R^{r×k},r<<min(d,k) W0+W=W0+BABRd×r,ARr×k,r<<min(d,k)。训练时,W_0是冻结的,没有梯度更新,A和B是可训练的,然后他们都会乘以相同的输入x: h = ( W 0 + ▲ W ) x = ( W 0 + B A ) x = W 0 x + B A x h = (W_0 +▲W)x= (W_0 +BA)x = W_0x +BAx h=W0+W)x=(W0+BA)x=W0x+BAx

注意三点:

  1. B是零矩阵初始化,A是随机高斯初始化,这时保证了初始时候▲W是零矩阵,h = W_0x,也就是预训练完后的情况,最初的 lora 权重为 0,所以 lora 参数是从头学起,并没有那么容易收敛。
  2. ▲Wx的放缩:alpha/r (r是秩,alpha是因子,是训练时可以设置的两个参数)。使用Adam优化,经过适当的缩放初始化,调alpha和学习率差不多一样
    在这里插入图片描述
  3. 部署:加载主干网络W_0 ,针对不同的下游任务切换BA,并且没有推理时延的!!!

知道以上这些,仍然不能帮助我们理解究竟LoRA怎么用到大模型训练上。首先要有几点认识
1、 理论上LoRA可以用到不同类型神经网络的权重矩阵,减少可训练的参数量
2、 不同的大语言模型基于Transformer的不同改版,Transformer结构主要self attention层(W_q,W_k,W_v,W_o)和MLP层。

本质上LoRA对网络层的权重矩阵进行低秩学习(d* k—>d* r , r*k)
在这里插入图片描述
stable Diffusion论文截图(对k,v,q矩阵的微调学习):
stable Diffusion论文截图
LLAMA2(来自BIT_666的博客):
LLAMA2
官方提供微调层的建议:
‘q_proj,v_proj,k_proj,o_proj,gate_proj,down_proj,up_proj’
对应q,v,k,o 输出,还有MLP层的结构可以加入LoRA模块进行微调

LoRA微调主要关注的几个问题:

  • 微调transformer哪些层?如果是给定参数预算,调节哪些层会有比较优的效果?
  • 秩r的选择

微调参数的概览[粗是重点]

CUDA_VISIBLE_DEVICES=0: 单卡运行。
do_train: 是否执行训练。
model_name_or_path: 预训练模型路径。
dataset_dir: 训练数据存储目录。
dataset: 训练数据集名称,可在 data/dataset_info.json 中增加自定义数据集。
output_dir: 微调后的模型保存路径。
source_prefix: 训练时每个输入序列添加的前缀,可为空。
max_source_length: 输入序列的最大长度,即 source_prefix + instruction + input 的长度。
max_target_length: 输出序列的最大长度,即 output 的长度。
per_device_train_batch_size: 用于训练的批处理大小。可根据 GPU 显存大小自行设置。
gradient_accumulation_steps: 梯度累加次数。
logging_steps: 多少步输出一次 log。
save_steps: 多少步保存一次参数。
learning_rate: AdamW 优化器的初始学习率。设置过大会出现loss值无法收敛或过拟合现象即过度适应训练集而丧失泛化能力,对非训练集中的数据失去原本的计算能力
**lr_scheduler_type": 学习率策略,可以设置cosine(月线退火策略)
num_train_epochs: 训练轮数(若非整数,则最后一轮只训练部分数据)如果loss值没有收敛到理想值可以增加训练轮数或适当降低学习率
plot_loss: 微调后绘制损失函数曲线,图片保存在 output_dir 中 。
fp16: 使用半精度(混合精度)训练。
lora_target: 大模型内将要进行 LoRA 微调的模块名称。
lora_rank: LoRA 微调中的秩大小。
padding_side: pad对齐方式,左对齐或者右对齐。

LoraConfig:创建 LoRA 微调方法对应的配置【比较影响模型的效果】
task_type:指定任务类型。如:条件生成任务(SEQ_2_SEQ_LM),因果语言建模(CAUSAL_LM)等。
r: LoRA低秩矩阵的维数。关于秩的选择。
lora_alpha: LoRA低秩矩阵的缩放系数,为一个常数超参,调整alpha与调整学习率类似。
lora_dropout:LoRA 层的丢弃(dropout)率,取值范围为[0, 1)。
target_modules:要替换为 LoRA 的模块名称列表或模块名称的正则表达式。

lora_config = LoraConfig(
    r=16,
    lora_alpha=32,
    lora_dropout=0.05,
    bias="none",
    task_type="CAUSAL_LM",
    target_modules = ["attn.c_proj", "attn.c_attn"]
)

解释:

  1. 输入输出序列的长度根据训练集而定,太短(截断)太长效果不太好
    2. lora_target: 哪些层是需要lora微调的(要替换为 LoRA 的模块名称列表或模块名称的正则表达式),一般根据名字找所有层【找不同模型对应的attention层对应的参数名称】
    在这里插入图片描述
    LLaMa的默认模块名为[q_proj, v_proj],也可以自行指定为:[q_proj,k_proj,v_proj,o_proj]
    常用的LLM对应的模块名列表:
    在这里插入图片描述
  2. 秩大小,不是越大越好,一般尝试4,8,16之类的数字看看效果怎样,小数据集一般设置小的r (1,2)
  3. batch_size 和 gradient_accumulation_steps 两个参数是协同调整,根据现存和训练快慢需要,一般显存小,就batch_size调小,acc调大(但也不能调太大,不然梯度更新不及时),显存充足batch_size可以调大,acc调小些。
  • 1
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值