想象你刚跳槽到一家新公司。HR 只带你绕了一圈,边走边说:“这位是财务部的林姐,这位是渠道组的陈总,那位戴黑框眼镜的是算法组的李博。”第二天早上,你在电梯里就能准确认出他们,甚至能喊出称呼。这并不神奇——因为你早已练出了“认人”的眼力,懂得看五官比例、走路姿态这些稳定特征,而不是死记衣服颜色。传统命名实体识别(NER)就像发给你一本员工花名册,对着几千张照片反复比对才能认人;而小样本 NER 只给你三两句话的“介绍”,就要求你认出一类全新的人(实体)。本文就用“快速记住新面孔”这条线,带你搞懂标注不够时,模型如何照样把实体识别做好。
学会小样本 NER,意味着你能在标注成本极高的垂直行业(医疗、法律、金融)只用几十条样本就快速上线实体识别,这是 NLP 落地中稀缺且有价值的能力。
目录
可视化演示
展示小样本命名实体识别三种方法:原型网络的类原型向量计算、元学习的episodic训练范式、以及提示学习的模板化NER,理解标注稀缺场景的解决方案。
本节配有交互动效(进入视口后自动加载,约 3KB)。
原型网络Prototypical Network 支持集:每类K个标注样本计算原型向量 原型计算:类内样本embedding的均值 查询分类:query到各原型距离最近者 proto_c = mean(f(x_i)), i ∈ S_c 通过原型向量实现少样本条件下的新类型NER
问题定义:标注稀缺下的新实体识别
花名册再厚,也盖不住公司未来的新面孔。传统 NER 靠上万条标注把“人名、地名、机构名”这类固定类型背得滚瓜烂熟,可一旦业务要新增“疾病名”“药品名”“法条名”,就得重新标注、重新训练,成本高得劝退。而现实里,新类型总在冒出来,就像公司永远在招新人。
小样本 NER(Few-shot NER)解决的核心问题正是:每个新实体类型只给 K 条(通常 5~20 条)标注样本,模型能否快速学会识别,且不遗忘旧类型。“实体”指文本中的人名、地名、机构名、疾病名等;“识别”有两层含义——先圈出实体边界(哪儿到哪儿是一个实体),再给出类型(是人名还是地名)。
与普通 NER 最大的不同:小样本 NER 假设新类型在训练时从未出现,模型必须凭借在大量相似任务上练出的通用能力完成迁移。三个挑战随之而来:类别内多样性不足,5 条样本覆盖不了该类型的所有写法;跨类型泛化困难,模型容易过拟合旧类型;新旧类型易混淆,边界需要小心区分。这也是它成为新领域快速落地与垂直行业 NER 首选方案的直接原因。
回到入职比喻:小样本 NER 不是给你一本更薄的花名册,而是教你会“看人”。真正值钱的是模型从旧任务里练出的眼力,而不是背下某几个类型。
- 输入句子s₁ 到 sₙ 是句子按词切分后的序列,例如“张三在北京上班”
- 输出实体清单模型输出 m 个实体片段 eᵢ,每个带着类型 tᵢ
- 映射符号箭头表示从原始文本到结构化标签的转换任务本身
少样本学习范式:先练“认人”的眼力
同样是认人,老保安先看骨相和步态,实习生却盯着衣服颜色。衣服天天换,骨相不会变。少样本学习范式要做的,就是把模型的注意力从“衣服”(表面用词)转移到“骨相”(本质特征)——通过特殊的训练组织方式练出这种眼力。
这种范式叫少样本学习(Few-shot Learning)。训练时把数据组织成一个个“任务”(episode):每次从旧实体类型中随机抽 N 个类型,每类抽 K 条标注样本,组成支撑集(support set);再从同样的 N 个类型中抽若干样本作为查询集(query set)。模型先“看”支撑集临时理解任务,再在查询集上预测并计算损失。
这就是 N-way K-shot 的含义:N 表示实体类型数,K 表示每类标注条数。训练时不断更换任务组成,让模型见惯“小样本”的场面。上线时遇到全新类型,模型只需用同样方式组织支撑集,就能把“如何适应”的本能迁移过去。
保安不是天生会认人的——他经历过千百次“只看三张照片就必须认出目标”的考核。少样本范式就是让模型经历千百次迷你考核,把“快速适应”训练成本能。
- 任务 Tᵢ一次少样本模拟任务,由支撑集与查询集两部分组成
- 支撑集 Sᵢ含 N 个类型、每类 K 条标注样本,共 N×K 条,相当于“临时教材”
- 查询集 Qᵢ含 N 类 × 每类 Q 条待预测样本,用来检验模型学得如何
原型网络:用“综合印象”认人
被介绍认识林姐时,你不会记住她每个角度的照片,而是形成一个模糊却稳定的综合印象:圆脸、银框眼镜、语速偏慢。下次碰面,你比对的是这个印象而不是某张照片。原型网络(Prototypical Network)把这条路搬进了模型。
做法很直观:每个实体类型的支撑样本,先用编码器 f_θ 映射到语义特征空间,取它们的均值作为该类型的“原型”(prototype)。于是每个类型在空间里就是一个点。识别查询样本时,把它也映射进同一空间,计算到各原型的距离,距离最近者胜出。
训练损失是距离上的 softmax 交叉熵:目标类型的负距离越大,概率越高。这个目标迫使特征空间呈现“同类聚拢、异类推开”的结构——这正是小样本分类最想要的性质。
原型就是你对林姐的综合印象。查询样本往空间一站,离谁近就归谁。简单、可解释,更妙的是新增类型只需新增一个原型点,模型完全不用重训。
- 原型 cₖ第 k 类所有支撑样本嵌入向量的平均,是该类在空间中的代表点
- 编码器 f_θ把句子编码成稠密向量的模型,实践中常用 BERT 类预训练模型
- 距离度量 d通常用欧氏距离,衡量查询样本与某个原型在空间中的远近
- softmax 概率负距离越大概率越高,最终取概率最大的类别作为预测
元学习方法:学会如何快速学会
有一种人“特别会学新东西”:转行做安检,三天就能认出违禁品成像特征。问诀窍,他说自己辨过上千张图,知道该看轮廓和材质密度。元学习要学的,就是这种“如何快速学会”的能力。
MAML(Model-Agnostic Meta-Learning)是其中的代表。它的核心思路:不直接学习一个能识别所有类型的模型,而是学习一组“稍微调整就能上手”的初始参数 θ。拿到新任务时,从 θ 出发,在支撑集上做几步梯度更新,模型就已经很好用。
训练分内外两层循环。内层:对每个任务 Tᵢ,从 θ 出发,用支撑集梯度更新几步,得到适应后参数 θ′ᵢ;外层:汇总所有任务适应后在查询集上的表现,反向更新 θ,让“从 θ 起步去适应新任务”这件事整体上越来越容易。
你认识同事靠的不是背诵,而是大脑被亿万年进化打磨出的“快速认人”启动器。MAML 交付的正是模型版的启动器——不是知识本身,而是快速获得知识的能力。
- 内层更新θ 沿任务 Tᵢ 的梯度走一小步,得到适应后的 θ′ᵢ
- 学习率 α控制内层“临时学几步”的步长,通常取很小值
- 外层更新用所有任务适应后的查询集表现,反推初始参数 θ 的梯度
- 学习率 β控制元学习“学会学习”的整体速度
提示学习:借语言模型“旧记忆”认新类型
认识新同事最快的方式,常是别人附上一句:“就是季度会上讲数据中台的那位。”这句话是提示(prompt),帮你把旧记忆与眼前的人挂钩。提示学习(Prompt-based Learning)给小样本 NER 递上的,正是这样一句“介绍词”。
预训练语言模型(如 BERT、GPT)读过海量文本,脑子里存着大量语言知识。提示学习构造一个带 [MASK] 的模板,比如“这位患者被诊断为 [MASK]”,让模型预测被遮住的词。若模型在 [MASK] 处填出“高血压”,而“高血压”恰被映射到“疾病”类型,我们就判定该实体属于疾病类。
两个关键组件决定效果:模板(template)负责把实体嵌入恰当的句式;标签词映射(verbalizer)把每个实体类型对应到一组代表性词汇,如“疾病”→{高血压,糖尿病,肺炎}。人工只需设计少量模板词,就能把大模型的预训练知识“释放”到新类型上。
同事的一句提示让你“哦,原来是他”;模板就是模型认人的提示词。模型不需要重新学疾病是什么——它只是被提醒:这些知识你早已见过。这正是大模型在少样本场景“给点提示就上手”的原因。
- 模板 Template(x)把实体 x 包进带 [MASK] 的自然语言句式,如“他被诊断为 [MASK]”
- 预测概率 P_LM预训练语言模型在 [MASK] 位置给出各候选词的概率
- 标签词集合 Vₖ第 k 类实体对应的词表,由 verbalizer 人工或自动定义
- argmax选出概率最高的标签词,从而判定实体类型
数据增广:给模型补几张“不同角度照片”
记住新同事不能只看一张证件照——他戴帽子、侧身时你可能就认不出了。多看他几个瞬间,印象才牢靠。数据增广(Data Augmentation)做的就是:用自动手段给每条标注样本“换几个角度”,让模型从有限的 K 条里看到更多样貌。
常见手段有三类。同义词替换:将句中的普通词换成近义词,如“患者购买”→“病人购买”,实体不动;回译:中文→英文→中文,得到语义相近、措辞不同的新句;大模型合成:让 GPT 类模型照几个示例续写风格相近的句子,并保留原实体标注。
增广不是越多越好。替换词改动了实体边界、回译产生不通顺表达、大模型把实体放进错误语境,都会变成噪声标注,污染原型均值。所以增广后必须做质量把控:实体边界与类型不变、语句通顺、分布与原数据一致,宁少勿滥。
照片角度多了,走廊偶遇才认得出。增广的本质就是低成本“补拍”:让模型对同一类型建立更丰满的印象,而不是死记那几条句子。
- 原始样本 x含实体及类型标签的标注样本,如“张三[人名]去医院”
- 先译英将中文机翻成英文,打乱原句的措辞和语序
- 再译中从英文翻回中文,得到语义相近但表达不同的新句子 x′
- 标签继承新句子原样保留实体标注,低成本得到一条新样本
新类型识别:认出“没见过的人”
更考验认人的场景来了:公司来了个岗位你没听过的人——“这位是数据合规官”。他是人是职位?此时你需要的是“我知道我不认识他”。开放世界的小样本 NER 不仅要识别已知类型,还要能识别未知类型。
原型网络天然适合做拒识。既然每个类型是特征空间里的一个原型点,那么查询样本若距离所有原型都远,就说明它不属于任何已知类型。设定距离阈值 τ,相似度低于 τ 就判为“未知”,交给人工。这让模型从“闭世界分类器”升级为“开放世界识别器”。
新类型被确认后还有一条捷径:不用重训模型,只要把新类型支撑样本的均值挂到原型列表里,一个新原型就建好了。冷启动阶段,可用大模型远程监督、规则或词典先生成一批初始标注,人工只修正少量样本,系统就能转起来。
认人高手都敢说“这个人我不认识”,而不是硬编身份。新类型识别让小样本 NER 变成持续成长系统——每确认一个新人就新增一个原型,越用越全。
- 置信度 Conf(x)查询样本与最近原型的相似度,由负距离取指数得到
- 阈值 τ人为设定的拒识界限,相似度低于它就判为未知类型
- 兜底 argmax相似度足够时,仍取最近原型对应的已知类型
实践与评估:实战中的衡量与落地
认人能力行不行,不能凭感觉,要看误抓与漏放的统计。NER 落地同样需要标尺:精确率(Precision)、召回率(Recall)与调和平均 F1。实体级别上,边界与类型都完全正确才算“认对”。
工程要点有三。编码器选型:中文场景常用 BERT-wwm、MacBERT 作底座,它们决定特征空间可分离性;N/K 对齐:训练任务的 N-way K-shot 要尽量贴近真实场景,比如业务是 3 类 × 10 条,就练 3-way 10-shot;验证集构建:留出部分旧类型扮演“新类型”,防止调参时偷看答案。
趋势上,小样本 NER 正与生成式大模型融合:大模型做数据合成、提示做推理、原型做约束,三者常常组合。对小团队而言,“大模型合成 + 小样本精调”是性价比最高的路径。
保安考核同时统计误抓和放跑,F1 帮我们找到两者平衡。有了标尺,小样本 NER 才能真正从实验室走进生产线。
- TP 真正例正确识别出的目标实体数,要求边界与类型都正确
- 精确率 P预测出的实体中真正正确的比例,衡量“误抓”多不多
- 召回率 R真实实体中被找出的比例,衡量“漏放”多不多
- F1 调和平均兼顾精确与召回,防止只偏袒其中一项
AI 应用场景
医疗电子病历的实体冷启动
阶段:数据准备与模型训练阶段
解决的问题:病历中的疾病名、药物名、检查项目需要逐句人工标注,医生时间宝贵、标注成本极高;训练传统 NER 需上万条标注,新科室接入还要重新适配。少样本 NER 只需医生每类标注 10~20 条,原型网络即可上线,再配合增广与主动学习持续迭代。
具体案例:某三甲医院信息科做病历质控,要在 20 个科室的病历中识别 15 类疾病名。工程师先用大模型远程监督生成候选标注,医生每类修正 20 条,随后用 BERT 编码器 + 原型网络上线,一周内达到 85% 的 F1;传统方案同等效果需要约三个月标注工期。
法律新规的即时实体识别
阶段:模型上线与知识迭代阶段
解决的问题:新法规颁布后,条款中的“行政处罚”“经营者集中”等新实体类型需要立刻可查,而律师逐条标注按小时收费。增量原型扩展让小样本 NER 在人工确认新类型后即时支持,不必整体重训。
具体案例:某法律科技公司维护法规数据库,2023 年新反垄断法发布后,标注员仅标注 30 条样本,模型即开始识别“经营者集中”“滥用市场支配地位”等新类型;配合回译增广,三天内新类型 F1 达 90%。
电商大促前的品牌属性抽取
阶段:数据标注与模型快速定制阶段
解决的问题:每年新品牌、新机型层出不穷,传统 NER 覆盖不了从未见过的品牌名;少样本 NER 用提示学习快速生成模板,结合原型网络识别新品。
具体案例:某电商平台 618 前需完成 500 个新品牌的属性抽取,运营同学用模板与标签词映射构造提示,再用原型网络分类查询样本,新品牌识别准确率快速达标。
Python 演示
# -*- coding: utf-8 -*-"""小样本NER原型网络演示:支撑集建原型,查询样本按距离分类"""import numpy as np class ProtoNet: def encode(self, x): return x # 实际系统在此接入BERT编码器 def fit_predict(self, sx, sy, qx): # 每类原型 = 该类支撑样本嵌入的均值 classes = np.unique(sy) protos = np.array([self.encode(sx)[sy == k].mean(axis=0) for k in classes]) # 查询样本与所有原型算欧氏距离,取最近者 dist = np.linalg.norm(self.encode(qx)[:, None, :] - protos[None, :, :], axis=2) return classes[dist.argmin(axis=1)], protos def make_task(n_way=3, k_shot=3, n_query=6, seed=0): rng = np.random.RandomState(seed) centers = rng.randn(n_way, 8) * 2.0 # 每个实体类型一个语义中心 sx, sy, qx, qy = [], [], [], [] for k in range(n_way): for _ in range(k_shot): sx.append(centers[k] + rng.randn(8) * 0.3) sy.append(k) for _ in range(n_query): qx.append(centers[k] + rng.randn(8) * 0.3) qy.append(k) return np.array(sx), np.array(sy), np.array(qx), np.array(qy) def demo(): model = ProtoNet() # 已见类型:训练阶段见过的实体类型 sx, sy, qx, qy = make_task(seed=0) pred, _ = model.fit_predict(sx, sy, qx) acc_old = (pred == qy).mean() # 全新类型:换一组从未见过的类别,模拟新领域冷启动 sx2, sy2, qx2, qy2 = make_task(seed=42) pred2, _ = model.fit_predict(sx2, sy2, qx2) acc_new = (pred2 == qy2).mean() print("已见类型识别准确率: %.1f%%" % (acc_old * 100)) print("全新类型识别准确率: %.1f%%" % (acc_new * 100)) if __name__ == "__main__": demo()
class ProtoNet:原型网络主体,把“认人”简化成两个步骤:建原型、算距离def encode(self, x): return x占位编码器;真实系统换成 BERT,把句子编码成语义向量protos = np.array([self.encode(sx)[sy == k].mean(axis=0) for k in classes])每个实体类型取支撑样本均值,得到该类的“综合印象”dist = np.linalg.norm(self.encode(qx)[:, None, :] - protos[None, :, :], axis=2)查询样本与所有原型计算欧氏距离return classes[dist.argmin(axis=1)], protos距离最近的原型对应类别,即预测结果centers = rng.randn(n_way, 8) * 2.0每个实体类型在语义空间里有一个中心,样本围绕它小幅波动make_task(seed=42)换一组从未见过的中心,验证“不重训也能识别新类型”
常见误区
误区“不就是少标点数据嘛,把普通 NER 的训练数据从一万条减到一百条,模型多训练几轮就好了。”
正解小样本 NER 的关键不是“数据量的多少”,而是“训练范式”的转变。普通 NER 希望模型记住训练时见过的类型,而小样本 NER 假定新类型从未出现在训练中,模型必须通过 N-way K-shot 任务模拟练出“快速适应”的能力。数据少但训练方式不变,模型只会过拟合到旧类型;数据一样少但按任务组织训练,模型才能迁移。就像保安只背花名册永远认不了新人,练过“迷你考核”才会认新人。
为何常见:大家习惯把模型能力与数据量直接挂钩,容易忽略数据组织方式(任务化)对泛化能力的决定性影响。
误区“支撑样本越多,模型认识应该越准,那我直接标 50 条、100 条不就好了?”
正解小样本 NER 面向的是标注成本极其敏感的场景,K 通常取 5~20。更重要的是训练时的 N/K 必须与真实场景对齐:你上线时只有 3 类 × 10 条,训练却用 10-way 50-shot,模型学到的“适应难度”与你实际面对的根本不是一回事。另外,K 增大到一定程度后准确率提升边际递减,而标注成本线性上升,性价比急剧下降。
为何常见:直觉上“数据越多越好”根深蒂固,忽略了小样本范式的价值恰恰存在于 K 很小的约束下。
误区“每个类别求个平均就当原型,这方法也太简陋了,深度学习不可能这么简单吧?”
正解看似简单的均值在嵌入空间里有扎实的理论支撑:当编码器选用合适的度量(如 Bregman 散度)时,均值恰好是该类别指数族分布的中心估计。实践中原型网络在少样本图像、文本分类上表现优异,而且“距离最近原型”的决策规则高度可解释、天然支持增量类别。简单不等于弱,关键是它把“少样本问题”转化成了“特征空间里的几何问题”。
为何常见:深度学习圈子里对“花哨模型”的偏好,让很多人低估了干净有效的统计方法。
误区“反正是机器生成的,同义词替换、回译随便做几万条,模型一定学得更好。”
正解增广的本质是“假设原样本附近的点类型不变”。如果替换改变了实体边界、回译引入了不通顺表达、大模型把实体放进了错误语境,这些噪声样本会直接污染原型均值。增广必须配质量过滤:类型不变性检查、通顺度评分、与原分布一致性校验。宁少勿滥。
为何常见:因为增广看起来“免费”,人们容易忽略它引入的噪声标注和分布偏移成本。
误区“要识别新类型,把'未知'当第 N+1 类重新训练不就行了?”
正解简单加类别有两个问题:一是“未知”不是一个真实类别,它包含成千上万种可能的实体,无法用有限标注刻画;二是重训成本高,违背小样本初衷。正确的做法是利用几何距离做拒识(远离所有原型则判未知),并在确认后新增原型做增量扩展,让系统持续成长而不必全局重训。
为何常见:分类模型的思维定式让人习惯“类别数固定、加一类重训”,忽略了开放世界里未知类的开放性。
面试题
Q1. 小样本NER主要解决什么问题?
- A.标注稀缺时快速识别新实体类型← 正确答案
- B.提升大模型的文本生成流畅程度
- C.降低推理时 GPU 显存的占用
- D.自动清洗互联网上的噪声数据
答案:A。小样本 NER 的价值正在于标注稀缺时快速识别新实体类型,这与标注多寡直接相关。生成流畅度、显存占用、数据清洗都与小样本 NER 无直接关系。
Q2. N-way K-shot 中"K-shot"表示什么?
- A.每个类别提供的标注样本数量← 正确答案
- B.文本中实体类型的总数量
- C.训练数据集的总文本条数
- D.模型参数更新的总步数
答案:A。K-shot 指每个实体类型提供的标注样本条数;N-way 才指实体类型数量,总样本数 = N×K。训练文本条数和参数更新步数与 K-shot 定义无关。
Q3. 原型网络中每类别的原型向量如何得到?
- A.该类支撑样本嵌入向量的均值← 正确答案
- B.查询样本嵌入向量的加权和
- C.随机初始化的可学习向量
- D.词表中出现频次最高的词
答案:A。原型网络用支撑样本嵌入的均值作为类别原型,这正是“综合印象”的实现方式。查询样本加权、随机向量或词频都不符合原型网络的定义。
Q4. 查询样本在原型网络中被划分到什么类别?
- A.嵌入距离最近的原型类别← 正确答案
- B.随机选择的任意一个类别
- C.词频最高的实体类型
- D.训练损失最小的类别
答案:A。查询样本在特征空间中与各原型计算距离,被划分到距离最近的原型类别。随机选择、词频排序或训练损失都不是原型网络的分类依据。
Q5. 小样本NER常用的技术栈包括哪些?
- A.元学习方法如 MAML 快速适应← 正确答案
- B.原型网络按距离聚类分类← 正确答案
- C.提示学习释放预训练知识← 正确答案
- D.数据增广扩展现有样本← 正确答案
答案:ABCD。元学习、原型网络、提示学习、数据增广都是小样本 NER 的常用技术,分别对应“学会学习”“原型距离分类”“释放预训练知识”“扩充样本多样性”四个方向。
Q6. 元学习 MAML 训练的核心思想是什么?
- A.学习一个易于快速适应新任务的初始参数← 正确答案
- B.收集海量标注数据训练一个大模型
- C.用规则穷举所有可能的实体类型
- D.直接对每个新类型单独训练模型
答案:A。MAML 学习的是一个易适应的初始参数,任务到来时从该起点做几步更新即可胜任。海量数据、规则穷举、单任务训练都不符合元学习的“学会学习”目标。
Q7. 提示学习做小样本NER通常需要哪些组件?
- A.自然语言模板与遮罩词预测← 正确答案
- B.预训练语言模型提供知识← 正确答案
- C.标签词映射连接类型与词← 正确答案
- D.大规模人工标注实体数据
答案:ABC。模板(Template)、预训练语言模型(LM)、标签词映射(Verbalizer)是提示学习的三件套。大规模人工标注恰恰是少样本场景希望避免的。
Q8. 对小样本NER做数据增广时最需注意什么?
- A.不能改变实体边界与实体类型← 正确答案
- B.增广数量不能超过十句
- C.只能使用英文语料进行增广
- D.必须删除句子中的标点符号
答案:A。实体边界与类型不变是增广合法的底线。增广数量没有硬性上限,也不限语种,更不需要删除标点;破坏边界的增广会污染原型均值。
Q9. 开放世界小样本NER如何识别“未知的新类型”?
- A.样本距所有原型都远则判为未知← 正确答案
- B.对所有实体直接按名词短语切分
- C.强制划分到概率最大的类别
- D.随机抽样验证后才判定类型
答案:A。开放世界识别依靠几何距离:样本离所有原型都远时判为未知。强制分到最大概率类别会漏掉未知类型,切分与随机验证都不属于模型机制。
Q10. 面对一个全新领域 NER 冷启动,合理方案有哪些?
- A.大模型远程监督生成初始标注← 正确答案
- B.用小样本范式训练特征提取器← 正确答案
- C.基于原型特征做新增量扩展← 正确答案
- D.完全放弃实体边界检测任务
答案:ABC。冷启动通常组合使用:大模型远程监督生成初始标注,小样本范式训练特征提取器,原型机制做增量扩展。放弃边界检测等于放弃 NER 本身。