LODE(Loss Decoupling)个人理解
作为LODE的笔记,方便理解与复习。
这里的LODE来自于论文“Loss Decoupling for Task-Free Continual Learning”,链接为:点我跳转
一.LODE简介
LODE 是 "Loss Decoupling" 的缩写,中文可译为“损失解耦”,它通过将新任务的损失函数解耦为“区分新旧类别”和“区分新类别内部”两个部分,并为它们分配不同权重,从而在持续学习中更好地平衡稳定性(不忘旧知识)和可塑性(学习新知识)。
说人话,就是为把损失函数拆成数学上等价的多个部分,根据不同部分负责的任务分配不同的权重,从而达到平衡稳定性和可塑性的目的。
二.回放策略下的损失函数
常见的基于回放的深度学习,损失函数的形式如下:
接下来拆解成两部分解释。
1.新任务损失
这是原公式的第一部分,称为新任务损失,其中:
-
:从当前新任务中采样的一批样本
-
:该批次的样本数量
-
:第
个新任务的样本和标签
-
:带有参数
的模型
-
:针对新任务的损失函数,通常是交叉熵损失函数
这一部分求的是新任务的损失,主要负责让模型学会正确分类新类别的样本。
2.回放损失
这是原公式的第二部分,称为回放损失,其中:
-
:存储旧样本的记忆缓冲区
-
:从记忆缓冲区中采样的一批旧样本
-
:回放批次的样本数量
-
:第 ii 个旧任务的样本和标签
-
:回放损失函数,可以是简单的交叉熵损失,也可以是结合了知识蒸馏的更复杂损失
这一部分求的是旧任务的损失,负责巩固旧任务的知识,防止灾难性遗忘。
PS:记忆缓冲区
基于回放的持续学习方法通过维护一个“记忆缓冲区”(Memory Buffer)来存储部分过往任务的数据,以缓解模型学习新任务时的“灾难性遗忘”问题。
为实现这一目标,一种典型策略是利用缓冲区中的旧数据计算一个额外的损失项。此时,模型的总优化目标由“新任务损失”与“旧任务损失”共同构成。这种双重损失约束迫使模型在参数更新时,必须同时兼顾新、旧知识的掌握:一方面积极学习新任务,另一方面也要巩固过去已学的经验,从而将历史知识有效地锚定在参数空间中,避免遗忘。
三.LODE的解耦过程
在交叉熵损失函数下的新任务损失可以表示为:
其中:
表示交叉熵损失函数
表示
输出的逻辑值。
关于交叉熵可以参考我之前的交叉熵损失函数的笔记:点此跳转
此时的新任务损失可以被拆解为:
1.“区分新类别内部”的损失
以下简称为。
-
分母变化:
只包含了所有新类别的 logits 指数和。
-
物理意义:
-
这个损失计算的是,在“所有新类别”这个封闭集合中,模型将样本分类到正确类别 y 的概率。
-
它的优化只影响新类别之间的相对关系。为了最小化这个损失,模型只需学会区分新类别中不同的小类别,而不会直接去改变新旧类别之间的决策边界。
-
因此,它纯粹对应于 “新类别内部区分” 的目标。
-
2.“区分新旧类别”的损失
以下简称为。
-
分子:所有新类别的 logits 指数和。
-
分母:所有类别(旧类+新类)的 logits 指数和。
-
物理意义:
-
这个分数计算的是模型认为“这个样本属于任何一个新类别”的总概率。
-
为了最小化这个损失,模型会倾向于增大分子,减小分母。这意味着模型会努力:
-
增大新类别的 logits(提高分子)。
-
减小旧类别的 logits(降低分母,因为分母也包含了旧类别)。
-
-
这个操作直接拉大了新类别和旧类别之间的差距,移动了新旧类别之间的决策边界。
-
因此,它明确地对应于 “新旧类别区分” 的目标。
-
接下来就可以对解耦后的损失函数分配不同权重,从而达到平衡稳定性和可塑性的目的。
论文中对这两部分分别进行了消融实验,得到的结论是:
移除时第一个任务的遗忘程度低于移除
,即
导致的遗忘比
更严重。
也就是说不考虑后面任务的正确率,只考虑训练了不同任务后对第一个任务保留的记忆(用准确率评估), 更容易导致遗忘。
最后的结论就是, 相较于
会引发更严重的遗忘,因此,对两者赋予相同权重的做法并不合理,理应降低
的权重,并相应提高
的权重。
四.总结
LODE 使用如下损失函数进行持续学习:
用于新旧类别区分,LODE 设置
与
成正比,避免模型偏向旧类别或新类别。
仅与新类别相关,LODE 将
设为常数。
具体而言, 和
的设置如下:
其中 和
是超参数。
