工业界求解NER问题的12条黄金法则

工业界求解NER问题的12条黄金法则

众所周知,命名实体识别(Named Entity Recognition,NER)是一项基础而又重要的NLP词法分析任务,也每每做为信息抽取、问答系统、机器翻译等方向的或显式或隐式的基础任务。在不少人眼里,NER彷佛只是一个书本概念,跟句法分析同样存在感不强。一方面是由于深度学习在NLP领域遍地开花,使得智能问答等曾经复杂的NLP任务,变得能够端到端学习,因而分词、词性分析、NER、句法分析等曾经的显式任务都隐式地编码到了大型神经网络的参数中;另外一方面,深度学习流行以后,NER问题相比以前有了比较长足的进步,LSTM+CRF的模式基本成为业内标配,不少人认为“这个事情应该差很少了”。算法

但!是!网络

真正在工业界解决NLP业务问题的NLPer,每每发现事情远无法这样轻描淡写。在真实的工业界场景中,一般面临标注成本昂贵、泛化迁移能力不足、可解释性不强、计算资源受限等问题,想要将NER完美落(bian)地(xian)可不简单,那些在经典benchmark上自称作到SOTA的方法放在现实场景中每每“也就那样”。以医疗领域为例:框架

  1. 不一样医院、不一样疾病、不一样科室的文本描述形式不一致,而标注成本又很昂贵,一个通用的NER系统每每不具有“想象中”的泛化迁移能力。当前的NER技术在医疗领域并不适合作成泛化的工具。
  2. 因为医疗领域的严肃性,咱们既要知其然、更要知其因此然:NER系统每每不能采用“一竿子插到底”的黑箱算法,处理过程应该随着处理对象的层次和深度而逐步叠加模块,下级模块使用上级结果,方便进行迭代优化、并具有可解释性,这样作可解耦医学事件、便于进行医学实体消歧。
  3. 仅仅使用统计模型的NER系统每每不是万能的,医疗领域相关的实体词典和特征挖掘对NER性能也起着关键做用。此外,NER结果每每不能直接使用,还需进行医学术语标准化。
  4. 因为医院数据不可出院,须要在院内部署NER系统。而一般医院内部的GPU计算资源又不是很充足(成本问题),咱们须要让机器学习模型又轻又快(BERT上不动哇),同时要更充分的利用显存。
    以上种种困难,致使了工业界场景求解NER问题时都难以作到BERT finetune一把就能把问题解决,总之

那些口口声声遇事不决上BERT的人们,应该像我同样,看着大家在NER问题上翻车机器学习

几天前,卖萌屋的天然语言处理讨论群内就命名实体识别问题进行了一番激烈的讨论,因为讨论持续了接近2小时,这里就不贴详细过程了(省略8k字)。ide

通过一番激烈的辩论,最后卖萌屋的做者杰神(JayLou娄杰)就讨论中出现的若干问题给出了工业界视角下的实战建议(每一条都是实打实的实战经验哇)。工具

杰神首先分享了他在医疗业务上作NER的七条经验教训:性能

  • 提高NER性能(performance)的⽅式每每不是直接堆砌⼀个BERT+CRF,这样作不只性能不必定会好,推断速度也很是堪忧;就算直接使用BERT+CRF进行finetune,BERT和CRF层的学习率也不要设成同样,让CRF层学习率要更大一些(通常是BERT的5~10倍),要让CRF层快速学习。
  • 在NER任务上,也不要试图对BERT进⾏蒸馏压缩,极可能吃⼒不讨好。
  • NER任务是⼀个重底层的任务,上层模型再深、性能提高每每也是有限的(甚至是降低的);所以,不要盲目搭建很深的网络,也不要痴迷于各类attention了。
  • NER任务不一样的解码方式(CRF/指针网络/Biaffine[1])之间的差别其实也是有限的,不要过度拘泥于解码⽅式。
  • 经过QA阅读理解的方式进行NER任务,效果也许会提高,但计算复杂度上来了,你须要对同⼀⽂本进行屡次编码(对同⼀文本会构造多个question)。
  • 设计NER任务时,尽可能不要引入嵌套实体,很差作,这每每是一个长尾问题。
  • 不要直接拿Transformer作NER,这是不合适的,详细可参考TENER[2]。
    以后,杰神在群里分享了工业界中NER问题的正确打开⽅式:

很是直接的1层lstm+crf!
注:本文所说的lstm都是双向的。学习

