Decomposed Meta-Learning for Few-Shot Named Entity Recognition

研究者提出了一种基于分解元学习的方法,解决了基于span的实体检测和分类问题,通过MAML训练spandetector,以及MAML-ProtoNet进行跨域实体类型识别。实验表明该方法在Intra和Inter数据设置以及Cross-Dataset上表现优秀。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

原文链接:

https://aclanthology.org/2022.findings-acl.124.pdf

ACL 2022

介绍

        问题

         目前基于span的跨度量学习(metric learning)的方法存在一些问题:

        1)由于是通过枚举来生成span,因此在解码的时候需要额外处理重叠的span;

        2)non-entites类别的原型通常都是噪声;

        3)跨域时,最有用的信息就是当前领域有限的样本,之前的方法只将这些样本用于分类的相似性计算。

        IDEA 

        作者提出分解元学习(decomposed meta-learning)的方法来解决Few-shot ner任务(实体的边界检测和实体的分类)。

        将span检测作为序列标注问题,并通过引入MAML(model-agnostic metalearning 不是很懂 可以参考这篇文章Model-Agnostic Meta-Learning (MAML)模型介绍及算法详解 - 知乎)训练span detector,从而找到一个能快速适应新实体类别的模型参数进行初始化;对于实体分类,作者提出MAML-ProtoNet来找到一个合适的向量空间对不同类别的span进行分类。 

方法

        整个方法的整体结构如下所示:

 Entity span Detection

         span detection模型用于定位输入句子中的实体,该模块是类别无关的,学到的只是实体的边界信息(即领域不变的内部特征,而不是特定的领域信息),因此就能跨域进行实体定位。

Basci Detector

        作者使用BIOES标注框架,给定一个有L个token的序列,使用encoder f_{\theta }来获得所有token的上下文表征,对于每个token 使用一个线性分类层来计算其是否是实体的一部分;

        模型的损失如下所示:

        使用每个token的交叉熵损失,这里引入最大值是为了缓解损失相对较高的token导致的学习不充分问题。推理阶段,通过Viterbi算法进行解码。

Meta-Learning Procedure

         在该阶段,作者对边界检测模型进行训练。

        首先,从train数据集中进行随机采样得到,对模型执行inner-update:

        其中U^{n}表示在学习率为α时n步的梯度更新,来最小化loss(公式3)。

        然后在query set中对更新后的模型进行评估,同时通过汇总多个时间来执行meta-update:

        上式中的二阶导数,使用其一阶近似值进行估算:

        meta-test阶段,首先将在support set上训练好的span detection迁移到新领域,然后对query样本进行相应的预测。 

Entity Typing

Basic Model: ProtoNet

        给定输入序列L:,用公式1的方法计算word embedding hi,并按以下方式计算span的表征:

        对于每个类别yk,使用这个support set中属于该类别的所有span来计算原型ck:

        训练过程中,首先使用support set中的训练数据计算所有类别的原型,然后对于query set中的每个span,通过计算其表征与每个类别原型ck的距离来得到属于每个类别的分数:

        最小化分类的交叉熵损失来训练原型网络:

        推理阶段,首先利用训练好的模型计算所有训练集中所有类别的原型,然后使用边界检测模型得到span,按照公式10为每个span进行分类:

MAML Enhanced ProtoNet

         在训练集中进行随机采样,得到。对于inner-update,首先为每个类别计算原型,然后将每个span作为query对模型参数进行更新:

        在meta-update阶段,使用\gamma {}'重新计算每个类别的原型,即在query set上对r进行验证,同样的使用一阶导数近似值提高计算效率: 

         训练过程中没有见过的数据,首先利用support中的样本来对meta-learned的模型进行微调,微调好后再计算每个类别的原型,最后基于这些原型进行分类。

实验

对比实验

         在Intra和Inter这两种数据设置下进行实验,结果如下图所示:

         在Cross-Dataset数据集上进行实验,结果如下所示:

消融实验

        对主要模块进行了消融实验,结果如下所示: 

其他

        对不同类别的span表征进行了可视化:

结论

        这篇论文没有很看懂,去看了以下Meta-learning的相关内容也没有很明白,似乎就是meta-learning就是为模型训练出一个更合适的参数,使其能够更快的应用于新领域。上周看的一篇论文感觉跟这篇很像,不过不知道是不是在Few-shot ner中用原型学习的很多,感觉还挺像的。 

