马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
1. 终身学习简介
神经网络的范例应用场景是,我们有一个固定的数据集,在其上练习并得到模子参数,然后将模子应用于特定使命而无需进一步更改模子参数。
然而,在许多实际工程应用中,常见的情况是体系可以不停地获取新数据,比方 Web 应用步伐中的新用户数据或自动驾驶中的新驾驶数据。 这些新数据必要被纳入练习集以加强模子的性能。 这被称为终身学习。
Life Long Learning (source: https://speech.ee.ntu.edu.tw/~hylee/ml/ml2021-course-data/life_v2.pdf)
人工智能终身学习面对哪些挑衅?好像通过不停更新其数据和相应的网络参数就可以实现终身学习。然而,究竟并非云云简朴。一个关键停滞是灾难性忘记。
如示例所示,在使命 1 上练习的神经网络到达了 90% 的正确率。在随后对使命 2 举行练习后,其在使命 2 上的性能进步到 97%。然而,该网络在原始使命 1 上的性能急剧降落至 80%。这表明学习新信息会导致网络“忘记”先前学习的知识,拦阻其随着时间的推移积累知识的本领。
catastrophic forgetting (source: https://speech.ee.ntu.edu.tw/~hylee/ml/ml2021-course-data/life_v2.pdf)
别的,这种忘记并不是由于神经网络缺乏同时处置惩罚两个使命的本领。如附加图表所示,如果我们同时对两个使命举行练习(瓜代练习来自使命 1 和使命 2 的数据),它在两个使命上都到达了很高的正确率(使命 1 上为 89%,使命 2 上为 98%)。 这表明网络确实具有学习两个使命的本领;标题在于学习过程的序次性,此中学习新使命会覆盖先前学习的知识。
network capacity (source: https://speech.ee.ntu.edu.tw/~hylee/ml/ml2021-course-data/life_v2.pdf)
灾难性忘记背后的核心标题在于差异使命之间的优化方向存在辩论。当神经网络在一个使命上举行练习时,它会调解其参数(用 θ 体现)以最小化该特定使命的丧失函数。这个过程会找到一组对于该使命体现良好的最优参数( θ∗ )。然而,当网络随后在新的使命上举行练习时,它会再次调解其参数以最小化新使命的丧失。这个新的优化过程通常会将参数从先前为原始使命找到的最优解中拉开,有用地“覆盖”了为第一个使命学习到的知识。当使命之间差异较大时,这种征象尤为显着。
why catastrophic forgetting (source: https://speech.ee.ntu.edu.tw/~hylee/ml/ml2021-course-data/life_v2.pdf)
鉴于这一挑衅,我们怎样缓解灾难性忘记?这篇综合综述论文概述了当前开始辈的方法(停止 2024 年),将其分为五个关键方法。
A Comprehensive Survey of Continual Learning: Theory, Method and Applicationhttp://arxiv.org/abs/2302.00487
Continual Learning Method (source: https://arxiv.org/abs/2302.00487)
基于正则化的方法中一个值得注意的技能是选择性突触可塑性。“突触权重”体现神经元(节点)之间毗连的强度,“可塑性”被用尴尬刁难生物学概念神经可塑性的类比,后者形貌了大脑改变神经元之间毗连强度(突触权重)的本领。选择性可塑性是指神经网络盼望具有的特性,即选择性地调治其整个布局中单个突触的可塑性。
Selective Synaptic Plasticity (source: https://speech.ee.ntu.edu.tw/~hylee/ml/ml2021-course-data/life_v2.pdf)
如图所示,参数 b 控制着可塑性的水平。在一个非常情况下,当 b 便是 0 时,正则化项消散,有用地消除了对参数更新的任何束缚。这种束缚的缺失导致了灾难性忘记,此中学习新使命完全覆盖了先前得到的知识。在另一个非常情况下,当 b 靠近无穷大时,正则化变得无穷强,克制了对参数的任何巨大更改。在这种情况下,模子变得“固执”,无法学习任何新东西,只能停顿在其初始知识上。
how b affects the performance (source: https://speech.ee.ntu.edu.tw/~hylee/ml/ml2021-course-data/life_v2.pdf)
以是,关键标题是怎样盘算这种“可塑性”?李宏毅传授在课程中保举了以下论文:
Elastic Weight Consolidation (EWC) (弹性权重巩固 ):
Overcoming catastrophic forgetting in neural networkshttp://arxiv.org/abs/1612.00796
EWC 利用 Fisher 信息矩阵 (FFF) 来衡量每个权重的告急性,并在学习新使命时处罚对关键权重的更改:
- : 使命特定的丧失
- : 权重 的 Fisher 信息
- : 来自先前使命的最优权重
- : 正则化强度
F 的界说如下所示:
我们仅取矩阵的对角线值来近似每个参数的 .
相应的代码实现为:
- # EWC
- class ewc(object):
- """
- @article{kirkpatrick2017overcoming,
- title={Overcoming catastrophic forgetting in neural networks},
- author={Kirkpatrick, James and Pascanu, Razvan and Rabinowitz, Neil and Veness, Joel and Desjardins, Guillaume and Rusu, Andrei A and Milan, Kieran and Quan, John and Ramalho, Tiago and Grabska-Barwinska, Agnieszka and others},
- journal={Proceedings of the national academy of sciences},
- year={2017},
- url={https://arxiv.org/abs/1612.00796}
- }
- """
- def __init__(self, model, dataloader, device, prev_guards=[None]):
- self.model = model
- self.dataloader = dataloader
- self.device = device
- # extract all parameters in models
- self.params = {n: p for n, p in self.model.named_parameters() if p.requires_grad}
- # initialize parameters
- self.p_old = {}
- # save previous guards
- self.previous_guards_list = prev_guards
- # generate Fisher (F) matrix for EWC
- self._precision_matrices = self._calculate_importance()
- # keep the old parameter in self.p_old
- for n, p in self.params.items():
- self.p_old[n] = p.clone().detach()
- def _calculate_importance(self):
- precision_matrices = {}
- # initialize Fisher (F) matrix(all fill zero)and add previous guards
- for n, p in self.params.items():
- precision_matrices[n] = p.clone().detach().fill_(0)
- for i in range(len(self.previous_guards_list)):
- if self.previous_guards_list[i]:
- precision_matrices[n] += self.previous_guards_list[i][n]
- self.model.eval()
- if self.dataloader is not None:
- number_data = len(self.dataloader)
- for data in self.dataloader:
- self.model.zero_grad()
- # get image data
- input = data[0].to(self.device)
- # image data forward model
- output = self.model(input)
- # Simply use groud truth label of dataset.
- label = data[1].to(self.device)
- # generate Fisher(F) matrix for EWC
- loss = F.nll_loss(F.log_softmax(output, dim=1), label)
- loss.backward()
- for n, p in self.model.named_parameters():
- # get the gradient of each parameter and square it, then average it in all validation set.
- precision_matrices[n].data += p.grad.data ** 2 / number_data
- precision_matrices = {n: p for n, p in precision_matrices.items()}
- return precision_matrices
- def penalty(self, model: nn.Module):
- loss = 0
- for n, p in model.named_parameters():
- # generate the final regularization term by the ewc weight (self._precision_matrices[n]) and the square of weight difference ((p - self.p_old[n]) ** 2).
- _loss = self._precision_matrices[n] * (p - self.p_old[n]) ** 2
- loss += _loss.sum()
- return loss
- def update(self, model):
- # do nothing
- return
复制代码
Synaptic Intelligence (SI) (突触智能):
Continual Learning Through Synaptic Intelligencehttp://arxiv.org/abs/1703.04200
SI 通过盘算参数 i 的告急权重 来衡量其告急性,盘算方法如下:
此中:
- :参数 i 的更新告急权重
- :来自先前使命的告急权重
- :累积梯度信息
- :使命期间的参数厘革
- : 防止出现零除数的小正数常量
然后,正则化处罚项 LSI 被盘算为:
|