序列标注任务常用方法

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了序列标注任务常用方法相关的知识,希望对你有一定的参考价值。

参考技术A

HMM 中,有5个基本元素:N,M,A,B,π,结合 序列标志任务(NER) 对其的概念定义为:

而以上的这些元素,都是可以从训练语料集中统计出来的。最后根据这些统计值,应用 维特比(viterbi) 算法,算出词语序列背后的标注序列了,命名实体识别本质上就是序列标注,只需要定义好对应的标签以及模式串,就可以从标注序列中提取出实体

假设对于t时刻的一个词 公式就可写作:

齐次马尔科夫性假设:隐藏的马尔科夫链在任意时刻t的状态只依赖于其前一时刻的状态,与其他时刻的状态及观测无关,也与时刻t无关

观测独立性假设:假设任意时刻的观测只依赖于该时刻的马尔科夫链的状态,与其他观测即状态无关.观测概率的公式可以表达如下:

将发射概率和转移概率相结合,得到整个句子最后的公式:

相对于HMM,CRF有两个优势

令 是观测序列, 是状态序列, 是 CRF 模型的参数,则 的条件概率是:

其中 是 CRF 特征函数集,加上正则化项,在做对数变换就得到

CRF 训练的目的是求解令 最大化的

应用于NER中的BiLSTM-CRF模型主要由Embedding层(主要有词向量,字向量以及一些额外特征),双向LSTM层,以及最后的CRF层构成。 实验结果表明biLSTM-CRF已经达到或者超过了基于丰富特征的CRF模型,成为目前基于深度学习的NER方法中的最主流模型。 在特征方面,该模型继承了深度学习方法的优势,无需特征工程,使用词向量以及字符向量就可以达到很好的效果,如果有高质量的词典特征,能够进一步获得提高

正常 CNN 的filter,都是作用在输入矩阵一片连续的区域上,不断sliding做卷积。 dilated CNN 为这个filter增加了一个 dilation width ,作用在输入矩阵的时候,会skip所有 dilation width 中间的输入数据;而filter本身的大小保持不变,这样filter获取到了更广阔的输入矩阵上的数据, 看上去就像是膨胀了一般。 具体使用时, dilated width 会随着层数的增加而指数增加。这样随着层数的增加,参数数量是线性增加的,而 receptive field 却是指数增加的,可以很快覆盖到全部的输入数据。

图中可见感受域是以指数速率扩大的。原始感受域是位于中心点的1x1区域:

对应在文本上,输入是一个一维的向量,每个元素是一个 character embedding :

IDCNN 对输入句子的每一个字生成一个 logits ,这里就和 BiLSTM 模型输出 logits 完全一样,加入 CRF 层,用 Viterbi 算法解码出标注结果,在 BiLSTM 或者 IDCNN 这样的网络模型末端接上 CRF 层是序列标注的一个很常见的方法。 BiLSTM 或者 IDCNN 计算出的是每个词的各标签概率,而 CRF 层引入序列的转移概率,最终计算出loss反馈回网络

BERT模型+全连接层 :BERT的encoding vector通过 FC layer 映射到标签集合后,单个token的output vector经过Softmax处理,每一维度的数值就表示该token的词性为某一词性的概率。基于此数据便可计算loss并训练模型。但根据 BiLSTM+CRF 模型的启发,在 BERT+FC layer 的基础上增加 CRF layer 加入一些约束来保证最终的预测结果是有效的。这些约束可以在训练数据时被CRF层自动学习得到,从而减少预测错误的概率

BiLSTM+CRF 优点是泛化能力强;缺点是 需要大量的标注样本 。在样本很少的情况下,效果会很不理想。为了更快速地实现一个实体提取器,提高系统易用性,可以采用 迁移学习 的思想,在先验知识的基础上进行模型训练,从而使用 BERT+BiLSTM+CRF

同样的,输入是wordPiece tokenizer得到的 tokenid ,进入Bert预训练模型抽取丰富的文本特征得到 的输出向量,输出向量过 BiLSTM 从中提取实体识别所需的特征,得到 的向量,最终进入 CRF 层进行解码,计算最优的标注序列

NLP新人,欢迎大家一起交流,互相学习,共同成长~~

CTC_Loss

传统RNN序列学习任务:

  • 输入序列和输出序列之间的映射关系已经事先标注好了。
  • 由于输入序列和输出序列是一一对应的,所以RNN模型的训练和预测都是端到端的,即可以根据输出序列和标注样本间的差异来直接定义RNN模型的Loss函数,传统的RNN训练和预测方式可直接适用。

缺点:

  • 在语音识别、手写字识别等任务中,由于音频数据和图像数据都是从现实世界中将模拟信号转为数字信号采集得到,这些数据天然就很难进行“分割”,这使得我们很难获取到包含输入序列和输出序列映射关系的大规模训练样本(人工标注成本巨高,且启发式挖掘方法存在很大局限性)。因此,在这种条件下,RNN无法直接进行端到端的训练和预测。

CTC:一种RNN的端到端训练方法

1、CTC原理简介:

CTC(Connectionist Temporal Classification)算法:一种RNN(Recurrent Neural Networks)的端到端训练方法。

  • 它可以让RNN直接对序列数据进行学习,而无需事先标注好训练数据中输入序列和输出序列的映射关系。使得RNN模型在语音识别等序列学习任务中取得更好的效果。
  1. 它扩展了RNN的输出层,在输出序列和最终标签之间增加了多对一的空间映射,并在此基础上定义了CTC Loss函数
  2. 它借鉴了HMM(Hidden Markov Model)的Forward-Backward算法思路,利用动态规划算法有效地计算CTC Loss函数及其导数,从而解决了RNN端到端训练的问题
  3. 最后,结合CTC Decoding算法RNN可以有效地对序列数据进行端到端的预测

