Continual Relation Learning via Episodic Memory Activation and Reconsolidation
Abstract
持续关系学习:不遗忘以前关系的同时继续学习新关系
新关系的出现会忘记旧的关系,虽然有证明在新的关系训练序列中添加遗忘的训练样本可以避免这个问题,但是又容易陷入over-fitting
因此本文根据人类的长期记忆构成,设计了EMAR框架。
1 Introduction
Continual RE最大的问题就是 灾难性遗忘,很难在学习新关系的同时避免忘记旧关系。这两个问题都是在开放场景下,pipeline是这样的:
memory-based方法,保留片段记忆,在继续训练新样本的过程中保留一部分以往的训练样本,是一个非常有效的解决灾难性遗忘的问题,但是这种方法依然不能解决过拟合的问题:
当模型在持续关系学习的环境下,会快速的改变以往关系的特征分布,逐渐过拟合于几个记忆中的样本,最终对旧的关系变得疑惑 (我认为这里似乎是想说停留的那一部分以往训练样本会过拟合。虽然不至于灾难性以往,但还是识别率下降了,瞧瞧,科研的话术多么的抽象)
这边有一段丢失了,不写了。包含related work和部分introduction(真烦死了
3 Methodogy
3.1 Task Definition and Overall Framework
持续关系学习在一个序列的任务上训练,每一个任务都有其训练集,验证集和测试集,Relation set。
任务要求模型在第k个和前k−1个上都表现优异,模型会验证全部的测试集。因此,验证过程会越来越难。
片段记忆模块M={M1,M2,...}是一个集合,用于存储历史任务中的一些样例,每一个记忆模块Mk={(x1Mk,y1Mk),...,(xBMk,yBMk)}
总之就是包含第k个任务中的B个训练样本。B是constrained memory size。应该是一个比较有效的超参数,相同的情况下,记忆的越少,模型应该越有效果。
模型包含3个步骤来学习新关系并且避免遗忘:
- fine-tune encoder,让模型注意新关系的pattern
- 对于当前任务的关系集合中的每一个关系,都选去其中最有信息的样例(类似于prototype那种,存储在Mk中。
- 迭代地采用记忆回放和**,以及记忆再合并去学习新关系同时维持旧关系。
3.2 Example Encoder
BiLSTM,用于encode,额外添加了entity的开始和结束position。
3.3 Learning for New Tasks
对应模型fine tune于新任务的新关系,
L(θ)=−i=1∑Nj=1∑∣R~k∣δyiτk=rj×log∑l=1∣R~k∣exp(g(f(xiTk),rl))exp(g(f(xiTk),rj))
-
rj是第j个关系的embedding(rj∈R~k。注意R~k是在执行第k个任务时,所有已知任务的关系合集(包含前面k−1个任务中的关系集合。
-
g(⋅,⋅)时计算embedding相似度的。
-
δ时信号函数,当yiTk=rj 时成立,为1,其他为0
负对数似然函数嘛,其实就是希望当类别为rj的时刻,其encoder f(xiTk)的embedding与relation embeddingrj 尽可能的接近(相似度为1)并且与其他relation embedding尽可能的相似度为0
对于每一个关系,会随机初始化relation embedding. i.e. rj
3.4 Selecting Examples for Memory
按照上面的整体步骤,对新任务fine tune了之后,要为k+1任务做准备了,留几个训练样例了要。因此选择 informative 和 diverse的examples。尽可能的覆盖这个任务中的关系模式。
在encoding第k个任务中的examples之后,用K-Means去聚类,聚类中心个数就是上面所说的B,对每一个聚类来说,选择最接近中心的样本。通过中心点的样本数量以及其本身的关系类别的数量,数量越多显现关系越重要。通过关系的重要程度来分配选择记录关系。
对于重要的关系,至少选取⌊∣Rk∣B⌋ 个样本,对于不那么重要的,最多选取⌈∣Rk∣B⌉个样本。
有趣的一点,如果任务样本小于B,那么会填充其他关系的样例。(我猜是历史关系的样例
知道了每一个关系的选择数量之后,再次使用K-Means对类内样本进行聚类。中心数量由上面分配的数量决定的,尽可能选取接近中心点的。
3.5 Replay, Activation and Reconsolidation
最重要的第三步来了。
Computing Prototypes
通过结合所有的在片段记忆之中的样本,得到有完整的记忆M~k=⋃i=1kMi,然后从中对每一个关系ri,获取其全部的样例,把当前关系下的样例的encoded embedding平均一下,就得到了prototype embedding
pi=∣Pi∣∑j=1∣Pi∣f(xjPi)
Memory Replay and Activation
所有记忆中的样例M~k和第k个任务的样例Tk合并起来,得到Ak=M~k∪Tk={(x1Ak,y1Ak),…,(xMAk,yMAk)}
持续的**模型去学习新关系和记住就关系。损失函数为:
LA(θ)=−i=1∑Mj=1∑∣R~k∣δyiAk=rj×log∑l=1∣R~k∣exp(g(f(xiAk),rl))exp(g(f(xiAk),rj))
其实没什么变化,就是训练集合引入了之前记忆中的一些关系。
Memory Reconsolidation
文章主要的重点应该是在此处,reconsolidation
对于每一个已知的关系ri∈R~k,采样它的样例集合,其中每一个样本也都是来源于M~k。
LR(θ)log=−i=1∑∣R~k∣j=1∑∣Ii∣∑l=1∣R~k∣exp(g(f(xjIi),pl))exp(g(f(xjIi),pi))
其中pl是 prototype embedding。通过上面的公式计算出来的
3.6 Training and Prediction
对于第k个任务,首先使用L(θ) 优化几个epoch。
然后迭代优化LA(θ)和LB(θ) 直到拟合
这就牛了,由于文章的核心思想,其实主要就是想突出在片段记忆的时刻,对人脑来说,记忆很容易被修改和删除。但是通过这样采样迭代训练的方式,让之前的relation和现在的relation都达到一个比较稳定的状态,难怪作者会说stable的情况下开始下一个任务。
在完成第k个任务之后,对于每一个关系,抽取出一个样例数量为S的集合称为Ei,计算最终的关系prototype如下:
p~i=1+Sri+∑j=1Sf(xjEi)
所以在最终的预测中,只需要将instance放进来,和prototype的关系进行对比就可以了。
结果可以看下表:
4 Experiments
Datasets and Experimental Settings
文章一共准备了三个数据集
-
FewRel: 80个关系分成10个task (自家出品,稳定涨引用)
-
SimpleQuestions: knowledge base 数据集 分成了20个task
-
TACRED: 42中关系分成10中数据集。其中删除掉了n/a 类型的关系
Average Performance可以看到 EMAR在随着任务增加的情况下,性能还是比较稳定的,那个紫色的叫EWC,大家做实验的时候,一定要带上它。
这边设计的比较巧妙,比较了:
- whole performance,就是经过了所有的task之后最终的evaluation。
- average performance,就是平均了所有看见过的task的性能。这一个方法会严重的突出遗忘的问题。
任务的顺序这些也会影响性能,所有作者用了相当多一样的setting来使得对照非常的公平,大部分都参照了 continual relation learning的第一篇文章:
Sentence Embedding Alignment for Lifelong Relation Extraction
Effect of Memory Size
表格结果如下:
记忆单元的增加有效的提升模型性能
Effect of Prototypes and Reconsolidation
这一部分主要强调了学的prototype和feature非常有用,使用SVM决策效果更好。图与表格如下