用双向LSTM+CNN+CRF来端到端地解决序列标注问题,这个可以说是机器学习玩家的理想了吧,毕竟做特征是大家都头疼的事儿。如果有一个模型架构可以端到端的解决序列标注问题,这不但可以减少背景知识的学习,还能去掉数据处理的繁琐过程,这个方案可以说是非常优雅了。
0. 论文主要内容
这是一篇2016年的论文,当时做序列标注的SOA是结合了很多任务相关的手工特征的。而作者不用手工特征,而是尝试用纯分布式表示(也就是词向量),配合LSTM+CNN+CRF的模型结构来做这个问题,在Penn Treebank WSJ的语料库上做词性标注和CoNLL 2003 数据集上做命名实体识别,并且取得了SOA的效果。这项试验的成功证明了分布式表示的强大,并且可以推广到更多的序列标注任务场景。
1. 背景知识介绍
1.1 NLP领域的序列标注问题指什么
以命名实体识别为例:就是给出一段话,需要识别出里面的人名、地名、机构名的这种片段。用机器学习来做就是按照句子从左到右的输入,就是一个一个的特征输进去,输出所谓的BIO,如下图所示:
这样,就是把这个问题转化成了序列标注问题。每一个单词位置的输入都对应一个输出:要么是B,要么是I,要么是O。当然如果对名词短语进行更加细致的划分的话分类会更多,如下所示:
这好像成了一个分类问题,不过和分类问题不太一样的是BIO之间是有关系的,比如I一定是跟在B或者I后面的,I-org后面不能跟I-per。所以还要考虑到相邻词的关系,这样就不能直接套用分类问题的目标函数,而是一个所谓的联合标注问题。因此应该考虑成无向图问题,就是一个序列在这儿,怎么进行分组最合理,或者说这个序列总体是什么样最合理。那么我们假设每个单词仅和相邻的词有关系,就可以用条件随机场(conditional random field,CRF)的算法来解决。
1.2 条件随机场CRF
这个算法是一种传统的机器学习算法,可以跟HMM模型相互类比,之后会另写一篇博客来介绍。
2. 引言
语言序列标注,比如POS或者NER,是NLU深度模型的第一步,也是非常重要的一步,这一点在NLP社区中是共识。因为利用了POS和NER的输出信息,NLP系统(比如句法分析和共指消解)也变得越来越复杂。
传统模型中大部分是线性统计模型,包括HMM和CRF,这些都是严重依赖手工特征和任务专用的资源的。举例来说,英语中POS任务就非常依赖单词拼写特征,实体识别就非常依赖拼字特征和地名词典。然而,建立这些针对任务的知识所需的代价很高,也让模型难以泛化到其他类型的任务上。
最近几年分布式表示(也叫单词嵌入)+非线性的神经网络模型在NLP中大获成功。Collobert 提出了简单而有效的前馈神经网络模型,这个模型仅仅利用了窗口大小的上下文就可以独立的预测单词的标签。RNN及其变种LSTM和GRU模型在建模序列 数据上取得了非常好的效果。也有人提出了一些RNN为基础的神经网络模型来解决序列标注问题比如POS和NER,并且取得了足以匹敌传统方法的效果。然而这些神经网络模型也只是把分布式表示作为手工特征的一个补充,而不是取代手工特征。如果去掉手工特征,模型表现会下降的非常多。
本论文提出了一种神经网络模型来解决序列标注问题。这个模型是真正的端到端,没有任何额外任务专用资源、手动特征工程、或者数据预处理,只需要语料+embedding就可以。这样我们的模型就可以非常容易的泛化到其他领域或者语言的序列标注任务上。首先我们用字符级别的CNN来编码字符信息,然后把字符嵌入和单词嵌入混合到一起,喂给双向LSTM模型,来建模它的上下文信息。在Bi-LSTM之后,在加一层CRF模型来为整个序列做联合解码。我们在两个数据集上(Penn Treebank WSJ和CoNLL 2003 )评估了这个模型。这个端到端的模型比之前的传统方法效果更好,POS 达到97.55% 的精准率, NER达到91.21% 的F1。本文的贡献有:
1 提出了一种全新的语言序列标注模型
2. 在两个经典的数据集上给出了模型的评估
3. 该模型达到了新的SOA
3. 模型结构
本章节自下而上的介绍模型结构。
3.1 字符级别的CNN表示
之前的研究表明,字符级别的CNN模型可以有效的提取单词形态特征(比如前缀和后缀)。下图是我们用于抽取指定单词字符级别信息的CNN模型结构:
这个模型结构看起来跟Chiu and Nichols 的模型很像,区别在于我们只用了字符embedding作为输入,没有用字符类型特征。Srivastava在字符embedding输入到CNN之前加了dropout。
3.2 Bi-LSTM
3.2.1 LSTM单元
RNN模型家族可以通过循环图非常有效的捕捉到时间动态信息。理论上讲RNN可以解决长尾依赖问题,但是实际上由于梯度爆炸/消失,这仍然是未解决的问题。LSTM是用来解决梯度爆炸/消失问题的一个RNN的变种。基本来说,LSTM是利用三个乘法门来控制传递到下一个时间步的信息比例,其单元结构如下图所示:
更新门单元的公式如下:
σ是element-wise的sigmoid函数,○是element-wise的乘法符号,xt是输入,ht是隐状态,Ui,Uf,Uc,Uo是门单元中xt所占的比重,Wi,Wf,Wc,Wo是ht的参数矩阵。bi,bf,bc,bo是bias。我们在这个模型中并没有使用窥视孔连接。
3.2.2 Bi-LSTM
对很多序列标注问题来说,连接到前文和后文是非常有益的,然而LSTM模型的ht只能承载前文,不能得到后文信息。一个优雅而有效的实现就是Bi-LSTM,大概就是用两个隐状态来分别捕捉前向和后向信息,两个隐状态concat起来组成最后的输出。
3.3 CRF
对于序列标注问题来说,给出一段输入序列,考虑相邻词的关系和序列的联合解码是非常有益的。比如POS问题中形容词后面经常会跟一个名词而不是动词。BIO标注中,I-per后面不能跟I-org。因此我们用CRF来 建模 联合序列标注问题,而不是对每个标注独立分类。
输入序列为:
其中zi为输入序列的第i个单词。标注序列为:
其中y(z)为输入序列z对应的可能的标注序列。那么序列CRF概率模型定义了条件概率p(y|z; W; b)的形式如下:
其中:
其中Wty’y和by’y是(y’,y)对应的权重和偏差。
对于CRF的优化求解,目标函数是最大化条件似然估计(应该是MAP的意思吧,最大后验估计)。对于给定的训练集{(zi; yi)},其对数似然为:
解码则是找到最可能的输出标记序列y*,如下:
对于假定单词只和相邻单词有关的序列CRF模型来说,其训练和解码都可以使用维特比算法来进行。
3.4 Bi-LSTM + CNNs + CRF
最终我们的模型结构如下:
用字符级别的embedding作为输入捕捉字符信息,然后将其跟单词embedding concat起来作为Bi-LSTM的输入。然后Bi-LSTM的输出给到CRF模型来进行序列的联合解码。Bi-LSTM的输入和输出都加了dropout。实验表明dropout可以有效提升模型表现。
4. 模型训练
编码用的是theano,模型训练硬件是 GeForce GTX TITAN X GPU,POS耗时12小时,NER耗时8小时。
4.1 参数初始化
单词的embedding用的斯坦福的100维glove向量:http://nlp.stanford.edu/projects/glove/。这个向量是600亿的维基百科和网页数据训练得到的。作者还用了两个其他的嵌入来作对比,一个是50维的Senna,一个是300维的google的word2vec。还有一个100维随机初始化的向量。
字符embedding是随机初始化的,数据服从正态分布,其上下限为:
其中dim=30。
参数矩阵和偏置项:参数矩阵是随机初始化的正态分布,上下限为:
偏置项初始值是0,只有LSTM的遗忘门的偏置项初始化为1。
4.2 优化算法
优化算法是mini-batch的SGD,batch-size是10,动量是0.9。初始学习率POS为0.01,NER为0.015。随着epoch数不断衰减,公式为:
其中p为0.05,t为epoch数。为了缓解梯度爆炸,采用了梯度裁剪的手法。作者还试过其他复杂的优化算法,但是效果并没有更好,比如AdaDelta、Adam、RMSprop。
Early Stopping:50
Fine Tuning:作者对嵌入向量进行了精调,这种做法之前也有人证明过有效性。
Dropout:为了防止过拟合,作者在CNN的输入和Bi-LSTM的输入输出上都加了dropout。Dropout率设置为0.5。这种做法可以获得极大的性能提升。
4.3 超参调优
超参调优的结果如下图所示:
作者使用随机搜索的方式进行超参调优,但由于时间限制,作者没有搜索所有可能的参数,而是让POS和NER任务的模型共享了大部分的超参数。最终结果也是基本相同的。LSTM的状态长度为200,这个参数不会对模型效果有很大影响。CNN使用了30个filters(卷积核),窗口大小为3。
5. 实验
5.1 数据集
POS:用了 Wall Street Journal (WSJ),Penn Treebank (PTB)的一部分,包含45个POS标签。为了跟之前的研究做对比,使用了同样的划分,0-18章做训练集,19-21章做验证集,22-24章做测试集。
NER:CoNLL 2003 包含四个实体类型标签:PERSON, LOCATION, ORGANIZATION, and MISC,作者用BIOES的规则来打标签。
语料库静态统计如下:
5.2 主要结果
作者针对模型中的不同模块做了销蚀分析,去掉不同的模块结构的结果如下:
可以看到Bi-LSTM比Bi-RNN的效果好很多,而加了字符CNN的Bi-LSTM又比单纯的Bi-LSTM好很多。而加入了CRF之后,模型可以达到SOA。
这是跟其他人的研究结果的对比,可以看到效果有所提升。跟传统模型相比,作者的模型抛弃了特征工程,跟其他纯分布式表示的模型相比,作者的准确率有所提高。
5.3 单词embedding的比较
可以看到不同的embedding对模型效果在NER上的影响比较大。需要注意的是word2vec在NER的表现远低于senna和glove,可能是因为本模型不需要任何预处理,而word2vec训练时是需要对单词进行预处理导致的。
5.4 dropout
作者表示dropout可以显著提高模型表现。
5.5 OOV的预测
作者把同时出现在训练集和embedding中的单词称为IV。而OOV的情况分三种:
OOEV:在训练集却不在embedding中
OOTV:在embedding却不在训练集中
OOBV:都不在
其中两个数据集中OOV的情况为:
以下是模型训练完成后,预测结果细致划分:
可以看到,加入CRF后模型对OOBV的提升比较大。
6. 结论
本文的贡献就是做了一个真·端到端模型,无需任何特征工程和额外数据,因此模型会具有非常良好的泛化能力。并且模型还在两个数据集上取得了新的SOTA。
作者展望说,模型还可以用多任务学习的方式进一步强化,比如同时做POS和NER的训练。另外把本模型应用到社交领域的文本上也许会有好的效果,比如推特和微博,因为模型不需要任何预处理。