作者:孟辉(alexmeng)
大家知道,序列标注、文本分类、句对关系判断和生成式任务并称自然语言处理四大基础技术支柱。序列标注作为最基础的语言计算任务已在命名实体识别、词性标注、分词以及属性抽取等场景中得到了广泛的应用。这里顺便提一下,我们在属性抽取方面沉淀了诸多宝贵的经验,限于文章篇幅,本文将侧重序列标注理论的阐述,业务应用将在后续文章中体现。
就我而言,认为序列标注技术的发展可以大致分为三个阶段,统计学习方法牛刀初试(HMM、CRF)、深度神经网络异军突起(BiLSTM、Attention)以及后深度神经网络纵横天下(以Transformer、BERT、XLNet为代表的后深度神经网络时代)。
统计学习方法中隐马尔科夫模型(HMM)、最大熵马尔可夫模型(MEMM)、条件随机场(CRF)等方法在序列标注任务上可以说是星光璀璨,在多领域包括语音识别、自然语言处理、文字识别、故障诊断取得了巨大的成功。
在介绍概率图统计学习方法之前,先谈谈生成模型与判别模型的区别、分类问题与序列标注任务的区别与联系,最后再探讨下什么是对数线性模型。
一般来说,监督学习方法可以分为生成方法(generative approach)和判别方法(discriminative approach),对应所学到的模型分别称为生成模型(generative model)和判别模型(discriminative model)。生成方法由数据学习联合概率分布P(X,Y),然后求出条件概率分布P(Y|X)作为预测模型,也就是生成模型:
\displaystyle\ P(X | Y) = \frac{P(X,Y)}{P(X)}\tag{0}
之所以称为生成方法,是因为模型表示了给定输入X产生输出Y的生成关系。典型的的生成模型有朴素贝叶斯法和隐马尔科夫模型(HMM)。
对应地,判别方法由数据直接学习决策函数f(X)或者条件概率分布P(Y|X)作为预测的模型,即判别模型。判别方法关系的试是对给定的输入X,应该预测什么样的输出Y。典型的判别模型包括感知机、决策树、支持向量机和条件随机场。
总的来看,在监督学习中二者各具优缺点,需在不同的场景下灵活选用:
HMM是结构最简单的动态贝叶斯网,是一种概率有向图模型,在20世纪70年提出,很快掀起了学界的研究热潮,主要用于时序数据建模,在语音识别、自然语言处理等领域有广泛的应用。HMM图结构如下图所示:
在上图中,箭头表示了变量间的依赖关系。在任一时刻,观测变量的取值仅依赖于状态变量,也就是说x\_t由y\_t确定,与其他状态变量和和观测变量的取值无关。同时,t时刻的状态y\_t仅依赖于t-1时刻的状态y\_t-1,与其余n-2个状态无关。那么在求解隐马尔科夫模型时需要确定状态转移概率、输出观测概率和初始状态概率。这里我们用 \lambda = [\boldsymbol A, \boldsymbol B, \boldsymbol \pi] 来形式化表示隐马尔科夫模型,其产生观测序列\lbrace x\_1,x\_2,\dots,x\_n\rbrace的过程描述如下:
(1)设置t=1并根据初始状态概率\pi选择初始状态y\_1;
(2)根据状态y\_t和输出观测概率B选择观测变量取值x\_t;
(3)根据状态y\_t和状态转移矩阵A转移模型状态,即确定y\_{t+1}
(4)若t\lt n,设置t=t+1,并转移到第2步,否则停止。
其中,y\_t\in \lbrace s\_1,s\_2, \dots, s\_N \rbrace和x\_t\in \lbrace o\_1,o\_2,\dots,o\_{N} \rbrace分别为第t时刻的状态和观测值。
周志华老师在《机器学习》一书中提到,在实际应用中,隐马尔科夫模型最基本的三个问题是:
不难理解,在序列标注任务中,tokens对应状态变量表示标签,观测变量即为tokens本身,完美对应上述第二种基本问题,即,如何根据观测序列推测出隐藏的模型状态。
条件随机场(CRF)是一种判别式无向图模型。CRF试图对多个变量在给定观测值后的条件概率进行建模。具体来说,若令\mathbf x=\lbrace x\_1, \dots, x\_n\rbrace为观测序列,\mathbf y=\lbrace y\_1, \dots, y\_n \rbrace为与之相应的标记序列,则条件随机场的目标是构建条件概率模型P(\mathbf y|\mathbf x)。需要注意的是,标记变量$\mathbf y$可以是结构性变量,即分量之间具有某种相关性。相应地,在自然语言处理的词性标注任务中,观测数据为文本序列或者说单词序列,标记为相应的词性序列,具有线性序列结构。
令G=\langle V,E \rangle表示节点与标记变量\mathbf y中元素一一对应的无向图,那么y\_v表示与节点v对应的标记变量,n(v)表示节点v的邻接节点,若图G的每个变量y\_v都满足马尔科夫性,即
\ P(y_v|\mathbf x, \mathbf y_{V\setminus \lbrace v \rbrace})\ =\ P(y_v|\mathbf x, \mathbf y_{n(v)})\tag{1}
则(\mathbf x, \mathbf y)构成一个条件随机场。
理论上来说,图G可具有任意结构,只要能表示标记变量之间的条件独立性关系即可。但是在现实应用中,尤其是对标记序列建模时,最常用的仍是链式条件随机场(Chain Structured CRF),结构如下图所示:
感兴趣的读者可以查询相关书籍如周志华《机器学习》来获取更多的计算推理细节。此外,上述方法如何在序列标注任务中应用,已有诸多文章和开源代码,在此也不再阐述。
随着技术的快速发展,深度学习技术异军突起,凭借无需人工构造特征、不依赖专家知识以及非线性深度拟合特性,很快激起了研究热潮,令人惊喜的是几乎在所有的序列标注权威公开数据集上(例如CoNLL 2003)击败了统计学习方法,经典的算法有BiLSTM-CRF和BiLSTM-CNNs-CRF。
据不完全统计,Zhiheng Huang等在2015年、Guillaume Lample等在2016年都对BiLSTM-CRF(Bidirectional LSTMs and Conditional Random Fields)做了比较深入的研究,总的来看其网络结构大致为:
为什么选用BiLSTM而不是LSTM,BiLSTM后为什么要加入CRF,LSTM与BiLSTM最大的区别是什么?
Long Short Term Model(LSTM)属于循环神经网络结构范畴,其优势是可以抓住长依赖信息,但无法获取反向信息。例如“北京大学每年的考生生源很好”,这里的形容词很好是对考生生源的一种修饰,而LSTM无法抓住反向信息,BiLSTM却可以获取双向语境依赖信息。也就是说BiLSTM可以在某个时刻t同时获取过去和未来依赖信息。
那么LSTM的工作原理是什么呢,其隐状态是如何计算的呢?我们通过形式化的方法展开阐述。假设在时刻t的输入为\mathbf x\_t记忆门为i\_t,神经元状态为c\_t,隐状态为h\_t、输出门为o\_t。单向LSTM的计算过程可以概括为,通过对细胞状态中信息遗忘和记忆新的信息使得对后续时刻计算有用的信息得以传递,而无用的信息被丢弃,并在每个时间步都会输出隐层状态,其中遗忘、记忆与输出由通过上个时刻的隐层状态和当前输入计算出来的遗忘门、记忆门和输出门来控制。
记忆状态计算公式如下所示:
\ \mathbf i_t = \sigma(W_{xi} \, \mathbf x_t + W_{hi} \, h_{t-1}+W_{ci}\, c_{t-1} +\mathbf b_i) \tag{2}
神经元状态c_t依赖记忆状态和当前时刻的输入,可表示为:
\ \mathbf c_t = (1- \mathbf i_t )\odot \mathbf c_{t-1}+ \mathbf i_t \odot \tanh(W_{xc} \mathbf x_t+W_{hc}h_{t-1}+\mathbf b_c) \tag{3}
那么输出状态值则是依赖当前输入、上一时刻隐状态值和神经元状态,具体形式可以表示为:
\ \mathbf o_t = \sigma(W_{xo}\mathbf x_t+W_{ho}\mathbf h_{t-1}+W_{co}\mathbf c_t +\mathbf b_o) \tag{4}
最终隐状态可以表示为:
\ \mathbf h\_t = \mathbf o\_t \odot \tanh(\mathbf c\_t)\tag{5}
上述公式是单向LSTM计算过程,不难想象双向LSTM的计算过程需要加上反向的计算过程,最终隐状态可以表示为\mathbf h\_t = [\overrightarrow{\mathbf h\_t} ,\, \overleftarrow{\mathbf h\_t} ]。
获取到双向隐状态信息\mathbf h\_t后,为什么还需要加入条件随机场呢?这是因为若采用BIO模式区分序列实体,那么各标签之间是相关的,不是独立无关的。也就是说CRF可以通过训练集学习到序列标签之间的某种限制关系,这些限制关系包括但不限于:
最后我们给出一组BiLSTM-CRF方法的一组实验对比,如下所示:
其他方法例如BiLSTM-CNNs-CRF与之类似,其模型结构如下图所示:
BiLSTM-CNNs-CRF模型可以充分利用文本序列字和词两种不同粒度的信息是其最大的亮点,字粒度信息的表示选择CNNs网络结构来实现,计算流程如下图所示:
感兴趣的同学可以自行阅读参考文献,来了解BiLSTM-CNNs-CRF形式化计算过程,本文不再阐述。
笔者认为,深度神经网络模型从异军突起到纵横天下,其中2017年Google提出的Transformer(Attention is All You Need)是重要的支点,起到了推波助澜的作用;随后2018年Google AI团队顺势推出了基于超大规模语料的BERT预训练模型,是自然语言处理领域浓墨重彩的一笔。从公开的实验数据来看BERT在XXX多项任务中拔得头筹,视为近年来NLP领域最重要的工作之一,预训练和微调过程如下图所示。
在我们的业务场景中,BERT Fine Tune取得了非常不错的效果,特别是在人物属性抽取任务中F1值超过了0.9。读过原文的读者可能注意到,纵然BERT模型具有这样那样的优点,但其本身并不是完美的,主要包括以下两点:
历史的车轮势不可挡,2019年夏天CMU和Google Brain联合推出了XLNet,在20项任务上超过了BERT的表现,例如业界知名的SQuAD、GLUE、RACE等任务。在原文中,为了解决上文中BERT模型面临的问题,XLNet通过最大化所有可能的因式分解顺序的对数似然,学习双向语境信息;并且由于其自回归性,利用乘法法则对预测tokens的联合概率执行因式分解,消除了BERT中提到的独立性假设局限性。
在此之前,有许多文章对Transformer和BERT进行阐释,本文不再赘述,这里仅对今年最新模型XLNet模型展开探讨。
无监督表征学习已经在自然语言处理领域取得了巨大的成功。在这种理念下,很多研究探索了不同的无监督预训练目标,逐渐形成两大阵营:AR(自回归语言模型:autoregressive language model)和AE(自编码语言模型:autoencoder language model)。
AR语言模型优点是可以利用自回归模型估计训练语料库的概率分布,缺点是AR模型不能获取双向语境信息(只能是单向或者双向),而自然语言理解任务往往对上下文信息十分敏感(生成式NLP任务除外),导致AR预训练模型效果不尽如人意,代表模型有ELMo和OpenAI GPT等。
若有文本序列\mathbf x = [x\_1, x\_2, ..., x\_T] ,那么AR语言模型在预训练过程中最大化期望对数似然,可以形式化表示如下:
\displaystyle \max_\theta \: \log\ p_\theta (\mathbf x) \ = \left( \sum_{t=1}^T log\,p_{\theta} (x_t | x_{\lt t}) \right) \ = \left( \sum_{t=1}^T log\,\frac{exp\left(h_\theta(\mathbf x_{1:t-1}\right))^T \, e(x_t)} {\sum_{x^{\prime}} exp(h_\theta(\mathbf x_{1:t-1}))^T \, e(x^{\prime})} \right) \ \tag{6}
上式中,h\_\theta\left(\mathbf x\_{1:t-1}\right)表示上文隐状态,e(x)是x的嵌入向量。
与之相反,AE类预训练模型不会进行明确的密度估计,而是从残缺的输入中重建原始数据,解决了双向语境信息提取问题,典型代表就是BERT预训练模型。
同样地,对于AE类模型,设有文本序列\mathbf x = [x\_1, x\_2, ..., x\_T] ,被掩盖住的tokens表示为\bar {\mathbf x},被破坏掉的文本序列表示为\hat {\mathbf x},无监督学习目标就是根据\hat {\mathbf x}去重构\bar {\mathbf x},可以形式化表示为:
\displaystyle \max\_\theta \: \log\ p\_\theta (\bar {\mathbf x} | \hat {\mathbf x}) \ \approx \left( \sum\_{t=1}^T m\_t \, log\,p\_{\theta} (x\_t | \hat {\mathbf x}) \right) \ = \left( \sum\_{t=1}^T log\,\frac{exp\left(H\_\theta(\hat {\mathbf x})\_{t}^T \, e(x\_t) \right)} {\sum\_{x^{\prime}} exp\left(H\_\theta(\hat {\mathbf x})\_{t}^T \, e(x^{\prime} \right)} \right) \tag{7}
在上式中,当m\_t=1时表示x\_t被掩盖住,H\_{\theta}表示Transformer。
那么XLNet则是基于自回归类方法,充分借鉴了AR和AE两类方法的各自优势,给出了近乎完美的解决方案。为了使XLNet可以学习双向语境,作者提出排列语言模型(Permutation Language Modeling)预训练目标。
特别地,假设有一段文本序列\mathbf x长度为T,也就是[1,2, \ldots,T ],不难算出有T!种排列方法。为了公式化表示排列语言模型,我们让Z_T表示所有排列的集合,那么优化目标可以写为:
\displaystyle\max\_\theta \:\ \mathbb{E}\_{\mathbf{z}\backsim\mathcal{Z}\_T} \left[ \sum\_ {t=1}^T \, log\,p\_{\theta} (x\_{z\_t} |\mathbf x\_{\mathbf z\lt t} ) \right]\tag{8}
需要注意的是在训练过程中所有可能的排列方式共享模型参数\theta,那么x\_t就可以看到整句话上下文中所有x\_i\not=x\_t的元素或tokens,因此我们就可以认为排列组合模型是可以抓住上下文信息,同时还避免了BERT模型存在的pretrain-finetune discrepancy缺点。
虽然排列语言模型有这么多优势,但是直接用Transformer的网络结构可能并不会有效。具体原因是什么?这里假设用标准的Softmax函数来表示条件概率分布p\_{\theta}(X\_{z\_{t}} | X\_{z\lt t}),具体如下所示:
\displaystyle \ p_{\theta}(X_{z_{t}}=x | X_{z\lt t}) \ = \ \frac{exp(e(x)^T\, h_{\theta}(\mathbf x_{z\lt t}))} {\sum{x^{\prime}\, exp(e(x^{\prime})^T\, h_{\theta}(\mathbf x_{z\lt t}))}} \tag{9}
上述公式中 h\_{\theta}(\mathbf x_{z\lt t})是\mathbf x_{z\lt t}的隐状态(通过Transformer计算得来),细心的读者可能会发现 h_{\theta}(\mathbf x_{z\lt t})与将要预测的位置z_{t}是无关的,在预测目标信息时会产生一种模糊性,这样就很难学到非常有用的语境信息。为了避免上述问题,XLNet作者提出如下形式化表示方法:
\displaystyle\ p\_{\theta}(X\_{z\_{t}}=x | X\_{z\lt t})\ =\ \frac{exp(e(x)^T\, g\_{\theta} (\mathbf x\_{z\lt t},\, z\_t ))} {\sum\_{x^{\prime}} \, exp(e(x^{\prime})^T\, g\_{\theta} (\mathbf x\_{z\lt t}, \, z\_t))}\tag{10}
上式中 g\_{\theta}(\mathbf x\_{z\lt t}, \, z\_t)是一种新的隐状态表示方法,与之前最大的区别就是融入了z\_t目标位置信息。然而计算 g\_{\theta}(\mathbf x\_{z\lt t}, \, z\_t)又是非平凡的,不要灰心,可以利用attention mask方法来解决。相较于标准的Transformer结构有两处不同的表述:
为了满足上面提到的两处表述,论文中提出了双流自注意力机制,那么双流自注意力机制工作细节是怎样的呢?
\displaystyle\ h_{z_{t}}^{(m)} = Attention(Q= h_{z_{t}}^{(m-1)}, KV= h_{\mathbf z_{\le t} }^{(m)}; \, \theta )\tag{11}
整体示意图如下所示:
Query Representation(QR)可以表示为gθ (x(z<t), zt),下文用g(zt ) 表示,与CR有明显的区别,它仅作用于上下文信息x(z<t) 和目标位置信息z_t 。
\displaystyle \ g_{z_{t}}^{(m)} = Attention(Q= g_{z_{t}}^{(m-1)}, KV= h_{\mathbf z_{\lt t}}^{(m)}; \, \theta ) \tag{12}
整体示意图如下所示:
上述公式中Q,K,V是注意力机制中常见的参数矩阵,更新和使用方法与一般无异,双流自注意力机制的计算架构如下图所示:
双流自注意力机制的实现主要是基于Transformer-XL,可能有些读者对Transformer-XL不太了解,笔者这里对上述计算过程做简单描述。
首先是初始化参数表示,对于 \forall \, t= 1,\dots, T ,h\_t=e(x\_t)且g\_t=w。这里需要注意的是XLNet通过利用Transformer-XL中片段循环机制来解决超长序列的依赖问题,因此这里需要在内存中缓存前一片段的内容信息,假设这里在内存存储了前一片段第m层隐状态向量\tilde{h}^{(m)} 。
接着利用Transformer-XL中先后利用相对位置编码和position-wise前馈计算来层层更新隐状态向量。
对于 \forall \, t=1,\dots,T 有:
\hat{h}\_{z\_t}^{(m)}=LN(h\_{z\_t}^{(m-1)}+RelAttn(h\_{z\_t}^{(m-1)},\, [\hat{h}^{m-1}, \, h\_ {z\_{\le t}}^{(m-1)}]))\tag{13}
\ h\_{z\_t}^{(m)}=LN(\hat{h}\_{z\_t}^{(m)}+PosFF(\hat{h}\_{z\_t}^{(m)}))\tag{14}
上述公式中LN表示Layer Normalization,那么对应的g\_{z\_t}^{(m)}的计算方法与h\_{z\_t}^{(m)}类似,在此不再赘述。最终的目标token概率分布可以表示为:
\displaystyle\ p\_{\theta}(X\_{z\_{t}}=x| \mathbf x\_{z\_{\lt t}})=\frac {exp(e(x)^{T}g\_{z\_{t}}^{(M)})} {\sum \_{x^{\prime}}exp(e(x^{\prime})^{T}g\_{z\_{t}}^{(M)})}\tag{15}
在上述计算过程中,读者应了解XLNet采用了Transformer-XL中相对位置编码技术和片段循环机制,详细的解释读者可自行阅读相关文章,限于篇幅,在此不做探讨。
实际上,写到这里XLNet模型的基本工作原理已经接近尾声,就像读者一样,十分关心XLNet利用文中提到的Permutation Language Modeling Objective算法是否会因为其排列复杂性而影响预训练阶段模型的收敛速度。答案是肯定的,不过作者提出可以通过限制预测tokens来降低优化难度,加快收敛速度。具体做法是,假设\mathbf z表示其中一种分解顺序(Factorization Order),我们可以将\mathbf z划分为两段,一段是不包含预测目标的序列z(≤c),另外一段是包含预测目标的子序列z(>c)。自然地,c就是分割点,此时的优化目标为:
\displaystyle\ \max\_\theta \:\ \mathbb{E}\_{\mathbf{z}\backsim \mathcal {Z}\_{T}} \left[ log\,p\_{\theta} (x\_{\mathbf z\gt\_c} |\mathbf x\_{\mathbf z\le c}) \right]\ =\ \sum\_{t=c+1}^{\lvert \mathbf z \rvert} \left[ log \, p\_{\theta} (x\_{z\_{t}} |\mathbf x\_{\mathbf z\_{\lt t}}) \right]\tag{16}
在上式中,设置超参K \approx \lvert \mathbf z \rvert / ( \lvert \mathbf z \rvert - c)。为了节省内存和加快训练速度,对于没有选择的tokens就不再计算其query representations。
论文中提到XLNet在超过20项NLP任务中碾压了BERT及多数经典模型,非常遗憾的是文章中并没有过多提及XLNet在序列标注任务的上表现。不过腾讯云知识图谱团队正在快马加鞭探索XLNet在人物属性抽取等场景的应用效果,后续也会在实战篇给大家分享出来。
目前,笔者正聚焦在中文知识图谱构建上,特别是知识抽取相关算法的研究与应用。知识抽取任务包括实体抽取、关系抽取、属性抽取和概念抽取,其中实体抽取、属性抽取以及概念抽取均可以转化成序列标注任务,由此可见序列标注是知识抽取服务的重要基石。在工具建设方面,我们初步沉淀出了知识抽取算法框架,主要包括训练和部署两大模块,并且在人物属性抽取任务上取得了不错的实验效果,具体的实验成果将会在另一篇文章中与大家见面,重要的是我们的知识抽取算法框架预计后续会在公司内部开源,感兴趣的同学请随时与我们联系。
在接下来,期望在现有知识抽取算法框架的基础上,从两方面优化提升:
(1)不断跟进最新研究进展,持续优化算法框架训练和推理性能。
(2)结合业务需求,不断丰富模型业务场景,且可私有化部署,体现其业务价值。
(3)将知识抽取算法框架开源,让更多的人了解知识图谱构建工作。
最后,限于笔者水平,不到之处请各位同仁不吝赐教,再次感谢!
*注:在文章撰写的过程中,参考了大量的资料,或列出来了或遗漏了,在此一并致谢!*
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。