中文NER的那些事儿4. 数据增强在NER的尝试
这一章我们不聊模型来聊聊数据,解决实际问题时90%的时间其实都是在和数据作斗争,于是无标注,弱标注,少标注,半标注对应的各类解决方案可谓是百花齐放。在第二章我们也尝试通过多目标对抗学习的方式引入额外的NER样本,或者分词边界来提高people daily小样本数据集的效果。
以下我会结合一些业界的案例和新鲜出炉的NLP数据增强综述,聊聊都有哪些数据增强方案,其中哪些适用于NER以及效果提升。代码详见 people_daily_augment
NLP数据增强综述
Paper:Data Augmentation Approaches in Natural Language Processing: A Survey
Blog:https://amitness.com/2020/05/data-augmentation-for-nlp/
数据增强可以分成三大类Paraphrasing, Nosing和Sampling,以下我们按类别分别介绍下各类的实现方案
方案一 Paraphrasing
目标:在尽可能保留句子整体语义的情况下,增加文本丰富度,包括让每个词拥有更加丰富的上下文context,让相似的语义表达有更多样的语法构成,词汇构成等等
方案 | 粒度 | 丰富度 | 使用成本 |
---|---|---|---|
同义词词林 | 词 | 低 | 低 |
词向量 | 词 | 中 | 低 |
语言模型 | 词 | 高 | 中 |
规则 | 词 | 低 | depends |
翻译 | 任意 | 高 | 高 |
生成 | 任意 | 高 | 高 |
同义词词林
基于词典中严格同义词的定义,对句子中非stopword的词汇进行随机替换,覆盖比较有限,但准确率很高。
中文同义词库
词向量
选择和当前文本预料相似的预训练词向量(word2vec/glove/fasttext etc),来生成most_similar词作为替换词,替换粒度可以是词,可以是字,可以是mix,取决于你使用的词向量本身的分词粒度。丰富度和覆盖率都比以上词典更高,这里的相似词是指上下文相似的词汇,对词性,实体类型等语法特征没有严格约束,所以在序列标注问题中需要小心使用。
语言模型
以上词典和向量都局限于词袋模型,无法解决一词多义的ambiguity问题。使用预训练语言模型做完形填空,可以基于上下文对随机MASK的部分进行生成。粒度可以是单词,也可以是long span,生成的文本丰富程度更高。不过也需注意因为丰富程度高,所以要控制句子中被替换的文本占比,占比过高会导致整个语义发生变化。
规则
哈哈规则这里其实是最能搞事情的,其实尤其是针对中文,多用于特殊业务场景(搜索/对话等等),以及垂直领域 中文缩写库,医学等领域词典
- 领域词典:例如医学,电力工程都有类似的比赛用利用领域内同义词典来进行样本增强
- 简写/缩写<->完整单词: yyds—>永远的神,哈工大<->哈尔滨工业大学
- 上下位词替换:手机价格->华为手机价格
- 英文特有的,否定句的多种写法,主动句变被动句等等
以上四种方案都在词粒度进行文本增强,会遍历句子中的每个词,有p的概率对该词进行替换,每个原始样本生成N个新样本。因为保留了原始句子的句法语法结构,应用场景相对广泛,对局部建模的序列标注问题以及全局建模的文本分类问题都适用。下面的两种方案会直接从句子整体进行改写,所以不适用于序列标注类任务。
回译
把原始样本语言翻译成另一种语言,再翻译回来,如果和原始输入不同则算一个增强的新样本。好处是保证了语义的一致性,以及语法的正确性。不过因为句子整体变化所以不适用于所有对局部建模的任务,例如关系抽取,序列标注等。
文本生成
直接用seq2seq,生成训练样本的同义表达。这个方法需要依赖额外的训练样本,来训练生成模型,和以上方案相比这个方案成本最高,虽然文本丰富程度最高,但不确定性也最高,所以。。。你懂的。。。
方案二 Noising
目标:增加模型稳健性,在不过多影响training error的前提下,降低模型的复杂度从而降低generalization error, 类比dropout,l2,random noise injection,etc
换位
对文本中,任意两个词,span,句子,段落进行位置交换得到新的文本。这个方法尤其适用于分类任务,因为多数分类任务语序信息并不十分重要。但是在序列标注任务中,因为局部label强依赖于周围信息,因此词粒度swapping可能会造成更严重的边界问题,更推荐在更大粒度进行shuffle,例如句子之间进行shuffle。
删除
中文删除需要考虑你的模型输入粒度,如果输入粒度是词,则按照词粒度进行随机删除,避免因为删除带来更多的OOV。当然对长文本也可以在句子,段落级别进行删除。对于序列标注任务,最好对整个Span粒度进行删除,避免影响实体label,以及label周边信息。例如存在实体'北京民政局',这时如果对‘民政局’进行随机删除,会改变'北京'的标签,如果删除实体周边词,可能会导致边界识别不准。
插入
最初在EDA中insertion是随机在句子中选择一个非stop words的词,把该词的同义词随机插入到句子中,增强相关信息。也有一些其他场景的改良操作
- 对长文本分类任务,可以把相同标签的其他文档中的句子随机抽取插入到当前文档任意位置
- 对UGC文本,可以尝试随机插入语气词,来增加口语化表达程度
替换
这里和上述的同义词替换不同,替换的并非同义词,需要按照使用场景设计替换方式。
例如搜索场景,针对用户键盘输入的typo,看到过的增强方式有
- 谐音字替换: de 的 地 得 德 嘚 徳 谐音词库
- 常见错别字替换: 高梁-高粱 pycorrector 中文文本纠错工具。音似、形似错字,中文拼音、笔画输入法的错误纠正
- 中文<->拼音(全写/缩写):xingfu-幸福, sz-深圳
- 英文字母键盘上相邻字母的替换
对实体抽任务,可以对同类型的实体进行替换,这里可以用当前样本的训练集构建实体词典,也可以用额外的实体词库,或者挖掘得到的领域词库。
Mixup
从图像领域的mixup衍生而来,和以上的方案都不尽相同,不对文本进行增强,而是对向量空间进行融合。原始图像的mixup在实验中发现对原始图片输入进行mixup效果最好,在文本领域,对原始输入的词向量,或者Encoder输出的文本向量进行融合,都有类似的尝试。
mixup会按一定比例对两个样本的向量空间求和,同时对label进行融合。把label融合这里有一点难理解,其实模型实现还是对融合的两个label各自计算cross-entropy,再对loss进行加权,只不过这个计算等价于下面写的对label进行融合,从one-hot变成带权重的multi-hot。
x &= \lambda * x_i + (1- \lambda) * x_j \\
y &= \lambda * y_i + (1 -\lambda) * y_j \\
\end{align}
\]
mixup确实比较黑盒,让人难以理解它为啥会work,不过看到过一个观点感觉比较有束缚里
提高模型泛化能力的一个方式,就是在训练样本没有覆盖的空间上控制模型的复杂程度,mixup通过插值,在训练样本没有覆盖的空间上让模型学到一个简单线性插值的函数
当然对比上面的数据增强方式,都在单一label内部进行增强,mixup是唯一一个对多label进行融合数据增强方案
方案三 Sampling(基于任务的样本生成)
以上两种方案是Task Independent,可以直接用于任何任务,而Sampling是任务依赖的,需要基于当前样本训练模型或者制定挖掘规则。
规则
paper中给的规则主要还是基于文本的,实际应用中有不少基于用户行为的规则挖掘。举几个
阿里妈妈:品牌广告中的 NLP 算法实践: 在训练query&item短文本相关性模型时,样本中除了少量人工标注的样本以外,还基于用户的搜索点击数据挖掘了弱标注的正负样本,这里的核心问题是未点击的原因很复杂并不意味等价于不相关。所以他们的负样本筛选规则是query无点击且VSM低,以及和当前query低相关的其他query中有点击的item
Query 理解和语义召回在知乎搜索中的应用: 在拓展同义词表时用了以下的样本生成规则
- user log:找到连续query(疑似用户改写),用对齐工具寻找其中可能的同义词
- query log:找到相同点击item对应的高搜索query,寻找其中的同义词
- 文本规则:例如‘XXXX又名XXX’
KDD 2019 | 用户视角看世界:腾讯提出ConcepT概念挖掘系统,助力推荐搜索在做概念挖掘时用了如下方式构建弱标注样本
- 基于Bootstrap的规则模版抽取:预定义一些规则模版,例如‘十大(XXX)’,‘(XXX)排行榜’, 用这些模版取query中抽取‘XX’对应的概念,例如'[家用SUV]排行榜',在用得到concept‘家用SUV’后,再去抽取还有哪些模版包含这个概念例如'哪款家用SUV性价比最高?',得到新的规则模版'哪款(XXX)性价比最高',再去挖掘概念...
- 基于query-Title对齐:同样使用搜索点击数据,作者对query和点击doc的title进行对齐,抽取首尾相同且ngram顺序一致的部分,例如query=‘好看的香港僵尸电影', Title='十大经典僵尸电影',就会得到concept=‘僵尸电影’
文本生成/语言模型
基于样本和标签训练生成模型,训练一个样本生成器。这里和Paraphasing生成模型的差异在于,这里会用到训练样本来训练模型。
例如下图中,针对文本分类任务,可以把标签和输入拼接成样本,用来fintune GPT,然后用标签和句子的前半部分来生成新的句子作为增强样本。因为在finetune过程中使用了标签本身,所以一定程度上解决了生成模型增强的样本label可能发生变化的问题。
序列标注任务直接使用生成模型肯定是不行的,因为生成的文本会缺少标签,于是DAGA用了一种很聪明的方案来构建生成模型的样本,就是把实体词token和token对应的实体标签进行线性混合,例如‘伦敦’,变成‘B-LOC 伦 I-LOC 敦’。然后用了轻量级的一层LSTM来训练生成模型,最小化next token predicition loss。生成方式也很简单,直接从[EOS]开始迭代向后生成即可,这样就可以得到融合了标签和文本的增强样本啦。非常简单粗暴有木有,而且完全不依赖外部词表,字典之类的资源~
Self-Training
self-training多用于存在大量未标注样本和少量标注样本时。主要步骤包括
- 用少量样本训练Teacher模型
- 用Teacher模型对大量未标注样本进行预测得到soft label
- 把预测的样本和标注样本混合训练Student模型
- 重复以上steps。
不过这里在训练stduent模型时,需要结合confidence reweighting & regularization, contrastive learning等特殊的Noise-Aware loss计算方式来降低soft label本身噪音对student模型的效果影响。
除此之外,self-training还可以和弱标注样本以及远程监督结合,用于最初基于规则挖掘,或者开源数据,得到一路/几路准确召回各不相同的弱标注样本,这些样本本身带噪音,切彼此之间存在label不一致,这时可以利用teacher-student框架来求同存异。以下是序列标注任务中用到self-training的一些尝试
- Named Entity Recognition with Small Strongly Labeled and Large Weakly Labeled Data
- BOND: BERT-Assisted Open-Domain Named Entity Recognition with Distant Supervision
- Fine-Tuning Pre-trained Language Model with Weak Supervision: A Contrastive-Regularized Self-Training Approach
- AliCG/ Fine-grained and Evolvable Conceptual Graph Construction for Semantic Search at Alibaba
NER数据增强尝试
这里主要针对方案一二和任务无关的通用增强方案,Reference[3]在英文NER任务中选择了同义词替换,实体替换,相同label的token替换,句子shuffle这四种方案进行评估。主要结论就是用啥增强方案都比不用好,用多个方案比用1个方案好。换到中文NER任务,我做了些许调整
- 同义词替换:这里我只对非实体部分进行了同义词替换,避免对实体label产生影响。这里的同义词没有使用词典而是使用了Embedding,获取更丰富的增强文本
- 替换:实体词典构造的部分我在people_daily训练样本之外加入了Cluener,MSRA的样本,随机对实体进行替换
- 换位:有尝试对词进行换位但效果并不好,因为输入是词粒度所以也不会对token进行换位,最终也选取了在句子级别进行随机shuffle
在增强过程中,可以调节的参数,包括每一步增强的概率(为了实现简单这里用了每个slot的独立概率,也可以尝试用联合概率, 以及和句子长度相关的条件概率),每个原始样本可以最多增强得到的新样本数。需要注意增强概率设置过高会影响整个句子的语义,增强样本数设置太高会导致全样本中准确样本占比过低,具体的参数设置需要在你的样本上测试。
以下我在people daily训练样本上进行了增强,实体替换,同义词替换,句子shuffle的增强概率分别是0.2,0.1,0.3, 最多增强样本数都是3。
在BiLSTM-CRF上测试集的Span F1从83.8%->86.8%,比上一章词表增强的各个方案中除了SoftLexicon以外的其他词表增强效果都要好。是不是很赞!只用增强训练样本哟,连词表增强需要修改NN输入和网络结构都不用做哟~
不过在BERT-CRF上没有任何提升(哈哈BERT以下寸草不生不是闹着玩的~),当然这也和我使用的增强方案本身的语义丰富程度相对有限,以及样本本身难度较低有关。如果样本是垂直领域的例如医学/金融领域的实体抽取,只是实体替换在BERT上也是会有一定效果的,有相关比赛中出现过类似的方案。
关于样本增强我们就聊这么多,其实样本增强并非只能独立使用,在实际应用时往往只是第一步,要想更好的使用增强样本,有时还需要配合Weakly-Supervised Learning,或者我们第二章已经使用过的Adversarial Training等其他模型/训练框架使用,这部分等整理好我们会单独就无标注,少标注,弱标注,半标注样本聊聊相关的解决方案~
Reference
- A Visual Survey of Data Augmentation in NLP
- A Survey of Data Augmentation Approaches for NLP
- An Analysis of Simple Data Augmentation ofr Named Entity Recognition
- EDA/ Easy Data Augmentation Techniques for Boosting Performance on Text Classification Tasks
- DAGA: Data Augmentatino with a Generation Approach for Low-resource Tagging Tasks
- https://zhuanlan.zhihu.com/p/146777068
- https://alanlee.fun/2021/09/12/data-augment-ner-nlp/
- https://www.zhihu.com/question/67472285
中文NER的那些事儿4. 数据增强在NER的尝试的更多相关文章
- 中文NER的那些事儿1. Bert-Bilstm-CRF基线模型详解&代码实现
这个系列我们来聊聊序列标注中的中文实体识别问题,第一章让我们从当前比较通用的基准模型Bert+Bilstm+CRF说起,看看这个模型已经解决了哪些问题还有哪些问题待解决.以下模型实现和评估脚本,详见 ...
- 中文NER的那些事儿2. 多任务,对抗迁移学习详解&代码实现
第一章我们简单了解了NER任务和基线模型Bert-Bilstm-CRF基线模型详解&代码实现,这一章按解决问题的方法来划分,我们聊聊多任务学习,和对抗迁移学习是如何优化实体识别中边界模糊,垂直 ...
- AI佳作解读系列(四)——数据增强篇
前言 在深度学习的应用过程中,数据的重要性不言而喻.继上篇介绍了数据合成(个人认为其在某种程度上可被看成一种数据增强方法)这个主题后,本篇聚焦于数据增强来介绍几篇杰作! (1)NanoNets : H ...
- TensorFlow之DNN(三):神经网络的正则化方法(Dropout、L2正则化、早停和数据增强)
这一篇博客整理用TensorFlow实现神经网络正则化的内容. 深层神经网络往往具有数十万乃至数百万的参数,可以进行非常复杂的特征变换,具有强大的学习能力,因此容易在训练集上过拟合.缓解神经网络的过拟 ...
- pytorch识别CIFAR10:训练ResNet-34(数据增强,准确率提升到92.6%)
版权声明:本文为博主原创文章,欢迎转载,并请注明出处.联系方式:460356155@qq.com 在前一篇中的ResNet-34残差网络,经过减小卷积核训练准确率提升到85%. 这里对训练数据集做数据 ...
- Python库 - Albumentations 图片数据增强库
Python图像处理库 - Albumentations,可用于深度学习中网络训练时的图片数据增强. Albumentations 图像数据增强库特点: 基于高度优化的 OpenCV 库实现图像快速数 ...
- (转)如何用TensorLayer做目标检测的数据增强
数据增强在机器学习中的作用不言而喻.和图片分类的数据增强不同,训练目标检测模型的数据增强在对图像做处理时,还需要对图片中每个目标的坐标做相应的处理.此外,位移.裁剪等操作还有可能使得一些目标在处理后只 ...
- 图像数据增强 (Data Augmentation in Computer Vision)
1.1 简介 深层神经网络一般都需要大量的训练数据才能获得比较理想的结果.在数据量有限的情况下,可以通过数据增强(Data Augmentation)来增加训练样本的多样性, 提高模型鲁棒性,避免过拟 ...
- 数据增强利器--Augmentor
最近遇到数据样本数目不足的问题,自己写的增强工具生成数目还是不够,终于在网上找到一个数据增强工具包,足够高级,足够傻瓜.想要多少就有多少!再也不怕数据不够了! 简介 Augmentor是一个Pytho ...
随机推荐
- adobe media encoder cc 2018无法打开,报错0xc0000005
在我这里是因为显卡的原因 下载NVIDIA然后打开NVIDIA控制面板,在里面选择软件的显卡,挨个试就行, 还不行就在设备管理器中将多余的先禁用,试一试
- Java基础系列(40)- Arrays类
Arrays类 数据的工具类java.util.Arrays 由于数组对象本身并没有什么方法可以供我们调用,但API中提供了一个工具类Arrays供我们使用,从而可以对数据对象进行一些基本的操作 查看 ...
- 一文让你彻底理解group by和聚合函数
知道group by是进行分组查询,但是一直觉得对其理解得不够透彻,在网上扒了一篇文章,我认为写得非常好. 为什么不能够select * from Table group by id,为什么一定不能是 ...
- css 圆形脉冲动画
需求: 项目需要在3D场景增加动画按钮,直接添加到场景时 当场景过大的时候 .加载比较麻烦 因在找资料时发现这玩意居然要付费.故做此记录, 效果: 参考: 1.https://www.jiangwei ...
- ssh 登录远程服务器--config配置
一.config 配置案列 Host master HostName: 39.105.61.1 Port 22 User root IdentityFile <id_rsa> 二.配置讲解 ...
- P7276-送给好友的礼物【dp】
正题 题目链接:https://www.luogu.com.cn/problem/P7276?contestId=39577 题目大意 \(n\)个点的一棵树,\(k\)个关键点,两个人从根出发分别走 ...
- 数据结构与算法——克鲁斯卡尔(Kruskal)算法
目录 应用场景-公交站问题 克鲁斯卡尔算法介绍 克鲁斯卡尔算法图解 克鲁斯卡尔算法分析 如何判断回路? 代码实现 无向图构建 克鲁斯卡尔算法实现 获取一个点的终点解释 应用场景-公交站问题 某城市新增 ...
- break和continue关键字
什么是break break 跳出最里层的循环,并且继续执行该循环下面的语句 就是强制退出循环 示例 package struct; public class ForDemo05 { public s ...
- 中国唯一入选 Forrester 领导者象限,阿里云 Serverless 全球领先
3 月 26 日消息,权威咨询机构 Forrester 发布 2021 年第一季度 FaaS 平台评估报告,阿里云函数计算凭借在产品能力.安全性.战略愿景和市场规模等方面的优势脱颖而出,产品能力位列全 ...
- 调试器地址出现大小端紊乱,引发的异常: 0xC0000005: 读取位置 0xFFFFFFFFFFFFFFFF 时发生访问冲突。
今天在编写一系列新增需求代码后,开始调试代码 发现上个版本正常可运行的代码出现了:引发的异常: 0xC0000005: 读取位置 0xFFFFFFFFFFFFFFFF 时发生访问冲突. 上个版本数代码 ...