文章目录
如何根据一些已经观察到的数据(如训练样本)观测出感兴趣的未知变量(如类别)。
概率图模型(probabilistic graphical model)是一类能够用图来表达变量相关关系的概率模型。可分为两类:
- 使用有向无环图表示变量之间的依赖关系,称为有向图模型或者贝叶斯网(Bayesian network)
- 使用无向图表示变量之间的相关关系,称为无向图模型或马尔可夫网(Markov network)
EM(Expectation-maximization)算法
EM算法的目的是解决变量中存在“隐变量”(latent variable)的问题,令
X
X
X是观测变量集,
Z
Z
Z是隐变量集合,
θ
\theta
θ表示模型参数。
若对
θ
\theta
θ做极大似然估计,目标是最大化对数似然:
L
L
(
θ
∣
X
,
Z
)
=
l
n
P
(
X
,
Z
∣
θ
)
LL(\theta | X,Z)=lnP(X,Z|\theta)
LL(θ∣X,Z)=lnP(X,Z∣θ)
又由于隐变量未知,上式不能直接求解,则可以将其转为对
Z
Z
Z计算期望,从而最大化已观测数据的边际似然:
L
L
(
θ
∣
X
)
=
l
n
P
(
X
∣
θ
)
=
l
n
∑
z
P
(
X
,
Z
∣
θ
)
LL(\theta|X)=lnP(X|\theta)=ln\sum_zP(X,Z|\theta)
LL(θ∣X)=lnP(X∣θ)=lnz∑P(X,Z∣θ)
EM(Exception-Maximization)算法是常用的估计参数隐变量的利器,其基本思想是:
- E步:根据 θ \theta θ去求解最优隐变量 Z Z Z的值,即 θ t → Z t \theta^t\rightarrow Z^t θt→Zt
- M步:已知Z通过极大似然估计去求解 θ \theta θ,即 Z t → θ t + 1 Z^t \rightarrow \theta^{t+1} Zt→θt+1
进一步,我们取的并不是 Z Z Z的期望,而是基于 θ t \theta^t θt计算 Z Z Z的概率分布 P ( Z ∣ θ t , X ) P(Z|\theta^t,X) P(Z∣θt,X),则EM算法的两个步骤是:
- E步(Exception):以当前的 θ t \theta^t θt去推断隐变量的分布 P ( Z ∣ X , θ t ) P(Z|X,\theta^t) P(Z∣X,θt),并计算对数似然 L L ( θ ∣ X , Z ) LL(\theta | X,Z) LL(θ∣X,Z)关于 Z Z Z的期望:
Q ( θ ∣ θ t ) = E Z ∣ X , θ t L L ( θ ∣ X , Z ) Q(\theta|\theta^{t})=E_{Z|X,\theta^t}LL(\theta | X,Z) Q(θ∣θt)=EZ∣X,θtLL(θ∣X,Z)
- M步(Maximization):最大化期望似然。
θ t + 1 = a r g m a x θ Q ( θ ∣ θ t ) \theta^{t+1}=argmax_{\theta}Q(\theta|\theta^t) θt+1=argmaxθQ(θ∣θt)
EM算法的推导
作为EM算法的扩展,不感兴趣的朋友可以跳过本节。
马尔科夫链,MCMC与Gibbs sampling
在我的博客MCMC与Gibbs sampling中有完整的介绍,这里就不再赘述。
隐马尔科夫模型(Hidden Markov Model,HMM)
对于一阶马尔科夫链而言,每个状态只与前一个状态有关,但是现实往往不是这么简单。因此,引入高阶马尔科夫性,我们有:
P
(
x
n
∣
x
n
−
1
,
⋯
,
x
1
)
=
P
(
x
n
∣
x
n
−
1
,
⋯
,
x
n
−
M
)
P(x_n|x_{n-1},\cdots,x_1)=P(x_n|x_{n-1},\cdots,x_{n-M})
P(xn∣xn−1,⋯,x1)=P(xn∣xn−1,⋯,xn−M)
但是这样会带来指数爆炸的问题,即参数随着
M
M
M的增大呈现爆炸式增长。假设每种随机变量有K种状态,其参数数量为
K
M
(
K
−
1
)
K^M(K-1)
KM(K−1)。
那么有什么方法能够将当前变量与更早的变量联系起来,又能有效减少参数数量呢?引入隐变量解决,由此我们得到HMM的基础结构,如下图所示:
基于这种依赖关系,所有变量的联合概率分布可以表示为:
P
(
x
1
,
x
1
,
⋯
,
x
n
)
=
p
(
x
1
)
p
(
y
1
∣
x
1
)
∏
t
=
2
n
p
(
y
t
∣
y
t
−
1
)
p
(
x
t
∣
y
t
)
P(x_1,x_1,\cdots,x_n)=p(x_1)p(y_1|x_1)\prod_{t=2}^np(y_t|y_{t-1})p(x_t|y_t)
P(x1,x1,⋯,xn)=p(x1)p(y1∣x1)t=2∏np(yt∣yt−1)p(xt∣yt)
除了结构信息,确定以下马尔可夫模型需要三组参数:
- 状态转移矩阵:模型在各个状态间转移的概率,通常记为矩阵 A = [ a i j ] N × N A=[a_{ij}]_{N\times N} A=[aij]N×N
a i j = p ( y t + 1 = s j ∣ y t = s i ) , 1 ≤ i , j ≤ N a_{ij}=p(y_{t+1}=s_j|y_t=s_i), 1\le i,j \le N aij=p(yt+1=sj∣yt=si),1≤i,j≤N
- 发射矩阵:模型根据当前的状态获得观测值的概率,通常记为矩阵 B = [ b i j ] N × M B = [b_{ij}]_{N \times M} B=[bij]N×M
b i j = p ( x t = o j ∣ y t = s i ) b_{ij}=p(x_t=o_j|y_t=s_i) bij=p(xt=oj∣yt=si)
- 初始状态概率:模型在初始时刻各个状态的概率,通常记为 π = { π 1 , ⋯ , π N } \pi=\{\pi_1,\cdots,\pi_N\} π={π1,⋯,πN}
π
j
=
p
(
y
t
=
s
j
)
,
1
≤
j
≤
N
\pi_j =p(y_t=s_j),1\le j\le N
πj=p(yt=sj),1≤j≤N
我们将这些结构信息,统称为
λ
=
(
A
,
B
,
π
)
\lambda=(A,B,\pi)
λ=(A,B,π),将观测序列称为
O
O
O。
HMM问题有三大经典问题要解决:
评估观察序列的概率
模型已知(即已知状态转移矩阵、发射概率矩阵以及其初始状态概率)记为 λ \lambda λ,已知观测序列记为 O O O,求解 P ( O ∣ λ ) P(O|\lambda) P(O∣λ)
显然,如果HMM模型很简单,我们是可以通过暴力求解的,假定隐藏序列为
I
I
I。下面简要叙述:
P
(
O
∣
λ
)
=
∑
I
P
(
O
,
I
∣
λ
)
=
∑
i
1
,
i
2
,
⋯
,
i
T
π
i
1
b
i
1
(
o
1
)
a
i
1
i
2
b
i
2
(
o
2
)
⋯
b
i
T
(
o
T
)
P(O|\lambda)=\sum_I P(O,I|\lambda)=\sum_{i_1,i_2,\cdots,i_T}\pi_{i_1}b_{i_1}(o_1)a_{i_1i_2}b_{i_2}(o_2)\cdots b_{i_T}(o_T)
P(O∣λ)=I∑P(O,I∣λ)=i1,i2,⋯,iT∑πi1bi1(o1)ai1i2bi2(o2)⋯biT(oT)
但如果我们的隐藏状态数很多,则有
N
T
N^T
NT种组合,其时间复杂度过高。前向后向算法就是帮助我们在较低的时间复杂度下完成该问题。
前向后向算法
前向算法:
后向算法:
求解模型参数
由于有隐变量的存在,显然的,应该采取EM算法求解,我们直接将EM算法的公式带入进来,就有:
- E步:
Q ( λ , λ t ) = ∑ I P ( I ∣ O , λ t ) l o g P ( O , I ∣ λ ) Q(\lambda,\lambda^t)=\sum_{I}P(I|O,\lambda^t)logP(O,I|\lambda) Q(λ,λt)=I∑P(I∣O,λt)logP(O,I∣λ)
- M步:
λ t + 1 = a r g m a x λ Q ( λ , λ t ) \lambda^{t+1}=argmax_{\lambda}Q(\lambda,\lambda^t) λt+1=argmaxλQ(λ,λt)
而我们知道:
P
(
O
,
I
∣
λ
)
=
π
i
1
b
i
1
(
o
1
)
a
i
1
,
i
2
⋯
a
i
T
−
1
,
i
T
b
i
T
(
o
T
)
(1)
P(O,I|\lambda)=\pi_{i_1}b_{i_1}(o_1)a_{i_1,i_2}\cdots a_{i_{T-1},i_T}b_{i_T}(o_T) \tag{1}
P(O,I∣λ)=πi1bi1(o1)ai1,i2⋯aiT−1,iTbiT(oT)(1)
且
P
(
I
∣
O
,
λ
t
)
=
P
(
O
,
I
∣
λ
t
)
P
(
O
∣
λ
t
)
P(I|O,\lambda^t)=\frac{P(O,I|\lambda^t)}{P(O|\lambda^t)}
P(I∣O,λt)=P(O∣λt)P(O,I∣λt)其中,
P
(
O
∣
λ
t
)
P(O|\lambda^t)
P(O∣λt)是常数,则问题变为:
Q
(
λ
,
λ
t
)
=
∑
I
P
(
O
,
I
∣
λ
t
)
l
o
g
P
(
O
,
I
∣
λ
)
(2)
Q(\lambda,\lambda^t)=\sum_{I}P(O,I|\lambda^t)logP(O,I|\lambda) \tag{2}
Q(λ,λt)=I∑P(O,I∣λt)logP(O,I∣λ)(2)
将(1)带入(2)中可得
λ
t
+
1
=
a
r
g
m
a
x
λ
∑
I
P
(
O
,
I
∣
λ
t
)
(
l
o
g
π
i
1
+
∑
t
=
1
T
l
o
g
a
i
t
,
i
t
+
1
+
∑
t
=
1
T
b
i
t
(
o
t
)
)
\lambda^{t+1}=arg max_{\lambda}\sum_{I}P(O,I|\lambda^t)(log\pi_{i_1}+\sum_{t=1}^T log a_{i_t,i_{t+1}}+\sum_{t=1}^T b_{i_t}(o_t))
λt+1=argmaxλI∑P(O,I∣λt)(logπi1+t=1∑Tlogait,it+1+t=1∑Tbit(ot))
那么,为了更新参数,当然我们需要对参数的每一项进行求导,并令导数结果为0。这里我就不推导了,其最终的结果为:
其中,
- 给定模型和观测状态O,在时刻t处于状态 q i q_i qi的概率
γ t ( i ) = P ( i t = q i ∣ O , λ ) = P ( i t = q i , O ∣ λ ) P ( O ∣ λ ) = α t ( i ) β t ( i ) ∑ j = 1 N α t ( j ) β t ( j ) \gamma_t(i)=P(i_t=q_i|O,\lambda)=\frac{P(i_t=q_i,O|\lambda)}{P(O|\lambda)}=\frac{\alpha_t(i)\beta_t(i)}{\sum_{j=1}^N\alpha_t(j)\beta_t(j)} γt(i)=P(it=qi∣O,λ)=P(O∣λ)P(it=qi,O∣λ)=∑j=1Nαt(j)βt(j)αt(i)βt(i)
- 给定模型和观测序列,在t时刻处于 q i q_i qi,在t+1时刻处于 q j q_{j} qj的概率
ξ t ( i , j ) = P ( i t = q i , i t + 1 = q j ∣ O , λ ) = P ( i t = q i , i t + 1 = q j , O ∣ λ ) P ( O ∣ λ ) = α t ( i ) a i , j b j ( o t + 1 ) β t + 1 ( j ) ∑ r = 1 N ∑ s = 1 N α r ( t ) a r s b s ( o t + 1 ) β t + 1 ( s ) \xi_t(i,j)=P(i_t=q_i,i_{t+1}=q_j|O,\lambda) \\ =\frac{P(i_t=q_i,i_{t+1}=q_j,O|\lambda)}{P(O|\lambda)} \\ =\frac{\alpha_t(i)a_{i,j}b_j(o_{t+1})\beta_{t+1}(j)}{\sum_{r=1}^N\sum_{s=1}^N \alpha_r(t)a_{rs}b_s(o_{t+1})\beta_{t+1}(s)} ξt(i,j)=P(it=qi,it+1=qj∣O,λ)=P(O∣λ)P(it=qi,it+1=qj,O∣λ)=∑r=1N∑s=1Nαr(t)arsbs(ot+1)βt+1(s)αt(i)ai,jbj(ot+1)βt+1(j)
维特比算法解码隐藏状态序列
该步骤主要解决,已知模型和观测序列,求得其最有可能出现的隐藏状态序列。那么也就是说目标是让
P
(
I
∗
∣
O
)
P(I^*|O)
P(I∗∣O)最大化。
CRF(Conditional Random Fields,条件随机场算法)
CRF可以解决词性标注问题,这里就从词性标注问题说起:
比如这句话:“Bob drank coffee at Starbucks”,注明每个单词的词性后是这样的:“Bob (名词) drank(动词) coffee(名词) at(介词) Starbucks(名词)”。
下面,就用条件随机场来解决这个问题。
以上面的话为例,有5个单词,我们将:(名词,动词,名词,介词,名词)作为一个标注序列,称为l,可选的标注序列有很多种,比如l还可以是这样:(名词,动词,动词,介词,名词),我们要在这么多的可选标注序列中,挑选出一个最靠谱的作为我们对这句话的标注。
怎么判断一个标注序列靠谱不靠谱呢?
就我们上面展示的两个标注序列来说,第二个显然不如第一个靠谱,因为它把第二、第三个单词都标注成了动词,动词后面接动词,这在一个句子中通常是说不通的。
假如我们给每一个标注序列打分,打分越高代表这个标注序列越靠谱,我们至少可以说,凡是标注中出现了动词后面还是动词的标注序列,要给它负分!!
上面所说的动词后面还是动词就是一个特征函数,我们可以定义一个特征函数集合,用这个特征函数集合来为一个标注序列打分,并据此选出最靠谱的标注序列。也就是说,每一个特征函数都可以用来为一个标注序列评分,把集合中所有特征函数对同一个标注序列的评分综合起来,就是这个标注序列最终的评分值。
定义CRF中的特征函数
现在,我们正式地定义一下什么是CRF中的特征函数,所谓特征函数,就是这样的函数,它接受四个参数:
- 句子s(就是我们要标注词性的句子)
- i,用来表示句子s中第i个单词
- l i l_i li,表示要评分的标注序列给第i个单词标注的词性
- l i − 1 l_{i-1} li−1,表示要评分的标注序列给第i-1个单词标注的词性
它的输出值是0或者1,0表示要评分的标注序列不符合这个特征,1表示要评分的标注序列符合这个特征。
Note:这里,我们的特征函数仅仅依靠当前单词的标签和它前面的单词的标签对标注序列进行评判,这样建立的CRF也叫作线性链CRF,这是CRF中的一种简单情况。为简单起见,本节中我们仅考虑线性链CRF。
从特征函数到概率
定义好一组特征函数后,我们要给每个特征函数
f
j
f_j
fj赋予一个权重
λ
j
λ_j
λj。现在,只要有一个句子s,有一个标注序列l,我们就可以利用前面定义的特征函数集来对l评分。
对这个分数进行指数化和标准化,我们就可以得到标注序列l的概率值
p
(
l
∣
s
)
p(l|s)
p(l∣s),如下所示:
CRF与HMM的比较
对于词性标注问题,HMM模型也可以解决。HMM的思路是用生成办法,就是说,在已知要标注的句子s的情况下,去判断生成标注序列l的概率,如下所示:
对上面取对数:
我们把这个式子与CRF的式子进行比较:
不难发现,如果我们把第一个HMM式子中的log形式的概率看做是第二个CRF式子中的特征函数的权重的话,我们会发现,CRF和HMM具有相同的形式。
换句话说,我们可以构造一个CRF,使它与HMM的对数形式相同。怎么构造呢?
对于HMM中的每一个转移概率
p
(
l
i
=
y
∣
l
i
−
1
=
x
)
p(l_i=y|l_{i-1}=x)
p(li=y∣li−1=x),我们可以定义这样的一个特征函数:
该特征函数仅当
l
i
=
y
,
l
i
−
1
=
x
l_i = y,l_{i-1}=x
li=y,li−1=x时才等于1。这个特征函数的权重如下:
同样的,对于HMM中的每一个发射概率,我们也都可以定义相应的特征函数,并让该特征函数的权重等于HMM中的log形式的发射概率。
用这些形式的特征函数和相应的权重计算出来的 p ( l ∣ s ) p(l|s) p(l∣s)和对数形式的HMM模型几乎是一样的。用一句话来说明HMM和CRF的关系就是这样:每一个HMM模型都等价于某个CRF。
但是,
- CRF可以定义数量更多,种类更丰富的特征函数。HMM具有天然的局限性,每一个单词只能依赖当前的标签,每一个标签只能依赖于前一个标签,因此其特征函数相对局限。而CRF可以定义全局的特征函数。
- CRF可以利用任意的权重。