转:使用RNN解决NLP中序列标注问题的通用优化思路

http://blog.csdn.net/malefactor/article/details/50725480网络

/* 版权声明:能够任意转载,转载时请标明文章原始出处和做者信息 .*/
框架

                                                     author: 张俊林 工具

 

 

序列标注问题应该说是天然语言处理中最多见的问题,并且极可能是最而没有之一。在深度学习没有普遍渗透到各个应用领域以前,传统的最经常使用的解决序列标注问题的方案是最大熵、CRF等模型,尤为是CRF,基本是最主流的方法。随着深度学习的不断探索和发展,极可能RNN模型会取代CRF的传统霸主地位,会成为解决序列标注问题的标配解决方案。性能

 

本文主要抽象出利用RNN解决序列标注问题的通用优化思路。这个RNN优化思路应该说是使用场景很是普遍,目前NLP中绝大多数问题均可以套用这套优化思路来统一解决问题。它有个独特的好处,就是说只要你构建好完整的这一套优化模型,绝大多数NLP的问题,包括分词、词性标注、命名实体识别、关键词抽取、语义角色标注等等,等于说问题已经被解决了,只须要你使用不一样问题对应的训练数据跑一遍,就等于说上面问题的实际解决工具你就拥有了,而不用像传统模型同样还须要不判定义问题特征模板等,这就是End-to-End的好处。学习

 

再啰嗦两句,为何说RNN必定会取代CRF?固然这不表明CRF彻底会被抛弃,之后必定有人去研究怎么结合RNN和CRF,这个估计也没有疑问。可是RNN取代CRF得到主流地位是必定的,缘由就是上面说的DL的End-to-End的优点。意思是,即便RNN只能取得和CRF方法相似的效果,可是因为End-to-End的优点,你不须要对研究领域有任何领域知识也能把它干好,由于有用的领域特征DL本身会去学,这个好处是巨大的(可是对于传统依靠NLP经验混饭吃的NLP老手们来讲,这是个坏消息),何况目前看RNN在很多领域已经得到了最好的结果。结合这些特色,这就是为什么说RNN会取代CRF成为新的主流模型的缘由。优化

 

若是看未来的技术发展趋势,从目前状况看,若是再把Encoder-Decoder框架引进来,加上这篇文章讲的RNN解决序列标注问题,以及后面可能会写的用RNN解决句子分类问题的通用思路,我相信NLP中90%以上的问题均可以被这两个模型覆盖(固然Encoder-Decoder实际上和RNN不是一个层级的模型,这个咱们暂且放一边,但且把它们并列来提)。所谓:RNN在手,全都我有,此言诚不我欺也。spa

 

我以为还在坚韧不拔地坚持用传统方法搞NLP的同志应该好好读一读我上面这几段话,里面有深意,本身去体会。.net

 

 

|序列标注问题code

 

如上文所述,序列标注问题是NLP中最多见的问题,由于绝大多数NLP问题均可以转化为序列标注问题,虽然不少NLP任务看上去大不相同,可是若是转化为序列标注问题后其实面临的都是同一个问题。所谓“序列标注”,就是说对于一个一维线性输入序列:blog


给线性序列中的每一个元素打上标签集合中的某个标签

 

因此,其本质上是对线性序列中每一个元素根据上下文内容进行分类的问题。通常状况下,对于NLP任务来讲,线性序列就是输入的文本,每每能够把一个汉字看作线性序列的一个元素,而不一样任务其标签集合表明的含义可能不太相同,可是相同的问题都是:如何根据汉字的上下文给汉字打上一个合适的标签。

 

咱们以中文分词任务来讲明序列标注的过程。图1给出了个例子,假设如今输入句子“跟着TFboys学左手右手一个慢动做”,咱们的任务是正确地把这个句子进行分词。首先,把句子看作是一系列单字组成的线性输入序列,即:

 

          “跟  着 Tfboys  学  左  手  右  手  一  个  慢  动  做”

 

序列标注的任务就是给每一个汉字打上一个标签,对于分词任务来讲,咱们能够定义标签集合为:


其中B表明这个汉字是词汇的开始字符,M表明这个汉字是词汇的中间字符,E表明这个汉字是词汇的结束字符,而S表明单字词。

 

 图1. 中文分词序列标注过程

 

 

有了这四个标签就能够对中文进行分词了。这时你看到了,中文分词转换为对汉字的序列标注问题,假设咱们已经训练好了序列标注模型,那么分别给每一个汉字打上标签集合中的某个标签,这就算是分词结束了,由于这种形式不方便人来查看,因此能够增长一个后处理步骤,把B开头,后面跟着M的汉字拼接在一块儿,直到遇见E标签为止,这样就等于分出了一个单词,而打上S标签的汉字就能够看作是一个单字词。因而咱们的例子就经过序列标注,被分词成以下形式:

       {跟着  Tfboys 学 左手 右手 一个 慢动做}

 

