项目介绍:(项目背景、项目难点、怎么做的、其中难点具体是怎么解决的,突出下解决思路以及实现的效果是怎么样的)
难点:
这个项目是对通用百科知识图谱中的实体类型进行判别,那么这个项目的难点其实在于一点标注数据都没有,以及类别边界定义模糊,类型非常多等挑战;在这个项目中,训练集有64万,验证集12万,测试集12万,在这个数据量的情况下,对于纯无标注的数据,即使通过人工标注的少量数据进行监督训练,效果可能也不太好,而且实体类型比较多的,所以使得监督任务变得比较困难。同时每一个实体可能对应一个或者多个标签,比如一个样本,实体为刘德华,同时会一个contents对刘德华进行文本描述,那么通过对文本的理解,从几十个类别中找到对应的类别标签。所以我把整个项目建模为多标签文本分类的任务,搭建了一个基于ERNIE的预训练-微调框架,解决这个项目的任务。
具体一个做法是:
怎么做的:
对于预训练部分:针对纯无标注的数据,结合业务理解构建种子词表;通过种子词表搭建了类型与实体之间的关系, 通过种子词表来挖掘少量的带有噪声的训练数据,通过挖掘出的数据对模型进行初步的预训练,同时我们也有人工标注一部分数据,在人工标注的数据集上进行微调,得到初代模型。
然后利用这个初代模型去提高预训练的数据质量,与此同时,我们也不断地增加微调部分的人工标注的数据量,通过不断提高预训练和微调部分的效果,从而进一步提高算法模型的效果。然后在不断地迭代刚才说的这个过程,最终得到一个分类效果较优的算法模型。
具体做法:
利用预训练-微调的手段+模型迭代的方式解决的。
当有监督数据很少的时候 模型不能很好的分类 本质原因 是模型的自身知识不够的 预训练就是能够提供一个粗的先验知识 比如非常流行的bert ,bert为什么能够成功 也是因为前面进行了大量的预训练 即使本身标注数据很少的话 也能够进行一个很好的预测 那么我们效仿预训练微调的框架 实行这个策略 。
这个预训练的不是nlp手段下bert的预训练,其实是我们通过规则和种子词的手段,去捞了很多规则数据,因为难点就是没有标注数据,那么希望这种手段可以,预训练的话可以能够识别到一些比较容易推断的实体类型,微调的话 我们通过少量的人工标注数据 大概一万多条。达到了还不错的效果。在此基础上,进行模型的迭代。
但是在群里交流的时候 发现前面几名都大量的标注数据。(5万多)但效果其实和我们差不多。
刚才提到了也使用了一些trick。
面向leader以及hr的回答方式:
背景:对知识图谱中实体类型类别进行判断。比如实体:刘德华,对这个身上的标签进行判断。官方有对应的标准标签。
建模方式:我们要做的就是 每个实体去找到匹配到的各个标签。
数据:没有任何标注数据。人工标注太过于耗费精力。所以我们挖掘一部分种子词来进行解决。
怎么做的:主要采用nlp常用的ERNIE模型,通过种子词挖掘的数据集进行预训练,同时我们也进行了一定量的人工标注数据,在人工标注的数据集上进行微调。并不断地进行模型的迭代,让模型有一个更好的效果。
刁钻问题:
1、评价指标:是什么,公式是什么?
- 精准率和召回率。
精准率公式:Precision = TP / (TP+FP)
召回率公式:Recall = TP / (TP+FN)
2、预训练准确率多少,微调后多少。不用预训练多少(只用人工的多少)
- 预训练的话:30%左右
- 仅人工:77%左右
- 预训练+微调后:78%多
- 经过4轮迭代左右,第一次迭代 79多,接近80,第二次迭代80.5左右,直到第四次大概多81%多。
3、还试过其他模型吗?
- bert,bert_CNN,bert_RNN,bert_RCNN,bert_DPCNN这些也有尝试。不过效果没有ERNIE好。
4、为什么没用集成模型?
- 实验条件不够 没有那么多机器
5、其他队伍大概怎么做的,知道吗?
- 目前了解到的话,有些队伍还是用监督学习做的。不过标注的数据更多些。
6、简单介绍下bert吗?ernie吗?这两个区别是什么吗?ernie最近出了3.0。(ernie现在出了3.0)秒杀所以中文任务。ernie论文也要看一下。
7、你能简单讲一下你们用的ERNIE和ernie3.0简单说一下吗?
8、现在nlp这么火,还可以介绍其他介绍模型吗?要是问ernie,就提bert。
9、针对题目,知识图谱问题:所有实体进行类型推断。数据来源是知识图谱来的,本身任务跟图谱没有多大关系。
10、使用ernie模型,输出维度是batch_size * sequence * embedding,你是怎么从这个维度得到你所需要的输出结果的维度?
- bert和ernie第一个CLS token其实表示的是这句话的语义,只需要拿CLS token的embedding去过一个全连接,这个全连接层,其中的神经元的个数就是标签个数。
11、你是基于ernie进行训练的,你们预训练任务是怎么设计的?
- 这里指的预训练并不是大家常说bert/ernie中随机mask的预训练任务,这里是构建的一个狭义的预训练任务,相当于给模型先验知识的一个感觉,提前让它看到一些数据,先学习一些简单的分类任务。
12、在人工标注的时候,一个样本标A可以,标B也可以,那么你们是怎么考虑的?如果标漏了,该怎么办?会对模型产生影响?(也是类别定义模糊的回答方式)
- 先讲评价指标,的确是您说的,标签之间定义有些模糊,对于官方任务中,如果一个标签漏了,这个样本都会算模型预测算了。
- 的确存在标签之间定义模糊的情况,所以在这个任务下,在标注的时候,遇到情况,我们会先把这部分数据拿出来,几个人一起看下,来定义一下,同时,我们也会和该任务下的负责人进行沟通,类似和需求方进行一定沟通,来定义这一部分的数据类别,当我们看到的数据越来越多的时候,我们也会更加理解实体所对应的类别。通过这些方式来尽量缓解这种标签定义模糊的现象。
13、如果要你再优化,你有考虑如何进行优化吗?
- 我觉得可以利用标签之间的层级关系,层级信息可以利用,会包含更多的有用的信息。具体怎么用还没想好。假设真的要用的话,就会去看一些论文,看看学术界以及工业界的一些用法。
Transformer精简版
Transformer知识点总结