Sequence Labeling Problem
上一章节我们讲到结构化学习的一种方法—结构化支持向量机,本章学习另一种结构化学习的方法—序列标注。
Sequence Labeling
Definition
![]()
f:X→Y
序列标注的问题可以理解为:机器学习所要寻找的目标函数的输入是一个序列,输出也为一个序列,并且假设输入输出的序列长度相同,即输入可以写成序列向量的形式,输出也为序列向量。该任务可以利用循环神经网络来解决,但本章节我们可以基于结构化学习的其它方法进行解决(两步骤,三问题)。
Application
![]()
命名实体识别:就是给定一个句子来识别这个句子中的人名,地名,组织名称等信息
比如:
但是对于中文的抽取很麻烦,例如下面两句要抽取人名:
Example Task:POS tagging
POS tagging:标记一个句子中每个word的词性。
词性有很多的类别,名词下面就可以分成proper(专有名词 )、common(一般名词)。动词可以分成main(主动词),modals(情态动词)等等。
![]()
现在要做的就是输入一个句子(比如,John saw the saw),系统将会标记John为专有名词,saw为动词,the为限定词,saw为名词;
词性标注是自然语言处理中非常典型和重要的task,是许多文字理解的基石,比如要先有词性标注,后续才能比较方便地做句法分析和词义消歧,或者抽key word(一般是名词),自动检测出哪些词汇是名词的话,就可以先去掉一些不可能的词汇。
![]()
如果今天找到一个字典,告诉我们说每个词汇的词性是什么,那不就解决词性标注的问题了吗?写一个hash table,hash table告诉我们说“the”的output是“D",那词性标注的问题不就解决了吗?这里困难的点是,词性标注光靠查表是不够的,要知道一整个sequence的信息才有可能把每一个word的词性找出来。
- 第一个"saw"更有可能是动词V,而不是名词N;
- 然而,第二个"saw"是名词N,因为名词N更可能跟在冠词“the”后面。
所以要把词性标注做好的话,必须考虑整个sequence的信息。
Outline(大纲)
![]()
HMM
介绍
隐马尔科夫模型(Hidden Markov Model,以下简称HMM)是比较经典的机器学习模型了,它在语言识别,自然语言处理,模式识别等领域得到广泛的应用。当然,随着目前深度学习的崛起,尤其是RNN,LSTM等神经网络序列模型的火热,HMM的地位有所下降。但是作为一个经典的模型,学习HMM的模型和对应算法,对我们解决问题建模的能力提高以及算法思路的拓展还是很好的。本文是HMM系列的第一篇,关注于HMM模型的基础。
什么样的问题需要HMM模型
首先我们来看看什么样的问题解决可以用HMM模型。使用HMM模型时我们的问题一般有这两个特征:
- 我们的问题是基于序列的,比如时间序列,或者状态序列。
- 们的问题中有两类数据,一类序列数据是可以观测到的,即观测序列;而另一类数据是不能观察到的,即隐藏状态序列,简称状态序列。
有了这两个特征,那么这个问题一般可以用HMM模型来尝试解决。这样的问题在实际生活中是很多的。比如:我现在在打字写博客,我在键盘上敲出来的一系列字符就是观测序列,而我实际想写的一段话就是隐藏序列,输入法的任务就是从敲入的一系列字符尽可能的猜测我要写的一段话,并把最可能的词语放在最前面让我选择,这就可以看做一个HMM模型了。再举一个,我在和你说话,我发出的一串连续的声音就是观测序列,而我实际要表达的一段话就是状态序列,你大脑的任务,就是从这一串连续的声音中判断出我最可能要表达的话的内容。
从这些例子中,我们可以发现,HMM模型可以无处不在。但是上面的描述还不精确,下面我们用精确的数学符号来表述我们的HMM模型。
How you generate a sentence?
![]()
我们如何生成一个句子呢?
这里主要是两个步骤:
step1:
当你想要说一句话的时候,你第一件在心里做的事情是先产生一个POS sequence,这个sequence是根据你脑中的grammar产生的(你大脑中对人类语言的理解)。
step2:
根据每一个tag(PN、V、D、N),去找一个符合tag的词汇,变成一个word sequence。文字和词性的关系可以从一个词典中得到。
step 1
当你想要说一句话的时候,你第一件在心里做的事情是先产生一个POS sequence,这个sequence是根据你脑中的grammar产生的(你大脑中对人类语言的理解)。
![]()
实际上这就是一个马尔科夫链,例如:
要说一句话,放在句首的0.5的几率是冠词,0.4的几率是专有名词,0.1的几率是动词
这里随机sample一下,假设第一个词是专有名词PN,PN后面80%几率是动词V,10%几率是冠词,10%几率直接结束。然后再随机sample一下。一直往下,直到end。
注意:每一个词后面接什么词合起来的几率应该是1,不是1就是ppt有问题。
当我们要计算"PN V D N"这样的一个序列的概率:
P("PN V D N")=0.4×0.8×0.25×0.95×0.1
step 2
根据我们脑袋中的词典,把相应的词根据词性放到相应位置。
![]()
根据每一个tag(PN、V、D、N),在词典中找一个符合tag的词汇,变成一个word sequence。
名词罐子里面有五个词,sample出John的几率是0.2,同理:得到saw的几率是0.17,the的几率是0.63,最后saw的几率是0.17,根据词性这句话出现的几率为:
P("John saw the saw"∣"PN V D N")=0.2×0.17×0.63×0.17
HMM的数学表达
![]()
HMM实际上就是在描述下面这件事情:
![]()
数学表达为:
P(x,y)=P(y)P(x∣y)
来看看右边分别怎么算的:
P(y)=P(PN∣start)×P(V∣PN)×P(D∣V)×P(N∣D)
P(x∣y)=P(John∣PN)×P(saw∣V)×P(the∣D)×P(saw∣N)
用更加一般化的数学表达HMM:
![]()
输入:x=x1,x2⋯xL
输出:y=y1,y2⋯yL
Step1 计算y的概率就是各个词性出现的条件概率积,这个条件概率称为 Transition probability(转移概率)
P(y)=P(y1∣start)×l=1∏L−1P(yl+1∣yl)×P(end∣yL)(1)
Step2 会计算x|y的概率,是词性产生word的条件概率积,这个条件概率称为 Emission probability(发散概率)
P(x∣y)=l=1∏LP(xl∣yl)(2)
写到一起:
P(y)=P(y1∣start)×l=1∏L−1P(yl+1∣yl)×P(end∣yL)×l=1∏LP(xl∣yl)(3)
那么问题来了,怎么算这两个几率呢?
Estimating the probabilities(概率估计)
![]()
怎么算转移概率、发射概率?
这个就要从训练数据中得到,先收集一大堆的训练数据(sentence),每个sentence词汇都标注好词性了。每一个sentence就是一笔training data。
![]()
那么算公式(1)中的P(yl+1∣yl)这个概率就是计算:
(s and s′ are tags )P(yl+1=s′∣yl=s)=count(s)count(s→s′)
s和s ′ 是tag(词性标签),count(s)就是在训练集中s出现的次数,count(s→s′)就是在训练集中s后面接s’的次数。
算公式(2)中的P(xl∣yl)这个概率就是计算:
(s is tag, and t is word )P(xl=t∣yl=s)=count(s)count(s→t)
s是tag,t是word,P(xl=t∣yi=s)的意思就是给一个词性,产生一个词汇的概率。count(s)就是在训练集中s出现的次数,count(s→t)在训练集中词性为s且词汇为t的次数。
讲到这里,老师解释了一下HMM在处理语音序列的时候表达式不是这样的,处理语音序列的时候,HMM里面的都是一个个高斯分布形成的GMM,不是像这里用统计的方法算出来的,GMM要用EM来解,这里不用。为什么?老师也没说,自己想。。。
How to do POS Tagging?(如何进行词性标记)
有两个上面算出来的概率之后,要做什么呢?
![]()
回到原来的问题,给一个句子x,要找y,x是我们看得到的,而y是隐藏的,这也就是为什么叫Hidden的原因!那找出y就要靠P(x,y)
用概率来说就是,在给定x 的条件下出现的几率的y 就是我们要求的y:
y=argy∈YmaxP(y∣x)
上式可以写成:
y=argy∈YmaxP(x)P(x,y)
由于分母P ( x ) 是固定的,所以上式等价于:
y=argy∈YmaxP(x,y)
这个最有可能的y就是穷举所有的y,然后带入公式P ( x , y )里面,然后找到最大的那个~!,我们把它记为y~
下面来分析一下这个做法:
Viterbi Algorithm(维特比算法)
![]()
从前面我们可以知道给定一个x真正要求的是:
y~=argy∈YmaxP(x,y)
如果是穷举所有可能的情况,那么假设现在有s个词性,sequnce长度是L,那有可能的y就是sL个!这个是非常大的数量。
但是用Viterbi Algorithm来解决这个问题,其算法时间复杂度为:O(LS2)!
那么什么是Viterbi-Algorithm算法呢?
维特比算法是一个特殊但应用最广的动态规划算法。利用动态规划,可以解决任何一个图中的最短路径问题。而维特比算法是针对一个特殊的图-篱笆网了(Lattice)的有向图最短路径问题而提出来的。它之所以重要,是因为凡是使用隐马尔科夫模型描述的问题都可以用它解码,包括当前的数字通信、语音识别、机器翻译、拼音转汉字、分词等。
更多的就不介绍了,可以看这篇文章:👉 Viterbi-Algorithm(维特比算法)
Summary(总结)
HMM的过程:
![]()
HMM也是结构化学习的一种方法,就要回答三个问题:
Q1:评估
F(x,y)=P(x,y)=P(y)P(x∣y)
该评估函数可以理解为x与y的联合概率。
Q2:推理
y~=argy∈YmaxP(x,y)
定一个x,求出最大的y,使得我们定义函数的值达到最大(即维特比算法)。
Q3:训练
从训练数据集中统计得到P(y)与P(x | y)
该过程就是计算几率的问题或是统计语料库中词频的问题。
Drawbacks(缺点)
HMM会有什么问题?
![]()
在做Q2推理的时候,我们是把让P(x,y)最大的y作为output:
y~=argy∈YmaxP(x,y)
如果我们要让HMM得到正确的结果,我们会希望正确的y~ :
(x,y^):P(x,y^)>P(x,y)
但是HMM可以做到这件事情吗?
HMM可能无法做到这件事情,在HMM训练中,你会发现它并没有保证可以让错误的y的P(x,y)一定是小的
。
可能你会很懵逼,我们这里举一个例子来说明一下:
假设从语料库中的数据是统计出来(如上图右边所示):
转移概率
- N后面接V的概率是9/10:P(V∣N)=109
- N后面接D的概率是1/10:P(D∣N)=101
分散概率
- V词性是word a的概率是1/2:P(a∣V)=21
- V词性是word c的概率是1/2:P(c∣V)=21
- D词性是word a的概率是1:P(a∣D)=1
可以看到,每一种词性的转移概率和发散概率各自的总和是1!
![]()
假设我们知道在l−1时刻词性标记为N,即yl−1=N,在 l 时刻我们看到的单词为a,现在需要求出yl=?即yl最有可能的词性是什么?
根据我们之前得到的概率,我们可以得到:
- yl=V的概率为0.9 × 0.5 = 0.45
- yl=D的概率为0.1 × 1 = 0.1
所以最有可能的词性是V
![]()
可是如果我们观察下训练数据(如上图右边所示,和我们前面看的不同之处在于加了状态P,但其他的跟前面讲的概率相同),N→V→c出现9次,P→V→a出现9次,N→D→a出现1次,那么N后面接V的概率是0.9,N后面接D的概率是0.1。V产生a的概率是0.5,产生c的概率是0.5,D产生a的概率是1。
根据训练数据,告诉我们说是V,但是你不觉得有问题吗?
在训练数据里,已经告诉你N→D→a,但是你还是预测为V,这不是很奇怪吗。
对HMM来说,它会给一些在训练数据里没出现过的sequence高的概率(例如上面例子的N→D→a)。
也就是说HMM算法只会按照概率的高低来进行估计,并不管这个序列是否出现过(HMM自己脑补了未出现过的东西)
。
但这个脑补的过程也不能说就是个坏事:
![]()
由于训练数据很少,也就是意味在真实的数据中是有可能出现训练数据中没有出现过的序列的,因此HMM在训练数据很少的时候性能反而比较好。也就是说训练数据多的时候HMM的表现并没有比较好。
隐马尔可夫模型会产生未卜先知的情况,是因为转移概率(Transition probability)和发散概率(Emission probability),在训练时是分开建模的,两者是相互独立的。因此解决这个现象就是用更加复杂的模型,把这两个东西都考虑起来,即我们也可以用一个更复杂的模型来模拟两个序列之间的可能性,但要避免过拟合!
下面要讲的CRF就是用同样的模型,解决这个问题。
Conditional Random Field (CRF,条件随机场)
![]()
CRF描述的也是P(x, y)的问题,但与条件随机场表示形式很不一样(本质上是在训练阶段不同),其几率正比于exp(w⋅ϕ(x,y)):
P(x,y)∝exp(w⋅ϕ(x,y))(1)
- ϕ(x,y)为一个特征向量;
- w是一个权重向量,可以从训练数据中学习得到;
- exp(w⋅ϕ(x,y))总是正的,
可以大于1
。所以说是概率的话就不太对,只能说和概率是成正比的。
那我们不就不知道真正的P(x,y)是什么了吗?
没关系,CRF不关心P(x,y),真正关心的是P(y|x):
P(y∣x)=∑y′P(x,y′)P(x,y)(2)
由公式(1)的正比可以得到:
P(x,y)=Rexp(w⋅ϕ(x,y))(3)
公式(2)的分母部分我们也可以得出:
y′∑P(x,y′)=y′∈Y∑Rexp(w⋅ϕ(x,y′))(4)
将公式(3)和公式(4)带入公式(2):
P(y∣x)=∑y′∈YRexp(w⋅ϕ(x,y′))Rexp(w⋅ϕ(x,y))=∑y′∈Yexp(w⋅ϕ(x,y′))exp(w⋅ϕ(x,y))(5)
分母中是对所有的y进行求和,因此和x是相互独立的,可以把公式(5)写成:
P(y∣x)=Z(x)exp(w⋅ϕ(x,y))
P(x,y) for CRF
你可能会奇怪,为什么概率会正比于两个向量的内积,跟HMM完全不一样呀!
emm…其实是一样的!🐶
<img src="https://img-blog.csdnimg.cn/20210128210001402.png"height=400/>
为什么说CRF和HMM是一样的呢?是有人证明了的,CRF只不过是training上不一样,我们来看,在HMM里面是这样计算P ( x , y ) 的:
P(x,y)=P(y1∣start)l=1∏L−1P(yl+1∣yl)P(end∣yL)l=1∏LP(xl∣yl)(1)
按乘法变加法的套路,对公式(1)的两边取对数
logP(x,y)=logP(y1∣start)+l=1∑L−1logP(yl+1∣yl)+logP(end∣yL)+l=1∑LlogP(xl∣yl)(2)
![]()
我们先来看一下上面红色方框的部分,把这一项做下整理就得到了:
l=1∑LlogP(xl∣yl)=s,t∑logP(t∣s)×Ns,t(x,y)
∑l=1L穷举所有可能的标记s和所有可能的单词t;
logP(xl∣yl)表示给定标记s的单词取对数的形式;
Ns,t(x,y)表示为单词t被标记成s的事情,在(x, y)对中总共出现的次数。
如果有10个可能的词性(s=10)和10000个词汇(t=10000),那这里就是summation ∑s,t=10∗10000 项。
可能有点难理解,这里对于上面的转换再举一个具体的例子吧:
![]()
举个例子:有一个sentence x “The dog ate the homework”,每一个word都有一个tag的label。
x:The dog ate the homeworky: D N V D N
我们来分别计算每一个pair (x, y)出现的次数(不考虑大小写):
- “the”被标记为D(冠词),这个(x,y) pair出现的次数为2次:ND,the(x,y)=2
- “dog”被标记为N(名词)的次数为1次:NN,dog(x,y)=1
- “ate”被标记为V(动词)的次数为1次:NV,ate(x,y)=1
- “homework”被标记为N(名词)的次数为1次:NN,homework(x,y)=1
- 其他词汇和词性的次数为0次:Ns,t(x,y)=0
计算下所有的概率的乘积:
l=1∑LlogP(xl∣yl)=logP(the∣D)+logP(dog∣N)+logP(ate∣V)+logP(the∣D)+logP(homework∣N)=logP( the ∣D)×2+logP(dog∣N)×1+logP(ate∣V)×1+logP(homework∣N)×1
可以看到,我们对概率对数之和整理之后,其实就可以得到下列等式:
l=1∑LlogP(xl∣yl)=s,t∑logP(t∣s)×Ns,t(x,y)(3)
对于公式(2)的其他项我们也可以做一样的转化:
![]()
其中:
第一项:
logP(y1∣start)=s∑logP(s∣start)×Nstart,x(x,y)(4)
表示对所有标记的词性s放在句首的几率取对数,再乘上在(x, y)对中,标记s放在句首所出现的次数。
第二项:
l=1∑L−1logP(yl+1∣yl)=s,s′∑logP(s′∣s)×Ns,s′(x,y)(5)
表示计算s后面的标记后面跟s’在(x, y)里面所出现的次数,再乘上s后面跟s’的几率取对数。
第三项:
logP(end∣yL)=s∑logP(end∣s)×Ns,end(x,y)(6)
表示对所有标记的词性s放在句尾的几率取对数,再乘上在(x, y)对中,标记s放在句尾所出现的次数。
![]()
将我们上面推导得到的公式(3),(4),(5),(6)带进公式(2):
logP(x,y)=logP(y1∣start)+l=1∑L−1logP(yl+1∣yl)+logP(end∣yL)+l=1∑LlogP(xl∣yl)(2)
中,就可以得到:
logP(x,y)=s,t∑logP(t∣s)×Ns,t(x,y)+s∑logP(s∣start)×Nstart,s(x,y)+s,s′∑logP(s′∣s)×Ns,s′(x,y)+s∑logP(end∣s)×Ns,end(x,y)(7)
其实看我们上面的式子,我们可以发现四项中每一个其实都是两个数相乘然后相加:
- summation over所有的tag跟word
- summation over所有的tag
- summation over所有的tag和tag
- summation over所有的tag
最后四项求和。那么近一步我们就可以将公式(7)描述成两个向量的inner product:
logP(x,y)=⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎡⋮logP(t∣s)⋮⋮logP(s∣start)⋮logP(s′∣s)⋮logP(end∣s)⋮⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎤⋅⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎡⋮Ns,t(x,y)⋮⋮Nstart,s(x,y)⋮Ns,s′(x,y)⋮Ns,end(x,y)⋮⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎤(8)
进而可以用w⋅ϕ(x,y)表示,第二个向量是依赖于(x, y)的,是(x,y)所形成的Feature,写成ϕ(x,y)。
对公式(8)两边同时取指数e:
P(x,y)=exp(w⋅ϕ(x,y))
到这里就从HMM的形式推导到CRF的形式了,说明两个是一码事,但是注意,在CRF的定义中,上面的式子不是等号是正比于∝, 这点我们前面也有提及,下面来看看为什么:
![]()
从我们上面推出的公式(8)中,我们可以得出:
w=⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎡⋮logP(t∣s)⋮⋮logP(s∣start)⋮logP(s′∣s)⋮logP(end∣s)⋮⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎤ϕ(x,y)=⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎡⋮Ns,t(x,y)⋮⋮Nstart,s(x,y)⋮Ns,s′(x,y)⋮Ns,end(x,y)⋮⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎤(9)
由上面的w向量,我们可以知道每一个权重和几率是有对应关系的,而在w中,权重其实一共分为四种,对应着公式(3),(4),(5),(6)中的每一个子项:
词性 s 时为word为 t 的概率:
ws,t=logP(xi=t∣yi=s)→P(xi=t∣yi=s)=ews,t
句首是s概率:
wstart,s=logP(s∣start)→P(s∣start)=ewstart,s
词性 s 时后面的词性为 s’ 的概率:
ws,s′=logP(yi=s′∣yi−1=s)→P(yi=s′∣yi−1=s)=ews,s′
句尾为s的概率:
ws,end=logP(end∣s)→P(end∣s)=ews,end
也就是在 w 里面,每一个weight都对应到HMM里的某个概率取 log,如果想转回概率的话,就把 w 取exp。
而w在训练的过程中,w里面的值是可正可负的,值是负的话,取exp的值是小于1的,可以解释为一个概率,但是如果exp大于1的话,就不能解释为概率了。还有就是given s(tags)后对t(word) summation ,没有办法保证和是1 (因为P(xi=t∣yi=s)取了log)。所以没办法说P(x,y)=exp(w⋅ϕ(x,y))) ,于是就改成正比。
一开始我看见上面的说法的时候,有点疑惑:根据公式(9)中的w,每一项概率P都是小于1的,那么取log后,不是一定小于0吗?为什么会可正可负呢?如果都是小于0,最后w⋅ϕ(x,y)后再取一个指数e,是一定小于1大于0的,满足概率的呀!?
想了一下,我的理解是:我们在训练的时候,w会随着训练而进行修改,而我们每次训练的时候,可能并不能保证修改后的值是一定小于1的。我们并不能按照概率的思想来想训练的时候w的变化情况!
Feature Vector
下面来看CRF的Feature Vector是什么样子,就是ϕ(x,y)这个东西,我们前面已经求出来了:
ϕ(x,y)=⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎡⋮Ns,t(x,y)⋮⋮Nstart,s(x,y)⋮Ns,s′(x,y)⋮Ns,end(x,y)⋮⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎤
我们前面也说了,ϕ(x,y)包含两个大部分:
- 第一个部分是有关tag(词性)和 word(词汇)的关系
- 第二个部分是有关tag(词性)和 tag(词性)之间的关系
又可分为四个小部分;
- 第一个部分是有关tag(词性)和 word(词汇)的关系
- 第三个部分是句子开头的tag(词性),即start 和 tag 的关系
- 第二个部分是句子中tag(词性)和 tag(词性)之间的关系
- 第四个部分是句子结尾的tag(词性),即end 和 tag的关系
下面直接看例子:
![]()
先看第一个部分,如上图右边的向量。
定义Ns,t(x,y):为词性s和词汇t在(x, y)对中出现的次数。
定义如果有S个tag,有L个可能的词汇,那向量维度就是S×L,例如有10种词性,10000个可能的词汇,那向量的长度就是100000维。
向量里面是所有词性跟所有词汇的pair,今天如果给一个(x,y)的pair,“the”标示为D出现2次的话,那向量维度D,the就对应2,没出现的pair都是0。可以想象这个向量的维度非常大,但有值的地方可能很少(稀疏)。
![]()
在第二个部分中,是如上图右边的向量。
定义NS,S′(x,y):为标记s和s’在(x, y)对中连续出现的次数。
ND,D(x,y)表示D后面出现D在(x, y)对中出现的次数,在这个例子中D和D没有接在一起过,所以次数为0;D后面接N出现过2次…
如果有S个可能的标记,其维度为S×S+2S(对所有的标记对,我们都需要一个维度,每一个标记跟start产生的对也是一个维度,每一个标记跟end所产生的对又是一个维度,因此所有标记的对为s的平方,start跟end的对为s)。
然后把part1和part2的向量接在一起作为ϕ(x,y),这个向量有它自己的含义,跟HMM想要model的东西是一样的。
但是CRF牛叉的地方在于,因为CRF把概率描述成w和ϕ(x,y)的inner product,所以这个特征向量可以不这样定义,可以自己来定义ϕ(x,y)的形式!
Training Criterion
下面来看CRF如何训练:
![]()
假设我们有一组训练数据:
{(x1,y^1),(x2,y^2),⋯(xN,y^N)}
找到一个权重向量W∗去最大化目标函数O(w);
w∗=argwmaxO(w)(1)
其中目标函数O(w)为:
O(w)=n=1∑NlogP(y^n∣xn)
表示为我们要寻找一个w,使得最大化给定的xn所产生y^n正确标记的几率,再取对数进行累加。
你会发现和交叉熵很像,交叉熵也是最大化正确维度的几率再取对数,只不过此时是针对整个序列而言的。给定一整个sequence x,我们要让正确的sequence的概率的log越大越好。
根据概率公式:
P(y∣x)=∑y′P(x,y′)P(x,y)
我们可以很容易对目标函数中的项logP(y^n∣xn)进行转换:
logP(y^n∣xn)=logP(xn,y^n)−logy′∑P(xn,y′)(2)
根据公式(1)知道我们的目标是maximize 目标函数,因此公式(2)真正要做的事情其实就是:
- 最大化logP(xn,y^n),最大化在训练数据里看到的pair (xn,y^n)的概率
- 最小化log∑y′P(xn,y′),最小化训练数据没有看到的pair的概率
因为是maximize 目标函数,我们又可以知道应该使用Gradient Ascent来更新w的数值:
![]()
Gradient descent:梯度下降里,最小化代价函数C,计算C的梯度,然后θ减去 η∇C(θ)(即往负梯度方向走):
θ→θ−η∇C(θ)
Gradient Ascent:梯度上升了,是θ加上η∇C(θ)(即往梯度方向走):
θ→θ+η∇O(θ)
上面只是通用的公式,下面来看看具体怎么弄:
![]()
先写出目标函数:
O(w)=n=1∑NlogP(y^n∣xn)=n=1∑NOn(w)
对目标函数中每一项求梯度,可以得到:
∇On(w)=⎣⎢⎢⎢⎢⎢⎢⎢⎡⋮∂On(w)/∂ws,t⋮∂On(w)/∂ws,s′⋮⎦⎥⎥⎥⎥⎥⎥⎥⎤
我们w有很多很多,有的w对应到一个tag和一个word的pair,有的w是对应两个tag的pair。
我们来看看∂ws,t∂On(w)如何计算,另外一个∂ws,s′∂On(w)是类似的,就不说了!
注意,下面的步骤有点复杂,可以跳过哦~我们后面会直接将偏导后的结果!但其实也并不复杂!
![]()
我接下里的过程过程和ppt中的过程有点不大一样,我是根据最终的目标函数来推倒的,但想法是相同的。
有前面可知,我们的目标函数中的每一项其实就是:
On(w)=logP(y^n∣xn)=logP(xn,y^n)−logy′∑P(xn,y′)
由(下面这个式子在我们将CRF开始的时候就已经说过并且证明了):
P(x,y)∝exp(w⋅ϕ(x,y))→P(x,y)=Rexp(w⋅ϕ(x,y))
进一步推导:
On(w)=logRexp(w⋅ϕ(x,y^n))−logR∑y′exp(w⋅ϕ(xn,y′))=logexp(w⋅ϕ(x,y^n))−logR−logy′∑exp(w⋅ϕ(xn,y′))+logR=w⋅ϕ(x,y^n)−logy′∑exp(w⋅ϕ(xn,y′))(1)
上式中,最后的结论的第一项其实可以化为:
w⋅ϕ(x,y^n)=s,t∑ws,t⋅Ns,t(xn,y^n)+s,s′∑ws,s′⋅Ns,s′(xn,y^n)(2)
其实,也很好理解,因为我们的权值和特征总体上分为两大类,前面有介绍,我们这里就以ws,t来计算,另一个ws,s′也是类似的!
现在来对公式(1)求梯度(偏导):
∂ws,t∂On(w)=∂ws,t∂w⋅ϕ(x,y^n)+∂ws,t∂log∑y′exp(w⋅ϕ(xn,y′))(3)
因此,根据公式(2),我们公式(3)的第一项就是:
∂ws,t∂w⋅ϕ(x,y^n)=Ns,t(xn,y^n)(4)
![]()
上面我们已经将公式(3)的第一项求导的结果算出来了,就是(4),因此现在我们现在要计算公式(3)的第二项:
∂ws,t∂log∑y′exp(w⋅ϕ(xn,y′))=∑y′exp(w⋅ϕ(xn,y′))1⋅∂ws,t∂∑y′exp(w⋅ϕ(xn,y′))=∑y′exp(w⋅ϕ(xn,y′))1⋅y′∑exp(w⋅ϕ(xn,y′))⋅ϕ(xn,y′)=y′∑∑y′exp(w⋅ϕ(xn,y′))exp(w⋅ϕ(xn,y′)))⋅Ns,t(xn,y′)=y′∑P(xn)P(xn,y′)⋅Ns,t(xn,y′)=y′∑P(y′∣xn)⋅Ns,t(xn,y′)(5)
将公式(4)和公式(5)带入公式(3),可以求出梯度为:
∂ws,t∂On(w)=∂ws,t∂w⋅ϕ(x,y^n)+∂ws,t∂log∑y′exp(w⋅ϕ(xn,y′))=Ns,t(xn,y^n)+y′∑P(y′∣xn)⋅Ns,t(xn,y′)
至此证明完毕!
前面没看懂也没事,主要是这个结论:
![]()
∂ws,t∂On(w)=Ns,t(xn,y^n)+y′∑P(y′∣xn)⋅Ns,t(xn,y′)
- 第一项是word t被标识为tag s,在pair (xn,y^n)中出现的次数
- 第二项是,summation over所有可能的y ,summation 中每个term是(word t被标识为tag s在xn跟任意一个y的pair中出现的次数)乘上 (给定xn 后任意一个y的概率),y是所有可能出现的sequence,所以非常多。
算出来偏微分的结果,是要跟ws,t 做相加,第一项和第二项是互相对抗的
- 第一项,如果算出来是正的,参数就会增加,算出来是负的,参数就会减少。这个式子告诉我们,如果s,t 这个pair在正确的训练数据(xn,y^n)中出现的次数越多,那ws,t就会越大。
- 第二项告诉我们,如果s,t这个pair在任意一个(xn,y)pair里出现的次数很多的话,那ws,t应该变小
如果s,t在正确答案里出现的很多,那对应的ws,t就会增加,但是如果不只是在正确答案里出现的次数多,在随便哪个y跟 xn pair里出现的次数也多的话,就应该减小ws,t。
今天你要在第二项summation over所有可能的y,可能会卡住,不知道怎么算。但没有关系,这个也可以用维特比算法算。
![]()
之前是算了某一个w的偏微分,现在对整个w的偏微分向量就是(正确的y^ 形成的特征向量)-(任意y’形成的特征向量∗y’的条件概率):
▽O(w)=ϕ(xn,y^n)−y′∑P(y′∣xn)ϕ(xn,y′)
如果我们把随机梯度上升的式子列出来的话
- 每次都取一笔数据(xn,y^n) :
w→w+η(ϕ(xn,y^n)−y′∑P(y′∣xn)ϕ(xn,y′))
Inference
![]()
把ww向量算出来后,就可以做Q2:推理 了!
我们知道现在要做的事情是,给一个x,找一个y让P(y∣x)最大,在HMM里已经知道,等同于最大化P(y∣x)。在CRF里又知道,P(y∣x)是正比于exp(w⋅ϕ(x,y)),代进去等同于是最大化w⋅ϕ(x,y):
y=argy∈YmaxP(y∣x)=argy∈YmaxP(x,y)=argy∈Ymaxw⋅ϕ(x,y)
也可以用维特比算法做。
CRF vs HMM
![]()
我们知道说,如果要得到正确的答案,会希望:
(x,y^):P(x,y^)>P(x,y)
CRF是增加P(x,y^),减小P(x,y),所以CRF更有可能得到正确的结果。
举例来说,用之前HMM的例子:
根据训练数据,HMM给了如上图左下方所示的结果(直接统计来的),HMM说yi应该是V:
P(V∣N)⋅P(a∣V)=0.45>P(D∣N)⋅P(a∣D)=0.1
但你会发现这种情况在我们的训练数据(上图左下角)中并没有出现过!
但是CRF不关心概率,就是调整w参数使得正确的(x,y) pair的分数比较大。所以CRF可能调来调去,使得P(a|V)到0.1,使得yi可能是D:
P(D∣N)⋅P(a∣D)=0.1>P(V∣N)⋅P(a∣V)=0.09
Synthetic Data(合成数据)
![]()
以下是一个综合的实验,比较CRF和HMM有什么不一样。
在这个实验里面,input是小写的a到z ,output是大写的A到E:
xi∈{a−z},yi∈{A−E}
然后我们要生成一些人工数据,这些数据使用HMM生成的,但用的不是一般的HMM,用的是一个mixed-order HMM(混合顺序隐马尔科夫模型)
。
转移概率是:
αP(yi∣yi−1)+(1−α)P(yi∣yi−1,yi−2)
如果α=1,则后面一项是0,就是一般的HMM的转移概率。今天α 的值可以任意调整,考虑一个order的比率大,还是两个order的比率大。
发射概率是:
αP(xi∣yi)+(1−α)P(xi∣yi,xi−1)
如果α=1,也就是一般的HMM。
比较HMM和CRF(都是一般的HMM和CRF),HMM只考虑一个order(α=1的状况) 。
一般而言,如果α 越小,那么跟一般的HMM和CRF差距越大,得到的performance越差。但是我们想要知道在这种情况下,到底是HMM坏得比较厉害,还是CRF坏得比较厉害。
![]()
上图是实验的结果,每个圈圈是不同的α 得到的结果。从左下到右上代表α 由大到小,每个点都做HMM和CRF的实验,横轴和纵轴代表HMM和CRF犯错的百分比。
可以想象如果一个点在45度角的右侧,代表说HMM犯得错多,CRF犯得错少。从实验结果可以发现,非实心的点是α>21,接近一般的HMM或者CRF,在这个状况下HMM是比CRF好的,也不用意外,因为数据是从HMM产生的,所以HMM的假设更贴近数据的产生方式。α<21时,也就是数据的产生方式和HMM、CRF的假设都不合时,这时候CRF就会比HMM好。因此此时HMM只能按照概率,而CRF会调整参数去fit数据,就算有些假设没有被model在CRF里面,也可以借由调整参数考虑到这些假设,所以当你的模型和数据背后的假设不合时,CRF的表现就会比较好。
Summary
![]()
上图是CRF的总结。CRF也是一个结构化学习的方法,解决了3个问题。
Q1:评估
F(x,y)是P(y|x):
F(x,y)=P(y∣x)=∑y′∈Yexp(w⋅ϕ(x,y′))exp(w⋅ϕ(x,y))
Q2:推理
找使w⋅ϕ(x,y)最大的y~ ,利用维特比算法求解:
y~=argy∈YmaxP(y∣x)=argy∈Ymaxw⋅ϕ(x,y)
Q3:训练
一般文献是写成相乘:
w∗=argwmaxn=1∏P(y^n∣xn)
但是也可以取log,变成相加(这中形式也是我们前面所讲的):
w∗=argwmaxn=1∑NlogP(y^n∣xn)
使用梯度上升求解w:
w→w+η⎝⎛ϕ(xn,y^n)−y′∑P(y′∣xn)ϕ(xn,y′)⎠⎞
Structured Perceptron/SVM
Structured Perceptron
![]()
也是那三个问题吧,我们前面已经讲烂了~:
Q1:评估
F(x,y)=w⋅ϕ(x,y)
你可以会说,如果x,y都是sequence的话,这个ϕ()应该定成什么样子?
可以选择自己喜欢的方式
,最简单的方式就是拿CRF的形式做就好了。
Q2:推理
y~=argy∈Ymaxw⋅ϕ(x,y)
一样使用维特比算法求解。
Q3:训练
对所有的训练数据n,和所有不等于y^的y,我们希望让w⋅ϕ(xn,y^n)大于w⋅ϕ(xn,y):
∀n,∀y∈Y,y=y^n: w⋅ϕ(xn,y^n)>w⋅ϕ(xn,y)
这件事在结构化感知机里,我们会找一个y~(根据目前的w,让式子最大):
y~n=argymaxw⋅ϕ(xn,y)
接下来更新w:
w→w+ϕ(xn,y^n)−ϕ(xn,y~n)
Structured Perceptron vs CRF
![]()
你有没有觉得结构化感知机w更新很眼熟呢,和CRF的梯度上升很像?
在CRF梯度上升里,如果忽略掉η (学习率),那跟结构化感知机一样都有两项(绿色线项和紫色线项)。绿色项是一样的,紫色项虽然看起来不一样,但其实是很有关系的:
Structured Perceptron里则是某一个y~ 的特征向量,而y~ 可以让w⋅ϕ(xn,y)最大,y~ 其实就是让概率P(y∣xn)最大y:
y~n=argmaxyw⋅ϕ(xn,y)ϕ(xn,y~n)
这一项也叫做Hard(硬范畴)
!
CRF里是summation over所有的y的特征向量,再做weight sum:
y′∑P(y′∣xn)ϕ(xn,y′)
这一项也叫做Soft(软范畴)
!
所以Structured Perceptron是减去Hard(硬范畴):
y~n=argmaxyw⋅ϕ(xn,y)w→w+ϕ(xn,y^n)−ϕ(xn,y~n)
而CRF是Soft(软范畴):
w→w+η⎝⎛ϕ(xn,y^n)−y′∑P(y′∣xn)ϕ(xn,y′)⎠⎞
可以想象说,如果所有y里面,只有一个y是概率为1的,其他y概率都是0,那么结构化感知机和CRF就是等价的。
Structured SVM
![]()
也是那三个问题吧,前面两个和Structured Perceptron一样的:
Q1:评估
F(x,y)=w⋅ϕ(x,y)
你可以会说,如果x,y都是sequence的话,这个ϕ()应该定成什么样子?
可以选择自己喜欢的方式
,最简单的方式就是拿CRF的形式做就好了。
Q2:推理
y~=argy∈Ymaxw⋅ϕ(x,y)
一样使用维特比算法求解。
Q3:训练
这里和Structured Perceptron是不一样的!
在SVM里面,我们会加上margin和error的概念,有两个方法求解:
- 采用梯度下降法
- QP二次规划问题,因为限制条件过多,所以采用切割平面算法
Structured SVM – Error Function
![]()
结构化SVM里面有个特别的地方,是要考虑error这件事情。我们把误差函数写成Δ(y^n,y):
计算y和正确的y^n之间不一样的程度(y和y^n之间的差异性)
结构化SVM的成本函数是Δ(y^n,y)的上界,所以最小化成本函数相当于最小化Δ(y^n,y)
理论上,Δ(y^n,y)可以是任何函数
但是,必须考虑,今天再使用结构化SVM的时候,不管是使用梯度下降,还是使用切割平面算法,都要面对一个问题2.1(穷举所有y让Δ(y^n,y)+w⋅ϕ(xn,y)最大):
yˉn=argymax[Δ(y^n,y)+w⋅ϕ(xn,y)]
这个不一定解得出来,如果Δ 定得比较复杂的话。上图最下方是一个可以解的例子,如果把两个sequence之间的Δ 定义成错误率的话(不一样label个数/sequence长度),这样就可以解。
不同方法的比较
![]()
上图是不同方法在POS Tagging上实验的比较:
上图下方是另外一个实验:命名实体识别。命名实体识别类似于POS词性标记,在实验中:
- 结构化支持向量机模型表现最好;
- 隐马尔科夫模型表现最差。
为什么不用RNN
![]()
刚才讲的这种序列标注的问题,你可以用RNN,LSTM来解,也可以用HMM、CRF、结构化感知机和SVM来解。那到底哪一个比较好呢?
RNN,LSTM
- 有个缺点是,如果你用的是单向RNN或者LSTM的话,并没有看过整个sequence。也就是在单向RNN里,产生第tt个时间点的output时,你只考虑了时间1到时间t的input,没有考虑时间t+1到时间T的input。那用双向RNN会怎么样呢?还没有在文献上看到过,双向RNN跟用维特比算法算出来的结果,有什么差异。
- RNN、LSTM有足够的的训练数据,或许可以把label依赖关系学习出来。
- 还有个问题是cost和你要的error不见得是有关系的。比如我们希望错误率最低,训练RNN的时候是最小化cost函数,最小化cost函数不一定能降低错误率。
- 有个传统方法无法比拟的优点,就是
可以deep(叠很多层)
HMM、CRF、结构化感知机/SVM
- 在产生结果的时候,都是做维特比算法(穷举所有的sequence,看哪个最可能),在计算分数的时候是看过整个sequence的,这个和单向RNN不同。
- 可以明确地考虑output的sequence,label跟label之间的关系。假设你今天知道output的sequence里面,a跟b这两个元素不可能同时出现,你可以轻易的把这件事情塞到维特比算法中去。比如语音识别里面,中文都是声母接韵母,声母后面不能再接声母,那你可以把这种约束塞到维特比算法中去。在做维特比算法时,一边穷举所有的sequence,一边过滤掉不可能的sequence。比如只穷举声母接韵母的sequence,丢掉声母接声母的sequence。 这样就可以把sequence里面的label的依赖关系明确地描述在我们的model里面。
- 如果使用结构化SVM,那你最小化的cost函数就是要的错误函数的上界,让你觉得训练的时候比较安心,当你的cost函数逐渐减小的时候,你的error很有可能也是逐渐减小的。
虽然传统方法有很多有点,但没什么卵用,RNN、LSTM的deep真的太强了!
所以总结的说:结构化学习你白学了!!!🐶
![]()
把传统方法和深度学习整合在一起
![]()
可以把深度学习方法和传统方法加起来。
- model的底层是RNN、LSTM,可以deep
- model的浅层可以使HMM、CRF、结构化感知机/SVM
可以发挥它们的优势:可以明确描述依赖关系,使用结构化SVM的话,cost函数还是error的上界。现在基本上好的方法就是底层架构是deep的方法。
![]()
以语音识别举例:卷积神经网络/循环神经网络或长短时记忆网络/深度神经网络 + 隐马尔可夫模型。如上图所示:
根据HMM的model,P(x,y)如上图所示的公式:
P(x,y)=P(y1∣start)l=1∏L−1P(yl+1∣yl)P(end∣yL)l=1∏LP(xl∣yl)
把HMM的P(xl∣yl) 用DNN、RNN、LSTM得到的结果替换。RNN或DNN可以把一个input xl变成一个概率的分布(P(a∣xl),P(b∣xl),P(c∣xl),⋯),可以把这个概率分布替换掉HMM的P(xl∣yl)。
可能你会觉得HMM是给定y,而RNN里是给定x,方向不一致,但可以做一下改变,如上图右下方所示:
P(xl∣yl)=P(yl)P(xl,yl)=P(yl)P(yl∣xl)
P(yl∣xl) 就是RNN的output,P(yl) 是label出现的概率(直接从训练数据统计),还有P(xl) ,训练数据每个特征都只有一个啊,怎么计算概率呢?就不要管它,真正在用HMM做Q2推理的时候,是给定x,看哪个y最有可能,不管x的值是多少,都不会影响最后得到的y。
![]()
可以使用双向循环神经网络/长短时记忆网络 + 条件随机场/结构化支持向量机!这种方法在序列标注、语义标注这种task里面是非常常见的。
可以把input的特征通过deep的RNN,得到一组新的特征,在新的特征上抽ϕ(x,y)(x是RNN的output):
把w⋅ϕ(x,y)作为评估函数
在训练的时候可以把w跟RNN的参数一起训练
测试阶段就是找出一个y~ 使w⋅ϕ(x,y)的结果最大化,但此时的x来自于循环神经网络的输出结果:
y~=argy∈Ymaxw⋅ϕ(x,y)
![]()
最后是今天的结论,讲了好几种不同的可以处理序列标注的方法:
- 隐马尔可夫模型,条件随机场,结构化感知机或支持向量机都是求解三个问题;
- 三个方法定义评估函数的方式都有所差异;
- 结构化感知机或支持向量机跟几率都没有关系;
- 以上这些方法都可以加上深度学习让它们的性能表现地更好。