如何快速有效地提高NER性能? 若是这么直接的打开方式致使NER性能达不到业务目标,这一点也不意外,这时候除了badcase分析,不要忘记一个快速提高的重要手段:规则+领域词典。在垂直领域,一个不断积累、不断完善的实体词典对NER性能的提高是稳健的,基于规则+词典也能够快速应急处理一些badcase;对于通⽤领域,能够多种分词工具和多种句法短语⼯具进行融合来提取候选实体,并结合词典进行NER。此外,怎么更好地将实体词典融入到NER模型中,也是一个值得探索的问题(如嵌入到图神经网络中提取特征[3])。优化

  1. 如何在模型层面提高NER性能? 若是想在模型层面(仍然是1层lstm+crf)搞点事情,上文讲过NER是一个重底层的任务,咱们应该集中精力在embedding层下功夫,引入丰富的特征:好比char、bigram、词典特征、词性特征、elmo等等,还有更多业务相关的特征;在垂直领域,若是能够预训练一个领域相关的字向量&语言模型,那是最好不过的了~总之,底层的特征越丰富、差别化越大越好(构造不一样视角下的特征)。编码

  2. 如何构建引入词汇信息(词向量)的NER? 咱们知道中文NER一般是基于字符进行标注的,这是因为基于词汇标注存在分词偏差问题。但词汇边界对于实体边界是颇有用的,咱们该怎么把蕴藏词汇信息的词向量“恰当”地引入到模型中呢?一种行之有效的方法就是信息无损的、引入词汇信息的NER方法,我称之为词汇加强,可参考《中文NER的正确打开方式:词汇加强方法总结》[4]。ACL2020的Simple-Lexicon[5]和FLAT[6]两篇论文,不只词汇加强模型十分轻量、并且能够比肩BERT的效果。

将词向量引入到模型中,一种简单粗暴的作法就是将词向量对齐到相应的字符,而后将字词向量进行混合,但这须要对原始文本进行分词(存在偏差),性能提高一般是有限的。

  1. 如何解决NER实体span过长的问题? 若是NER任务中某一类实体span比较长(⽐如医疗NER中的⼿术名称是很长的),直接采起CRF解码可能会致使不少连续的实体span断裂。除了加入规则进行修正外,这时候也可尝试引入指针网络+CRF构建多任务学习(指针网络会更容易捕捉较长的span,不过指针网络的收敛是较慢的,能够试着调节学习率)。

  2. 如何客观看待BERT在NER中的做用? 对于工业场景中的绝大部分NLP问题(特别是垂直领域),都没有必要堆资源。但这毫不表明BERT是“一无可取”的,在不受计算资源限制、通用领域、小样本的场景下,BERT表现会更好。咱们要更好地去利用BERT的优点:
    a. 在低耗时场景中,BERT能够做为一个“对标竞品”,咱们能够采起轻量化的多种策略组合去逼近甚至超越BERT的性能;
    b. 在垂直领域应用BERT时,咱们首先确认领域内的语料与BERT原始的预训练语料之间是否存在gap,若是这个gap越大,那么咱们就不要中止预训练:继续进行领域预训练、任务预训练。
    c. 在小样本条件下,利用BERT能够更好帮助咱们解决低资源问题:好比基于BERT等预训练模型的文本加强技术[7],又好比与主动学习、半监督学习、领域自适应结合(后续详细介绍)。
    d. 在竞赛任务中,能够选取不一样的预训练语⾔模型在底层进行特征拼接。具体地,咱们能够将char、bigram和BERT、XLNet等一块儿拼接喂入1层lstm+crf中。语⾔模型的差别越⼤,效果越好。若是须要对语言模型finetune,须要设置不一样的学习率。

  3. 如何冷启动NER任务? 若是⾯临的是⼀个冷启动的NER任务,业务问题定义好后,首先要作的就是维护好一个领域词典,而不是急忙去标数据、跑模型;当基于规则+词典的NER系统不可以知足业务需求时,才须要启动人工标注数据、构造机器学习模型。固然,咱们能够采起一些省成本的标注方式,如结合领域化的预训练语言模型+主动学习,挖掘那些“不肯定性高”、而且“具有表明性”的高价值样本(须要注意的是,因为NER一般转化为一个序列标注任务,不一样于传统的分类任务,咱们须要设计一个专门针对序列标注的主动学习框架)。

