Peft库的LoraConfig详解(附彩铅风格微调实验)
Peft库的LoraConfig详解(附彩铅风格微调实验)
为确保图像输出能满足高标准,探究和调整LoRA模型的参数配置就成了必经之路。今天,我们就来聊聊Peft库的LoraConfig参数对生图效果的影响。
LoRA 回顾
在此之前,先回顾LoRA的原理:
LoRA方法将原来参数量较大的注意力权重矩阵分解为两个低秩矩阵A和B,低秩矩阵的秩远小于原始权重矩阵的大小,通过固定原始权重和更新A、B的权重,为模型引进新的概念的同时又能节省内存。
peft库的LoraConfig
如果使用diffusers库训练LoRA,可以看到代码是用peft库中的LoraConfig方法来定义LoRA结构的,关键组件有:
低秩矩阵的秩-r:在数学上,矩阵的“秩”衡量的是它包含多少真正独立的信息行或列。如果一个矩阵很大,但大部分信息都能通过少数几条规则或者几个关键数值(称为基向量)推导出来,我们说这个矩阵的秩很低。低秩矩阵意味着存在大量的数据冗余,或者数据间有很强的相关性。较大的r值会增加模型的表达能力,但也意味着更高的内存和计算需求。
lora_alpha:ΔW0的控制因子。根据论文,ΔW0X由lora_alpha/r 控制,较大的lora_alpha值意味着低秩修正将会对模型的输出有更大的影响力,可能会导致模型学习更多的特定任务信息,但也可能增加过拟合的风险。
target_modules: 指定哪些层需要被添加LoRA矩阵,常用的有"to_k","to_q","to_v","to_out",要想达到较好的效果,最好这四个矩阵都要加上。
lora_dropout:LoRA层中的dropout率,用于正则化,防止过拟合。
task_type:任务类型,通常用于文本任务,视觉任务直接置为None即可。
使用示例
from peft import LoraConfig
# 实例化LoraConfig
config = LoraConfig(
r=8,
lora_alpha=32,
lora_dropout=0.1,
bias="none",
task_type=None,
init_lora_weights="gaussian",
target_modules=["q_proj", "v_proj"],
)
论文关于秩和target_modules的实验结果
我们先来看看论文里面对这几个参数在NLP任务上的结果:
更新多个权重矩阵的效果比只更新两个权重矩阵的更有效。因为q、k、v、o在注意力机制里都发挥着各自重要的作用,都更新能够提升模型的表达能力,减缓过拟合。
即使在使用很小的秩r时,模型就已经能够达到较好的效果,作者认为:LoRA以小规模的秩就能高效优化模型,不需要追求更高的秩来获取实质性的性能提升。
训练彩铅风格模型
根据论文的结论,为了验证秩对微调效果的影响,在网上的彩铅数据集上进行LoRA微调。(target_modules对q、k、v、o都进行微调)
彩铅数据集:huggingface.co/datasets/litmonster0521/pencildrawing/resolve/main/caiqian_style.tar
r=4时训练出来的效果图
感觉还挺贴近训练集
r=8时训练出来的效果图
画面要比r=4时更清晰,但效果似乎有点过拟合,有不自然和失真感
训练文本编码器LoRA
除了调整秩r,我还做了一组同时训练text_encoder和unet的实验(前面只训练了unet),失真感有所缓解,画风柔和一些,但与数据集的相似度还是不如r=4无微调时高~
结尾的一些总结
从这三个实验来看,训练参数的增加好像仅仅只是增加了图像的清晰度。Lora训练的参数不是越多、越大就越能提升效果。如果给模型定制了太多学习任务,反而会学不来。参数设置得太复杂,模型可能会“消化不良”,不是学到太过了,就是根本学不会,这就叫过拟合或者难训练。
所以啊,重要的是要通过不断的实践,像是做实验那样,一点点调整。可能有时候少一点参数,模型的表现反而会更好,更灵活,更能适应不同的情况。这就是为啥我们要在实际操作中多动手试试,找到那个能让Lora表现最佳的“黄金比例”~