# PromptNER: A Prompting Method for Few-shot Named Entity Recognition via k Nearest Neighbor Search

# 前言

PromptNER 是 2023 年 5 月 20 日复旦大学计算机科学学院和上海市智能信息重点实验室发布在 Arxiv 的预印本。原文链接为:https://arxiv.org/abs/2305.12217

# 日期

2023 年 5 月 20 日

# 作者

Mozhi Zhang, Hang Yan, Yaqian Zhou, Xipeng Qiu

复旦大学计算机科学学院

复旦大学上海市智能信息重点实验室

# 摘要

小样本命名实体识别是一项旨在通过有限的标注样本来识别命名实体的任务。最近,原型网络在小样本 NER 中表现的性能令人期待。大多数原型网络将利用支持集中的实体来构建标签原型,并使用查询集来计算跨度级别的相似性并优化这些标签原型表示。然而,这些方法通常不适用于在目标领域进行微调,因为目标领域只有支持集可用。本文提出了 PromptNER:一种通过 k 近邻搜索进行小样本 NER 的新型提示方法。使用包含实体类别信息的提示来构建标签原型,使本文的模型能够仅使用支持集进行微调。我们的方法具有出色的迁移学习能力,对 Few-NERD 和 CrossNER 数据集的广泛实验表明,本文的模型在性能上优于最先进的方法。

# 方法

image-20230907182611748

  1. 输入构造

    给定输入X=[x1,x2,,xn]X=[x_1,x_2,\cdots,x_n] 以及标签类型T={none,t1,t2,,tm1}\mathcal{T}=\{none,t_1,t_2,\cdots,t_{m-1}\},其中 m 是标签的长度,none 标识着 O 的类型。输入主要构造的是

    Xp=Fprompt(T)X,=[Xl,Xm,X]\begin{aligned} X_{p} & =\mathrm{F}_{\text {prompt }}(\mathcal{T}) \oplus X, \\ & =\left[X_{l}, X_{m}, X\right] \end{aligned}

    其中 F 函数是一个利用实体标签构造的提示语句。

    例如:

    实体标签:

    输入语句:Steve Jobs founded Apple in 1976

    构造语句:Find some entities, such as none, person, company: Steve Jobs founded Apple in 1976

    其中使用的模版语句为:Find some entities, such as none,t_1,t_2,\dots,t_

    这里的XlX_l 指代的是”Find some entities, such as",XmX_m 指代的是 "none, person, company"

  2. 位置感知的双仿射模块

    将跨度检测任务变成一个二分类任务。对于 n 个 Token,需要进行n(n+1)/2n(n+1)/2 次二分类。

    首先是通过对预训练编码器对提示和输入语句进行编码即:

    H=Encode(Xp)=[Hl,Hm,Hn]H=Encode(X_p)=[H_l,H_m,H_n]

    在这个模块中,HlH_l 会被忽略掉,HmH_m 则用在后续的基于提示的分类器中。

    接着设计一个结合绝对位置和相对位置的双仿射模型(位置编码采用 RoPE,R(ji)=RiTRjR_{(j-i)}=R^T_iR_j),具体的位置编码为:

    hs=LeakyReLU(hiWs),he=LeakyReLU(hjWe),Ri,j=hsUhe+(RihiWp)(RjhjWp),=hsUhe+(hiWp)Rji(hjWp)\begin{aligned} \mathbf{h}_{s} & =\operatorname{LeakyReLU}\left(\mathbf{h}_{i} W_{s}\right), \\ \mathbf{h}_{e} & =\operatorname{LeakyReLU}\left(\mathbf{h}_{j} W_{e}\right), \\ \mathbf{R}_{i, j} & =\mathbf{h}_{s}^{\top} \mathbf{U h}_{e}+\left(\mathcal{R}_{i} \mathbf{h}_{i} W_{p}\right)^{\top}\left(\mathcal{R}_{j} \mathbf{h}_{j} W_{p}\right), \\ & =\mathbf{h}_{s}^{\top} \mathbf{U h}_{e}+\left(\mathbf{h}_{i} W_{p}\right)^{\top} \mathcal{R}_{j-i}\left(\mathbf{h}_{j} W_{p}\right) \end{aligned}

    其中 R 是上三角矩阵(下三角被 mask)。

    同时为了解决跨度分类的不平衡性,根据不同类别的 span 引入了不同的损失:

    Lpos=log(1+(i,j)Sposer(i,j)),Lneg=log(1+(i,j)Sneger(i,j)),Lspan=Lpos+Lneg,\begin{aligned} \mathcal{L}_{\text {pos }} & =\log \left(1+\sum_{(i, j) \in \mathcal{S}_{\text {pos }}} e^{-r(i, j)}\right), \\ \mathcal{L}_{\text {neg }} & =\log \left(1+\sum_{(i, j) \in \mathcal{S}_{\text {neg }}} e^{r(i, j)}\right), \\ \mathcal{L}_{\text {span }} & =\mathcal{L}_{\text {pos }}+\mathcal{L}_{\text {neg }}, \end{aligned}

    其中SposS_{pos} 表示名词短语,而SnegS_{neg} 表示不属于非名词的短语。

    推理阶段 ,选择 R 的上三角矩阵中 top-3*k(其中 k 表示 k-shot)来召回更多候选跨度。

  3. 基于提示的分类器

    给定输入训练集(X,Y,T)(X,Y,\mathcal{T}),利用第二步中的HmH_mHnH_n 来计算SposS_{pos} 的分类概率。对于第 i 个跨度的表示(si,ei)(s_i,e_i) 表示为:

    ui=1eisi+1k=sieihk\mathbf{u}_{\mathbf{i}}=\frac{1}{e_{i}-s_{i}+1} \sum_{k=s_{i}}^{e_{i}} \mathbf{h}_{k}

    其中sis_ieie_i 分别表示开头和结尾的索引(均值池化)。

    其中每个标签的概率分布可以被计算为:

    p(ysi,ei)=Softmax(Hmuid)p\left(y \mid s_{i}, e_{i}\right)=\operatorname{Softmax}\left(\frac{\mathbf{H}_{m} \mathbf{u}_{i}^{\top}}{\sqrt{d}}\right)

    P.S. 这里是由于每个类只有一个英文单词,所以这里可以直接取到提示中每个类的隐藏状态)

    最终的损失函数定为:

    Lclass=1Sposi=1Sposlog(p(ysi,ei))\mathcal{L}_{\text {class }}=\frac{1}{\left|\mathcal{S}_{\text {pos }}\right|} \sum_{i=1}^{\left|\mathcal{S}_{\text {pos }}\right|}-\log \left(p\left(y \mid s_{i}, e_{i}\right)\right)

