自学内容网 自学内容网

Life Long Learning(李宏毅)机器学习 2023 Spring HW14 (Boss Baseline)

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 Application​icon-default.png?t=O83Ahttp://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 networksicon-default.png?t=O83Ahttp://​arxiv.org/abs/1612.00796

EWC 使用 Fisher 信息矩阵 (FFF) 来衡量每个权重的重要性,并在学习新任务时惩罚对关键权重的更改:

L_{\text{total}} = L_{\text{task}} + \frac{\lambda}{2} \sum_i F_i (\theta_i - \theta^*_{i})^2 \\​: 任务特定的损失

  • F_i : 权重 \theta_i 的 Fisher 信息

  • \theta^*_{i} ​: 来自先前任务的最优权重

  • \lambda: 正则化强度

  • F 的定义如下所示:

    F = [ \nabla \log(p(y_n | x_n, \theta^{*})) \nabla \log(p(y_n | x_n, \theta^{*}))^T ] \\ .

    相应的代码实现为:

    # 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 Intelligenceicon-default.png?t=O83Ahttp://arxiv.org/abs/1703.04200

    SI 通过计算参数 i 的重要权重 \Omega_i 来衡量其重要性,计算方法如下:

    \Omega_i^{\text{new}} \leftarrow \Omega_i^{\text{old}} + \frac{W_i}{(\theta_i - \theta_i^*)^2 + \epsilon} \\ :参数 i 的更新重要权重

  • \Omega_i^{\text{old}}​:来自先前任务的重要权重

  • W_i​:累积梯度信息

  • \theta_i - \theta_i^* ​:任务期间的参数变化

  • \epsilon : 防止出现零除数的小正数常量

  • 然后,正则化惩罚项 LSI 被计算为:


    原文地址:https://blog.csdn.net/m0_66773231/article/details/145081946

    免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!