自然语言处理在文本信息抽取、自动审校、智能问答、情感分析等场景下都有非常多的实际应用需求,在人工智能领域里有极为广泛的应用场景。然而在实际工程应用中,最经常面临的挑战是我们缺乏资源,往往很难有大量高质量的标注语料。
“巧妇难为无米之炊”,在缺少语料的情况下,如何达到良好的NLP应用效果,是这些场景要落地所必须解决的问题。我们通常称其为“低资源问题”,或者称为“小样本学习”问题,本文从达观数据的实践经验出发,用命名实体识别(NER)任务为例,来介绍在小标注数据量下进行NLP处理的经验和方法,希望对自然语言处理从业人员及爱好者有所启发。
经典的低资源NLP方法
在众多文本处理场景中,NER(NamedEntityRecognition,命名实体识别)又称专名识别,是最为常见的一项任务,使用的范围非常广,因此本文中我们以NER任务为例来讲解。命名实体通常指文本中具有特别意义或者指代性非常强的事物,例如人名、地名、机构名、书名、时间、以及其他专有名词等。NER的任务就是从原始的非机构化文本中自动抽取出上述实体,或者按业务需求识别出更多特定类别的实体,比如产品名称、型号、价格等。实体这个概念可以很广,只要是业务需要的特殊文本片段都可以称为实体。例如在金融行业文本中,债权人、债务人、利润总额、资产负载率等,这些特定意义的信息,都可以视为实体。
在实际应用中,由于标注数据稀少(这个原因来自很多实际条件的限制),但又期望能达到足够好的效果,在经典的机器学习方法里,往往可以通过对特征进行概率统计学习,来形成抽取模型。其具体算法思想如下:
先由工程师标定特征,通过对训练数据进行特征统计和挖掘,形成抽取模型。
下面简单举例说明,假设标注的样本数据是:
百度是一家人工智能公司→NER(公司名:百度)
需要抽取出“参加本次活动的达观数据是一家人工智能公司”这句话里的公司名。通过分词、词性标注、句法结构分析等,掌握到“参加本次活动”这样的定语修饰词,以及后续13个字,经典方法是用概率计算方法判断出现在“是人工智能公司”前面的词汇是公司名的概率。
在经典NER方法中,达观的经验是条件随机场(CRF)效果较好。条件随机场使用势函数和图结构上的团来定义条件概率P(y
x)。给定观测序列x,链式条件随机场主要包含两种关于标记变量的团,即单个标记变量{yi}以及相邻的标记变量{yi-1,yi}。在条件随机场中,通过选用合适的势函数,并引入特征函数,可以得到条件概率的定义:
其中:
tk(yi-1,yi,x,i)是定义在观测序列的两个相邻标记位置上的转移特征函数,用于刻画相邻标记变量之间的相关关系以及观测序列对它们的影响,sl(yi,x,i)是定义在观测序列的标记位置i上的状态特征函数,用于刻画观测序列对标记变量的影响,λk和ul为参数,Z为规范化因子。
可以将tk(yi-1,yi,x,i)和sl(yi,x,i)两个特征函数统一为:fk(yi-1,yi,x,i),则有:
其中:
已知训练数据集,由此可知经验概率分布
可以通过极大化训练数据的对数似然函数来求模型参数。加入惩罚项后,训练数据的对数似然函数为:
其中的σ是可以调节的惩罚权重。对似然函数L(w)中的w求偏导,令:
可以依次求出wi。在上述情况下,如果带来干扰的训练样本不多,则CRF还是可以取得尚可的效果的。但是前置的句法结构分析、词性分析等一旦出现误差,会带来连锁反应。例如“参加本次活动的”这样的定语有时需要进行剔除才能确保NER识别的精度,不得不让工程师针对每个场景进行很多繁琐的预处理和后处理工作。
深度学习与小标注数据训练
使用深度学习的优点是不需要工程师告诉算法要提取哪些特征,而是由算法从标注数据中自动学习并寻找到关键特征,再进行预测(提取)。深度学习源自经典的BP神经网络模型,一般由输入层,隐藏层,输出层组成,其中隐藏层的数目按需确定。深度学习增加了网络层数,将每一层的输出作为下一层的输入,将底层的简单特征进行多层组合抽象为高层的特征表示。NER最常使用的深度神经网络结构是长短时记忆网络LSTM(LongShortTermMemory)。长短期记忆网络的原理可见下图:
第一步,如何做长期记忆的更新?输入Ht-1和Xt,Ht-1是上一个时刻这个cell隐状态的输出,Xt是当前输入,它们两个通过这个函数计算后的输出是0-1之间的某一个值。这一步,决定上个时刻神经元状态留下的比率是多少。
第二步,上下文中获得了新的信息,不能只是把老的神经元状态更新,还要把新的信息添进去,通过这两个公式来添,第一个公式输出0-1的系数,第二个公式要选出量是多少。有了第一步和第二步之后就开始第三步神经元状态更新。
第三步,第一步的输出0-1和Ct-1相乘决定上一时刻这个神经元状态留下多少。第二步算出来系数和信息量相乘决定留下多少新增信息,然后把上一步剩下的和这一步新增的加起来,做一个更新,这个更新就是现的神经元状态值。
第四步,现在单元的状态更新完了,接下来就要输出,这个输出有两个:第一个,对外是一样,还是隐层的输出Ht。决定留下多少老的信息,决定留下多少新的信息,第二个再把老的信息和新的信息加起来就是最终的结果。
使用深度学习的方法通常需要有大量的训练数据,在小数据集下往往很难对网络结构进行充分训练。多任务学习(Multi-taskLearning)可通过端到端的学习方式,直接在当前任务中引入其他相关任务的标注信息作为监督学习的样本。年Collobert等人最早提出了NLP中应用Multi-task的思想,通过不同任务的标注数据,共同训练一个神经网络模型,来共同提升数据的综合利用程度。多任务学习可以设计为可共享网络的核心层次,在输出层对不同任务设计特定的网络结构。达观在实际使用中,也会使用Bi-LSTM和CRF结合的网络结构,效果略有提升,但受限于数据规模,并非有质的提升。
引入预训练神经网络
前面所提的方法只依赖了测试场景下已有的训练数据,而很多实际场景下获取标注语料非常困难,那为了达到好的效果还有什么不同的思路吗?这些专有名词除了出现在标注语料中,还有很多文本中也一样会出现,无论是字、词或者句子,都大量存在。所以是否可以使用其他文本中的未标注过的语料,来改进当前测试场景下的效果?这就是近年来在NLP领域大放异彩的预训练思路。而词向量(WordEmbedding)是普遍使用的方法,相比传统的对于词语进行One-Hot编码,词向量携带了更加丰富的语义信息。
字面上不相关的词在中文中有可能是非常相近甚至是同义词,如“电脑”和“计算机”,“香蕉”和“水果”,“公司”和“企业”,如果模型可以结合这些信息,能有效提高抽取的泛化能力。词向量主要的几代技术有Word2Vec,ELMO和BERT。
Word2Vec
Word2Vec是google在年推出的一个NLP工具,它的特点是将所有的词向量化。Word2Vec中最重要的两个模型是CBOW(ContinuousBag-of-Word)模型和Skip-gram(ContinuousSkip-gram)模型,两个模型都包含三层:输入层,投影层,输出层。CBOW模型的作用是已知当前词Wt的上下文环境(Wt-2,Wt-1,Wt+1,Wt+2)来预测当前词,Skip-gram模型的作用是根据当前词Wt来预测上下文(Wt-2,Wt-1,Wt+1,Wt+2)
在模型求解中,和一般的机器学习方法类似,也是定义不同的损失函数,使用梯度下降法寻找最优值。Word2vec模型求解中,使用了HierarchicalSoftmax方法和NegativeSampling两种方法。通过使用Word2vec,我们可以方便的将词转化成向量表示,让计算机和理解图像中的每个点一样,数字化词的表现。
ELMO
相同的词在不同上下文是可能有不同的含义。如“苹果”,在“我吃了一个苹果”,和“我买了一个苹果手机”两个句子下的含义完全不同。所以wordembedding对于每个词只有一个唯一的向量,是无法区分不同语义下相同词的不同含义。ELMO(EmbeddingfromLanguageModels)通过上下文来调整wordembedding的方式,可以比较好的解决这个问题。
上图展示的是其预训练过程,它的网络结构采用了双层双向LSTM,目前语言模型训练的任务目标是根据单词的上下文去正确预测单词,单词之前的单词序列称为上文,之后的单词序列称为下文。图中左端的前向双层LSTM代表正方向编码器,输入的是从左到右顺序的除了预测单词外的上文。右端的逆向双层LSTM代表反方向编码器,输入的是从右到左的逆序的句子下文。每个编码器的深度都是两层LSTM叠加。这个网络结构其实在NLP中是很常用的。
使用这个网络结构利用大量语料做语言模型任务就能预先训练好这个网络,如果训练好这个网络后,输入一个新句子,句子中每个单词都能得到对应的三个Embedding:最底层是单词的WordEmbedding,往上走是第一层双向LSTM中对应单词位置的Embedding,这层编码单词的句法信息更多一些;再往上走是第二层LSTM中对应单词位置的Embedding,这层编码单词的语义信息更多一些。所以,ELMO不仅仅学会单词的WordEmbedding,还学会了一个双层双向的LSTM网络结构。
BERT
ELMO一个非常明显的缺点在特征抽取器选择方面,ELMO使用了LSTM而不是新贵Transformer,Transformer是谷歌在17年做机器翻译任务的“Attentionisallyouneed”的论文中提出的,引起了相当大的反响,很多研究已经证明了Transformer提取特征的能力远强于LSTM。
BERT的全称是BidirectionalEncoderRepresentationfromTransformers,在机器阅读理解顶级水平测试SQuAD1.1中表现出惊人的成绩:全部两个衡量指标上全面超越人类!并且还在11种不同NLP测试中创出最佳成绩,包括将GLUE基准推至80.4%(绝对改进7.6%),MultiNLI准确度达到86.7%(绝对改进率5.6%)等。
Bert使用双向Transformer的Encoder,因为decoder是不能获要预测的信息的。模型的主要创新点都在预训练方法上,即用了MaskedLanguageModel和NextSentencePrediction两种方法分别捕捉词语和句子级别的语义。
MaskedLanguageModel(MLM)是指在训练的时候随即从输入预料上mask掉一些单词,然后通过的上下文预测该单词,该任务非常像我们在中学时期经常做的完形填空。正如传统的语言模型算法和RNN匹配那样,MLM的这个性质和Transformer的结构是非常匹配的。在BERT的实验中,15%的Token会被随机Mask掉。在训练模型时,一个句子会被多次喂到模型中用于参数学习,但是Google并没有在每次都mask掉这些单词,而是在确定要Mask掉的单词之后,80%的时候会直接替换为[Mask],10%的时候将其替换为其它任意单词,10%的时候会保留原始Token。这么做的原因是如果句子中的某个Token%都会被mask掉,那么在fine-tuning的时候模型就会有一些没有见过的单词。加入随机Token的原因是因为Transformer要保持对每个输入token的分布式表征,否则模型就会记住这个[mask]是token‘hairy’。至于单词带来的负面影响,因为一个单词被随机替换掉的概率只有15%*10%=1.5%,这个负面影响其实是可以忽略不计。
NextSentencePrediction(NSP)的任务是判断句子B是否是句子A的下文。如果是的话输出‘IsNext’,否则输出‘NotNext’。训练数据的生成方式是从平行语料中随机抽取的连续两句话,其中50%保留抽取的两句话,它们符合IsNext关系,另外50%的第二句话是随机从预料中提取的,它们的关系是NotNext。
达观数据在实践中发现,使用预训练方法,通过词嵌入,对于比较常见的字段抽取可以有明显的提升,比如人名类字段(甲方,乙方,律师,原告等),很少的标注语料就可以达到很好的效果,但对于行业性质比较强的字段,由于本身能获取到的未标注语料总量也不够大,相关字词的出现频率不够多,限制了方法的效果。
迁移学习(TransferLearning)方法
现在需要处理的任务标注样本不足,但其他相关的任务有大量的标注样本,并且有个比较好的模型。所以是否可以将大量标注样本数据的任务来优化这个样本不足任务?迁移学习就是基于这样的思路,核心思想就是将一个已经成熟的任务应用于另外一个任务。举例来说,比如采购合同往往数据量比较大,而租赁合同数据量比较小,可以用采购合同的模型来优化租赁合同的场景。
迁移学习根据迁移的知识进行分类,可以分为基于样本的迁移,基于模型的迁移,基于特征的迁移,及基于关系的迁移。
基于样本的迁移学习是根据一定的权重生成规则,对数据样本进行重用,来进行迁移学习。经典的算法是TrAdaBoost,从源场景中筛选有效数据,过滤掉与目标场景不同的数据,通过Boosting方法建立一种权重调整机制,增加有效数据权重,降低无效数据权重。
基于模型的迁移是目前比较容易落地的,前面提到的租赁合同和采购合同,达观也是基于模型的迁移进行的处理。基于模型的迁移又叫多任务学习,网络结构如下图所示,任务与任务之间共享隐藏层,保留每个任务的输出层。
基于特征的迁移方法是指将通过特征变换的方式互相迁移,来减少源场景和目标场景之间的差距;或者将源场景和目标场景的数据特征变换到统一特征空间中,然后利用传统的方法进行识别。典型的方法是迁移成分分析方法。该方法的核心内容是以最大均值差异作为度量准则,将不同数据领域中的分布差异最小化。
基于关系的迁移学习方法比较
转载请注明:http://www.0431gb208.com/sjszjzl/1215.html