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

原创 2016年02月23日 19:11:46
/* 版权声明:可以任意转载,转载时请标明文章原始出处和作者信息 .*/

                                                     author: 张俊林 


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


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


再啰嗦两句,为什么说RNN一定会取代CRF?当然这不代表CRF完全会被抛弃,以后一定有人去研究怎么结合RNNCRF,这个估计也没有疑问。但是RNN取代CRF获得主流地位是一定的,原因就是上面说的DLEnd-to-End的优势。意思是,即使RNN只能取得和CRF方法类似的效果,但是由于End-to-End的优势,你不需要对研究领域有任何领域知识也能把它干好,因为有用的领域特征DL自己会去学,这个好处是巨大的(但是对于传统依靠NLP经验混饭吃的NLP老手们来说,这是个坏消息),况且目前看RNN在不少领域已经获得了最好的结果。结合这些特点,这就是为何说RNN会取代CRF成为新的主流模型的原因。


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


我觉得还在坚韧不拔地坚持用传统方法搞NLP的同志应该好好读一读我上面这几段话,里面有深意,自己去体会。


|序列标注问题


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


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


所以,其本质上是对线性序列中每个元素根据上下文内容进行分类的问题。一般情况下,对于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中的隐层单元,因为LSTMGRU对于解决长距离依赖的场景明显要优于RNN本身,接着可以上BLSTM,即双向LSTM,因为双向RNN或者双向LSTM相对RNN来说,能够看到下文特征,所以明显引入了更多的特征,如果你觉得效果还是不够好,那么可以增加BLSTM的深度,不断叠加网络形成深度BLSTM网络,当然,这里要注意,随着优化的进行,模型越来越复杂,如果训练数据规模不够的话,很可能会出现过拟合现象,所以使用LSTM的时候,记得用上DropOut以及L1/L2正则来避免过拟合,但是如果模型相对训练数据规模确实复杂,你加上这些可能也没用。至于GRULSTM两者相比,到底哪个更好目前并无定论,倾向于认为两者性能差不多,但是GRULSTM的简化模型,所以同样结构的神经网络其参数要少,在训练数据不太大情况下,优先考虑使用GRU


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


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


3. 深层双向LSTMNER


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




扫一扫关注微信号:“布洛卡区” ,深度学习在自然语言处理等智能应用的技术研讨与科普公众号。



概率图模型及序列标注

概率图模型是一类用图来表达变量相关关系的概率模型。以图作为表示工具,最常见的使用一个节点表示一个或一组随机变量,节点之间的边表示变量间的概率相关关系,即“变量关系图”。概率图模型大致分为两类: 1、贝...
  • KinboSong
  • KinboSong
  • 2017年03月14日 14:51
  • 345

CRF序列标注模型几个问题的理解

1,CRF
  • liu_zhlai
  • liu_zhlai
  • 2016年08月17日 22:06
  • 4818

HMM与序列标注

隐马尔可夫模型(Hidden Markov Model,HMM)是统计模型,它用来描述一个含有隐含未知参数(隐状态)的马尔可夫过程。其难点是从可观察的参数中(显状态)确定该过程的隐含参数(隐状态),然...
  • zbc1090549839
  • zbc1090549839
  • 2016年12月26日 16:29
  • 1718

『RNN 监督序列标注』笔记-第一/二章 监督序列标注

『RNN 监督序列标注』笔记-第一/二章 监督序列标注 监督序列标注(Supervised Sequence Labeling)与传统的监督模式分类(supervised pattern clas...
  • u012428391
  • u012428391
  • 2015年11月11日 23:58
  • 5906

TensorFlow RNN深度学习 BiLSTM+CRF 实现 sequence labeling 序列标注 源码

在TensorFlow (RNN)深度学习下 BiLSTM+CRF 跑 sequence labeling  双向LSTM+CRF跑序列标注问题 去年底样子一直在做NLP相关task,是个关于序列...
  • Scotfield_msn
  • Scotfield_msn
  • 2017年03月04日 20:32
  • 19306

TensorFlow入门(六) 双端 LSTM 实现序列标注(分词)

@author: huangyongye @creat_date: 2017-04-19 reference: - [1] 【中文分词系列】 4. 基于双向LSTM的seq2seq字标注 ...
  • Jerr__y
  • Jerr__y
  • 2017年04月22日 20:00
  • 14577

结构学习:序列标注

以序列标注为背景,介绍了隐马尔科夫模型,条件随机场模型
  • dugudaibo
  • dugudaibo
  • 2018年01月22日 11:52
  • 41

TensorFlow 使用例子-LSTM实现序列标注

本文主要改写了一下"Sequence Tagging with Tensorflow"程序。原文是基于英文的命名实体识别(named entity recognition)问题,由于博主找不到相应的中...
  • omnispace
  • omnispace
  • 2017年10月17日 06:34
  • 3636

『RNN 监督序列标注』笔记-第四章 LSTM(Long Short-Term Memory)

『RNN 监督序列标注』笔记-第四章 LSTM(Long Short-Term Memory)标准 RNN 在实际使用中能够有效利用的上下文范围很有限,这是由于经过若干次迭代,隐含层权重值要么消失要么...
  • u012428391
  • u012428391
  • 2015年11月17日 09:57
  • 6538

深度学习(三十八)初识DL在自然语言序列标注中的应用-未完待续

最近开始学习深度学习在自然语言领域的应用,于是就用了最简单粗暴的方式进行了训练、测试,先熟悉一下中文分词、词向量、context win等 #coding=utf-8 from collections...
  • hjimce
  • hjimce
  • 2016年05月01日 12:04
  • 6146
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:使用RNN解决NLP中序列标注问题的通用优化思路
举报原因:
原因补充:

(最多只允许输入30个字)