# 训练和微调

在训练和微调阶段,本文从训练数据集中抽样一个包含支持集和查询集的数据。通过下述损失对其进行分别优化:

L=Lspan+Lclass\mathcal{L}=\mathcal{L}_{\text {span }}+\mathcal{L}_{\text {class }}

而在测试阶段,则仅使用测试集中的支持集做微调(应该是指验证集)S^test\hat{\mathcal{S}}_{\text {test }}

# KNN 推理

在之前的步骤中获取到了 top-3k 的候选表示并获取各个标签概率值,因此在推理阶段,过滤掉 none 标签概率最大的区间。为了弥补测试集中最佳实体表示的不足,本文在推理过程中使用 K 近邻搜索算法。将测试集中所有的最佳实体聚合到一个矩阵中,然后再次计算这些最佳实体和候选区间的相似度:

di=Ugoldenuid\mathbf{d}_{i}=\frac{\mathbf{U}_{\text {golden }} \mathbf{u}_{i}^{\top}}{\sqrt{d}}

有了距离函数,使用 KNN 检索 top-k 的相似度分数。

p(yi=tsi,ei)j=1nI(jNi,yj=t)di(j)p\left(y_{i}=t \mid s_{i}, e_{i}\right) \propto \sum_{j=1}^{n} \mathbb{I}\left(j \in \mathcal{N}_{i}, y_{j}=t\right) \cdot \mathbf{d}_{i}(j)