要学习NLP,首先要把面对问题时的思惟意识转换一下,就是如上所示,把你直观感受的问题转换为序列标注思惟,这个思惟意识转换过程很重要,若是你没有这种意识,那很明显属于业余选手,专业选手看NLP问题确定首先是把它们看作一个序列标注问题的。

 

为了促进意识转换,下面再用命名实体识别(NER)问题举个序列标注解决问题的例子,命名实体识别任务是识别句子中出现的实体,一般识别人名、地名、机构名这三类实体。如今的问题是:假设输入中文句子

 

  {花园北路的北医三院里,昏迷三年的我听杨幂的爱的供养时起身关了收音机。}

 

咱们要识别出里面包含的人名、地名和机构名。若是以序列标注的角度看这个问题,应该怎么解决呢?图2给出了整个流程的说明。

 

首先,咱们把输入序列当作一个个汉字组成的线性序列,这是基础。

 

而后,咱们定义标签集合以下(这个标签用什么表明不重要,重要的是它们表明的含义):

 


其中,BA表明这个汉字是地址首字,MA表明这个汉字是地址中间字,EA表明这个汉字是地址的尾字;BO表明这个汉字是机构名的首字,MO表明这个汉字是机构名称的中间字,EO表明这个汉字是机构名的尾字;BP表明这个汉字是人名首字,MP表明这个汉字是人名中间字,EP表明这个汉字是人名尾字,而O表明这个汉字不属于命名实体。

图2. 命名实体(NER)序列标注过程

 

 

有了输入汉字序列,也有了标签集合,那么剩下的问题是训练出一个序列标注ML系统,可以对每个汉字进行分类,假设咱们已经学好了这个系统,那么就给输入句子中每一个汉字打上标签集合中的标签,因而命名实体就被识别出来了,为了便于人查看,增长一个后处理步骤,把人名、地名、机构名都明确标识出来便可。

 

不少NLP中的其它任务一样能够转换为序列标注问题,好比词性标注、CHUNK识别、句法分析、语义角色识别,甚至包括关键词抽取等不少应用问题也是如此。

 

传统解决序列标注问题的方法包括HMM/MaxEnt/CRF等,很明显RNN很快会取代CRF的主流地位,成为解决序列标注问题的标准解决方案,那么若是使用RNN来解决各类NLP基础及应用问题,有什么优化轨迹可循吗?有的,下面咱们就概括一下使用RNN解决序列标注问题的通常优化思路。

 


|使用RNN解决序列标注问题的通常优化思路

 

首先,咱们能够说,对于序列标注问题,均可以用RNN来替代传统解决方案,这个目前看没什么问题,也是大势所趋。

 

而后,若是概括的话,通常的优化流程是:首先用RNN来解决序列标注问题,而后能够上LSTM或者GRU来替代RNN中的隐层单元,由于LSTM或GRU对于解决长距离依赖的场景明显要优于RNN自己,接着能够上BLSTM,即双向LSTM,由于双向RNN或者双向LSTM相对RNN来讲,可以看到下文特征,因此明显引入了更多的特征,若是你以为效果仍是不够好,那么能够增长BLSTM的深度,不断叠加网络造成深度BLSTM网络,固然,这里要注意,随着优化的进行,模型愈来愈复杂,若是训练数据规模不够的话,极可能会出现过拟合现象,因此使用LSTM的时候,记得用上DropOut以及L1/L2正则来避免过拟合,可是若是模型相对训练数据规模确实复杂,你加上这些可能也没用。至于GRU和LSTM二者相比,到底哪一个更好目前并没有定论,倾向于认为二者性能差很少,可是GRU是LSTM的简化模型,因此一样结构的神经网络其参数要少,在训练数据不太大状况下,优先考虑使用GRU。

 

固然,根据NLP的不一样任务特色,是先上BiRNN好仍是先上LSTM好这个可能不一样任务状况不同,好比对于分词、POS、NER这种依赖不会太远的任务,RNN应该就够了,可是BiRNN确定是要上的,由于下文特征有重要参考意义,可是对于语义级别的任务好比指代消解、语义角色标注等,估计确定是要上LSTM的。因此要根据具体状况具体分析,不过通用的优化手段也不外乎以上几种。

 

下面给出深层双向LSTM来作NER的神经网络结构示意图:


图3. 深层双向LSTM作NER

 

图比较直观,就不解释了,其它的NLP序列标注任务其实均可以套用这个模型来解决。

相关文章
相关标签/搜索