7.如何有效解决低资源NER问题? 若是拿到的NER标注数据仍是不够,又不想标注人员介入,这确实是一个比较困难的问题。低资源NLP问题的解决方法一般都针对分类任务,这相对容易一些,如能够采起文本加强、半监督学习等方式,详情可参考 《如何解决NLP中的少样本困境》 。而这些解决低资源NLP问题的方法,每每在NER中提高并不明显。NER本质是基于token的分类任务,其对噪声极其敏感的。若是盲目应用弱监督方法去解决低资源NER问题,可能会致使全局性的性能降低,甚至还不如直接基于词典的NER。这里给出一些能够尝试的解决思路(也许还会翻车):
a. 上文已介绍BERT在低资源条件下能更好地发挥做用:咱们可使用BERT进行数据蒸馏(半监督学习+置信度选择),同时利用实体词典辅助标注。
b. 还能够利用实体词典+BERT相结合,进行半监督自训练,具体可参考文献[8]。
c. 工业界毕竟不是搞学术,要想更好地解决低资源NER问题,RD在必要时仍是要介入核查的。

  1. 如何缓解NER标注数据的噪声问题? 实际工做中,咱们经常会遇到NER数据可能存在标注质量问题,也许是标注规范就不合理(必定要提早评估风险,否则就白干了),正常的状况下只是存在一些小规模的噪声。一种简单地有效的方式就是对训练集进行交叉验证,而后人工去清洗这些“脏数据”。固然也能够将noisy label learning应用于NER任务,惩罚那些噪音大的样本loss权重,具体可参考文献[9]。

9.如何克服NER中的类别不平衡问题? NER任务中,经常会出现某个类别下的实体个数稀少的问题,而常规的解决方法无外乎是重采样、loss惩罚、Dice loss[10]等等。而在医疗NER中,咱们经常会发现这类实体自己就是一个长尾实体(填充率低),若是能挖掘相关规则模板、构建词典库也许会比模型更加鲁棒。

10.如何对NER任务进行领域迁移? 在医疗领域,咱们但愿NER模型可以在不一样医院、不一样疾病间进行更好地泛化迁移(领域自适应:源域标注数据多,目标域标注数据较少),如能够尝试将特征对抗迁移[11]。在具体实践中,对抗&特征迁移一般还不如直接采起finetune方式(对源域进行预训练,在目标域finetune),特别是在后BERT时代。在医疗领域,泛化迁移问题并非一个容易解决的问题,试图去将NER作成一个泛化工具每每是困难的。或许咱们更应该从业务角度出发去将NER定制化,而不是拘泥于技术致使没法落地。

11.如何让NER系统变得“透明”且健壮? 一个好的NER系统并非“一竿子插到底”的黑箱算法。在医疗领域,实体类型众多,咱们每每须要构建一套多层级、多粒度、多策略的NER系统。
a. 多层级的NER系统更加“透明”,能够回溯实体的来源(利于医学实体消歧),方便“可插拔”地迭代优化;同时也不须要构建数目众多的实体类型,让模型“吃不消”。
b. 多粒度的NER系统能够提升准召。第⼀步抽取⽐较粗粒度的实体,经过模型+规则+词典等多策略保证⾼召回;第⼆步进⾏细粒度的实体分类,经过模型+规则保证⾼准确。

  1. 如何解决低耗时场景下的NER任务? 从模型层面来看,1层lstm+CRF已经够快了。从系统层面来看,重点应放在如何在多层级的NER系统中进行显存调度、或者使当前层级的显存占用最大化等。

综上,若是能在1层lstm+CRF的基础上引入更丰富的embedding特征、并进行多策略组合,足以解决垂直领域的NER问题;此外,咱们要更好地利用BERT、使其价值最大化;要更加稳妥地解决复杂NER问题(词汇加强、冷启动、低资源、噪声、不平衡、领域迁移、可解释、低耗时)。

除了上面的12条工业界实战经验,群内的一个小伙伴@一一 还提出了一个实际场景常常遇到的问题:

lstm+crf作实体提取时,保证精度的状况下,在提高模型速度上有没有什么好的办法或者建议?
杰神一样给予了一个饱含实战经验的回答:

个⼈经验来讲,1层lstm+CRF够快了。

  1. 若是以为lstm会慢,换成cnn或transformer也许更快一些,不过效果好很差要具体分析;一般来讲,lstm对于NER任务的⽅向性和局部特征捕捉会好于别的编码器。
  2. 若是以为crf的解码速度慢,引入label attention机制把crf拿掉,好比LAN这篇论文[12];固然能够⽤指针网络替换crf,不过指针网络收敛慢⼀些。
  3. 若是想进行模型压缩,好比对lstm+crf作量化剪枝也是⼀个须要权衡的⼯做,有可能费力不讨好~能够看出,哪怕是命名实体识别,中文分词甚至文本分类这些看似已经在公开数据集上被求解的任务,放在实际的工业界场景下均可能存在大量的挑战。这也是提醒还未踏入工业界的小伙伴们,不只要刷paper追前沿,更要记得积极实践,在实际问题中积累NLP炼丹技巧哦。
相关文章
相关标签/搜索