最近比赛多得令人窒息,所以笔者也从中学到了不少的东西。为此,笔者想基于之前更新的命名实体识别的文章,再写一写最近看到的一些NER算法。
笔者在这里就不对命名实体识别等基础知识进行赘述了,我们扣1直接开车。
1. MRC实体分类+抽取
输入格式:
输出格式:该分类下的所有实体
这种方式的关键在于数据构造这一块,相当于是把分类问题转化成了数据构造问题,我们只要找出对应类别的定义,与相应的文本进行拼接,然后正常完成NER任务即可。
举个例子,假如我们要抽出一段话里面的朝代实体和人物实体。
样例:“贼吕布在东汉末年认了三个爹,李白生于唐朝,朱元璋建立了明朝。”
数据构造格式:
我们定义朝代问题:“请抽出这段话含有的朝代。”
我们定义人物问题:“请抽出这段话含有的人物。”
输入:
输出:东汉、唐朝、明朝
输出:吕布、李白、朱元璋
一般来说,“问题”就是这个类别的定义。总之我们构造的问题要描绘出该类别信息。
模型结构:简单的BERT的阅读理解任务:BERT的最后一层向量分别下接dense层,生成start和end两条结果向量,两条向量的长度是输入BERT的max_len长度,使用argmax对两条向量分别进行二分类,1为是start/end,0为不是start/end,如图1所示。
Loss如公式1所示下:
图1 模型示意图预测结果配对:采用就近原则,对start和end位置进行配对,抽出实体,如图2所示。我们可以从图中看到,这种方式的配对可能会导致end位置超过一些start的位置,所以我们直接跳过这些start位置,并将这些位置赋值为“I”。
图2 预测结果配对这个方法的缺点在于很难把控好对问题的定义且分类效果不佳。笔者的师弟跑了某个比赛的数据集,实验发现该方法能召回很多正确的实体,但是这些正确的实体并不属于当前我们问题所定义的类别。
从结果来看,这种方法抽出的实体都是我们想要的,只是类别没分对而已。因此,我们可以将BERT+CRF模型的结果与该方法抽出的实体做个配对,将CRF的类别用在MRC的结果上,最后我们通过实验发现,分数确实上去了。
指针网络可以认为是第一种方法的进阶,它简化了我们定义问题的过程。我们直接在模型中多抽取几对(Start,End)向量,每一对向量代表一个类别即可,预测结果匹配也是按照就近原则。
不过,指针网络相较于方法1多了个span loss,整体的loss如公式2所示。
其中span loss的设计为了解决实体嵌套问题,但是由于它的时空复杂度比较高,且笔者的师弟在某个比赛的数据集测试发现并不是很有效,甚至伤害了模型性能,于是便删掉了span loss。
虽说span loss在某个比赛数据集确实没啥用,但也不妨碍我们去了解它,它的原理也挺简单的,就是通过一个二维矩阵来记录真实实体在句子中的(Start,End)位置,比如某个实体在文本中的位置是1~3,那么它在二维矩阵的坐标(1,3)则标注为1,如图3所示。我们假设这个文本的max len为3,那么span 矩阵的大小则为3×3,我们可以看到span矩阵中的“0”会比1多,极大浪费了空间。当然了,这也是可以优化的,我们通过别的算法来储存矩阵,进而压缩空间复杂度,只是加上这个loss的效果不佳,因此,笔者也没对其进行过多的深究。
图3 span矩阵最后,我们再看一下删掉span loss的模型结构,如图4所示。
图4 指针网络笔者在命名实体识别NER论文调研中也提到,这两年的NER算法思想主要集中在将词典信息融入训练过程,加强模型的整体泛化效果。我也知道中文BERT NER是基于char(字)级别的embedding,那么我们能不能将词(word)级别的embedding也融进BERT里面。
答案是可以的,事实上预训练模型ZEN模型做的就是这个操作,笔者在平安产险的比赛中也用了ZEN模型搭配WWM预训练了一个ZEN_wwm模型。
当然了,我们也可以把操作玩得更好一点,BERT fine-tune输入参数是有input mask这个玩意的,那么我们能不能通过修改attention score的公式,利用input mask对word embedding 与 char embedding融合之后的embedding进行加权呢?
关注我的微信公众号【阿力阿哩哩】~不定期更新相关专业知识~
喜欢就点个赞吧~