神经网络防“失忆“秘笈:弹性权重固化怎样让AI学会“温故知新“

[复制链接]
发表于 2025-10-27 03:47:27 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
神经网络防"失忆"秘笈:弹性权重固化怎样让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λ​∑i​Fi​(θi​−θold,i​)2给告急知识上锁给重点条记贴荧光标签贝叶斯推导式log⁡p(θ∣D)∝log⁡p(DB∣θ)+log⁡p(θ∣DA)\log p(\theta|D) \propto \log p(D_B|\theta) + \log p(\theta|D_A)logp(θ∣D)∝logp(DB​∣θ)+logp(θ∣DA​)新旧知识均衡法则考试前既复习新题也温习旧题费舍尔信息矩阵Fi=E[∇θ2log⁡p(y∣x,θ)]F_i = \mathbb{E}[\nabla_\theta^2 \log p(y|x,\theta)]Fi​=E[∇θ2​logp(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(∂log⁡p(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​=N1​x,y∑​(∂θi​∂logp(y∥x,θ)​)2
变量解读:

  • xxx:输入数据(弟子的练习题)
  • yyy:标签答案(尺度答案)
  • log⁡p(y∥x,θ)\log p(y\|x,\theta)logp(y∥x,θ):答案准确率评分
类比表明:
如同统计弟子复习时翻看某页条记的次数,翻看越频仍的页面(参数)得到越多荧光标签(高F值)

三、公式体系演进(关键推导步调)

1. 贝叶斯推导路径


  • 初始目的:
    max⁡θlog⁡p(θ∥DA,DB)\max_\theta \log p(\theta\|D_A, D_B)θmax​logp(θ∥DA​,DB​)
  • 使命分解:
    ∝log⁡p(DB∥θ)+log⁡p(θ∥DA)\propto \log p(D_B\|\theta) + \log p(\theta\|D_A)∝logp(DB​∥θ)+logp(θ∥DA​)
  • 拉普拉斯近似:
    log⁡p(θ∥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​)≈−21​i∑​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增量学习
  1. import torch
  2. import torch.nn as nn
  3. class EWC_CNN(nn.Module):
  4.     def __init__(self):
  5.         super().__init__()
  6.         self.conv = nn.Sequential(
  7.             nn.Conv2d(1,32,3),
  8.             nn.ReLU(),
  9.             nn.MaxPool2d(2))
  10.         self.fc = nn.Linear(32*13*13,10)
  11.     def forward(self, x):
  12.         x = self.conv(x)
  13.         return self.fc(x.view(x.size(0),-1))
  14. # EWC核心实现
  15. class EWC_Regularizer:
  16.     def __init__(self, model, dataloader, device):
  17.         self.model = model
  18.         self.params = {n:p.detach().clone() for n,p in model.named_parameters()}  # 旧参数快照
  19.         self.fisher = {}
  20.         
  21.         # 计算Fisher信息矩阵
  22.         for batch in dataloader:
  23.             inputs, labels = batch
  24.             outputs = model(inputs.to(device))
  25.             loss = nn.CrossEntropyLoss()(outputs, labels.to(device))
  26.             loss.backward()
  27.             
  28.             for n,p in model.named_parameters():
  29.                 if p.grad is not None:
  30.                     self.fisher[n] = p.grad.data.pow(2).mean()  # 梯度平方均值
  31.     def penalty(self, current_params):
  32.         loss = 0
  33.         for n,p in current_params.items():
  34.             loss += (self.fisher[n] * (p - self.params[n]).pow(2)).sum()
  35.         return loss
  36. # 训练流程示例
  37. device = torch.device('cuda')
  38. model = EWC_CNN().to(device)
  39. old_task_loader = ...  # 旧任务数据加载器
  40. new_task_loader = ...  # 新任务数据加载器
  41. # 第一阶段:训练旧任务
  42. optimizer = torch.optim.Adam(model.parameters())
  43. for epoch in range(10):
  44.     for batch in old_task_loader:
  45.         # 常规训练流程...
  46.         
  47. # 第二阶段:计算EWC约束
  48. ewc = EWC_Regularizer(model, old_task_loader, device)
  49. # 第三阶段:增量学习新任务
  50. for epoch in range(10):
  51.     for batch in new_task_loader:
  52.         inputs, labels = batch
  53.         outputs = model(inputs.to(device))
  54.         ce_loss = nn.CrossEntropyLoss()(outputs, labels.to(device))
  55.         ewc_loss = ewc.penalty(dict(model.named_parameters()))
  56.         total_loss = ce_loss + 1000 * ewc_loss  # λ=1000
  57.         
  58.         optimizer.zero_grad()
  59.         total_loss.backward()
  60.         optimizer.step()
复制代码

五、可视化分析

1. 参数空间分布
  1. import matplotlib.pyplot as plt
  2. import seaborn as sns
  3. # 生成模拟数据
  4. theta_old = np.random.normal(0,1,1000)  # 旧任务参数分布
  5. theta_new = np.random.normal(3,1,1000)  # 新任务参数分布
  6. theta_ewc = 0.3*theta_old + 0.7*theta_new  # EWC约束参数
  7. # 可视化
  8. plt.figure(figsize=(12,6))
  9. sns.kdeplot(theta_old, label="Old Task", color='grey', linewidth=3)
  10. sns.kdeplot(theta_new, label="New Task", color='gold', linewidth=3)
  11. sns.kdeplot(theta_ewc, label="EWC Compromise", color='red', linestyle='--')
  12. plt.title("Parameter Space Distribution")
  13. plt.xlabel("Parameter Value"), plt.ylabel("Density")
  14. plt.legend()
  15. plt.show()
复制代码

六、技能演进蹊径

阶段代表方法关键突破范围1.0参数冻结物理隔离旧知识丧失模子扩展本事2.0L2正则简单束缚参数漂移无差异掩护全部参数3.0EWC智能参数告急性加权盘算二阶导数开销大4.0动态网络独立适配器模块模子体积膨胀
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表