【机器学习精通】第15章 | 迁移学习与预训练模型:站在巨人肩膀上
环境声明
- Python版本:Python 3.12+(建议使用3.10以上版本)
- 深度学习框架:PyTorch 2.0+
- 预训练模型库:Hugging Face Transformers 4.35+
- 硬件要求:支持CUDA的GPU(推荐)或CPU
- 操作系统:Windows / macOS / Linux(通用)
学习目标
通过本章学习,你将掌握:
- 迁移学习的核心概念与主要类型
- 特征提取与微调的实践策略
- 领域自适应的理论与方法
- 预训练语言模型(BERT、GPT、T5、LLaMA)的架构原理
- 计算机视觉预训练模型与自监督学习
- 参数高效微调(PEFT)技术:LoRA、Adapter、Prompt Tuning
- 使用BERT进行文本分类的完整实战流程
1. 迁移学习概述与类型
1.1 什么是迁移学习
迁移学习(Transfer Learning)是机器学习的一个重要分支,其核心思想是:将在源领域(Source Domain)学到的知识迁移到目标领域(Target Domain),从而减少对目标领域大量标注数据的依赖。
用一个形象的比喻:假设你已经学会了骑自行车(源任务),那么学习骑摩托车(目标任务)会容易得多,因为你已经掌握了平衡感、转向控制等通用技能。迁移学习正是利用这种"知识复用"的能力。
1.2 迁移学习的数学定义
给定源域 Ds={Xs,P(Xs)}D_s = \{X_s, P(X_s)\}Ds={Xs,P(Xs)} 和目标任务 Ts={Ys,fs(⋅)}T_s = \{Y_s, f_s(\cdot)\}Ts={Ys,fs(⋅)},以及目标域 Dt={Xt,P(Xt)}D_t = \{X_t, P(X_t)\}Dt={Xt,P(Xt)} 和目标任务 Tt={Yt,ft(⋅)}T_t = \{Y_t, f_t(\cdot)\}Tt={Yt,ft(⋅)},迁移学习的目标是:利用 DsD_sDs 和 TsT_sTs 中的知识,提升目标域 DtD_tDt 上目标预测函数 ft(⋅)f_t(\cdot)ft(⋅) 的学习效果,其中 Ds≠DtD_s \neq D_tDs=Dt 或 Ts≠TtT_s \neq T_tTs=Tt。
1.3 迁移学习的类型
| 类型 | 定义 | 特点 | 典型应用 |
|---|---|---|---|
| 归纳式迁移学习 | 源任务与目标任务不同,但领域可能相同或不同 | 需要源域标注数据 | 图像分类、文本分类 |
| 直推式迁移学习 | 源任务与目标任务相同,但领域不同 | 源域有标注,目标域无标注 | 跨领域情感分析 |
| 无监督迁移学习 | 源任务与目标任务均不同,且均无标注 | 难度最大,依赖自监督 | 特征表示学习 |
| 领域自适应 | 源域与目标域分布不同,但任务相同 | 核心问题是对齐分布 | 域迁移图像识别 |
1.4 迁移学习的应用场景
迁移学习在以下场景中尤为重要:
- 数据稀缺场景:目标领域标注数据极少(如医疗影像分析)
- 计算资源受限:无法从头训练大规模模型
- 快速部署需求:需要在短时间内获得可用模型
- 多任务学习:多个相关任务共享底层表示
2. 特征提取与微调
2.1 特征提取(Feature Extraction)
特征提取策略将预训练模型作为固定的特征提取器,只训练顶层分类器。
实现方式:
- 冻结预训练模型的所有参数
- 移除原始分类层
- 添加新的任务特定层
- 仅训练新添加的层
适用场景:
- 目标数据集较小
- 目标数据与预训练数据分布相似
- 计算资源非常有限
2.2 微调(Fine-tuning)
微调策略允许调整预训练模型的部分或全部参数。
微调策略分类:
| 策略 | 描述 | 适用情况 |
|---|---|---|
| 全量微调 | 更新所有参数 | 数据充足,计算资源充裕 |
| 逐层解冻 | 从顶层开始逐层解冻 | 中等规模数据 |
| 选择性微调 | 只微调特定层 | 特定层包含任务相关信息 |
| 差分学习率 | 不同层使用不同学习率 | 需要精细控制 |
2.3 学习率设置策略
# 差分学习率示例(PyTorch实现)
# 底层使用较小学习率,顶层使用较大学习率
optimizer = torch.optim.Adam([
{'params': model.layer1.parameters(), 'lr': 1e-5},
{'params': model.layer2.parameters(), 'lr': 1e-4},
{'params': model.classifier.parameters(), 'lr': 1e-3}
])
学习率衰减策略:
- 线性衰减:学习率随训练轮数线性下降
- 余弦退火:使用余弦函数调整学习率
- 预热策略:前几轮从小学习率逐渐增大
3. 领域自适应
3.1 领域自适应的核心问题
领域自适应(Domain Adaptation)处理源域与目标域数据分布不一致的问题。核心挑战是:
Ps(X)≠Pt(X)P_s(X) \neq P_t(X)Ps(X)=Pt(X)
即源域和目标域的特征分布存在差异。
3.2 分布差异度量
最大均值差异(Maximum Mean Discrepancy, MMD):
MMD是衡量两个分布差异的常用指标:
MMD(Xs,Xt)=∥1ns∑i=1nsϕ(xis)−1nt∑j=1ntϕ(xjt)∥HMMD(X_s, X_t) = \left\| \frac{1}{n_s} \sum_{i=1}^{n_s} \phi(x_i^s) - \frac{1}{n_t} \sum_{j=1}^{n_t} \phi(x_j^t) \right\|_HMMD(Xs,Xt)= ns1i=1∑nsϕ(xis)−nt1j=1∑ntϕ(xjt) H
其中,ϕ(⋅)\phi(\cdot)ϕ(⋅) 是将样本映射到再生核希尔伯特空间(RKHS)的函数。
其他度量方法:
| 方法 | 特点 | 适用场景 |
|---|---|---|
| CORAL | 对齐二阶统计量 | 特征协方差对齐 |
| 对抗距离 | 通过判别器度量 | 对抗式方法 |
| Wasserstein距离 | 考虑几何结构 | 分布差异较大时 |
3.3 对抗式领域自适应
**域对抗神经网络(Domain-Adversarial Neural Network, DANN)**是领域自适应的经典方法。
DANN架构组成:
- 特征提取器(G):提取领域不变特征
- 标签预测器(F):预测样本标签
- 域判别器(D):区分样本来自源域还是目标域
对抗训练目标:
minGmaxDLy−λLd\min_G \max_D \mathcal{L}_y - \lambda \mathcal{L}_dGminDmaxLy−λLd
其中,Ly\mathcal{L}_yLy 是分类损失,Ld\mathcal{L}_dLd 是域分类损失,λ\lambdaλ 控制对抗强度。
梯度反转层(Gradient Reversal Layer, GRL):
GRL在前向传播时保持输入不变,在反向传播时反转梯度符号,实现对抗训练:
class GradientReversalLayer(torch.autograd.Function):
@staticmethod
def forward(ctx, x, lambda_val):
ctx.lambda_val = lambda_val
return x.view_as(x)
@staticmethod
def backward(ctx, grad_output):
return -ctx.lambda_val * grad_output, None
4. 预训练语言模型
4.1 预训练语言模型发展历程
预训练语言模型(Pre-trained Language Models, PLMs)的发展经历了多个阶段:
| 阶段 | 代表模型 | 核心特点 |
|---|---|---|
| 词向量时代 | Word2Vec, GloVe | 静态词表示 |
| 上下文嵌入时代 | ELMo | 动态词表示 |
| Transformer时代 | BERT, GPT | 深层双向/单向编码 |
| 大模型时代 | GPT-3, LLaMA | 超大规模参数 |
4.2 BERT架构解析
BERT(Bidirectional Encoder Representations from Transformers) 采用双向Transformer编码器架构。
核心设计:
- 双向编码:同时考虑左右上下文
- 预训练任务:
- 掩码语言模型(MLM):随机掩码15%的词进行预测
- 下一句预测(NSP):判断两个句子是否连续
BERT变体:
| 模型 | 参数量 | 层数 | 隐藏维度 | 适用场景 |
|---|---|---|---|---|
| BERT-Base | 110M | 12 | 768 | 通用任务 |
| BERT-Large | 340M | 24 | 1024 | 复杂任务 |
| DistilBERT | 66M | 6 | 768 | 资源受限场景 |
| RoBERTa | 355M | 24 | 1024 | 优化训练策略 |
4.3 GPT系列架构
GPT(Generative Pre-trained Transformer) 采用自回归解码器架构。
演进历程:
- GPT-1:1.17亿参数,证明生成式预训练的有效性
- GPT-2:15亿参数,展示零样本学习能力
- GPT-3:1750亿参数,涌现上下文学习能力
- GPT-4:多模态能力,推理能力大幅提升
自回归语言建模:
P(x)=∏i=1nP(xi∣x1,x2,...,xi−1)P(x) = \prod_{i=1}^{n} P(x_i | x_1, x_2, ..., x_{i-1})P(x)=i=1∏nP(xi∣x1,x2,...,xi−1)
4.4 T5与编码器-解码器架构
T5(Text-to-Text Transfer Transformer) 将所有NLP任务统一为文本到文本的格式。
核心思想:
- 输入:“translate English to German: The house is wonderful.”
- 输出:“Das Haus ist wunderbar.”
T5预训练任务:
- Span Corruption:随机掩码连续片段,预测被掩码内容
- 去噪自编码:类似于BART的降噪目标
4.5 LLaMA架构
LLaMA(Large Language Model Meta AI) 是Meta开源的大语言模型系列。
架构优化:
| 技术 | 说明 | 效果 |
|---|---|---|
| Pre-normalization | 使用RMSNorm代替LayerNorm | 训练稳定性提升 |
| SwiGLU激活函数 | 替代ReLU | 表达能力增强 |
| 旋转位置编码(RoPE) | 相对位置编码 | 外推能力增强 |
| 分组查询注意力(GQA) | 减少KV缓存 | 推理速度提升 |
5. 计算机视觉预训练模型
5.1 ImageNet预训练
ImageNet预训练是计算机视觉领域的标准做法。
经典预训练模型:
| 模型 | 年份 | 参数量 | Top-1准确率 | 特点 |
|---|---|---|---|---|
| ResNet-50 | 2015 | 25.6M | 76.1% | 残差连接 |
| ResNet-101 | 2015 | 44.5M | 77.4% | 更深网络 |
| EfficientNet-B0 | 2019 | 5.3M | 77.1% | 复合缩放 |
| ConvNeXt | 2022 | 88.6M | 83.8% | 现代化CNN |
| ViT-Base | 2020 | 86M | 84.2% | 纯Transformer |
5.2 自监督学习
自监督学习通过设计预训练任务,从无标注数据中学习视觉表示。
主要方法:
-
对比学习(Contrastive Learning):
- SimCLR:通过数据增强生成正样本对
- MoCo:使用动量编码器维护负样本队列
- CLIP:跨模态对比学习
-
掩码图像建模(Masked Image Modeling):
- BEiT:将图像离散化为视觉token
- MAE:高比例掩码,重建像素
5.3 MAE(Masked Autoencoder)详解
MAE是视觉自监督学习的里程碑工作。
核心思想:
- 随机掩码图像块(掩码比例高达75%)
- 编码器仅处理可见块
- 解码器重建完整图像
MAE架构优势:
| 特点 | 说明 |
|---|---|
| 非对称设计 | 编码器轻量,解码器简单 |
| 高掩码率 | 75%掩码率,迫使学习高层语义 |
| 像素重建 | 直接预测原始像素,无需复杂tokenizer |
6. 参数高效微调PEFT
6.1 PEFT概述
参数高效微调(Parameter-Efficient Fine-Tuning, PEFT)旨在通过训练少量参数,实现与全量微调相当的效果。
PEFT方法分类:
| 类别 | 代表方法 | 核心思想 |
|---|---|---|
| 添加参数 | Adapter, Prompt Tuning | 引入可训练模块 |
| 选择参数 | BitFit | 只训练偏置项 |
| 重参数化 | LoRA, DoRA | 低秩近似权重更新 |
| 混合方法 | UniPELT | 组合多种方法 |
6.2 LoRA(Low-Rank Adaptation)
LoRA是2021年提出的低秩适应方法,已成为PEFT的事实标准。
核心思想:
对于预训练权重矩阵 W0∈Rd×kW_0 \in \mathbb{R}^{d \times k}W0∈Rd×k,不直接更新 W0W_0W0,而是引入低秩分解:
W=W0+ΔW=W0+BAW = W_0 + \Delta W = W_0 + BAW=W0+ΔW=W0+BA
其中,B∈Rd×rB \in \mathbb{R}^{d \times r}B∈Rd×r,A∈Rr×kA \in \mathbb{R}^{r \times k}A∈Rr×k,r≪min(d,k)r \ll \min(d, k)r≪min(d,k)。
LoRA特点:
| 特性 | 说明 |
|---|---|
| 参数效率 | 可训练参数减少为原来的 r/dr/dr/d |
| 无推理开销 | 推理时可合并权重,不增加延迟 |
| 模块化 | 不同任务训练不同的LoRA模块 |
| 可组合 | 多个LoRA模块可线性组合 |
LoRA实现示例:
import torch
import torch.nn as nn
import math
class LoRALayer(nn.Module):
def __init__(self, in_features, out_features, rank=8):
super().__init__()
self.rank = rank
# 低秩矩阵A和B
self.lora_A = nn.Parameter(torch.zeros(in_features, rank))
self.lora_B = nn.Parameter(torch.zeros(rank, out_features))
# 初始化:A用高斯初始化,B用零初始化
nn.init.kaiming_uniform_(self.lora_A, a=math.sqrt(5))
nn.init.zeros_(self.lora_B)
self.scaling = 1.0
def forward(self, x):
# 计算低秩更新:x @ A @ B
return x @ self.lora_A @ self.lora_B * self.scaling
6.3 QLoRA与量化技术
QLoRA(Quantized LoRA) 结合4-bit量化和LoRA,实现单卡微调大模型。
关键技术:
- 4-bit NormalFloat量化:信息论最优的4-bit数据类型
- 双量化:对量化常数进行二次量化
- 分页优化器:使用NVIDIA统一内存处理内存峰值
QLoRA优势:
- 在48GB GPU上微调65B参数模型
- 保持16-bit全量微调的99.3%性能
6.4 DoRA(Weight-Decomposed Low-Rank Adaptation)
DoRA是2024年提出的LoRA改进方法,将权重分解为幅度和方向分别更新。
权重分解:
W=m⋅V∥V∥W = m \cdot \frac{V}{\|V\|}W=m⋅∥V∥V
其中,mmm 是幅度向量,VVV 是方向矩阵。
DoRA更新:
- 幅度 mmm:直接微调
- 方向 VVV:使用LoRA进行低秩更新
DoRA优势:
| 特性 | LoRA | DoRA |
|---|---|---|
| 学习能力 | 基础 | 增强 |
| 训练稳定性 | 一般 | 提升 |
| 推理开销 | 无 | 无 |
| 适用模型 | 通用 | LLM和VLM效果更佳 |
6.5 Adapter Tuning
Adapter在Transformer层中插入小型瓶颈层。
Adapter结构:
输入 -> 降维(d -> r)-> 非线性激活 -> 升维(r -> d)-> 输出
Adapter特点:
- 参数量小(通常 r=16r=16r=16 或 646464)
- 可并行训练多个任务
- 推理时需要额外计算
6.6 Prompt Tuning与Prefix Tuning
Prompt Tuning:
在输入嵌入层添加可训练的软提示(Soft Prompt)token。
Prefix Tuning:
在每层Transformer的key和value前添加可训练的前缀向量。
比较:
| 方法 | 参数位置 | 参数量 | 效果 |
|---|---|---|---|
| Prompt Tuning | 输入层 | 较小 | 大模型效果好 |
| Prefix Tuning | 每层K,V | 中等 | 通用性强 |
| P-Tuning v2 | 深层Prefix | 较大 | 小模型也有效 |
6.7 2024-2025年PEFT新进展
最新研究方向:
- 多模态PEFT:适配视觉-语言模型(如LLaVA)
- 长上下文PEFT:支持更长序列的微调方法
- 联邦PEFT:隐私保护下的分布式微调
- 自动化PEFT:自动选择最优PEFT配置
7. 实战案例:使用BERT进行文本分类微调
7.1 任务描述
本案例使用BERT-base-chinese模型,在中文情感分类数据集上进行微调。
7.2 环境准备
# 安装依赖
# pip install transformers datasets torch scikit-learn
import torch
import torch.nn as nn
from torch.utils.data import DataLoader
from transformers import (
BertTokenizer,
BertForSequenceClassification,
AdamW,
get_linear_schedule_with_warmup
)
from datasets import load_dataset
from sklearn.metrics import accuracy_score, f1_score
import numpy as np
# 设置随机种子
torch.manual_seed(42)
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
print(f"使用设备: {device}")
7.3 数据准备
# 加载中文情感分析数据集(ChnSentiCorp)
# 如果没有该数据集,可以使用自定义数据
def load_data():
"""加载数据集,返回train和test数据集"""
# 示例:使用Hugging Face的datasets库加载中文情感数据
try:
dataset = load_dataset("chnsenticorp")
train_dataset = dataset['train']
test_dataset = dataset['test']
except:
# 如果无法下载,创建示例数据
print("使用示例数据进行演示...")
train_texts = ["这个产品很好", "质量太差了", "非常满意", "不值得购买"] * 100
train_labels = [1, 0, 1, 0] * 100
test_texts = ["效果不错", "很失望"] * 50
test_labels = [1, 0] * 50
from datasets import Dataset
train_dataset = Dataset.from_dict({"text": train_texts, "label": train_labels})
test_dataset = Dataset.from_dict({"text": test_texts, "label": test_labels})
return train_dataset, test_dataset
train_data, test_data = load_data()
print(f"训练集大小: {len(train_data)}")
print(f"测试集大小: {len(test_data)}")
7.4 数据预处理
# 加载BERT中文分词器
tokenizer = BertTokenizer.from_pretrained('bert-base-chinese')
def tokenize_function(examples):
"""对文本进行tokenize处理"""
return tokenizer(
examples['text'],
padding='max_length',
truncation=True,
max_length=128
)
# 对数据集进行编码
train_encoded = train_data.map(tokenize_function, batched=True)
test_encoded = test_data.map(tokenize_function, batched=True)
# 设置数据格式
train_encoded.set_format(
type='torch',
columns=['input_ids', 'attention_mask', 'label']
)
test_encoded.set_format(
type='torch',
columns=['input_ids', 'attention_mask', 'label']
)
# 创建DataLoader
train_loader = DataLoader(train_encoded, batch_size=16, shuffle=True)
test_loader = DataLoader(test_encoded, batch_size=16)
7.5 模型定义
# 加载预训练BERT模型,添加分类头
model = BertForSequenceClassification.from_pretrained(
'bert-base-chinese',
num_labels=2, # 二分类:正面/负面
output_attentions=False,
output_hidden_states=False
)
model = model.to(device)
# 查看模型结构
print(f"模型参数量: {sum(p.numel() for p in model.parameters()) / 1e6:.2f}M")
7.6 训练配置
# 定义优化器和学习率调度器
optimizer = AdamW(model.parameters(), lr=2e-5, weight_decay=0.01)
# 计算总训练步数
epochs = 3
total_steps = len(train_loader) * epochs
# 学习率预热(前10%的步数)
warmup_steps = int(0.1 * total_steps)
scheduler = get_linear_schedule_with_warmup(
optimizer,
num_warmup_steps=warmup_steps,
num_training_steps=total_steps
)
# 损失函数
loss_fn = nn.CrossEntropyLoss()
7.7 训练循环
def train_epoch(model, data_loader, optimizer, scheduler, device):
"""训练一个epoch"""
model.train()
total_loss = 0
for batch in data_loader:
# 将数据移至设备
input_ids = batch['input_ids'].to(device)
attention_mask = batch['attention_mask'].to(device)
labels = batch['label'].to(device)
# 清零梯度
optimizer.zero_grad()
# 前向传播
outputs = model(
input_ids=input_ids,
attention_mask=attention_mask,
labels=labels
)
loss = outputs.loss
# 反向传播
loss.backward()
# 梯度裁剪,防止梯度爆炸
torch.nn.utils.clip_grad_norm_(model.parameters(), max_norm=1.0)
# 更新参数
optimizer.step()
scheduler.step()
total_loss += loss.item()
return total_loss / len(data_loader)
def evaluate(model, data_loader, device):
"""评估模型性能"""
model.eval()
predictions = []
true_labels = []
with torch.no_grad():
for batch in data_loader:
input_ids = batch['input_ids'].to(device)
attention_mask = batch['attention_mask'].to(device)
labels = batch['label'].to(device)
outputs = model(
input_ids=input_ids,
attention_mask=attention_mask
)
# 获取预测结果
preds = torch.argmax(outputs.logits, dim=1)
predictions.extend(preds.cpu().numpy())
true_labels.extend(labels.cpu().numpy())
# 计算指标
accuracy = accuracy_score(true_labels, predictions)
f1 = f1_score(true_labels, predictions, average='weighted')
return accuracy, f1
# 训练循环
print("开始训练...")
for epoch in range(epochs):
print(f"\nEpoch {epoch + 1}/{epochs}")
# 训练
train_loss = train_epoch(model, train_loader, optimizer, scheduler, device)
print(f"训练损失: {train_loss:.4f}")
# 评估
acc, f1 = evaluate(model, test_loader, device)
print(f"测试准确率: {acc:.4f}, F1分数: {f1:.4f}")
7.8 使用LoRA进行高效微调
# 使用PEFT库进行LoRA微调
# pip install peft
from peft import LoraConfig, get_peft_model, TaskType
# 配置LoRA
lora_config = LoraConfig(
task_type=TaskType.SEQ_CLS, # 序列分类任务
r=8, # 低秩维度
lora_alpha=16, # 缩放参数
lora_dropout=0.1,
bias="none",
target_modules=["query", "key", "value", "dense"] # 目标模块
)
# 将LoRA应用于模型
lora_model = get_peft_model(model, lora_config)
lora_model.print_trainable_parameters()
# 使用LoRA模型进行训练(训练代码同上)
# 优势:可训练参数从1.1亿减少到约30万
7.9 模型保存与加载
# 保存微调后的模型
output_dir = "./bert_sentiment_model"
model.save_pretrained(output_dir)
tokenizer.save_pretrained(output_dir)
# 保存LoRA权重(如果使用LoRA)
lora_model.save_pretrained("./bert_lora_model")
# 加载模型进行推理
from transformers import pipeline
# 创建文本分类pipeline
classifier = pipeline(
"sentiment-analysis",
model=output_dir,
tokenizer=output_dir,
device=0 if torch.cuda.is_available() else -1
)
# 测试推理
test_texts = ["这个产品质量非常好,强烈推荐!", "太失望了,完全不值这个价钱"]
results = classifier(test_texts)
for text, result in zip(test_texts, results):
print(f"文本: {text}")
print(f"预测: {result}\n")
8. 避坑小贴士
8.1 数据相关
- 数据分布检查:微调前务必检查目标数据与预训练数据的分布差异,差异过大时考虑领域自适应
- 数据量评估:数据量小于1000条时,优先考虑特征提取;数据量大于10000条时,可尝试全量微调
- 类别平衡:分类任务中注意类别不平衡问题,可使用加权损失或过采样
8.2 训练相关
- 学习率选择:预训练层使用较小学习率(1e-5到5e-5),新层可使用较大学习率(1e-3)
- 预热步数:使用学习率预热,避免早期训练不稳定
- 早停策略:监控验证集损失,避免过拟合
- 梯度累积:显存不足时,使用梯度累积模拟大batch训练
8.3 模型相关
- 模型选择:中文任务优先选择bert-base-chinese或chinese-roberta
- 序列长度:根据任务选择合适的max_length,过长浪费计算,过短信息丢失
- 层冻结策略:底层捕获通用特征,应使用更小学习率或保持冻结
8.4 PEFT相关
- LoRA秩选择:一般任务r=8即可,复杂任务可尝试r=16或32
- 目标模块选择:注意力层的query、value是关键,优先添加LoRA
- QLoRA注意:4-bit量化可能略微影响精度,对精度要求极高的任务慎用
9. 本章小结
本章系统介绍了迁移学习与预训练模型的核心知识:
核心概念:
- 迁移学习通过知识复用,解决数据稀缺和计算资源受限问题
- 领域自适应处理源域与目标域分布不一致的挑战
- 预训练模型(BERT、GPT、T5、LLaMA)提供强大的基础能力
关键技术:
- 特征提取与微调的权衡与选择
- 对抗式领域自适应(DANN)的原理与实现
- 参数高效微调(PEFT)大幅降低微调成本
实践要点:
- LoRA已成为PEFT的事实标准,QLoRA实现单卡微调大模型
- DoRA作为2024年的改进方法,在稳定性和学习能力上有所提升
- 使用Hugging Face Transformers可快速实现BERT微调
一句话总结:迁移学习让我们"站在巨人肩膀上",以更低的成本获得强大的模型能力;PEFT技术进一步降低了门槛,使得个人开发者也能微调大模型。
参考资源:
- Devlin J, et al. BERT: Pre-training of Deep Bidirectional Transformers. NAACL 2019.
- Hu E, et al. LoRA: Low-Rank Adaptation of Large Language Models. ICLR 2022.
- Dettmers T, et al. QLoRA: Efficient Finetuning of Quantized LLMs. NeurIPS 2023.
- Liu S, et al. DoRA: Weight-Decomposed Low-Rank Adaptation. ICML 2024.
- Ganin Y, et al. Domain-Adversarial Training of Neural Networks. JMLR 2016.
本文是《机器学习精通》系列教程的第15章,欢迎持续关注后续内容。
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐
所有评论(0)