1. 灾难性遗忘的本质与挑战
当我们在预训练大语言模型(LLM)基础上进行微调时,经常会遇到一个棘手的问题:模型在新任务上表现提升的同时,会快速遗忘之前学到的知识。这种现象在机器学习领域被称为"灾难性遗忘"(Catastrophic Forgetting)。
从神经科学的角度看,这与人类大脑的学习机制形成鲜明对比。人脑能够通过突触可塑性实现渐进式学习,而人工神经网络由于参数共享和全局更新的特性,在新任务训练时往往会覆盖原有参数空间中的重要特征。
以金融领域微调为例:
- 基础模型:具备通用语言理解和推理能力
- 微调目标:适应金融术语、报表分析和投资建议生成
- 典型问题:微调后的模型可能丧失基础数学能力或常识推理
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 正则化技术的实战应用
2.1 弹性权重固化(EWC)实现细节
EWC通过计算参数的重要性权重,在微调时约束重要参数的改变幅度。以下是基于PyTorch的核心实现:
python复制class EWCTrainer:
def __init__(self, model, lambda_=1e4, fisher_sample_size=1000):
self.model = model
self.lambda_ = lambda_ # 正则化强度
self.fisher = {} # Fisher信息矩阵
self.params_initial = {} # 初始参数值
# 存储初始参数
for n, p in model.named_parameters():
if p.requires_grad:
self.params_initial[n] = p.data.clone()
def compute_fisher(self, dataset, tokenizer, sample_size=1000):
"""计算Fisher信息矩阵"""
self.model.eval()
fisher = {}
# 初始化二阶导数累加器
for n, p in self.model.named_parameters():
if p.requires_grad:
fisher[n] = torch.zeros_like(p.data)
# 随机采样计算Fisher
indices = torch.randperm(len(dataset))[:sample_size]
for idx in indices:
text = dataset[idx]['text']
inputs = tokenizer(text, return_tensors="pt", truncation=True)
# 计算对数似然的梯度
self.model.zero_grad()
outputs = self.model(**inputs, labels=inputs["input_ids"])
loss = outputs.loss
loss.backward()
# 累加梯度平方(Fisher对角近似)
for n, p in self.model.named_parameters():
if p.grad is not None:
fisher[n] += p.grad.data ** 2 / sample_size
self.fisher = fisher
def ewc_loss(self, current_loss):
"""计算EWC正则化损失"""
ewc_loss = 0
for n, p in self.model.named_parameters():
if n in self.fisher:
ewc_loss += (self.fisher[n] *
(p - self.params_initial[n]) ** 2).sum()
return current_loss + self.lambda_ * ewc_loss
关键参数选择经验:
- λ系数:金融文本建议1e4~1e5,对话系统建议1e3~1e4
- Fisher采样:至少500个样本,覆盖主要数据分布
- 计算频率:每轮训练后更新Fisher矩阵效果最佳
2.2 动态权重衰减策略
不同于固定L2正则化,动态策略根据参数重要性调整衰减强度:
python复制def dynamic_weight_decay(optimizer, model, importance_dict, base_decay=1e-2):
for group in optimizer.param_groups:
for p