进一步分析:

  • 对音频“分割”并标注映射关系的数据依赖是不切实际的,实际情况是对音频按照时间窗口滑动来提取特征,比如按照每10毫秒音频提取特征得到一个N维数组。如下图所示

  • 由于人说话发音是连续的,且中间也会有“停顿”,所以输出序列中存在重复的元素,比如“wo3 wo3”,也存在表示间隔符号“_”。需从输出序列中去除掉重复的元素以及间隔符,才可得到最终的音节序列,比如,“wo3 wo3 ai4 _ ni3 _ zhong1 guo2 _” 归一处理后得到“wo3 ai4 ni3 zhong1 guo2”。因此,输出序列和最终的label之间存在多对一的映射关系,如下图

RNN模型本质是对𝒑(𝒛│𝒙)建模,其中x表示输入序列,o表示输出序列,z表示最终的label,o和l存在多对一的映射关系,即:𝒑(𝒛│𝒙)=sum of all P(o|x),其中o是所有映射到z的输出序列。因此,只需要穷举出所有的o,累加一起即可得到𝒑(𝒛│𝒙),从而使得RNN模型对最终的label进行建模

经过以上的映射转换,解决了端到端训练的问题,RNN模型实际上是对映射到最终label的输出序列的空间建模。然而,对每一个z都“穷举所有的o”,这个计算的复杂度太大,会使得训练速度变得非常慢,因此怎么更高效地进行端到端训练成为待解决的关键问题。

3. 问题定义

  • CTC的目标是使概率P最大化。
  • 本质上是最大似然预估, S是训练数据集,X是输入空间(由音频信号向量序列组成的集合),Z是目标空间(由声学模型建模单元序列组成的集合),L是由输出的字符集(声学建模单元的集合),且x的序列长度小于或等于z的序列长度

4. RNN输出层扩展

  • 把声学建模单元选择为字母{a-z},并对建模单元字符集{a-z}做了扩展(增加“_”空格)
  • 定义了从输出层到最终label序列的多对一映射函数,使得RNN输出层能映射到最终的label序列。多对一映射函数:1)连续相同的字符去重;2)去除空格字符;

如果要计算𝒑(𝒛│𝒙),可以累加其对应的全部输出序列(也即映射到最终label的“路径”)的概率即可,如下图。

5、CTC Loss函数定义:

※※※CTC Loss的重点:

  • 1)单条路径上,连乘每个时刻预测结果的概率.P(单条路径) = y0*y1*y2*y3......yt;
  • 2)累加所有能映射为正确结果的路径概率。P(所有正确路径)=P0+P1+P2+....Pm;假设有m条路径能映射到正确结果。
  • 3)对概率加上一个-In函数。(重点是-In的函数曲线图,概率越大,loss越小,反之概率越小,loss越大)

6. CTC Loss函数计算

暴力计算存在的问题:由于直接暴力计算 𝒑(𝒛│𝒙)(即所有正确路径)的复杂度非常高,作者借鉴HMM的Forward-Backward算法思路,利用动态规划算法求解

动态规划计算细节:

为了更形象表示问题的搜索空间,用X轴表示时间序列, Y轴表示输出序列,并把输出序列做标准化处理,输出序列中间和头尾都加上blank。

展示apple其中的一条路径:

全部合法路径:遍历所有映射为“apple”的合法路径,最终时序T=8,标签labeling=“apple”的全部路径如下图:

通过动态规划递归计算出所有路径的概率,即当前节点处的概率总和等于前面所有子路径概率相加。

P(当前节点概率综合) = [ Pi1+ Pi2 + ...] × yt

Pi为上一个状态子路径1的概率, yt为当前节点的概率,将前面所有子路径的概率相加然后再乘以当前节点的概率。

通过动态规划求解出前向概率之后,可以用前向概率来计算CTC Loss函数,如下图:

类似地方式,我们可以定义反向概率,并用反向概率来计算CTC Loss函数,如下图:

根据任意时刻的前向概率和后向概率计算CTC Loss函数,得到以下结论:

 

CTC的特征

  1. 条件独立:CTC的一个非常不合理的假设是其假设每个时间片都是相互独立的,这是一个非常不好的假设。在OCR或者语音识别中,各个时间片之间是含有一些语义信息的,所以如果能够在CTC中加入语言模型的话效果应该会有提升。
  2. 单调对齐:CTC的另外一个约束是输入X与输出Y之间的单调对齐,在OCR和语音识别中,这种约束是成立的。但是在一些场景中例如机器翻译,这个约束便无效了。
  3. 多对一映射:CTC的又一个约束是输入序列X的长度大于标签数据Y的长度,但是对于Y的长度大于X的长度的场景,CTC便失效了。

参考:https://xiaodu.io/ctc-explained/

 

 

以上是关于序列标注任务常用方法的主要内容,如果未能解决你的问题,请参考以下文章

NLP(十四)自制序列标注平台

spring mvc常用注解总结

Spring常用注解

python 之 序列 常用方法

Python-序列常用方法 + * += extend append方法区别

Node 节点常用 API 详解