其中I\mathbb{I} 为指示函数 [https://zh.wikipedia.org/zh-sg/ 指示函数],其中没有被 KNN 检索到标签概率则为 0。

预测的最后概率就为:

p(ysi,ei)=γSigmoid(R(si,ei))+αpprompt(ysi,ei)+βpknn(ysi,ei)\begin{aligned} p\left(y \mid s_{i}, e_{i}\right) & =\gamma \cdot \operatorname{Sigmoid}\left(\mathbf{R}\left(s_{i}, e_{i}\right)\right) \\ & +\alpha \cdot p_{\text {prompt }}\left(y \mid s_{i}, e_{i}\right) \\ & +\beta \cdot p_{k n n}\left(y \mid s_{i}, e_{i}\right) \end{aligned}

即多个概率的加权求和,这里用了R(si,ei)R(s_i,e_i) 是为了过滤掉一些假的名词跨度。

# 实验部分

# 数据集
  1. Few-NERD 2021

    小样本数据集 N way K~2K shot

  2. CrossNER 数据集

    • CoNLL03
    • WNUT-2017
    • GUM
    • OntoNotes

    为了公平,选择使用 2020 年 Hou 等的 N-way K-shot 数据集。

# 基线模型

Few-NERD 数据集

  1. CONTaiNER 2022
  2. ESD 2022
  3. DecomposedNER 2022
  4. StructShot 2021
  5. ProtoBERT

CrossNER 数据集

  1. DecomposedNER
  2. L-TapNET+CDT
  3. Hou 2020 中的其他方法

评估指标:采用带有标准偏差的微平均 F1 值

# 实现细节

针对位置感知模块和提示分类器模块分别采用了两个 BERT(HuggingFace 的 BERT-base-uncased) 模型。

# 实验结果

  1. Few-NERD

    image-20230903194713832

  2. CrossNER

    image-20230903194738637

# 消融实验(w/o :without)

分为 6 个实验

  1. 无微调
  2. 无重排
  3. 无 KNN 搜索
  4. 无微调 + KNN 搜索
  5. 无位置感知双仿射模块
  6. 无微调和 RoPE 模块

结果:

image-20230903195206975

结果表明:

  1. 在原始的支持集上微调可以显著的提升实验的结果;

  2. 即使没有微调,本文模型的效果仍然比基于 Token 的模型效果来得好(例如 CONTaiNER 就没有我们好,这表明基于 SPAN 的方法优越性);

  3. 重排策略同样显著的提升了实验结果,这表明这个模块可以有效的过滤一些假名词跨度;

  4. KNN 搜索也可以达到少许的提升;

  5. 当移除了了位置感知模块,模型效果整体下滑厉害,这意味着只靠基于提示的分类无法有效的过滤假名词跨度;

  6. 此外,利用 RoPE 等提供相对位置和绝对位置的信息也可以有效提高模型的性能。

很明显:重排和微调是推理阶段的关键模块,因此本文深入探索了两个模块为什么有效:

  1. 重排阶段

image-20230903200248206

​ 上述的表格可以得到在推理阶段增加了 Rerank 模块在 Intra 和 Inter 分别提升了 5.47% 和 4.46% 的性能。而当去除了位置感知模块时,w 和 w/o Rerank 模块的差距更为明显,分别提升了 38.95% 和 50.23%。这个现象表明 Rerank 策略可以有效得过滤掉假名词片段。

  1. 微调阶段

    image-20230903203054219

    上图表明 F1 值随着微调的迭代而上升。

  2. 错误分析

    image-20230903203327701

    NER 任务有两个类型的错误,一种是区间提取错误,一种是分类错误。上表表明仍然倾向于提取边界不正确的跨度(这里的跨度是 rerank 且使用 none 过滤后的跨度)。下表则表明本文的模型有更好的 FP-Type(即错误分类更少)

image-20230903203747752

# 总结

  • 提示引导模型从指定的标签去提取实体;

  • 模型与传统的原型模型不同,仅仅使用了原始支持集去优化标签原型;

  • 两个新模块:位置感知双仿射和 KNN;

  • 实验表明本文模型比现有方法更好。

# 相关论文:

  1. CONTaiNER (ACL 2022) CONTaiNER: Few-Shot Named Entity Recognition via Contrastive Learning

    https://arxiv.org/abs/2109.07589

  2. ESD(NAACL 2022) An Enhanced Span-based Decomposition Method for Few-Shot Sequence Labeling

    https://arxiv.org/abs/2109.13023

  3. DecomposedNER(2022) Decomposed Meta-Learning for Few-Shot Named Entity Recognition

    https://arxiv.org/abs/2204.05751

  4. L-TapNet+CDT(ACL 2020) Few-shot Slot Tagging with Collapsed Dependency Transfer and Label-enhanced Task-adaptive Projection Network

    https://arxiv.org/abs/2006.05702

更新于 阅读次数