微信扫码
添加专属顾问
我要投稿
想让AI更懂你?一文读懂模型微调的三种主流方法,轻松上手不踩坑! 核心内容: 1. 三种主流微调方法对比:LoRA、Adapter和Prompt Tuning 2. LoRA技术详解:如何通过轻量矩阵实现高效微调 3. 微调成本分析及实际应用建议
大模型虽然很强,但总不能什么都懂你——想让它说得更准、听得更懂,就得“调教”一下,这就是:模型微调(Fine-tuning)。
LoRA | ||||
Adapter | ||||
Prompt Tuning |
🔍 类比:你想在不开脑的前提下偷偷给 Transformer 植入一点“记忆补丁”。
它不会去改模型原始结构,而是: 在每层注意力机制的 Query(Wq)和 Value(Wv)矩阵上,加上一个 可训练小矩阵补丁。
原始计算:
Q = X × Wq
LoRA 改造后:
Q = X × (Wq + B × A)
↑ ↑
可训练 可训练
from peft import get_peft_model, LoraConfig, TaskType
from transformers import AutoModelForSequenceClassification
model = AutoModelForSequenceClassification.from_pretrained("bert-base-uncased")
lora_config = LoraConfig(
r=8, # 降维维度
lora_alpha=32, # 缩放系数
target_modules=["query", "value"], # 注意:加在哪些层要对得上模型结构
task_type=TaskType.SEQ_CLS
)
model = get_peft_model(model, lora_config)
model.print_trainable_parameters()
📌大家别被代码劝退!我放代码是为了说明 Python 封装得很好,实际代码就这几行,非常友好 😊
🔍 类比:你不改模型主板,只在中间每层插个“小外挂”,训练这些外挂就够了。
每层 Transformer 都是处理输入的“中继站”,Adapter 就是在中间偷偷插个小模块,专门拿来训练的。
整个流程大致是这样的:
先降维 + 激活 + 升维: 把输入缩小成低维(比如从 768 降到 64),再用非线性函数加工一下,然后再升回去(64 ➜ 768)。
输出加和: 把这个加工后的输出,和原来那层的输出相加起来,再一起传给下一层。
输入 →
Linear(降维)→ 非线性 → Linear(升维) → 加回主干
from transformers import AutoModelForSequenceClassification
import transformers.adapters # 要安装 adapters 扩展包
model = AutoModelForSequenceClassification.from_pretrained("bert-base-uncased")
# 添加 Adapter 模块
model.add_adapter("my_adapter")
model.train_adapter("my_adapter") # 冻结主干,只训练 adapter
model.save_adapter("./adapter_model", "my_adapter") # 导出只需几十MB
💡 你可以为不同任务分别训练 Adapter 模块,就像“插卡带”一样部署时灵活切换,特别适合一个模型跑多个任务的场景。
比如:你可以在一个大模型里,为不同的任务各自训练一个 Adapter 模块,
adapter_sentiment | |
adapter_law | |
adapter_medical |
这些 Adapter 是独立的小模块,平时你只训练和保存 Adapter 的参数,不动大模型。
那部署的时候呢?
你只需要加载你当前任务需要的那个 Adapter,比如做法律问答时:
model.load_adapter("adapter_law")
这样模型就像“插上专用外挂”,立刻切换成懂法律的角色。
🔍 类比:不是告诉模型你要干嘛,而是训练一段“潜意识引导前缀”。
和写 “你是一个助理,请…” 这种文字提示不同,Prompt Tuning 是:
✅ 训练一段 embedding 向量(不可读、不代表词),直接拼在输入文本前面。
输入 = [虚拟 Prompt 向量 1~8] + [真实文本 Token]
这 8 个向量是你训练出来的参数,主干模型完全不动
from transformers import AutoModelForSequenceClassification, AutoTokenizer
from peft import PromptTuningConfig, get_peft_model, TaskType
model = AutoModelForSequenceClassification.from_pretrained("bert-base-uncased")
peft_config = PromptTuningConfig(
task_type=TaskType.SEQ_CLS,
num_virtual_tokens=8, # 虚拟向量个数
tokenizer_name_or_path="bert-base-uncased"
)
model = get_peft_model(model, peft_config)
model.print_trainable_parameters()
💡 最终生成的“Prompt”不是汉字,不是词,是 8 个模型学出来的向量,你看不懂但模型很懂。
以下是以阿里云弹性 GPU 实例 + 本地调试平台(如 Colab)为估算基础,按“租用+上传数据+训练+导出模型”流程估算:
ChatGLM3-6B | |||||
Qwen-7B | |||||
BGE-Large-zh | |||||
Mistral-7B | |||||
MiniCPM-2B |
以阿里云为代表的国内主流平台,常见 GPU 部署成本如下(按弹性GPU服务器 + 推理框架搭建估算):
T4(16GB) | ||||
A10(24GB) | ||||
A100(40GB) | ||||
CPU(16核/32G) |
53AI,企业落地大模型首选服务商
产品:场景落地咨询+大模型应用平台+行业解决方案
承诺:免费场景POC验证,效果验证后签署服务协议。零风险落地应用大模型,已交付160+中大型企业
2025-04-30
2025-04-19
2025-04-16
2025-04-16
2025-04-20
2025-05-26
2025-04-20
2025-04-19
2025-04-06
2025-05-07