面向取证产品智能客服问答系统的命名实体识别模块
2020-10-16 本文已影响0人
yousa_
介绍一下项目(不同于通常的时间、地点、组织机构命名实体识别,我们这个项目是有难度的,比如盗窃手段,采用方案等等偏语义层面)
- 项目介绍:从语料中准确识别命名性的指称项,如作案时间、地点、手段、侵害目标、损失物品等实体。
- 我的工作:命名实体识别算法研发:将字级与词级特征融合构建特征表示层,搭建BiLSTM-CRF-Att模型并进行参数调优,F1值达到84.2。主要是进行了模型选型与Fine-tune
- 创新点:①在字的基础上增加了词特征,具体做法是初始化了三个位置嵌入向量segment embedding,分别表示词头、词中、词尾,这个位置嵌入是一个初始化的查询矩阵,然后拿位置嵌入和字嵌入做一个拼接,整体作为LSTM的输入,这样模型同时学习到了分词相关的信息,有助于命名实体识别(本质上是利用了分词的边界信息),但是这样有一个潜在的问题,那就是引入了分词的误差,拿最近流行的最经典的例子:喜欢上 /一个 /人和喜欢/ 上 /一个 /人和喜欢 /上一个 /人和喜欢上/ 一个人,这涉及到认知智能领域了,这应该也是命名实体识别一大痛点!
- 创新点:①引入20维度的位置嵌入信息,相当于给模型提供了先验(为什么要加位置嵌入呢?因为我们的实际任务有许多专有名词如某某牌挖掘机、某某公园、某某牌电缆,我们需要将它加入jieba词典里,然后添加了位置嵌入可以学习到这些专有名词)②引入了attention机制,对每一个时间步的输出都做一次注意力。
- 我的工作:参与了最终工程的开发,包括接口调用等等
- 没有使用词向量,全是初始化字向量。
对于这个项目,传统的方法是怎么样的?
- 传统的最初有基于规则,基于字典的,到后面有基于机器学习结合HMM CRF的,今年来大家用基于seq2seq结构的RNN LSTM GRU做特征提取器,然后配合CRF做命名实体识别。到现在最先进的有基于注意力的Transformer,基于迁移学习的BERT。此外,最近还有多任务学习的命名实体识别。
attention怎么做的?
- ①对BiLSTM的结果(正反向拼接)先进行一个非线性变换(tanh),②然后具体地针对每个时间步初始一个单独的向量,二者进行矩阵乘运算,最后得到一个的向量,③再经过softmax得到attention向量,与原BILSTM矩阵进行乘运算。
遇到的难点?你这个模型的优点在哪?
- 一、有些词比较偏僻,是专有名词,比如AAA牌拖拉机等等,模型实体可能只分到了拖拉机三个字,针对这种问题我们引入了分词信息,在jieba词典中把这些专有名词加进去,最后在训练模型的时候,将segment embedding也作为信息输入模型中,这样相当于为模型提供了词边界信息。但是缺点就是有时候分词会出现不准的情况(分词通常只有90%准确率)(但是对本任务影响不大,因为大部分实体,分词能够分得准)
- 二、有些内容涉及到理解语义,比如盗窃手段:敲碎窗户顺手牵羊、扒开车门、撬开油箱等等,纯LSTM特征提取能力不够,所以加一层attention,增加特征提取能力。
命名实体识别的痛点是什么?
- 我认为很大的一个痛点就是在认知智能上,我们通常的命名实体识别模型(如LSTM),其实它做了两部分工作:①分词 ②实体识别,个人认为实体识别本质上是个分类任务,相对容易,但分词很难,属于认知智能,你只有在理解语义的基础上才能进行更好的分词。(涉及到强人工智能了)
你提到了多任务学习,能讲讲吗?
- 多任务学习也是希望模型同时做多个任务时,能将其他任务学到的知识,用于目标任务中,从而提升目标任务效果。
- 从本质上讲,多任务学习其实是对目标任务做了一定的约束,可以增强模型的泛化性能。
- 多任务学习有两种模式:参数的硬共享和软共享,硬共享指多个任务之间共享网络的同几层隐藏层,只不过在靠近输出的过程中分叉去做不同的任务。软共享指的是不同的任务使用不同的网络,但是不同任务的网络参数,采用距离(L1,L2)等作为约束,鼓励参数相似化。
- 多任务的核心思想是,知识在底层是想通的,它不希望模型只针对特定任务学习特定的表示,它更希望模型能学习到一些底层的、通用的知识,这样可以提升模型泛化性能,同时也方便迁移至别的任务。
-
迁移学习在源领域(即数据)和任务上学习出一般的规律(泛化知识),然后将这个规律迁移到目标领域和任务上 。而多任务学习同时学习多个相关任务,让这些任务在学习过程中共享知识,利用多个任务之间的相关性来改进模型在每个任务的性能和泛化能力 。
区别在于:①迁移学习能够适用于目标任务数据不足的情况,而多任务学习不适用。
②迁移学习通常分为两阶段:源任务上的学习阶段+目标任务上的迁移学习阶段;而多任务学习部分阶段,同时学习。(一个串行,一个并行)
③迁移学习是单向的知识迁移,希望能够提高模型在目标任务上的性能;而多任务学习是希望你提高所有任务的性能,是双向的知识迁移。 - 文本分类也可以用到多任务学习,比如说我们可以对一批数据做多种分类标准,然后进行训练啊什么的,不过如果权衡代价和利润的话,可能就不太划算了
- 对于比较难的文本分类任务,比如情感极性、观点极性这类的,那我们可以考虑将观点极性+摘要提取做多任务学习。
你在这个项目中遇到的印象最深刻的问题是什么?
- 这个命名实体识别不同于其他的,有一些涉及理解的东西,比如盗窃手段,有拉车门盗窃、打碎玻璃盗窃等等,这也是我为什么加attention的原因。
- 还有一些数据上的问题,比如案情发生地点,大多数发生在农村或者工地,发生在公园或者公共场合的不多,这类数据就少,就需要认为扩充数据,比如查当地有哪些公园然后做一个替换等。
你知道隐马尔可夫模型吗,大概介绍下?
特比算法其实是一种动态规划算法,动态规划算法通常用来解决什么问题,在HMM里是怎么使用的?
介绍一下CRF
https://zhuanlan.zhihu.com/p/44042528
B站up主视频讲解,超赞!必看!
- BILSTM的输出为每一个标签的分值,即使没有CRF层,我们也可以训练一个BiLSTM命名实体识别模型,虽然我们可以得到句子x中每个单元的正确标签,但是我们不能保证标签每次都是预测正确的。例如,标签序列是“I-Organization I-Person” and “B-Organization I-Person”,很显然这是错误的。
- CRF能从训练数据中获得约束性的规则,例如①句子中第一个词总是以标签“B-“ 或 “O”开始,而不是“I-”
②标签“B-label1 I-label2 I-label3 I-…”,label1, label2, label3应该属于同一类实体。例如,“B-Person I-Person” 是合法的序列, 但是“B-Person I-Organization” 是非法标签序列。
③标签序列“O I-label” 是非法的.实体标签的首个标签应该是 “B-“ ,而非 “I-“, 换句话说,有效的标签序列应该是“O B-label”。 - 关于CRF的损失函数,是CRF得分的计算:把发射状态得分和转移状态得分加起来作为分母,真实路径的发射和转移状态得分加起来作为分子,对其取log:
其中,,至于为什么是e,这涉及到CRF无向图里的最大团啥的,不多解释,,还不会。
其中分别是i位置的发射概率(这里发射概率说概率不妥,因为是一个个值,和并不为1)和转移概率。 -
总的公式:
log_likelihood, transition_params = tf.contrib.crf.crf_log_likelihood(inputs=crf.logits,
tag_indicies=self.labels, sequence_lengths = self.sequence_lengths)
self.loss = -tf.reduce_mean(log_likelihood)
-
由于CRF是无向图模型,且在我们命名实体识别中用的是链式CRF,所以它的最大团是这样
那么也就是当前显状态由当前隐状态和前一时刻隐状态共同决定???暂认为
HMM和CRF有什么区别?
- HMM基于两个假设:①齐次马尔科夫假设 (任意时刻的隐状态只依赖于前一时刻的隐状态)②观测独立假设(任意时刻的观测状态(即显状态)只依赖于当前时刻的隐状态)
- CRF呢?CRF全名条件随机场,条件的意思是它是判别式模型,随机场表明它是无向图模型
- CRF是判别模型,HMM是生成模型
- HMM通过发射概率求出转移概率,最后经过维特比算法求最大概率
- HMM是基于统计的,而且它假设当前状态只与上一层状态相关,不科学,并且是求全概率公式,计算量大。同时HMM认为显状态由当前隐状态决定
lstm,画了lstm的结构图,以及写了所有的公式,讲了下lstm的流程
- 一、遗忘门:首先决定从细胞状态中丢弃什么信息。
遗忘门 - 二、输入门:决定输入哪些新信息到细胞状态中
输入门 -
三、更新:将遗忘门中剩下的记忆与输入门的新记忆加起来,作为新的记忆。
更新细胞状态 - 四、输出门:基于新的细胞状态,得到输出:首先,新的细胞状态经过一个tanh的非线性映射,然后与运行一个sigmoid层,决定哪些部分要遗忘,最后进行输出,作为ht和yt
为什么RNN会出现梯度消失和梯度爆炸?
- 标准RNN结构简单,在进行反向梯度求导的过程中,但是随着时间间隔不断增大时,RNN会丧失学习到连接很远的信息能力(梯度消失),依赖于我们的激活函数和网络参数,也可能会产生梯度爆炸。梯度爆炸可以通过梯度裁剪解决。
- 具体来,其实LSTM也是会发生梯度消失的,只不过人家LSTM中细胞状态是相加的,所以它的梯度传播有很多条路径,单论每条路径,其实都是会梯度消失/爆炸的。
- 最原始的时候,LSTM是没有遗忘门的,也就是相当于遗忘门置1,不遗忘,那么这时LSTM其实相当于高速公路网络,也就是残差,由于总的远距离梯度 = 各条路径的远距离梯度之和,即便其他远距离路径梯度消失了,只要保证有一条远距离路径(就是上面说的那条高速公路)梯度不消失,总的远距离梯度就不会消失(正常梯度 + 消失梯度 = 正常梯度)。因此 LSTM 通过改善一条路径上的梯度问题拯救了总体的远距离梯度。
- 对于现在带有遗忘门的LSTM来说,遗忘门的导数通常是非0即1的,但这不影响,有可能你在A路线上是0,但是在B路线上就是1了,这体现出模型的特征选择特性。
LSTM为什么能解决梯度消失呢?
- LSTM对记忆的操作是相加的,线性的,使得不同时序的记忆对当前的影响相同,为了让不同时序的记忆对当前影响变得可控,LSTM引入了遗忘门、输入门和输出门。
lstm面对特别长的文本,有什么解决办法呢?
- 截断一部分(Padding)
- 首先预处理,删去低频词等等。
- 想法(是否可行未知)双向 LSTM,其中每个 LSTM 单元对的一部分处理输入序列的一半,在输出至层外时组合。这种方法可以将序列分为两块或多块处理。
- 想法(是否可行未知)我们还可以探索序列感知编码方法、投影法甚至哈希算法来将时间步的数量减少到指定长度。
LSTM的复杂度
- 假设输入维度为x_dim,LSTM输出维度为y_dim,那么,LSTM的复杂度就是
具体推导看这里讲的很好!(三个sigmoid门以及一个输入门中的tanh,注意:输出门中的tanh不进行矩阵变换)
我的职责:模型选型,对比,为什么要用LSTM ,为什么不用纯CRF(CRF更多是偏向于统计学,引入字向量的LSTM能学习到语义,如果出现一些错别字或者未登录词等情况,只使用CRF就不太行)
LSTM中tanh的作用
- LSTM中的tanh单元只是对数据作一次线性变换+非线性映射tanh(wx+b)以提升非线性建模的模型容量
- 此外,tanh其实也是对数据进行了一次标准化处理。
LSTM中sigmoid的作用
- sigmoid决定了哪些内容需要更新(或者说哪些内容需要丢弃)
LSTM中c和h的区别
- c可以看做一个长期的记忆,h可以看做一个短期的记忆,这里c与RNN的h更像
项目总结与思考
LSTM深度思考
- 从图上可以看出来,上面的C(细胞状态层)可以看做是长期记忆,下面的H和X可以看做是短期记忆,长短期联合,所以叫LSTM(长短期记忆网络)
梯度消失及其解决方案
- 根据链式求导和反向传播,我们很容易得出
这里C是代价函数(损失函数)
如果我们使用标准方法来初始化网络中的权重,那么会使用一个均值为0标准差为1的高斯分布。因此所有的权重通常会满足|wj|<1,而s'是小于0.25(对于sigmoid,它的导数最大为0.25)的值,那么当神经网络特别深的时候,梯度呈指数级衰减,导数在每一层至少会被压缩为原来的1/4,当z值绝对值特别大(网络层特别深)时,导数趋于0,正是因为这两个原因,从输出层不断向输入层反向传播训练时,导数很容易逐渐变为0,使得权重和偏差参数无法被更新,导致神经网络无法被优化,训练永远不会收敛到良好的解决方案。 这被称为梯度消失问题。 - 梯度消失解决方案
①batch norm,Batchnorm是深度学习发展以来提出的最重要的成果之一了,目前已经被广泛的应用到了各大网络中。batchnorm对每一层的输出(激活函数之前)进行一次缩放和变换(scale和shift),将其拉回均值为0,方差为1的标准正态分布(也不是完全标准的,还是要学习两个参数,否则模型特征就丢失了)这样使得激活输入值落在非线性函数对输入比较敏感的区域,这样输入的小变化就会导致损失函数较大的变化,使得让梯度变大,避免梯度消失问题产生,而且梯度变大意味着学习收敛速度快,能大大加快训练速度。
②换激活函数:sigmoid的本身性质使得它最大的导数也是0.25,相当于没多一层,梯度至少下降4倍,首先可以将sigmoid换成tanh,tanh的导数是,下图可以看出,其效果比sigmoid好一点
此外,可以采用ReLu作为激活函数,ReLu的导数在参数大于0的时候恒等于1,避免了梯度消失问题,此外,ReLu计算速度也快(计算机不善于做指数运算)但是ReLu的缺点在于如果参数小于0,那么导数为0,这样某些神经元可能永远不会被激活,相应的参数可能永远不会被更新。
解决这个办法也可以通过换用LeakyReLu来解决
③残差结构:自从残差提出后,几乎所有的深度网络都离不开残差的身影,相比较之前的几层,几十层的深度网络,在残差网络面前都不值一提,残差可以很轻松的构建几百层,一千多层的网络而不用担心梯度消失过快的问题,原因就在于残差的捷径(shortcut)部分,其中残差单元如下图所示:
相比较于以前网络的直来直去结构,残差中有很多这样的跨层连接结构,这样的结构在反向传播中具有很大的好处,见下式:
④LSTM:LSTM的梯度传播有很多条路径 这条路径上只有逐元素相乘和相加的操作,梯度流最稳定;但是其他路径 上梯度流与普通 RNN 类似,照样会发生相同的权重矩阵反复连乘。
注意,LSTM在最初提出的时候没有遗忘门,即为1,从而这条路径上的梯度畅通无阻,不会消失。类似于 ResNet 中的残差连接。
但LSTM为什么能缓解梯度爆炸呢?首先,LSTM的其他路径非常崎岖(见上个图),和普通RNN相比经过了多次激活函数,此外,还有一个sigmoid函数,要知道相比tanh函数,sigmoid函数的导数最大也是0.25,所以更加缓解了梯度爆炸问题。(sigmoid会带来梯度消失问题,但是LSTM已经解决了)
题外话:LSTM只是“缓解”了梯度爆炸问题,梯度爆炸仍然有可能出现(初始化太大或者),所以采用梯度裁剪等方式避免
梯度爆炸及其解决方案
- 当我们将w初始化为一个较大的值时,例如>10的值,那么从输出层到输入层每一层都会有一个的增倍,当为0.25时>2.5,同梯度消失类似,当神经网络很深时,梯度呈指数级增长,最后到输入时,梯度将会非常大,我们会得到一个非常大的权重更新,这就是梯度爆炸的问题,在循环神经网络中最为常见。
- 梯度爆炸解决方案
①好的参数初始化方式:用01正态分布(均值为0,方差为1)(但是也不能保证参数不会跑到-1,1之外的区间)
②梯度截断(梯度裁剪)将梯度限制在某个区间
③batchnorm
④正则化:对参数的大小进行限制
⑤LSTM:LSTM之所以缓解(不是彻底解决)梯度爆炸是因为他的一半路程梯度更新道路太崎岖了(某一部分),sigmoid函数加了一个tanh函数,sigmoid函数导数小于等于0.25,所以梯度爆炸不太可能发生。(但是另一半路仍然可能发生梯度爆炸,但是因为是sigmoid,所以也缓解了)