标签(空格分隔): 王小草机器学习笔记
机器学习的套路:
参数估计–>模型预测
隐马尔可夫模型需要涉及的步骤:
概率计算
参数估计
模型预测
应用:中文分词,语音识别等
在中文分词中,如果学习到了参数,隐马尔可夫就不需要词库也可以分词,但如果有词库,就会增加正确性。
所以在工业中可以HMM+词典来进行中文分词
但HMM可以发现新词,这个新词在词库中是没有的。
1. 什么是HMM
1.1 HMM初识
HMM可用于标注问题(词性标注),语音识别,NLP,生物信息,模式识别等领域。
HMM是关于时序的概率模型,描述由一个隐藏的马尔科夫链生成不可观测的状态随机序列,再由各个状态生成观测粹机序列的过程。
HMM随机生成的状态随机序列,称为状态序列;每个状态序列生成一个观测,由此产生的观测随机序列,称为观测序列。
隐马尔可夫模型的贝叶斯网络:
如上图中,第一行的z是一组不可观测的随机序列,即状态序列;下面一行x是可观测的随机序列,即观测序列。每一个位置可以看成是一个时刻,但这个时刻并不是严格意义上的时间,也可以是空间上的,比如DNA。
假设现在有一句话“隐马尔可夫模型的贝叶斯网络”。如果要分词的话我们希望是这样分“隐/马尔可夫/模型/的/贝叶斯/网络”。
要将这些词分出来,其实我们只需要知道哪个字是一个词语的终止字。比如“夫”,“型”,“的”,“斯”,“络”都是终止字,他们出现表示一个词语的结束。
一个字是不是终止字,我们叫做是这个字的隐状态,表示成(0,1),0表示非终止字,1表示是终止字。这个因状态就是上图中的z1,z2,z3….
现在中文分词的问题就转变为寻找一个字的隐状态的问题了。
在来看一个概念,如果有a,b,c三个点,a指向b,c。当我们不知道a的时候,我们说b,c是不独立的。
表示成公式可以这样:
当a不知道的时候,bc是不独立的p(c,b) ≠ p(c)p(b)
当a知道的时候,bc是独立的p(c,b/a) = p(c/a)p(b/a)
根据以上概念,再来看回上面的图。当z1不知道的时候,我们说x1和z2是不独立的。
也可以说,当z1不知道的时候,x1和(z2,x2)是不独立的。
可以想见,对于一句话,前后的字之间总是相关的。
1.2 HMM的参数确定
1.2.1 参数的来源与原理
概率矩阵A
在中文分词中每个隐状态都是两种可能(0,1)。但是比如说预测天气,预测投骰子,很多问题都是说个可能的。我们假设如何情况下的隐状态有n中可能。(1,2,3…)
现在假设从z1到z2,z1有n中状态,z2也有n种状态,当z1是1的时候,z2可以是1,2,3…n;当z1是2的时候,z2可以是1,2,3…n;当zn是n的时候,z2可以是1,2,3…n.酱紫的话,我们可以用一个n*n的表格来表示出这种可能的关系。
z1/z2 | 1 | 2 | 3 | 4 | … | n |
---|---|---|---|---|---|---|
1 | a11 | a12 | a13 | a14 | … | a1n |
2 | a21 | a22 | a23 | a24 | … | a2n |
3 | … | … | … | … | … | … |
… | … | … | … | … | … | … |
n | an1 | an2 | … | … | … | ann |
aij表示的是由z1的n=1转换到z2的n=j的概率。比如a12表示z1的隐状态为1时,z2的隐状态为2的概率。于是这个n*n的矩阵我们称之为概率转换矩阵A。
既然是概率矩阵,那么当z1=1时, z2=1或2或3或..n的概率相加一定是等于1的。但是当z1=1,z2=1;z1=2,z2=1,…z1=n,z2=1的所有概率相加是不一定等于1的。也就是说,概率矩阵A的每行和都是1,每列的和不一定是1.这是概率矩阵的性质。
混淆矩阵B
上面讲了z1到z2的过程(前一个时刻到后一个时刻)。然而z1不止指向了z2,还指向了x1。
如果z的隐状态仍然是n个:1,2,3…n
x的可观测状态是m个值:1,2,3…m (一般m不等于n,等了也是凑巧的)
那么从z->x也是可以表示成一个n * m的矩阵的,叫做混淆矩阵。
z1/x1 | 1 | 2 | 3 | 4 | … | m |
---|---|---|---|---|---|---|
1 | b11 | b12 | b13 | b14 | … | b1m |
2 | b21 | b22 | b23 | b24 | … | b2m |
3 | … | … | … | … | … | … |
… | … | … | … | … | … | … |
n | bn1 | an2 | … | … | … | anm |
同样b也是一个条件概率,当z=i的时候,x=j的概率。
混淆矩阵有的文献中也叫发射矩阵。
初始状态π
现在我们知道每一个时刻都是与前一个时刻有联系的。那么第一个时刻呢?第一个时刻的z也可能有n种情况,那么它的状态是通过什么确定的呢?
我们假设z1=1的概率为p1,那么每个状态都会有一个概率。
z | 1 | 2 | 3 | … | n |
---|---|---|---|---|---|
p | p1 | p2 | p3 | … | pn |
这个初始状态的概率分为我们记为π。
π其实可以表示成是一个n维的向量,向量的每个元素都是一个状态的概率。
于是,一个隐马尔可夫模型就可以表示成公式:
模型λ由三个参数:转移矩阵A, 混淆矩阵B,概率向量π构成。
1.2.2 模型与参数的数学表示
将上面通俗的描述转换成数学表达式来说明:
Q是所有可能的状态的集合,N是可能的状态数。
V是所有可能的观测的集合,M是可能的观测数。
Q={q1,q2,…qN}
V={v1,v2,…vM}
I是长度为T的状态序列,O是对应的观测序列
I={i1,i2,…iT}
O={o1,o2,…oT}
A是转义概率矩阵:
其中
aij是在时刻t处于状态qi的条件下,时刻t+1转移到状态qj的概率。
B是观测概率矩阵:
其中,
bik是在时刻t处于窗台qi的条件下生成观测Vk的概率。
π是初始状态概率向量
其中,
πi是时刻t=1处于状态qi的概率
总结起来,HMM由初始概率分布π(向量), 状态转移概率分布A(矩阵)以及观测概率分布B(矩阵)确定。π和A决定状态序列,B决定观测序列。因此,HMM可以用三元符号表示,称为HMM的三要素:
1.3 HMM的两个性质
齐次假设:
一旦确定了t-1时刻的状态,我们就可以确定t时刻的状态的概率。
观测独立性假设:
一旦确定了t时刻的状态,我们就可以确定t时刻的观测值的概率。
2. HMM的训练
2.1 两种方法与三个问题
HMM的两种方法:
训练的目标其实就是求得模型的三个参数A,B,π
HMM的训练其实有两种,一种是通过不断地迭代测试,记录下输出的一整串观测值。通过这些观测值去求矩阵A,B和向量π。这个方法是EM算法。在隐马模型中我们一般叫做baum welth算法。
第二种方法,如果我们已经知道了参数π,与最后的观测值,那么就是典型的最大似然估计法。
HMM的3个基本问题:
(1)概率计算问题:前向-后向算法—>动态规划
给定模型λ=(A,B,π)和观测序列O={o1,02,…or},计算模型λ下观测序列O出现的概率P(O|λ).
(2)学习问题:Baum-Welch算法(状态未知)—>EM
已知观测序列O={o1,02,…or},估计模型λ=(A,B,π)的参数,使得在该模型下观测序列P(O|λ)最大
(3)预测问题:Viterbi算法—>动态规划
解码问题:已知模型λ=(A,B,π)和观测序列O={o1,02,…or},求给定观测序列条件概率P(I|O,λ)最大的状态序列I。
2.2 概率计算问题
概率计算问题有三种求解方法:
(1)直接算法(暴利算法)
(2)前向算法
(3)后向算法
2.2.1 直接算法
概率计算问题的目的是求出P(O|λ)。
按照概率公式,我们可以先求出联合概率P(O,I|λ),然后对所有可能的状态序列求和,从而得到P(O|λ)。
O和I同时出现的联合概率是:
要求得联合概率,得先分别求得P(I|λ),与P(O|I,λ)
状态序列I={i1,i2,…iT}的概率是:
对固定的状态序列I,观测序列O={o1,o2,…oT}的概率是:
所以OI同时出现的联合概率是:
知道了联合概率,我们对所有可能的状态序列I求和,得到观测序列O的概率P(O|λ)
计算复杂度:
加和符号中有2T个因子,I的遍历个数为N的T次方,因此时间复杂度为:。复杂度较高。
2.2.2 前向计算
定义:
给定λ,定义到时刻t的观测序列为o1,o2,..ot且状态qi的概率为前向概率。记作:
可以递推计算前向概率ai(t)及观测序列概率P(O|λ)。
初值:
递推:对于t=1,.。。T-1:
最终:
前向算法的复杂度:
2.2.3 后向计算
定义:
给定λ,定义到时刻t状态为qi的前提下,从t+1到T的观测序列为ot+1,ot+2…oT的概率为后向概率,记作:
可递推计算后向概率βt(i)及观测序列概率P(o|λ)
初值:
递推:对于T=T-1,T-2…,1
最终:
2.2.4前后向的关系
表示当给定模型λ时,所有观测序列与t时刻的状态为qi的联合概率。它最终其实是等于前向概率与后向概率相乘。
2.2.5 单个状态的概率
求给定模型λ和观测值O,在时刻t处于状态qi的概率。
记作:
根据前向后向概率的定义:
γ的意义:
在每个时刻t选择在该时刻最优可能出现的状态it,从而得到一个状态序列,将它作为预测的结果。
给定模型和观测序列,时刻t处于状态q1的概率为:
两个状态的联合概率:
期望:
在观测O下状态i出现的期望:
在观测O下状态i转移到状态j的期望:
学习算法:
若训练数据包括观测序列和状态序列,则HMM的学习非常简单,是监督学习;
若训练数据只有观测序列,则HMM的学习需要使用EM算法,是非监督学习。
大数定理:
假定已给定训练数据包含S个长度相同的观测序列和对应的状态序列{(O1,I1), (O2,I2)…(OS,IS),那么,可以直接利用伯努利大数定理的结论:频率的极限是概率,从而给吃HMM的参数估计。
2.3 Baum-Welch算法
所有观测数据写成O=(o1,o2,…,oT),所有隐状态写成I=(i1,i2,…iT),完全数据是(O,I),完全数据的对数似然函数是lnP(O,I|λ)
假设是HMM参数的当前估计值,λ待求的参数。
之前我们已经验证过了
所以函数可以写成:
现在我们要去Q到达最大值时的参数π,A,B为多少。
由于三个参数分别位于三个项中,可分别极大化:
注意πi满足和为1,利用拉格朗日乘子法,得到:
对上式的π求偏导,得到
对i求和,得到:
从而得到初始状态概率:
第二项可写成:
仍然使用拉格朗日乘子法,得到:
同理,得到:
2.4 预测算法
预测的近似算法
在每一个时刻t选择在该时刻最优可能出现的状态i,从而得到一个状态序列I,将它作为预测结果。
给定模型和观测序列,时刻t处于状态qi的概率为:
选择概率最大的i作为最有可能的状态。
Viterbi算法
Viterbi算法实际是用动态规划解HMM预测问题。用DP求概率最大的路径,这是一条路径对应一个状态序列。
定义变量δt(i)是时刻t的所有路径中概率最大值。
递推:
终止:
可以用一个很直观的图来表示: