时序模型大致上分为(ML)版本和(DL)版本
ML:HMM和GRF
DL:RNN/LSTM
今天就讲解一下隐马尔科夫模型HMM算法
HMM结构
由上图可知观测值(x)和隐含状态(z)在这里举个例子说明
x和
z的关系
例子:假设现在有两枚硬币{A,B}分别有正反两面,这时有两个人:“小明”和”小华”现在将两个人隔开,“小明负责扔硬币”,“小华负责观察硬币的正反面”。但是小华是看不到小明是扔的A还是B,这里的可以观测到的正反面相当于HMM算法中的
x,扔的A或者B相当于状态
z,这也就是说由状态生成观测值,那么问题来了:
1、假设t时刻小华看到了小明扔的是正面,那么能不能确定这枚硬币是A还是B呢?(inference问题)
2、
t时刻小明扔了A硬币,那么
t+1时刻小明会扔A还是B?
t A硬币出现正反的概率是多少(参数估计问题)
3、能不能计算
p正,反,正,正,饭
假设我们计算词性标注的问题:
这里的词性就相当于单词的隐含状态
z,单词就相当于可观测值
x
那么问题1就是:句子中每个单词对应的词性是什么(动词,名词,代词)?
问题2:词性之间的转移关系是什么,每个词性输出的词之间有什么关系?
问题3:给定一组单词,判断它出现的概率
语音识别问题:
可观测值
x是一段长的波形,隐含状态
z是对应文字
问题1:每段波形对应的文字是什么?
问题2:文字与文字之间的转移关系是什么,文字与的波形之间的关系
问题3:给定一段语音波形,判断它出现的概率
这就是HMM最典型的三个问题,也就是说我们在做nlp任务时,像:词性标注,命名实体识别等等这些任务时,我们的可观测值一般是我们的输入,像句子,文章,音波等,我们的状态一般就是我们的目标:词性,实体,音波对应的文字
HMM参数
那么HMM的就是计算
z1与
z2之间的关系,
z与
x之间的关系,这两个关系也就是HMM的参数我们设置为
A和
B
那么
A是一个矩阵,如下图,每一行都对应一个状态
z其中的值表示下一状态出现的概率,例如下图这一行表示
zi,第一个值表示下一个状态出现
z1的概率为
0.02,第二个值表示下一个状态出现
z2的概率为
0.03。因此我们称
A为:状态转移矩阵
B也是一个矩阵,也就是表示
z状态下生成
x的概率,如下图:
如上图,每一行都对应一个状态
z其中的值表示出现
x的概率,例如下图这一行表示
zi,第一个值表示在状态
zi下出现
x1的概率为
0.12,第二个值表示出现
x2的概率为$0.05.
在HMM中我们还设置了一个参数
π,是一个向量用来表示状态
zi成为第一个状态的概率:
π={0.02,0.05,0.06,...,0.08}:
z1成为第一个状态的概率为(0.02),:
z2成为第一个状态的概率为(0.05)以此类推。
所以在HMM中有三个参数
A,B,π
解决inference问题
给定模型找到最优的状态
z,给定模型也就是我们的参数
A,B,π已经训练好了,我们直接利用可观测值
x来进行反推状态
z现在有两种方法:
暴力求解
暴力求解:将所有可能性一一列出来,找到那个最优的解
计算过程:
求
x1,x2,x3,x4...xm对应的状态
z
一共n种状态
1、列出可能发生的所有状态序列:
一共n种状态,计算m个观测值x对应的
z,则一共有
nm个序列
2、对每个序列利用A计算状态转移的概率
例如:
p(z1)⋅p(z1∣z2)⋅p(z3∣z2)⋅p(z4∣z3)⋅....
3、再利用B计算每个状态生成对应
x的概率
例如:
p(x1∣z1)⋅p(x2∣z2)⋅p(x3∣z3)⋅p(x4∣z4)⋅....
4、找到结果最大的那个序列
优点:
一定可以找到全局最优解
缺点:
很明显,计算量太大
维特比算法求解
对于1对1的转移关系的计算,维特比的计算方法还是比较好用的,维特比算法是典型的动态规划思想,如图
如上图在计算
xk+1对应的
z时,要分计算:
p(zj+1∣z2)⋅p(xk+1∣zj+1)
但是我们要求的是最优解
在这里我们假设
ϕk(i)表示
xk时选择
zi的最优的路径。例如
ϕk(1)指的是在
xk时选择
z1最优的最优路径。那么
ϕk+1(i)的计算方式是就是在
xk+1时选择时
zi最好的路径:
ϕk+1(i)=max ⎩⎪⎪⎪⎪⎪⎪⎪⎪⎨⎪⎪⎪⎪⎪⎪⎪⎪⎧ϕk(1)⋅p(zi∣z1)⋅p(xk+1∣zi)ϕk(2)⋅p(zi∣z2)⋅p(xk+1∣zi)ϕk(3)⋅p(zi∣z3)⋅p(xk+1∣zi)ϕk(4)⋅p(zi∣z4)⋅p(xk+1∣zi)ϕk(5)⋅p(zi∣zi)⋅p(xk+1∣z5)....
也就是
ϕk+1(i)=maxjϕk(j)⋅p(zi∣zj)⋅p(xk+1∣zi)
maxj表示
j的取值为1到n
我们在
xk+1时计算所有的路径:也就是计算:
ϕk+1(1),
ϕk+1(2),
ϕk+1(3)…
ϕk+1(n)
这样我们就把一个大的问题分成了一个一个的子问题,对于每个观测值
x计算其对应的
ϕ(1),
ϕ(2),
ϕ(3)…
ϕ(n),直到最后一层
xn.然后我们选择最好的.
ϕn利用
ϕn找到生成它的
ϕn−1以此类推找到最优路径。
这里有一个问题:第一步怎么计算,这里我们使用了参数
π,它对应了每个
z作为第一个状态的概率。
对于一对一的状态转换关系使用维特比算法计算出的一定是全局最优解,这里不懂的同学可以去了解一下动态规划和维特比算法
估计模型的参数
向前向后算法
第二个问题,给定一系列观测值计算参数也就是:
A,B和π
对于这一类的问题首先得了解两个算法,叫向前向后算法,我们在这里简称为FB算法,首先先看一下这两个算法长什么样子的吧
向前算法:
p=(zk,x1:k)
向后算法:
p=(xk+1:n∣zk)
为什么要使用到这两个算法呢?是因为我们在估计模型的参数时会用到计算
p=(zk∣x),这个概率表示的对于可观测数据
x来说,给定任一时刻k都可以计算出此时的
zk是哪一个状态的概率,因此在计算
p=(zk∣x)这个概率时会用到向前向后算法,简单看一下数学推导:
p(zk∣x)=p(x)p(zk,x)∝p(zk,x)
p(zk,x)=p(xk+1:n,x1:k,zk)=p(xk+1:n∣zk,x1:k)⋅p(zk,x1:k)
由于
p(zk+1:n)条件独立于
p(z1:k)(可以根据D-separation来证明)所以
p(xk+1:n∣zk,x1:k)=p(xk+1:n∣zk)因此:
p(zk,x)=p(zk+1:n∣zk)⋅p(zk,x1:k)
由于
p(zk∣x)只是正比于
p(zk,x)并不是相等的关系,所以为了最后计算结果符合一个概率的规则,所以进行一个计算百分比的操作
p(zk=1∣x)=∑jp(zk=j,x)p(zk=1,x)
所以可以用FB算法计算
p(zk∣x)
我们来计算一下向前向后算法:
向前算法(动态规划的思想):
p(zk,x1:k)=∑zk−1p(zk−1,zk,x1:k)=∑zk−1p(zk−1,zk,x1:k−1,xk)
=∑zk−1p(zk−1,x1:k−1)⋅p(zk∣zk−1,x1:k)⋅p(xk∣zk,zk−1,x1:k)
由D-separation的思想我们可以知道
zk−1、
x1:k条件独立于
xk所以
p(xk∣zk,zk−1,x1:k)=p(xk∣zk),
x1:k条件独立于
p(zk)因此
p(zk∣zk−1,x1:k)=p(zk∣zk−1)
所以公式为:
p(zk,x1:k)=∑zk−1p(zk−1,x1:k−1)⋅p(zk∣zk−1)⋅p(xk∣zk)
在这里我们可以看的出来
p(zk∣zk−1)可以从参数A中计算出来,
p(xk∣zk)可以由参数B计算出来,而
∑zk−1p(zk−1,x1:k−1)是可以用递归的方法计算出来。
在第一步的时候不是使用
p(zk∣zk−1)而是使用
p(z1)这个是由
π计算出来的
计算完向前算法下面计算向后算法
p(xk+1:n∣zk)
p(xk+1:n∣zk)=∑zk+1p(xk+1:n,zk+1∣zk)=∑zk+1p(xk+2:n∣zk+1,xk+1,zk)⋅p(xk+1∣zk+1,zk)⋅p(zk+1∣zk)
=∑zk+1p(xk+1:n∣zk+1)⋅p(xk+1∣zk+1)⋅p(zk+1∣zk)
同理
p(xk+1∣zk+1)可以由B参数获得,
p(zk+1∣zk)是由参数A获得、然后动态规划的方法进行计算。
EM算法
在估算参数之前,首先得了解什么是EM算法,EM算法的详细推导我已经写了一篇博客,大家想要明白原理可以先去学习一下,总之EM算法就是来解决这种带有隐含状态的参数的计算,主要分为两步:
1、E步:根据可观测值
x以及由上一步计算出的参数计算出状态
z的期望(FB算法)
2、M步:根据计算出的状态
z,更新参数
因此HMM算法就是应用了EM算法的思想
估计参数
π
前面我们提到了参数
π指的是
z属于第一个状态的概率
上面我们说过FB算法能够在给定一组观测值下计算任意时刻对应状态
z的概率,也就是说我们可以利用FB算法只计算第一时刻每个状态生成的情况然后统计出
π
假设这里有状态有三种{1,2,3}
这里有三组数据{
x1,x2,x3}
我们利用FB算法来计算每组数据的每种状态在第一时刻发生的概率:
第一组数据的每个状态在第一时刻的发生的概率:
p(z1=1∣x1)=0.6p(z2=1∣x1)=0.2p(z2=1∣x1)=0.2
第二组数据的每个状态在第一时刻的发生的概率:
p(z1=1∣x2)=0.4p(z2=1∣x2)=0.3p(z2=1∣x2)=0.3
第三组数据的每个状态在第一时刻的发生的概率:
p(z1=1∣x3)=0.5p(z2=1∣x3)=0.3p(z2=1∣x3)=0.2
将
z1作为第一状态下发生的所有概率相加
0.6+0.4+0.5=1.5
将
z2作为第一状态下发生的所有概率相加
0.2+0.3+0.3=0.8
将
z3作为第一状态下发生的所有概率相加
0.2+0.3+0.2=0.7
将每个数写成概率的形式也就是
z1=31.5=0.5,
z1=30.8=0.17,
z1=30.7=0.23
最后
π=(0.5,0.17,0.23)
估计参数
B
估计参数B与估计
π一样我们还是使用的是EM算法,先计算出状态
z的期望,再利用
z更新参数B
由上面的讲解我们知道参数B的值是状态生成观测值的概率矩阵,也就是说必须要计算出状态生成每一个观测值的概率。
假设这里有状态有三种{1,2,3}
这里有三组数据{
x1,x2,x3}
计算步骤:
1、对于观测值(x)我们先利用FB算法计算出每时每刻状态z发生的概率计算结果如下图:
2、利用状态概率和的对应时刻的观测值统计状态生成观测值的概率:
状态
z1生成观测值
a的概率统计:
0.6+0.5+0.3+0.2+0.5+0.6=2.7
状态
z1生成观测值
b的概率统计:
0.3+0.6+0.3+0.5+0.4=2.1
状态
z1生成观测值
c的概率统计:
0.3+0.4+0.3+0.2=1.2
写成概率的形式
(
62.7,
62.1,
61.2)
=(0.45,0.35,0.2)
状态
z2生成观测值
a的概率统计:
0.2+0.4+0.2+0.7+0.1+0.3=1.9
状态
z2生成观测值
b的概率统计:
0.5+0.2+0.5+0.3+0.3=1.8
状态
z2生成观测值
c的概率统计:
0.3+0.3+0.4+0.3=1.2
(
4.91.9,
4.91.8,
4.91.2)
=(0.39,0.37,0.24)
状态
z3生成观测值
a的概率统计:
0.2+0.1+0.5+0.1+0.4+0.1=1.4
状态
z3生成观测值
b的概率统计:
0.2+0.2+0.2+0.3+0.2=1.1
状态
z3生成观测值
c的概率统计:
0.4+0.3+0.3+0.5=1.5
(
41.4,
41.1,
41.5)
=(0.35,0.28,0.38)
这样我们的B为:
估算参数A
估算参数A,我们在这里用到了B-Gram的思想,也就是说在B-gram中计算:
p(wi∣wj)=c(wj)c(wi,wj)也就是在计算
wi作为
wj的下一个单词的概率时用
wi和wj出现的次数除以
wj出现的总次数。在估算参数A时与B-gram类似,我们主要计算的是
p(zk+1=j∣zk=i)所以计算公式为:
p(zk+1=j∣zk=i)=p(zk=i)p(zk+1=j,zk=i)
我们来分析一下这个公式:分母是指的所有时刻
zk=i的概率,这个概率我们可以通过FB算法计算出来的,因为FB算法对于可观测值
x可以计算出每时每刻状态
z发生的概率,有FB算法计算后再进行简单的统计就可以计算出
p(zk=i)
下面看分子:分子求的是
zk+1=j和zk=i的联合概率,这个我们没有现成的公式,因此我们只能对每个观测值求其对应的
p(zk+1=j,zk=i∣x)所以只能对这个公式进行简单的化简:
p(zk+1=j,zk=i∣x)∝p(zk+1=j,zk=i,x)=p(zk+1=j,zk=i,x1:k,xk+1,xk+2:n)
将
x分为三个部分目的是为了更好的计算:
=p(zk,x1:k)⋅p(xk+2:n∣zk+1)⋅p(zk+1∣zk)⋅p(xk+1∣zk+1)
在这里我们可以清楚的看到
p(zk,x1:k)是向前算法,
p(xk+2:n∣zk+1)指的是向后算法,
p(zk+1∣zk)指的是可以从参数A获得,
p(xk+1∣zk+1)可以从参数B获得。这样我们就可以计算出
p(zk=i,zk+1=j∣x)
最后我们在做一个normalization的操作让其表示为一个概率的形式。
例如
A23=p(z1=2,z2=3∣x)+p(z2=2,z3=3∣x)+p(z3=2,z4=3∣x)...
举个例子:
假设这里有状态有三种{1,2,3}
这里有三组数据{
x1,x2,x3}
这里计算参数A的第一行,也就是计算状态
z=1时对应下一个状态(1,2,3)的概率,这里的每一条连接线就是由
p(zk+1=i,zk=i∣x)计算出来的。比如第一个0.6,对应下一条线就是0.1,0.2,.0.3(边缘概率=条件概率之和)
先计算
A11=0.6+0.3+0.5+0.4+0.3+0.5+0.5+0.6+0.50.1+0.1+0.1+0.2+0.1+0.1+0.2+0.2+0.1=4.21.2=0.29
A12=0.6+0.3+0.5+0.4+0.3+0.5+0.5+0.6+0.50.2+0.1+0.2+0.1+0.1+0.3+0.1+0.3+0.2=4.21.6=0.38
A13=0.6+0.3+0.5+0.4+0.3+0.5+0.5+0.6+0.50.3+0.1+0.2+0.1+0.1+0.1+0.2+0.1+0.2=4.21.4=0.33
这样就计算出了参数A的第一行(
A11,A12,A13)以此类推