简单的NER模型实现——CRF+LSTM
记录从零到实现CRF+LSTM的整个过程
- 查找概述,了解实现的过程【1h30min】
- 建立模型【3h】
背景知识
NER
神经网络成为可以有效处理许多NLP任务的模型。这类方法对于序列标注任务(如CWS、POS、NER)的处理方式是类似的,将token从离散one-hot表示映射到低维空间中成为稠密的embedding,随后将句子的embedding序列输入到RNN中,用神经网络自动提取特征,Softmax来预测每个token的标签。
缺点在于对于token打标签的时候是独立的分类,不能够直接利用上文已经预测的标签。
为了解决这个问题,提出LSTM+CRF模型做序列标注,在LSTM层后接入CRF层来做句子级别的标签预测,使得标注过程不再是对各个token独立分类。
LSTM
信息来源:《Neural Network Methods for NLP》
LSTM,即为Long Short-Term Memory,是目前最成功的RNN架构类型之一。
从名字可以看出,其设计的主要目的是解决RNN的梯度消失问题和梯度爆炸问题。门机制能够使得与记忆部分相关的梯度保留很长时间。因此,RNN能够在更长的序列中有更好的表现。
主要手段是首次引入门机制。所谓的门机制,简单来说,就是利用一个0-1列向量,通过hadamard乘积来控制对于历史/记忆的获取。
具体来说,LSTM架构将状态向量分成两部分,一部分称之为memory cell ,被设计用来保存记忆,每次计算的时候通过忘记门向量f控制记忆的获取、通过输入门向量i控制更新的获取;另一部分称之为working memory ,隐藏状态组件。
信息来源:人人都能看懂的LSTM
图一:LSTM和普通RNN结构对比图
左边为普通的RNN结构,只有一个传递状态。
右边为LSTM结构,有两个传递状态c和h。前者改变的较慢,主要由历史经验决定;后者改变的较快,在不同节点下往往差别较大。
图二:LSTM内部结构解析
LSTM内部有三个阶段:
阶段一:忘记阶段。
简言之,从历史数据中选择最重要的。
用数学公式表示即为用作为忘记门控,来控制上一个状态哪一部分需要保留。
阶段二:选择记忆阶段。
简言之,从输入数据中选择最重要的。
用数学公式表示即为用作为输入门控,来控制输入哪一部分需要重点保留。
阶段三:输出阶段。
简言之,控制输出。
用数学公式表示即为用作为输出门控,来控制输出。
其中,门控向量的计算方法:
sigmoid函数的目的是将值映射为0-1之间,从而可以作为门向量。
模型建立
主要思路:
- 将token从离散one-hot表示映射到低维空间中成为稠密的embedding
- 将句子的embedding序列输入到LSTM中,用神经网络自动提取特征
- 用CRF做句子级别的标签预测
模型示意图:
大致可分为五层:
- Embedding层
输入:字对应的id列表以及分词信息特征
目标:将字转化为低维稠密向量
操作:预先训练好n维词向量模型,通过查询得到每一个字的n维向量。n维向量与分词信息特征向量一起输出到dropout层。 - dropout层
输入:字对应的n维向量以及分词信息特征向量
目标:缓解过拟合
操作: - bi-lstm层
输入:字对应的n维向量
目标:自动提取句子特征
操作:将每个字的char embedding序列作为bi-lstm的各个时间步的输入,再将正向LSTM输出的隐状态序列与反向LSTM的在各个位置输出的隐状态按照位置进行拼接,得到完整的隐状态序列。 - project层
线性层。
输入:bi-lstm输出的隐状态序列
目标:得到自动提取的句子特征
操作:将隐状态序列映射到标签数的维数,从而可以将每一维视作字到标签的打分值。此时如果使用softmax可以直接得到分类结果,但是没办法应用上其他位置上已经标注过的信息,所以接下来再接入一个CRF层。 - loss层
内嵌CRF层。
输入:字对于标签序列的打分
目标:句子级的序列标注
操作:重新打分;打分分成两部分,LSTM输出的打分加上CRF的转移矩阵(即由一个标签转移到另一个标签的转移得分)。得到打分之后,进而利用Softmax得到归一化之后的概率。
模型数学公式推导:
参考链接: