维特比算法在HMM和CRF中的应用

背景

维特比算法是一个通用的解码算法,是基于动态规划的求序列最短路径的方法。
一般应用场景为HMM(隐马尔可夫模型)或CRF 中的解码(decoding)问题,在HMM模型的解码问题中,给定模型 λ = ( A , B , Π ) \lambda=(A, B, \Pi) λ=(A,B,Π) 和观测序列 O = { o 1 , o 2 , … o T } O=\left\{o_{1}, o_{2}, \ldots o_{T}\right\} O={o1,o2,oT}, 求给定观测序列 O O O的条件下, 最可能出现的对应的状态序列 I ∗ = { i 1 ∗ , i 2 ∗ , … i T ∗ } I^{*}=\left\{i_{1}^{*}, i_{2}^{*}, \ldots i_{T}^{*}\right\} I={i1,i2,iT},即 P ( I ∗ ∣ O ) P\left(I^{*} \mid O\right) P(IO) 要最大化。
I ∗ = arg ⁡ max ⁡ I p ( I ∗ ∣ O ) I^{*} = \arg \max _{I} p(I^{*} \mid O) I=argImaxp(IO)
我们的目标是找到一个序列 I I I使其概率最大,该序列对应一个路径,维特比算法可以求解该路径。

动态规划算法需要找到合适的局部状态, 以及局部状态的递推公式。在HMM中, 维特比算法定义了两个局部状态用于递推。
第一个局部状态是在时刻 t t t 到达隐藏状态为 q i q_i qi的所有可能的状态转移路径 i 1 , i 2 , … i t i_{1}, i_{2}, \ldots i_{t} i1,i2,it 中的概率最大值。记为 δ t ( i ) \delta_{t}(i) δt(i) : 也就是观测变量
δ t ( i ) = max ⁡ i 1 , i 2 , … i t − 1 P ( i t = q i , i 1 , i 2 , … i t − 1 , o t , o t − 1 , … o 1 ∣ λ ) , i = 1 , 2 , … N \delta_{t}(i)=\max _{i_{1}, i_{2}, \ldots i_{t-1}} P\left(i_{t}=q_i, i_{1}, i_{2}, \ldots i_{t-1}, o_{t}, o_{t-1}, \ldots o_{1} \mid \lambda\right), i=1,2, \ldots N δt(i)=i1,i2,it1maxP(it=qi,i1,i2,it1,ot,ot1,o1λ),i=1,2,N
δ t ( i ) \delta_{t}(i) δt(i) 的定义可以得到 δ \delta δ 的递推表达式 : : :
δ t + 1 ( j ) = max ⁡ i 1 , i 2 , … i t P ( i t + 1 = q j , i 1 , i 2 , … i t , o t + 1 , o t , … o 1 ∣ λ ) = max ⁡ 1 ≤ j ≤ N [ δ t ( i ) a i j ] b j ( o t + 1 ) \begin{aligned} \delta_{t+1}(j) &=\max _{i_{1}, i_{2}, \ldots i_{t}} P\left(i_{t+1}=q_j, i_{1}, i_{2}, \ldots i_{t}, o_{t+1}, o_{t}, \ldots o_{1} \mid \lambda\right) \\ &=\max _{1 \leq j \leq N}\left[\delta_{t}(i) a_{i j}\right] b_{j}\left(o_{t+1}\right) \end{aligned} δt+1(j)=i1,i2,itmaxP(it+1=qj,i1,i2,it,ot+1,ot,o1λ)=1jNmax[δt(i)aij]bj(ot+1)
a i j a_{i j} aij表示从隐变量 q i q_i qi转移到 q j q_j qj的概率, b j ( o t + 1 ) b_{j}(o_{t+1}) bj(ot+1)表示从隐变量 q j q_j qj发射到观测变量为 ( o t + 1 ) (o_{t+1}) (ot+1)的概率。
第二个局部状态由第一个局部状态递推得到。

定义在时刻 t + 1 t+1 t+1 隐藏状态为 q i q_i qi的所有可能的状态转移路径 ( i 1 , i 2 , … , i t − 1 , i ) \left(i_{1}, i_{2}, \ldots, i_{t-1}, i\right) (i1,i2,,it1,i) 中概率最大的转移路径中,第 t t t 个节点的隐藏状态为 Ψ t + 1 ( i ) \Psi_{t+1}(i) Ψt+1(i),其递推表达式可以表示为:
Ψ t + 1 ( i ) = arg ⁡ max ⁡ 1 < i < N [ δ t ( j ) a j i ] \Psi_{t+1}(i)=\arg \max _{1<i<N}\left[\delta_{t}(j) a_{j i}\right] Ψt+1(i)=arg1<i<Nmax[δt(j)aji]

根据这两个局部状态从0时刻递推到T时刻,利用T时刻 Ψ T ( i ) \Psi_{T}(i) ΨT(i)记录的前一个最可能的状态节点进行回溯,直到找到最优的隐藏状态序列。

算法流程

HMM

HMM概念

