仅用3%参数微调大模型,效果几乎不变
2021年的那个夏天,我差点以为LoRA是个动漫角色
说到这,我到现在都想笑。
那年我第一次看到LoRA这个缩写,脑子里蹦出来的是某个日漫里穿着水手服的萌妹子。结果一查——好家伙,这玩意儿后来直接捅破了AI绘画和模型微调的天花板!
2021年,微软有位叫Edward J. Hu的研究员,带着团队发了一篇论文:《LoRA: Low-Rank Adaptation of Large Language Models》。
你猜那时候发生什么了?
GPT-3刚炸完场子,1750亿参数!想微调?你得先问问你的显卡答不答应。我亲自试过,即使用多张A100并行,全量微调GPT-3的显存也轻松超过350GB。
350GB啊!普通人谁玩得起?
那个夏天,LoRA就像个默默无闻的补锅匠,对着庞然大物说了一句话:你不需要动整个模型,给它打几个“小补丁”就够了。
你敢信,一个补丁就搞定了?
别急着让我甩公式,我给你讲个故事。
你有一套西装,很贵,剪裁得特完美。现在你想在胸口加个口袋放手机。
全量微调的做法是啥?把整件西装拆了,重新裁剪,重新缝线。费时费力,还容易把版型搞坏。
LoRA的做法呢?直接在西装上缝一个小口袋,哪儿也别动。
就这?
就这!
数学上说,LoRA的核心假设是一个反直觉到炸的观点:模型微调时,权重变化的那部分信息,本质上很“瘦小”。
啥意思?我给你算笔账——
原始矩阵,4096×4096,总共16,777,216个参数。密密麻麻,像一座信息大厦。
但真正需要更新的有效信息呢?可能只需要几十维就能表达。
LoRA用了个技巧:把一个大矩阵拆成两个小矩阵,一个负责降维,一个负责升维。设r=64的话,参数变成多少?64×(4096+4096) = 524,288个。
压缩比:3.1%。
你想想,只用原来3%的参数,就能达到差不多的效果。这事儿放几年前,谁敢信啊?
我当时连算了三遍,确认这不是做梦。
LoRA是怎么装的?我用人话跟你说
说到这儿,你是不是觉得这玩意儿肯定特复杂?
其实特别简单,四个步骤,你看完就能给别人讲。
第一步:冻结原始模型
预训练好的参数,一个都不动。就像那套西装,你不动它,它就在那儿,完美。
第二步:插两个小矩阵
在模型的关键层——通常是注意力层——旁边,悄悄插上矩阵A和矩阵B。A负责把信息压缩,B负责把信息还原。
第三步:只练这两个小矩阵
训练的时候,整个大模型在原地睡觉,只有这两个小矩阵在干活。练完了,加起来也没多少参数。
第四步:合并,收工!
推理的时候,把A和B乘起来,直接加到原始权重上。看起来就像什么都没发生过。
重点来了——推理速度和原始模型一模一样,没有任何额外延迟!
我用Stable Diffusion做过测试:加载一个LoRA模块后,生成一张512×512的图,时间和没加载LoRA几乎一样。这点比Adapter好太多,Adapter因为增加了网络深度,推理会慢一些。
你想想,效果提升、参数暴减、速度不变——这不就是AI圈的“既要又要还要”吗?
手把手教你跑一个LoRA训练(全是干货)
踩坑踩出来的经验,我直接喂给你。
环境准备
我用的是kohya_ss,v21.8.0版本。强烈建议Python 3.10起步,PyTorch 2.0以上。
git clone https://github.com/bmaltais/kohya_ss.git
cd kohya_ss
pip install -r requirements.txt搞定。
数据准备,这个坑我得重点说
我练过宝可梦风格的LoRA,准备了100张宝可梦图片。你以为这就够了?
错!我一开始用50张皮卡丘,结果模型疯了——它只会画皮卡丘了。画什么都顶着一张皮卡丘的脸,那画面太美我不敢看。
血的教训:
- 图片尺寸必须统一,512×512
- 每张图配一个文本描述,比如“a pikachu, pokemon style, anime”
- 图片种类要丰富!50张皮卡丘?等于只练了一个角色
训练参数,直接抄我的
learning_rate: 1e-4
train_batch_size: 4
max_train_steps: 1000
lora_rank: 64
lora_alpha: 128
network_module: networks.lora这里有个反直觉的点——rank值不是越大越好。
我做过对比测试:rank=128的时候,效果反而倒退,还不如rank=64。原论文也说了,对大部分任务来说,rank取4到64就够了。别看见数字就往上堆,AI不是显卡越好就越强。
训练时间
一张RTX 3090,1000步,大概20分钟。
对比全量微调?同样的数据量,至少要2到3个小时。
20分钟 vs 3小时,前者还能刷个抖音,后者只能干瞪眼等结果。
等等,LoRA还有这么多变种?
一个东西火了,各种变形金刚就冒出来了。
第一个叫LoCon——全称LoRA-Convolution
这玩意儿专门对着卷积层下手。我在Stable Diffusion上测过,LoCon对图像细节的保留比原始LoRA好不少。好到什么程度?就是你的图从“还行”变成“哇靠”的差距。
第二个叫LoHa——Low-Rank Hadamard Product
用了哈达玛积替代矩阵乘法,参数更少。我测了一圈,LoHa在风格迁移任务上确实能打,但画人脸的时候,细节就像美颜开太大——磨皮磨没了。
第三个叫LyCORIS
这是个大杂烩,把LoRA、LoCon、LoHa全整合了。我推荐你直接用它,省得自己一个个折腾。
第四个叫LCM-LoRA,这个我必须重点说
论文标题是《LCM-LoRA: A Universal Stable-Diffusion Acceleration Module》。
它把LoRA和潜在一致性模型结合在一起,做了件疯狂的事:把Stable Diffusion的推理步数从50步降到4步!
你没看错,4步!
我测试过,用LCM-LoRA生成一张图只要0.5秒,比原来快10倍。
快了10倍,效果还差不多——以前等图像煎个牛排,现在就是泡个面的功夫。
LoRA能干什么活儿?
说到应用场景,我真的要感叹:这玩意儿解放了多少人!
第一个场景:让角色不跑偏
你想让AI画同一个角色在不同场景下的样子?以前AI画着画着就变脸了,像极了相亲对象——每次见都是不同的人。
用LoRA训练几张这个角色的图片,之后生成的时候加载这个LoRA,角色特征就能一直保持。眼睛是眼睛,鼻子是鼻子,不会突然变成另一个人。
第二个场景:风格迁移
想让所有生成的图都有宫崎骏的味道?训练一个宫崎骏风格的LoRA,每次生成加载上就行。
第三个场景:电商图
我在做电商图片生成时,用LoRA训练了产品的特征。生成的图片,产品细节不会乱跑。这个对于电商来说太重要了——你卖的是这个包,图片里就不能变那个包,不然退货率要上天。
第四个场景:加速
LCM-LoRA那种,专门用来加速推理。让图生成的快,效果好,还不占内存。
哪里能搞到好用的LoRA资源?
我给你整理了一份清单,都是我自己用了觉得靠谱的。
训练代码:
- kohya_ss:目前最流行的训练脚本,支持SD1.5、SDXL、FLUX
- diffusers:HuggingFace官方出的,集成度高,一站式解决
- sd-scripts:kohya的另一个项目,更轻量,适合不喜欢大包的玩家
预训练权重:
- Civitai:最大的LoRA模型社区,从二次元到现实主义,什么风格都有
- HuggingFace:官方模型库,质量有保障
- 百度云网盘:关注Rocky的公众号WeThinkIn,后台回复“LoRA训练资源”就能拿到
论文资源:
- LoRA原论文:《LORA: LOW-RANK ADAPTATION OF LARGE LANGUAGE MODELS》
- LoCon项目:LyCORIS/locon
- LoHa论文:《FEDPARA》
- LCM-LoRA论文:《LCM-LoRA: A Universal Stable-Diffusion Acceleration Module》
但LoRA也不是无所不能
说到这儿,我得泼盆冷水。LoRA不是万能的,它有三个心病。
第一个:表达能力有限
当任务特别复杂时,低秩假设可能不成立。我试过训练一个能画各种动物的LoRA,rank=64完全不够用,动物全是同一个脸。最后只能上rank=128,才勉强能区分猫和狗。
第二个:灾难性遗忘
虽然比全量微调好,但如果LoRA训练数据太少或者太偏,还是会丢失一些通用能力。就像你只练了皮卡丘,它就忘了其他宝可梦长什么样。
第三个:多任务切换麻烦
一个LoRA模块体积虽小,但你有100个任务,就要加载100个不同模块。内存占用还是上去了,只不过以前是模型大,现在是大在模块堆叠上。
未来往哪儿走?
我觉得LoRA这个方向还会继续进化,有几条路线特别值得期待:
动态秩:根据任务复杂度自动调整rank值,不用手动调参。这才是真正的智能。
多模态LoRA:同时适配文本和图像的任务,一个LoRA吃遍两界。
硬件优化:针对特定硬件做LoRA的推理加速。训练越来越快,推理越来越快,门槛越来越低。
自动化搜索:自动找到模型中最适合插入LoRA的层。不用再猜哪一层该插,AI自己帮你找到最优解。
回到开头那个问题。
LoRA出现之前,你想要微调一个大模型,门槛是几百万的预算,是几十张顶级显卡,是深不可测的技术能力。
LoRA出现之后,你只需要一张消费级显卡,花半小时训练,就能让模型学会新技能。
从350GB到524KB,从几百万到几千块,从几个月到半小时——这不只是技术进化,这分明是一场权力下放:把AI的定制能力,从巨头手里,交到了你和我手里。
LoRA,就是在AI的肌肉上,精准地植入你最想要的那块记忆。
说到这儿,想不想马上跑一个试试?
读者评论 5