<think>好的,用户之前的问题是关于在R语言中处理时间序列数据时遇到的几个错误,特别是关于移动平均计算和时间序列分解的问题。用户现在继续询问为什么在运行`decompose(time_series)`和`plot(decomposed)`后没有进行分析,或者可能遇到了什么问题。 首先,我需要回顾用户之前的对话历史。用户最初遇到了三个主要问题:安装forecast包失败、移动平均函数无法调用以及时间序列分解时的周期错误。用户提供的代码中,`decompose`函数报错是因为时间序列没有正确设置周期(frequency),导致无法分解。在之前的回复中,我指导用户如何设置正确的frequency参数,并确保数据长度足够。 现在用户的问题是“为什么不分析了”,这可能意味着他们在按照建议修改代码后仍然无法进行分析,或者分解后的结果没有正确显示。需要进一步分析可能的原因。 首先,用户可能在设置`ts`对象时仍然没有正确指定frequency参数。例如,如果数据是日数据,但用户错误地设置了frequency为1,这会导致周期不足,无法分解。此外,数据长度可能不足,比如虽然设置了frequency为7(周数据),但数据点只有10个,不足两个周期(14个点),这也会导致错误。 其次,用户在调用`decompose`函数后,可能没有正确检查`decomposed`对象是否存在。如果在分解过程中出现错误,`decomposed`对象可能没有被创建,导致`plot(decomposed)`时出现“找不到对象”的错误。例如,用户可能在运行`decomposed <- decompose(time_series)`时,由于周期设置错误或数据长度不足,导致该行代码执行失败,从而`decomposed`未被正确赋值。 另外,用户可能没有正确加载所需的包,比如虽然安装了forecast包,但没有正确调用,或者存在函数名冲突。不过,在时间序列分解方面,`decompose`是R基础包stats中的函数,因此不需要额外安装包,除非用户使用的是其他包中的分解函数。 还需要考虑数据本身的问题。例如,时间序列数据可能存在缺失值(NA),这会导致分解失败。或者数据不是数值型,例如包含字符或因子类型,这也会引发错误。 此外,用户可能在绘制分解图时,虽然分解成功,但图表没有正确显示,或者分解后的组件(趋势、季节性、随机)存在问题,导致图表无法生成。例如,如果分解后的季节性部分为零,可能图表看起来没有变化,让用户误以为没有分析。 总结可能的原因: 1. 时间序列的frequency参数未正确设置。 2. 数据长度不足,无法满足至少两个周期的要求。 3. decompose函数执行时出错,导致对象未创建。 4. 数据中存在缺失值或非数值类型。 5. 绘图代码错误,例如未正确调用plot方法。 需要针对这些可能的原因逐一排查,并提供相应的解决方案。在回复中,应分步骤指导用户检查每个可能的问题点,并给出修正代码示例。同时,需要强调关键概念,如如何正确设置时间序列的frequency,数据长度的要求,以及如何处理缺失值等。此外,提供替代方案,如使用STL分解方法,以备用户在使用经典分解法失败时尝试。</think>--- ### **问题原因分析** 你在运行 `decompose(time_series)` 和 `plot(decomposed)` 时遇到问题,可能是由于以下原因之一: --- ### **1. 时间序列未定义周期(frequency)** `decompose()` 要求时间序列必须包含明确的周期信息(例如日、周、月等)。 **错误表现**: ```R Error in decompose(time_series) : 時間序列的周期不能小于二 ``` **解决方法**: 在创建时间序列时,通过 `ts()` 函数明确指定 `frequency` 参数: ```R # 示例:假设数据是日频(周周期为7天) time_series <- ts(data$close, frequency = 7) # frequency=7 表示周周期 # 检查周期是否生效 frequency(time_series) # 应输出 7 ``` --- ### **2. 数据长度不足** `decompose()` 需要至少包含 **2个完整周期** 的数据。 **错误表现**: ```R Error in decompose(time_series) : 时间序列长度不足以分解 ``` **验证方法**: ```R # 检查数据长度是否满足 2 * frequency length(time_series) >= 2 * frequency(time_series) # 示例:如果 frequency=7,则数据至少需要 14 个观测值 ``` --- ### **3. 数据格式错误** 时间序列必须为数值型且无缺失值(NA)。 **验证方法**: ```R # 检查是否有NA值 sum(is.na(time_series)) # 应输出 0 # 检查数据类型 class(time_series) # 应为 "ts" 或 "numeric" ``` --- ### **4. 分解方法不适用** `decompose()` 使用经典加法/乘法分解,可能不适用于某些复杂序列。 **替代方案**: 使用更稳健的 `stl()` 分解(需满足 `frequency >= 2`): ```R decomposed_stl <- stl
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值