HMM有两个假设

  1. 齐次马尔科夫链假设。即任意时刻的隐藏状态只依赖于它前一个隐藏状态。
    如果在 时刻 t t t 的隐藏状态是 i t = q i i_{t}=q_{i} it=qi,在时刻 t + 1 t+1 t+1 的隐藏状态是 i t + 1 = q j i_{t+1}=q_{j} it+1=qj, 则从时刻 t t t 到时刻 t + 1 t+1 t+1 的HMM状态转移概率 a i j a_{i j} aij 可以表示为:
    a i j = P ( i t + 1 = q j ∣ i t = q i ) a_{i j}=P\left(i_{t+1}=q_{j} \mid i_{t}=q_{i}\right) aij=P(it+1=qjit=qi)
    这样 a i j a_{i j} aij 可以组成马尔科夫链的状态转移矩阵 A A A :
    A = [ a i j ] N × N A=\left[a_{i j}\right]_{N \times N} A=[aij]N×N
    N是每个时刻隐藏状态的个数
  2. 观测独立性假设。即任意时刻的观察状态只依赖于当前时刻的隐藏状态。
    如果在时刻 t t t 的隐藏状态是 i t = q j i_{t}=q_{j} it=qj, 而对应的观察状态为 o t = v k o_{t}=v_{k} ot=vk, 则该时刻观察状态 v k v_{k} vk 在隐藏状态 q j q_{j} qj 下生成的概率为 b j ( k ) b_{j}(k) bj(k),满足 :
    b j ( k ) = P ( o t = v k ∣ i t = q j ) b_{j}(k)=P\left(o_{t}=v_{k} \mid i_{t}=q_{j}\right) bj(k)=P(ot=vkit=qj)
    这样 b j ( k ) b_{j}(k) bj(k) 可以组成观测状态生成的概率矩阵 B : B: B:
    B = [ b j ( k ) ] N × M \boldsymbol{B}=\left[b_{j}(k)\right]_{N \times M} B=[bj(k)]N×M
    M是每个时刻观测状态的总个数。
    除此之外,我们需要一组在时刻 t = 1 t=1 t=1 的隐藏状态概率分布 Π \Pi Π:
    Π = [ π ( i ) ] N  其中  π ( i ) = P ( i 1 = q i ) \Pi=[\pi(i)]_{N} \text { 其中 } \pi(i)=P\left(i_{1}=q_{i}\right) Π=[π(i)]N 其中 π(i)=P(i1=qi)
    一个HMM模型,可以由隐藏状态初始概率分布 Π \Pi Π, 状态转移概率矩阵 A A A 和观测状态概率矩阵 B B B 决定。 Π , A \Pi, A Π,A 决定状态序列, B B B 决定观测序列。因此, HMM模型可以由一个三元组 λ \lambda λ 表示如下:
    λ = ( A , B , Π ) \lambda=(A, B, \Pi) λ=(A,B,Π)

Viterbi in HMM

输入: HMM模型 λ = ( A , B , Π ) \lambda=(A, B, \Pi) λ=(A,B,Π), 观测序列 O = ( o 1 , o 2 , … o T ) O=\left(o_{1}, o_{2}, \ldots o_{T}\right) O=(o1,o2,oT)
输出:最有可能的隐藏状态序列 I ∗ = { i 1 ∗ , i 2 ∗ , … i T ∗ } I^{*}=\left\{i_{1}^{*}, i_{2}^{*}, \ldots i_{T}^{*}\right\} I={i1,i2,iT}

  1. 初始化局部状态:
    δ 1 ( i ) = π i b i ( o 1 ) , i = 1 , 2 … N Ψ 1 ( i ) = 0 , i = 1 , 2 … N \begin{array}{c} \delta_{1}(i)=\pi_{i} b_{i}\left(o_{1}\right), \quad i=1,2 \ldots N \\ \Psi_{1}(i)=0, i=1,2 \ldots N \end{array} δ1(i)=πibi(o1),i=1,2NΨ1(i)=0,i=1,2N
  2. 进行动态规划递推时刻 t = 2 , 3 , … T t=2,3, \ldots T t=2,3,T 时刻的局部状态:
    δ t ( i ) = max ⁡ 1 ≤ j ≤ N [ δ t − 1 ( j ) a j i ] b i ( o t ) , i = 1 , 2 … N Ψ t ( i ) = arg ⁡ max ⁡ 1 ≤ j ≤ N [ δ t − 1 ( j ) a j i ] , i = 1 , 2 … N \begin{array}{l} \delta_{t}(i)=\max _{1 \leq j \leq N}\left[\delta_{t-1}(j) a_{j i}\right] b_{i}\left(o_{t}\right), \quad i=1,2 \ldots N \\ \Psi_{t}(i)=\arg \max _{1 \leq j \leq N}\left[\delta_{t-1}(j) a_{j i}\right], i=1,2 \ldots N \end{array} δt(i)=max1jN[δt1(j)aji]bi(ot),i=1,2NΨt(i)=argmax1jN[δt1(j)aji],i=1,2N
  3. 计算时刻 T T T 最大的 δ T ( i ) \delta_{T}(i) δT(i),即为最可能隐藏状态序列出现的概率。 i ∗ i^* i即为时刻 T T T 最可能的隐藏状态,令局部状态 Ψ T ( i ) = i T ∗ \Psi_T(i) = i_{T}^* ΨT(i)=iT
    P ∗ = max ⁡ 1 ≤ j ≤ N δ T ( i ) i T ∗ = arg ⁡ max ⁡ 1 ≤ j ≤ N [ δ T ( i ) ] \begin{array}{c} P *=\max _{1 \leq j \leq N} \delta_{T}(i) \\ i_{T}^{*}=\arg \max _{1 \leq j \leq N}\left[\delta_{T}(i)\right] \end{array} P=max1jNδT(i)iT=argmax1jN[δT(i)]
  4. 利用局部状态 Ψ ( i ) \Psi(i) Ψ(i) 开始回溯。对于 t = T − 1 , T − 2 , … , 1 t=T-1, T-2, \ldots, 1 t=T1,T2,,1 :
    i t ∗ = Ψ t + 1 ( i t + 1 ∗ ) i_{t}^{*}=\Psi_{t+1}\left(i_{t+1}^{*}\right) it=Ψt+1(it+1)
    最终得到最有可能的隐藏状态序列 I ∗ = { i 1 ∗ , i 2 ∗ , … i T ∗ } I^{*}=\left\{i_{1}^{*}, i_{2}^{*}, \ldots i_{T}^{*}\right\} I={i1,i2,iT}

