马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
神经网络防"失忆"秘笈:弹性权重固化怎样让AI学会"温故知新"
“就像学霸给重点条记贴荧光标签,EWC给告急神经网络参数上锁”
一、核心公式对比表
公式名称数学表达式普通表明类比场景文献EWC主公式Ltotal=Lnew+λ2∑iFi(θi−θold,i)2L_{total} = L_{new} + \frac{\lambda}{2} \sum_i F_i (\theta_i - \theta_{old,i})^2Ltotal=Lnew+2λ∑iFi(θi−θold,i)2给告急知识上锁给重点条记贴荧光标签贝叶斯推导式logp(θ∣D)∝logp(DB∣θ)+logp(θ∣DA)\log p(\theta|D) \propto \log p(D_B|\theta) + \log p(\theta|D_A)logp(θ∣D)∝logp(DB∣θ)+logp(θ∣DA)新旧知识均衡法则考试前既复习新题也温习旧题费舍尔信息矩阵Fi=E[∇θ2logp(y∣x,θ)]F_i = \mathbb{E}[\nabla_\theta^2 \log p(y|x,\theta)]Fi=E[∇θ2logp(y∣x,θ)]知识告急度评分卡根据条记划重点的频率标记 二、公式详解与类比表明
公式1:EWC核心掩护机制
Ltotal=Lnew(θ)⏟新使命+λ2∑iFi(θi−θold,i)2⏟旧知识防护罩 L_{total} = \underbrace{L_{new}(\theta)}_{\text{新使命}} + \underbrace{\frac{\lambda}{2} \sum_i F_i (\theta_i - \theta_{old,i})^2}_{\text{旧知识防护罩}} Ltotal=新使命Lnew(θ)+旧知识防护罩2λi∑Fi(θi−θold,i)2
参数数学符号类比表明作用原理旧使命参数θold\theta_{old}θold学霸的旧条记本知识基准锚点告急性系数FiF_iFi荧光标签密度参数告急性量化束缚强度λ\lambdaλ胶水粘性系数均衡新旧知识权重案例:在图像分类使命中,给辨认"猫耳朵"的关键神经元增长3倍掩护权重
公式2:费舍尔信息矩阵盘算
Fi=1N∑x,y(∂logp(y∥x,θ)∂θi)2 F_i = \frac{1}{N} \sum_{x,y} \left( \frac{\partial \log p(y\|x,\theta)}{\partial \theta_i} \right)^2 Fi=N1x,y∑(∂θi∂logp(y∥x,θ))2
变量解读:
- xxx:输入数据(弟子的练习题)
- yyy:标签答案(尺度答案)
- logp(y∥x,θ)\log p(y\|x,\theta)logp(y∥x,θ):答案准确率评分
类比表明:
如同统计弟子复习时翻看某页条记的次数,翻看越频仍的页面(参数)得到越多荧光标签(高F值)
三、公式体系演进(关键推导步调)
1. 贝叶斯推导路径
- 初始目的:
maxθlogp(θ∥DA,DB)\max_\theta \log p(\theta\|D_A, D_B)θmaxlogp(θ∥DA,DB)
- 使命分解:
∝logp(DB∥θ)+logp(θ∥DA)\propto \log p(D_B\|\theta) + \log p(\theta\|D_A)∝logp(DB∥θ)+logp(θ∥DA)
- 拉普拉斯近似:
logp(θ∥DA)≈−12∑iFi(θi−θold,i)2\log p(\theta\|D_A) \approx -\frac{1}{2} \sum_i F_i (\theta_i - \theta_{old,i})^2logp(θ∥DA)≈−21i∑Fi(θi−θold,i)2
2. 方法对比
方法核心公式上风范围L2正则L=Lnew+λ∣θ−θold∣2L = L_{new} + \lambda |\theta - \theta_{old}|^2L=Lnew+λ∣θ−θold∣2简单易实现无差异掩护全部参数EWCL=Lnew+λ2∑Fi(θi−θold,i)2L = L_{new} + \frac{\lambda}{2} \sum F_i(\theta_i - \theta_{old,i})^2L=Lnew+2λ∑Fi(θi−θold,i)2智能参数掩护需盘算二阶导数LwFL=Lnew+αDKL(pold∣pnew)L = L_{new} + \alpha D_{KL}(p_{old}|p_{new})L=Lnew+αDKL(pold∣pnew)保持输出分布稳固依靠旧模子推理 四、代码实战:MNIST/FashionMNIST增量学习
- import torch
- import torch.nn as nn
- class EWC_CNN(nn.Module):
- def __init__(self):
- super().__init__()
- self.conv = nn.Sequential(
- nn.Conv2d(1,32,3),
- nn.ReLU(),
- nn.MaxPool2d(2))
- self.fc = nn.Linear(32*13*13,10)
- def forward(self, x):
- x = self.conv(x)
- return self.fc(x.view(x.size(0),-1))
- # EWC核心实现
- class EWC_Regularizer:
- def __init__(self, model, dataloader, device):
- self.model = model
- self.params = {n:p.detach().clone() for n,p in model.named_parameters()} # 旧参数快照
- self.fisher = {}
-
- # 计算Fisher信息矩阵
- for batch in dataloader:
- inputs, labels = batch
- outputs = model(inputs.to(device))
- loss = nn.CrossEntropyLoss()(outputs, labels.to(device))
- loss.backward()
-
- for n,p in model.named_parameters():
- if p.grad is not None:
- self.fisher[n] = p.grad.data.pow(2).mean() # 梯度平方均值
- def penalty(self, current_params):
- loss = 0
- for n,p in current_params.items():
- loss += (self.fisher[n] * (p - self.params[n]).pow(2)).sum()
- return loss
- # 训练流程示例
- device = torch.device('cuda')
- model = EWC_CNN().to(device)
- old_task_loader = ... # 旧任务数据加载器
- new_task_loader = ... # 新任务数据加载器
- # 第一阶段:训练旧任务
- optimizer = torch.optim.Adam(model.parameters())
- for epoch in range(10):
- for batch in old_task_loader:
- # 常规训练流程...
-
- # 第二阶段:计算EWC约束
- ewc = EWC_Regularizer(model, old_task_loader, device)
- # 第三阶段:增量学习新任务
- for epoch in range(10):
- for batch in new_task_loader:
- inputs, labels = batch
- outputs = model(inputs.to(device))
- ce_loss = nn.CrossEntropyLoss()(outputs, labels.to(device))
- ewc_loss = ewc.penalty(dict(model.named_parameters()))
- total_loss = ce_loss + 1000 * ewc_loss # λ=1000
-
- optimizer.zero_grad()
- total_loss.backward()
- optimizer.step()
复制代码 五、可视化分析
1. 参数空间分布
- import matplotlib.pyplot as plt
- import seaborn as sns
- # 生成模拟数据
- theta_old = np.random.normal(0,1,1000) # 旧任务参数分布
- theta_new = np.random.normal(3,1,1000) # 新任务参数分布
- theta_ewc = 0.3*theta_old + 0.7*theta_new # EWC约束参数
- # 可视化
- plt.figure(figsize=(12,6))
- sns.kdeplot(theta_old, label="Old Task", color='grey', linewidth=3)
- sns.kdeplot(theta_new, label="New Task", color='gold', linewidth=3)
- sns.kdeplot(theta_ewc, label="EWC Compromise", color='red', linestyle='--')
- plt.title("Parameter Space Distribution")
- plt.xlabel("Parameter Value"), plt.ylabel("Density")
- plt.legend()
- plt.show()
复制代码 六、技能演进蹊径
阶段代表方法关键突破范围1.0参数冻结物理隔离旧知识丧失模子扩展本事2.0L2正则简单束缚参数漂移无差异掩护全部参数3.0EWC智能参数告急性加权盘算二阶导数开销大4.0动态网络独立适配器模块模子体积膨胀 |