Simple and Effective Few-Shot Named Entity Recognition with Structured Nearest Neighbor Learning
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Simple and Effective Few-Shot Named Entity Recognition with Structured Nearest Neighbor Learning相关的知识,希望对你有一定的参考价值。
参考技术A我们提出了一个基于最近邻学习和结构化推理的简单few-shot命名实体识别(NER)系统。我们的系统使用在 源域上训练的监督NER模型作为特征提取器 。在 多个测试域中,我们发现在这个特征空间中的最近邻分类器比标准的元学习方法更有效 。我们进一步提出了一种廉价但有效的方法来捕获 标记实体标记之间的依赖关系,无需昂贵的CRF训练 。我们证明了我们将结构化解码与最近邻学习相结合的方法在标准的少数镜头上达到了最先进的性能NER评估任务,与之前基于MetalLearning的系统相比,F1提高了6%-16%的绝对分数。
命名实体识别(NER)旨在将文本的范围识别和分类为一组封闭的类,如人员、组织和位置。作为一项核心语言理解任务,NER被广泛应用于多个领域,如新闻、医学和社交媒体。然而,使NER适应新领域的主要挑战之一是 不同领域特定实体类型之间的不匹配 。例如,在I2B2 2014数据中标注的23种实体类型中,只有两种可以在OntoNotes 5注释中找到。不幸的是,获取新领域的NER注释可能非常昂贵,通常需要领域知识。 Few-shot classification模型旨在根据每个类别中仅有的少数标记示例(支持集)识别新类别 。在NER的上下文中,这些fewshot分类方法可以通过仅标记每个实体类的几个示例来快速构建新领域的NER系统。之前的几项研究(Fritzler et al.,2019;Hou et al.,2020)建议使用典型网络(Snell et al.,2017),这是一种流行的少数镜头分类算法,
在NER的上下文中,这些fewshot分类方法可以通过仅标记每个实体类的几个示例来快速构建新领域的NER系统。之前的几项研究建议使用prototype网络,这是一种流行的few-shot分类算法,来解决few-shot NER问题。然而,这些方法只能达到10∼30% 当使用一个或五个示例在不同的NER数据集之间传递知识时,F1平均得分为30%。由于两个原因,现有的few-shot分类方法直接适应few-shotNER是一个挑战。
首先,NER本质上是一个结构化学习问题。 建立标签依赖关系模型 至关重要,而 不是使用现有的few-shot分类方法直接独立地对每个标记进行分类 。
其次,few-shot分类模型通常会 根据其支持集中的标记示例通过学习原型来表示每个语义类 。然而,对于NER,外部(O)类与实体类不同并不表示任何统一的语义。事实上, 数据集中标记为O的标记实际上对应于不同的语义空间,这些语义空间应该在基于度量的学习框架中单独表示。
图1:一个简单的例子。职业(如“部长”和“总统”)和日期(如“今天”和“明天”)是O类的一部分。与使用 基于类的度量的方法相比 ,最近邻分类器更擅长使用 基于实例的度量 来预测O类。
例如,考虑在图1中,对于一些NER数据集,诸如专业(例如,“部长”)和日期(例如,“今天”)之类的语义类也可能属于O类。因此,以前的方法最终学习了 一个嘈杂的prototype ,用于在这种低资源环境中表示O类。
在本文中,我们提出了一种简单而有效的方法STRUCTSHOT,用于few-shot。我们没有学习每个实体类的原型,而是 通过句子中的上下文表示在支持集的标记示例中表示每个标记 。(by its contextual representation in the sentence),我们通过在 源域上训练标准的监督NER模型来学习这些上下文表示
虽然在训练阶段meta-learning方法模拟了few-shot验证设置,但我们的方法并没有采用。在评估期间,STRUCTSHOT使用最近邻(NN)分类器和维特比解码器进行预测。如图1所示, 对于目标示例中的每个令牌(“总统”),NN分类器从支持示例中查找其最近的令牌(“部长”),而不是依赖错误的类级(外部)prototype表示 。我们还 通过使用维特比解码器捕获标签依赖性来改进最近邻预测 。
我们针对这个问题进行了广泛的域内和域外实验。我们测试了我们的系统,既可以在源域中识别新类型的实体,也可以在one-shot和five-shot设置中在各种目标域中识别新类型的实体。
除了Hou等人(2020)之前的评估设置外,我们还通过使用多个领域基准数据集的标准测试集和开发集,为few-shot NER提出了更标准和可重复的评估设置。特别是,我们从标准开发集中采样支持集,并在标准测试集上评估我们的模型。在我们所有的实验中,我们发现我们提出的系统比以前的元学习系统的F1绝对分数高出6%-16%。
在本节中,我们正式确定了few-shot NER的任务,并提出了一个标准的评估设置,以便于对未来研究的结果进行有意义的比较
few shot-NER系统需要学习仅使用几个标记的示例来泛化到看不见的实体类
k-shot ner定义如下,输入序列x,k-shot支持集 for 目标tag集,找出序列x的标签y
k-shot支持集:对于每个由目标tag集给出的实体类含有k个实体实例
之前关于few-shot NER的工作遵循了few-shot分类文献,并采用了情节评估方法。
具体而言,针对多个评估事件评估NER系统。一集包括一组标记示例的K-shot支持样本集和几个K-shot测试样本集。除了这些先前的实践之外,我们还提出了一个更现实的评估设置,只对支持集进行采样,并在NER基准的标准测试集上测试模型。
测试集构造在情节评估设置中,对测试集进行采样,以使不同的实体类均匀分布。这种评估设置显然没有考虑真实数据中的实体分布。因此,报告的绩效分数不能反映这些模型在适应新领域时的有效性。我们建议 使用标准NER数据集的原始测试集 来评估我们模型的性能。我们的评估设置不需要随机抽样测试集,因此,为未来的研究提高了其再现性
为了在few-shot设置中测试我们的模型,我们从基准数据集的标准开发集中采样支持集。我们通过对多个支持集进行抽样,并报告这些抽样支持集在测试集上的平均性能,来说明模型性能的差异。我们计划在我们的再现性实验中发布用于评估的不同支持集。与分类任务不同,NER中的一个句子可能包含多个实体类。因此, 简单地为每个实体类采样K个句子将导致频繁类的实体比不频繁类的实体多得多 。因此,我们使用 贪婪抽样策略来构建支持集 。特别是,我们对实体类的句子按照其频率的递增顺序进行取样。
在本节中,我们将介绍基于结构化最近邻学习(STRUCTSHOT)的少镜头NER算法。我们的方法使用在源域上训练的NER模型), as a token embedder to generate contextual representations for all tokens。推断时,这些静态表征仅用于最近邻token分类。我们还使用 维特比解码器通过利用从源域估计的标签转换 来 捕获标签依赖关系 。
STRUCTSHOT的 主干是一个简单的token级最近邻分类系统(NNShot) 。在推断时,给出了一个测试示例
和K-shot实体支持集,由N个句子组成,
NNShot使用token embedder
获取各自句子中所有标记的上下文表示。NNShot计算测试示例中的标记token x与支持集中的所有标记x\'之间的相似性分数。
其中Sc是标记为c的支持标记集,在这项工作中,我们使用平方欧氏距离d(ˆx,xˆ\')=| | xˆ− xˆ\' | | 2用于计算最近邻分类中标记之间的相似性。在计算这些距离之前,我们还对特征执行L2规范化。
大多数元学习方法在训练阶段模拟测试阶段的设置。因此,这些方法从训练数据中抽取多个支持集和测试集并学习表示,以最小化源域上相应的few-shot损失。在本文中,我们使用在源域上训练的NER模型来学习token表示,以最小化监督交叉熵损失。监督的NER模型通常由token embedder和线性分类器组成。我们考虑了两种受监督的NER模型的流行神经架构:BiLSTM NER模型和基于BERT的NER模型。为了在源域上培训这些模型,我们遵循他们原始论文中的设置。对这些模型进行训练以最小化源域中训练数据的交叉熵损失。在推理时,NNShot使用BiLSTM 和 Transformer encoders just before the final linear classification layers as token embedders
条件随机场(CRF)是为NER建立标签依赖关系模型的实际方法
使用BiLSTM embedder和分类层来表示 token-tag emission scores,并通过联合训练CRF层来学习tag-tag 转换分数。在few-shot学习的情况下,采用类似的方法很有挑战性。源域和目标域中的tags之间的不匹配不允许仅通过在源域上的培训来学习目标域的tag-tag转换分数。
STRUCTSHOT通过 使用源域数据上估计的抽象tag转换分布 来解决这一难题。此外,STRUCT-SHOT放弃了CRF中的训练阶段,仅在推理过程中使用其Viterbi解码器。 利用转移矩阵捕获三个抽象NER标记之间的转移概率 O, I, I-Other:
比如p(O|I) 和 p(I|O)表示实体tag和o之间的转移概率
p(I|I) 和p(I-Other|I)表示实体tag和他自己以及其他实体tag之间的转移概率
如图2所示, 通过将抽象转移概率均匀分布到相应的目标转移中 ,我们可以将这些抽象转移概率扩展到任意目标域tag set。我们的简单扩展方法保证了得到的目标转移概率仍是有效的分布。
STRUCTSHOT的关键思想是, 在训练数据中通过计算特定转移发生的次数来估计抽象转移概率 。从X到Y的跃迁概率为
从X到Y的转换频率,以及从任何标记到Y的转换频率。在实践中,这些抽象转换也可以从给定领域知识的先验分布中提取。
对于维特比推理,我们从NNShot获得测试示例中每个token的发射概率p(y=c | x)。
给定这个抽象转移分布p(y0 | y)和发射分布p(y | x),我们使用维特比解码器来解决以下结构化推理问题
由于发射和转移概率是独立估计的,因此我们引入了一个温度超参数τ,该参数重新规范化了转移概率,以将发射和转移得分调整到类似的尺度
A Simple, Fast and Effective Polygon Reduction Algorithm 代码 vscode编译过程
最近在看减面的内容
找了好久 终于找到了 这篇论文的源码
这里记录一下 用vscode 编译这个98年代码的过程
基础环境
c++环境
参考:Visual Studio Code (vscode) 配置 C / C++ 环境
openGL 环境
编译踩坑
然后进入了漫长地踩坑阶段(2、3天)
报错: multiple definition of xxx
最后发现 是 task.json写的有问题,导致cpp文件被重复编译
然后各种编译报错
可以看到是 缺一些库文件
比如 搜索 glnormal3fv
搜到windows官网
然后就可以看到 缺这个叫opengl
然后呢 进入再编译 再解决报错的循环:
最后找到了所有的依赖库 嗯嗯 就是下面这些,写到tasks.json里就好了
“-lglfw3dll”,“-lopengl32”,“-lWinmm”,“-lGlu32”,“-lGdi32”
tasks.json 如下:
// See https://go.microsoft.com/fwlink/?LinkId=733558
// for the documentation about the tasks.json format
"version": "2.0.0",
"tasks": [
"type": "shell",
"label": "task g++", //修改此项
"command": "G:\\\\Program Files\\\\mingw64\\\\bin\\\\g++.exe",
"args": [ //"$file",
"-g",
"-o",
"$fileDirname\\\\$fileBasenameNoExtension.exe",
"-I$workspaceFolder/include",
"-L$workspaceFolder/lib",
"$workspaceFolder/\\\\*.cpp",
"$workspaceFolder/glad.c",
"-lglfw3dll","-lopengl32","-lWinmm","-lGlu32","-lGdi32"
],
"options":
"cwd": "G:\\\\Program Files\\\\mingw64\\\\bin"
,
"problemMatcher": [
"$gcc"
],
"group": "build"
]
以上是关于Simple and Effective Few-Shot Named Entity Recognition with Structured Nearest Neighbor Learning的主要内容,如果未能解决你的问题,请参考以下文章
A Simple, Fast and Effective Polygon Reduction Algorithm 代码 vscode编译过程
阅读Frustratingly Simple Few-Shot Object Detection
Ten Simple Rules for Effective Statistical Practice
Ten Simple Rules for Effective Statistical Practice
LightGCL: Simple Yet Effective Graph Contrastive Learning for Recommendation
A few distributed abstractions and primitives from Kubernetes