Viterbi in CRF

输入:模型的 K K K 个特征函数,和对应的 K K K 个权重。
观测序列 x = ( x 1 , x 2 , … x n ) x=\left(x_{1}, x_{2}, \ldots x_{n}\right) x=(x1,x2,xn), 可能的标记个数 m m m

输出:最优标记序列 y ∗ = ( y 1 ∗ , y 2 ∗ , … y n ∗ ) y^{*}=\left(y_{1}^{*}, y_{2}^{*}, \ldots y_{n}^{*}\right) y=(y1,y2,yn)

  1. 初始化:
    δ 1 ( l ) = ∑ k = 1 K w k f k ( y 0 =  start  , y 1 = l , x , i ) } , l = 1 , 2 , … m Ψ 1 ( l ) =  start  , l = 1 , 2 , … m \begin{array}{c} \left.\delta_{1}(l)=\sum_{k=1}^{K} w_{k} f_{k}\left(y_{0}=\text { start }, y_{1}=l, x, i\right)\right\}, l=1,2, \ldots m \\ \Psi_{1}(l)=\text { start }, l=1,2, \ldots m \end{array} δ1(l)=k=1Kwkfk(y0= start ,y1=l,x,i)},l=1,2,mΨ1(l)= start ,l=1,2,m
  2. 对于 i = 1 , 2 … n − 1 i=1,2 \ldots n-1 i=1,2n1,进行递推:
    δ i + 1 ( l ) = max ⁡ 1 ≤ j ≤ m { δ i ( j ) + ∑ k = 1 K w k f k ( y i = j , y i + 1 = l , x , i ) } , l = 1 , 2 , … m \delta_{i+1}(l)=\max _{1 \leq j \leq m}\left\{\delta_{i}(j)+\sum_{k=1}^{K} w_{k} f_{k}\left(y_{i}=j, y_{i+1}=l, x, i\right)\right\}, l=1,2, \ldots m δi+1(l)=1jmmax{δi(j)+k=1Kwkfk(yi=j,yi+1=l,x,i)},l=1,2,m
    Ψ i + 1 ( l ) = arg ⁡ max ⁡ 1 ≤ j ≤ m { δ i ( j ) + ∑ k = 1 K w k f k ( y i = j , y i + 1 = l , x , i ) } , l = 1 , 2 , … m \Psi_{i+1}(l)=\arg \max _{1 \leq j \leq m}\left\{\delta_{i}(j)+\sum_{k=1}^{K} w_{k} f_{k}\left(y_{i}=j, y_{i+1}=l, x, i\right)\right\}, l=1,2, \ldots m Ψi+1(l)=arg1jmmax{δi(j)+k=1Kwkfk(yi=j,yi+1=l,x,i)},l=1,2,m
  3. 终止:
    y n ∗ = arg ⁡ max ⁡ 1 ≤ j ≤ m δ n ( j ) y_{n}^{*}=\arg \max _{1 \leq j \leq m} \delta_{n}(j) yn=arg1jmmaxδn(j)
  4. 回溯:
    y i ∗ = Ψ i + 1 ( y i + 1 ∗ ) , i = n − 1 , n − 2 , … 1 y_{i}^{*}=\Psi_{i+1}\left(y_{i+1}^{*}\right), i=n-1, n-2, \ldots 1 yi=Ψi+1(yi+1),i=n1,n2,1
    最终得到最优标记序列 y ∗ = ( y 1 ∗ , y 2 ∗ , … y n ∗ ) y^{*}=\left(y_{1}^{*}, y_{2}^{*}, \ldots y_{n}^{*}\right) y=(y1,y2,yn)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值