一. 马尔可夫过程
1.1定义
假设一个随机过程中, t n t_n tn 时刻的状态 x n x_n xn的条件发布,只与其前一状态 x n − 1 x_{n-1} xn−1 相关,即:
P ( x n ∣ x 1 , x 2 , . . . , x n − 1 ) = P ( x n ∣ x n − 1 ) P(x_n|x_1,x_2,...,x_{n-1}) = P(x_n|x_{n-1}) P(xn∣x1,x2,...,xn−1)=P(xn∣xn−1)
则将其称为 马尔可夫过程。
1.2隐马尔科夫算法
1.2.1定义
隐马尔科夫算法是对含有未知参数(隐状态)的马尔可夫链进行建模的生成模型,如下图所示:
在隐马尔科夫模型中,包含隐状态 和 观察状态,隐状态
x
i
x_i
xi 对于观察者而言是不可见的,而观察状态
y
i
y_i
yi 对于观察者而言是可见的。隐状态间存在转移概率,隐状态
x
i
x_i
xi到对应的观察状态
y
i
y_i
yi 间存在输出概率。
1.2.2假设
- 假设隐状态 x i x_i xi 的状态满足马尔可夫过程,i时刻的状态 x i x_i xi 的条件分布,仅与其前一个状态 x i − 1 x_{i-1} xi−1相关,即:
P ( x i ∣ x 1 , x 2 , . . . , x i − 1 ) = P ( x i ∣ x i − 1 ) P(x_i|x_1,x_2,...,x_{i-1}) = P(x_i|x_{i-1}) P(xi∣x1,x2,...,xi−1)=P(xi∣xi−1)
- 假设观测序列中各个状态仅取决于它所对应的隐状态,即:
P ( y i ∣ x 1 , x 2 , . . . , x i − 1 , y 1 , y 2 , . . . , y i − 1 , y i + 1 , . . . ) = P ( y i ∣ x i ) P(y_i|x_1,x_2,...,x_{i-1},y_1,y_2,...,y_{i-1},y_{i+1},...) = P(y_i|x_{i}) P(yi∣x1,x2,...,xi−1,y1,y2,...,yi−1,yi+1,...)=P(yi∣xi)
1.2.3存在问题
在序列标注问题中,隐状态(标注)不仅和单个观测状态相关,还和观察序列的长度、上下文等信息相关。例如词性标注问题中,一个词被标注为动词还是名词,不仅与它本身以及它前一个词的标注有关,还依赖于上下文中的其他词。
二. 条件随机场 (以线性链条件随机场为例)
2.1定义
给定 X = ( x 1 , x 2 , . . . , x n ) X=(x_1,x_2,...,x_n) X=(x1,x2,...,xn) , Y = ( y 1 , y 2 , . . . , y n ) Y=(y_1,y_2,...,y_n) Y=(y1,y2,...,yn) 均为线性链表示的随机变量序列,若在给随机变量序列 X 的条件下,随机变量序列 Y 的条件概率分布 P ( Y ∣ X ) P(Y|X) P(Y∣X) 构成条件随机场,即满足马尔可夫性:
P ( y i ∣ x 1 , x 2 , . . . , x i − 1 , y 1 , y 2 , . . . , y i − 1 , y i + 1 ) = P ( y i ∣ x , y i − 1 , y i + 1 ) P(y_i|x_1,x_2,...,x_{i-1},y_1,y_2,...,y_{i-1},y_{i+1}) = P(y_i|x,y_{i-1},y_{i+1}) P(yi∣x1,x2,...,xi−1,y1,y2,...,yi−1,yi+1)=P(yi∣x,yi−1,yi+1)
则称为 P(Y|X) 为线性链条件随机场。
通过去除了隐马尔科夫算法中的观测状态相互独立假设,使算法在计算当前隐状态 x i x_i xi时,会考虑整个观测序列,从而获得更高的表达能力,并进行全局归一化解决标注偏置问题。
2.2参数化形式
p ( y ∣ x ) = 1 Z ( x ) ∏ i = 1 n exp ( ∑ i , k λ k t k ( y i − 1 , y i , x , i ) + ∑ i , l μ l s l ( y i , x , i ) ) p\left(y | x\right)=\frac{1}{Z\left(x\right)} \prod_{i=1}^{n} \exp \left(\sum_{i, k} \lambda_{k} t_{k}\left(y_{i-1}, y_{i}, x, i\right)+\sum_{i, l} \mu_{l} s_{l}\left(y_{i}, x, i\right)\right) p(y∣x)=Z(x)1i=1∏nexp⎝⎛i,k∑λktk(yi−1,yi,x,i)+i,l∑μlsl(yi,x,i)⎠⎞
其中:
Z ( x ) Z(x) Z(x) 为归一化因子,是在全局范围进行归一化,枚举了整个隐状态序列 x 1 … n x_{1…n} x1…n的全部可能,从而解决了局部归一化带来的标注偏置问题。
Z ( x ) = ∑ y exp ( ∑ i , k λ x t k ( y i − 1 , y i , x , i ) + ∑ i , l μ l s l ( y i , x , i ) ) Z(x)=\sum_{y} \exp \left(\sum_{i, k} \lambda_{x} t_{k}\left(y_{i-1}, y_{i}, x, i\right)+\sum_{i, l} \mu_{l} s_{l}\left(y_{i}, x, i\right)\right) Z(x)=y∑exp⎝⎛i,k∑λxtk(yi−1,yi,x,i)+i,l∑μlsl(yi,x,i)⎠⎞
t k t_k tk 为定义在边上的特征函数,转移特征,依赖于前一个和当前位置
s 1 s_1 s1 为定义在节点上的特征函数,状态特征,依赖于当前位置。
2.3简化形式
因为条件随机场中同一特征在各个位置都有定义,所以可以对同一个特征在各个位置求和,将局部特征函数转化为一个全局特征函数,这样就可以将条件随机场写成权值向量和特征向量的内积形式,即条件随机场的简化形式。
step 1
将转移特征和状态特征及其权值用统一的符号表示,设有k1个转移特征, k 2 k_2 k2个状态特征, K = k 1 + k 2 K=k_1+k_2 K=k1+k2,记
f k ( y i − 1 , y i , x , i ) = { t k ( y i − 1 , y i , x , i ) , k = 1 , 2 , ⋯ , K 1 s i ( y i , x , i ) , k = K 1 + l ; l = 1 , 2 , ⋯ , K 2 f_{k}\left(y_{i-1}, y_{i}, x, i\right)=\left\{\begin{array}{lc} t_{k}\left(y_{i-1}, y_{i}, x, i\right), & k=1,2, \cdots, K_{1} \\ s_{i}\left(y_{i}, x, i\right), & k=K_{1}+l ; l=1,2, \cdots, K_{2} \end{array}\right. fk(yi−1,yi,x,i)={tk(yi−1,yi,x,i),si(yi,x,i),k=1,2,⋯,K1k=K1+l;l=1,2,⋯,K2
step 2
对转移与状态特征在各个位置i求和,记作
f k ( y , x ) = ∑ i = 1 n f k ( y i − 1 , y i , x , i ) , k = 1 , 2 , ⋯ , K f_{k}(y, x)=\sum_{i=1}^{n} f_{k}\left(y_{i-1}, y_{i}, x, i\right), \quad k=1,2, \cdots, K fk(y,x)=i=1∑nfk(yi−1,yi,x,i),k=1,2,⋯,K
step 3
将 λ x \lambda_{x} λx 和 μ l \mu_{l} μl 用统一的权重表示,记作
w k = { λ x , k = 1 , 2 , ⋯ , K 1 μ 1 , k = K 1 + l ; l = 1 , 2 , ⋯ , K 2 w_{k}=\left\{\begin{array}{ll} \lambda_{x}, & k=1,2, \cdots, K_{1} \\ \mu_{1}, & k=K_{1}+l ; l=1,2, \cdots, K_{2} \end{array}\right. wk={λx,μ1,k=1,2,⋯,K1k=K1+l;l=1,2,⋯,K2
step 4
转化后的条件随机场可表示为:
P ( y ∣ x ) = 1 Z ( x ) exp ∑ k = 1 K w k f k ( y , x ) Z ( x ) = ∑ y exp ∑ k = 1 K w k f k ( y , x ) \begin{aligned} P(y | x) &=\frac{1}{Z(x)} \exp \sum_{k=1}^{K} w_{k} f_{k}(y, x) \\ Z(x) &=\sum_{y} \exp \sum_{k=1}^{K} w_{k} f_{k}(y, x) \end{aligned} P(y∣x)Z(x)=Z(x)1expk=1∑Kwkfk(y,x)=y∑expk=1∑Kwkfk(y,x)
step 5
若 w w w 表示权重向量:
w = ( w 1 , w 2 , . . . , w K ) T w = (w_1,w_2,...,w_K)^T w=(w1,w2,...,wK)T
以 F ( y , x ) F(y,x) F(y,x) 表示特征向量,即
F ( y , x ) = ( f 1 ( y , x ) , f 2 ( y , x ) , ⋯ , f x ( y , x ) ) T F(y, x)=\left(f_{1}(y, x), f_{2}(y, x), \cdots, f_{x}(y, x)\right)^{\mathrm{T}} F(y,x)=(f1(y,x),f2(y,x),⋯,fx(y,x))T
则,条件随机场写成内积形式为:
P ∗ ( y ∣ x ) = exp ( w ⋅ F ( y , x ) ) Z x ( x ) Z x ( x ) = ∑ Y exp ( w ⋅ F ( y , x ) ) \begin{array}{c} P_{*}(y | x)=\frac{\exp (w \cdot F(y, x))}{Z_{x}(x)} \\ Z_{x}(x)=\sum_{Y} \exp (w \cdot F(y, x)) \end{array} P∗(y∣x)=Zx(x)exp(w⋅F(y,x))Zx(x)=∑Yexp(w⋅F(y,x))
2.3基本问题
条件随机场包含概率计算问题、学习问题和预测问题三个问题。
- 概率计算问题:已知模型的所有参数,计算观测序列 Y Y Y 出现的概率,常用方法:前向和后向算法;
- 学习问题:已知观测序列 Y Y Y,求解使得该观测序列概率最大的模型参数,包括隐状态序列、隐状态间的转移概率分布和从隐状态到观测状态的概率分布,常用方法:Baum-Wehch 算法;
- 预测问题:一直模型所有参数和观测序列 Y Y Y ,计算最可能的隐状态序列 X X X,常用算法:维特比算法。
2.3.1概率计算问题
给定条件随机场 P ( Y ∣ X ) P(Y|X) P(Y∣X),输入序列 x x x 和 输出序列 y y y;
计算条件概率
P ( Y i = y i ∣ x ) , P ( Y i − 1 = y i − 1 , Y i = y i ∣ x ) P(Y_i=y_i|x), P(Y_{i-1} = y_{i-1},Y_i = y_i|x) P(Yi=yi∣x),P(Yi−1=yi−1,Yi=yi∣x)
计算相应的数学期望问题;
前向-后向算法
step 1 前向计算
对观测序列 x x x 的每个位置 i = 1 , 2 , . . . , n + 1 i=1,2,...,n+1 i=1,2,...,n+1 ,定义一个 m m m 阶矩阵( m m m 为标记 Y i Y_i Yi取值的个数)
M t ( x ) = [ M t ( y t − 1 , y t ∣ x ) ] M t ( y t − 1 , y t ∣ x ) = exp ( W t ( y t − 1 , y i ∣ x ) ) W t ( y t − 1 , y t ∣ x ) = ∑ t = 1 K w k f k ( y i − 1 , y i , x , i ) \begin{array}{c} M_{t}(x)=\left[M_{t}\left(y_{t-1}, y_{t} | x\right)\right] \\ M_{t}\left(y_{t-1}, y_{t} | x\right)=\exp \left(W_{t}\left(y_{t-1}, y_{i} | x\right)\right) \\ W_{t}\left(y_{t-1}, y_{t} | x\right)=\sum_{t=1}^{K} w_{k} f_{k}\left(y_{i-1}, y_{i}, x, i\right) \end{array} Mt(x)=[Mt(yt−1,yt∣x)]Mt(yt−1,yt∣x)=exp(Wt(yt−1,yi∣x))Wt(yt−1,yt∣x)=∑t=1Kwkfk(yi−1,yi,x,i)
对每个指标 i = 0 , 1 , . . . , n + 1 i=0,1,...,n+1 i=0,1,...,n+1,定义前向向量 α i ( x ) \alpha_{i}(x) αi(x),则递推公式:
α i ⊤ ( y i ∣ x ) = α i − 1 ⊤ ( y i − 1 ∣ x ) M i ( y i − 1 , y i ∣ x ) , i = 1 , 2 , ⋯ , n + 1 \alpha_{i}^{\top}\left(y_{i} | x\right)=\alpha_{i-1}^{\top}\left(y_{i-1} | x\right) M_{i}\left(y_{i-1}, y_{i} | x\right), \quad i=1,2, \cdots, n+1 αi⊤(yi∣x)=αi−1⊤(yi−1∣x)Mi(yi−1,yi∣x),i=1,2,⋯,n+1
其中,
α 0 ( y ∣ x ) = { 1 , y = start 0 , 否则 \alpha_{0}(y | x)=\left\{\begin{array}{ll} 1, & y=\text { start } \\ 0, & \text { 否则 } \end{array}\right. α0(y∣x)={1,0,y= start 否则
step 2 后向计算
对每个指标 i = 0 , 1 , . . . , n + 1 i=0,1,...,n+1 i=0,1,...,n+1,定义前向向量 β i ( x ) \beta_{i}(x) βi(x),则递推公式:
β n + 1 ( y n + 1 ∣ x ) = { 1 , y n + 1 = stop 0 , 否则 β i ( y i ∣ x ) = M i ( y i , y i + 1 ∣ x ) β i − 1 ( y i + 1 ∣ x ) \begin{aligned} &\beta_{n+1}\left(y_{n+1} | x\right)=\left\{\begin{array}{ll} 1, & y_{n+1}=\text { stop } \\ 0, & \text { 否则 } \end{array}\right.\\ &\beta_{i}\left(y_{i} | x\right)=M_{i}\left(y_{i}, y_{i+1} | x\right) \beta_{i-1}\left(y_{i+1} | x\right) \end{aligned} βn+1(yn+1∣x)={1,0,yn+1= stop 否则 βi(yi∣x)=Mi(yi,yi+1∣x)βi−1(yi+1∣x)
step 3
Z ( x ) = α n T ( x ) ⋅ 1 = 1 T ⋅ β 1 ( x ) Z(x)=\alpha_{n}^{\mathrm{T}}(x) \cdot 1=\mathbf{1}^{\mathrm{T}} \cdot \beta_{1}(x) Z(x)=αnT(x)⋅1=1T⋅β1(x)
step 4 概率计算
所以,标注序列在位置 i i i 是标注 y i y_i yi 的条件概率为:
P ( Y i = y i ∣ x ) = α i T ( y i ∣ x ) β i ( y i ∣ x ) Z ( x ) P ( Y t − 1 = y i − 1 , Y i = y i ∣ x ) = α i − 1 ⊤ ( y i − 1 ∣ x ) M i ( y i − 1 , y i ∣ x ) β i ( y i ∣ x ) Z ( x ) \begin{array}{c} P\left(Y_{i}=y_{i} | x\right)=\frac{\alpha_{i}^{\mathrm{T}}\left(y_{i} | x\right) \beta_{i}\left(y_{i} | x\right)}{Z(x)} \\ P\left(Y_{t-1}=y_{i-1}, Y_{i}=y_{i} | x\right)=\frac{\alpha_{i-1}^{\top}\left(y_{i-1} | x\right) M_{i}\left(y_{i-1}, y_{i} | x\right) \beta_{i}\left(y_{i} | x\right)}{Z(x)} \end{array} P(Yi=yi∣x)=Z(x)αiT(yi∣x)βi(yi∣x)P(Yt−1=yi−1,Yi=yi∣x)=Z(x)αi−1⊤(yi−1∣x)Mi(yi−1,yi∣x)βi(yi∣x)
其中,
Z ( x ) = α s T ( x ) ⋅ 1 Z(x)=\alpha_{s}^{T}(x) \cdot \mathbf{1} Z(x)=αsT(x)⋅1
step 5 期望值计算
通过利用前向-后向向量,计算特征函数关于联合概率分布 P ( X , Y ) P(X,Y) P(X,Y) 和 条件概率分布 P ( Y ∣ X ) P(Y|X) P(Y∣X) 的数学期望,即特征函数 f k f_k fk 关于条件概率分布 P ( Y ∣ X ) P(Y|X) P(Y∣X) 的数学期望:
E P(r ) ( f , 1 ) = ∑ y P ( y ∣ x ) f 1 ( y , x ) = ∑ i = 1 n + 1 ∑ n = 1 f 1 ( y i − 1 , y i , x , i ) α i − 1 ⊤ ( y i − 1 ∣ x ) M i ( y i 1 , y i ∣ x ) β i ( y i ∣ x ) Z ( x ) k = 1 , 2 , ⋯ , K \begin{aligned} E_{ \text {P(r } )(f, 1)} &=\sum_{y} P(y | x) f_{1}(y, x) \\ &=\sum_{i=1}^{n+1} \sum_{n=1} f_{1}\left(y_{i-1}, y_{i}, x, i\right) \frac{\alpha_{i-1}^{\top}\left(y_{i-1} | x\right) M_{i}\left(y_{i_{1}}, y_{i} | x\right) \beta_{i}\left(y_{i} | x\right)}{Z(x)} \\ & k=1,2, \cdots, K \end{aligned} EP(r )(f,1)=y∑P(y∣x)f1(y,x)=i=1∑n+1n=1∑f1(yi−1,yi,x,i)Z(x)αi−1⊤(yi−1∣x)Mi(yi1,yi∣x)βi(yi∣x)k=1,2,⋯,K
其中:
Z ( x ) = α s T ( x ) ⋅ 1 Z(x)=\alpha_{s}^{T}(x) \cdot \mathbf{1} Z(x)=αsT(x)⋅1
2.3.2学习问题
这里主要介绍一下 BFGS 算法的思路。
输入:特征函数 f 1 , f 2 , . . . , f n f_1,f_2,...,f_n f1,f2,...,fn:经验分布 P ~ ( X , Y ) \widetilde{P}(X,Y) P (X,Y);
输出:最优参数值 w ^ \widehat{w} w ,最优模型 P w ^ ( y ∣ x ) P_{\widehat{w}}(y|x) Pw (y∣x)。
- 选定初始点 w^{(0)}, 取 B 0 B_0 B0 为正定对称矩阵,k = 0;
- 计算 g k = g ( w ( k ) ) g_k = g(w^(k)) gk=g(w(k)),若 g k = 0 g_k = 0 gk=0 ,则停止计算,否则转 (3) ;
- 利用 B k p k = − g k B_k p_k = -g_k Bkpk=−gk 计算 p k p_k pk;
- 一维搜索:求 λ k \lambda_k λk使得
f ( w ( k ) + λ k p k ) = min λ > 0 f ( w ( k ) + λ p k ) f\left(w^{(k)}+\lambda_{k} p_{k}\right)=\min _{\lambda>0} f\left(w^{(k)}+\lambda p_{k}\right) f(w(k)+λkpk)=λ>0minf(w(k)+λpk)
-
设 w ( k + 1 ) = w ( k ) + λ k ∗ p k w^{(k+1)} = w^{(k)} + \lambda_k * p_k w(k+1)=w(k)+λk∗pk
-
计算 g k + 1 g_{k+1} gk+1 = g(w^{(k+1)}),
若 g k = 0 g_k = 0 gk=0, 则停止计算;否则,利用下面公式计算 B k + 1 B_{k+1} Bk+1:
B k + 1 = B k + y k y k ⊤ y k ⊤ δ k − B k δ k δ k ⊤ B k δ k ⊤ B k δ k y k = g k + 1 − g k , δ k = w ( k + 1 ) − w ( k ) \begin{aligned} &B_{k+1}=B_{k}+\frac{y_{k} y_{k}^{\top}}{y_{k}^{\top} \delta_{k}}-\frac{B_{k} \delta_{k} \delta_{k}^{\top} B_{k}}{\delta_{k}^{\top} B_{k} \delta_{k}}\\ &y_{k}=g_{k+1}-g_{k}, \quad \delta_{k}=w^{(k+1)}-w^{(k)} \end{aligned} Bk+1=Bk+yk⊤δkykyk⊤−δk⊤BkδkBkδkδk⊤Bkyk=gk+1−gk,δk=w(k+1)−w(k)
- 令 k = k + 1 k=k+1 k=k+1,转步骤(3);
2.3.3预测问题
对于预测问题,常用的方法是维特比算法,其思路如下:
输入:模型特征向量 F ( y , x ) F(y,x) F(y,x) 和权重向量 w w w,输入序列(观测序列) x = x 1 , x 2 , . . . , x n x={x_1,x_2,...,x_n} x=x1,x2,...,xn;
输出:条件概率最大的输出序列(标记序列) y ∗ = ( y 1 ∗ , y 2 ∗ , . . . , y n ∗ ) y^{*}= (y_1^*,y_2^*,...,y_n^*) y∗=(y1∗,y2∗,...,yn∗),也就是最优路径;
- 初始化
δ 1 ( j ) = w ⋅ F 1 ( y 0 = start , y 1 = j , x ) , j = 1 , 2 , ⋯ , m \delta_{1}(j)=w \cdot F_{1}\left(y_{0}=\text {start}, y_{1}=j, x\right), \quad j=1,2, \cdots, m δ1(j)=w⋅F1(y0=start,y1=j,x),j=1,2,⋯,m
- 递推,对 i = 2 , 3 , . . . , n i=2,3,...,n i=2,3,...,n
δ t ( l ) = max 1 ⩽ j ≤ n { δ t − 1 ( j ) + w ⋅ F t ( y t − 1 = j , y t = l , x ) } , l = 1 , 2 , ⋯ , m Ψ i ( l ) = arg max i ≤ j ∈ m { δ t − 1 ( j ) + w ⋅ F i ( y t − 1 = j , y i = l , x ) } , l = 1 , 2 , ⋯ , m \begin{array}{c} \delta_{t}(l)=\max _{1 \leqslant j \leq n}\left\{\delta_{t-1}(j)+w \cdot F_{t}\left(y_{t-1}=j, y_{t}=l, x\right)\right\}, \quad l=1,2, \cdots, m \\ \Psi_{i}(l)=\arg \max _{i \leq j \in m}\left\{\delta_{t-1}(j)+w \cdot F_{i}\left(y_{t-1}=j, y_{i}=l, x\right)\right\}, \quad l=1,2, \cdots, m \end{array} δt(l)=max1⩽j≤n{δt−1(j)+w⋅Ft(yt−1=j,yt=l,x)},l=1,2,⋯,mΨi(l)=argmaxi≤j∈m{δt−1(j)+w⋅Fi(yt−1=j,yi=l,x)},l=1,2,⋯,m
- 终止
max y ( w ⋅ F ( y , x ) ) = max 1 ⩽ j ⩽ m δ n ( j ) y n ∗ = arg max 1 ⩽ j ⩽ m δ n ( j ) \begin{array}{c} \max _{y}(w \cdot F(y, x))=\max _{1 \leqslant j \leqslant m} \delta_{n}(j) \\ y_{n}^{*}=\arg \max _{1 \leqslant j \leqslant m} \delta_{n}(j) \end{array} maxy(w⋅F(y,x))=max1⩽j⩽mδn(j)yn∗=argmax1⩽j⩽mδn(j)
- 返回路径
y i ∗ = Ψ i + 1 ( y i + 1 ∗ ) , i = n − 1 , n − 2 , ⋯ , 1 y_{i}^{*}=\Psi_{i+1}\left(y_{i+1}^{*}\right), \quad i=n-1, n-2, \cdots, 1 yi∗=Ψi+1(yi+1∗),i=n−1,n−2,⋯,1
求得最优路径 y ∗ = ( y 1 ∗ , y 2 ∗ , . . . , y n ∗ ) y^{*}= (y_1^*,y_2^*,...,y_n^*) y∗=(y1∗,y2∗,...,yn∗)
三.例子说明
利用维特比算法计算给定输入序列 x x x 对应的最优输出序列 y ∗ y^* y∗:
max ∑ i = 1 3 w ⋅ F i ( y i − 1 , y i , x ) \max \sum_{i=1}^{3} w \cdot F_{i}\left(y_{i-1}, y_{i}, x\right) maxi=1∑3w⋅Fi(yi−1,yi,x)
- 初始化
δ 1 ( j ) = w ⋅ F 1 ( y 0 = start , y 1 = j , x ) , j = 1 , 2 i = 1 , δ 1 ( 1 ) = 1 , δ 1 ( 2 ) = 0.5 \begin{array}{l} \delta_{1}(j)=w \cdot F_{1}\left(y_{0}=\operatorname{start}, y_{1}=j, x\right), \quad j=1,2 \\ i=1, \quad \delta_{1}(1)=1, \quad \delta_{1}(2)=0.5 \end{array} δ1(j)=w⋅F1(y0=start,y1=j,x),j=1,2i=1,δ1(1)=1,δ1(2)=0.5
- 递推,对 i = 2 , 3 , . . . , n i=2,3,...,n i=2,3,...,n
i
=
2
δ
2
(
l
)
=
max
{
δ
1
(
j
)
+
w
⋅
F
2
(
j
,
l
,
x
)
}
δ
2
(
1
)
=
max
{
1
+
λ
2
t
2
,
0.5
+
λ
4
t
4
}
=
1.6
,
Ψ
2
(
1
)
=
1
δ
2
(
2
)
=
max
{
1
+
λ
1
t
1
+
μ
2
s
2
,
0.5
+
μ
2
s
2
}
=
2.5
,
Ψ
3
(
2
)
=
1
\begin{aligned} i=2 & \delta_{2}(l)=\max \left\{\delta_{1}(j)+w \cdot F_{2}(j, l, x)\right\} \\ & \delta_{2}(1)=\max \left\{1+\lambda_{2} t_{2}, 0.5+\lambda_{4} t_{4}\right\}=1.6, \quad \Psi_{2}(1)=1 \\ & \delta_{2}(2)=\max \left\{1+\lambda_{1} t_{1}+\mu_{2} s_{2}, 0.5+\mu_{2} s_{2}\right\}=2.5, \quad \Psi_{3}(2)=1 \end{aligned}
i=2δ2(l)=max{δ1(j)+w⋅F2(j,l,x)}δ2(1)=max{1+λ2t2,0.5+λ4t4}=1.6,Ψ2(1)=1δ2(2)=max{1+λ1t1+μ2s2,0.5+μ2s2}=2.5,Ψ3(2)=1
i
=
3
δ
3
(
l
)
=
max
{
δ
2
(
j
)
+
w
⋅
F
3
(
j
,
l
,
x
)
}
δ
3
(
1
)
=
max
{
1.6
+
μ
s
s
s
,
2.5
+
λ
5
t
3
+
μ
3
s
3
}
=
4.3
,
Ψ
1
(
1
)
=
2
δ
3
(
2
)
=
max
{
1.6
+
λ
t
1
+
μ
4
s
4
,
2.5
+
λ
5
t
5
+
μ
4
s
4
}
=
3.2
,
Ψ
3
(
2
)
=
1
\begin{aligned} i=3 & \delta_{3}(l)=\max \left\{\delta_{2}(j)+w \cdot F_{3}(j, l, x)\right\} \\ & \delta_{3}(1)=\max \left\{1.6+\mu_{s} s_{s}, 2.5+\lambda_{5} t_{3}+\mu_{3} s_{3}\right\}=4.3, \quad \Psi_{1}(1)=2 \\ & \delta_{3}(2)=\max \left\{1.6+\lambda t_{1}+\mu_{4} s_{4}, 2.5+\lambda_{5} t_{5}+\mu_{4} s_{4}\right\}=3.2, \quad \Psi_{3}(2)=1 \end{aligned}
i=3δ3(l)=max{δ2(j)+w⋅F3(j,l,x)}δ3(1)=max{1.6+μsss,2.5+λ5t3+μ3s3}=4.3,Ψ1(1)=2δ3(2)=max{1.6+λt1+μ4s4,2.5+λ5t5+μ4s4}=3.2,Ψ3(2)=1
3. 终止
max y ( w ⋅ F ( y , x ) ) = max δ 3 ( l ) = δ 3 ( 1 ) = 4.3 y 3 ∗ = arg max 1 δ 3 ( l ) = 1 \begin{array}{c} \max _{y}(w \cdot F(y, x))=\max \delta_{3}(l)=\delta_{3}(1)=4.3 \\ y_{3}^{*}=\arg \max _{1} \delta_{3}(l)=1 \end{array} maxy(w⋅F(y,x))=maxδ3(l)=δ3(1)=4.3y3∗=argmax1δ3(l)=1
- 返回路径
y 2 ∗ = Ψ 3 ( y 3 ∗ ) = Ψ 3 ( 1 ) = 2 y 1 ∗ = Ψ 2 ( y 2 ∗ ) = Ψ 2 ( 2 ) = 1 \begin{aligned} &y_{2}^{*}=\Psi_{3}\left(y_{3}^{*}\right)=\Psi_{3}(1)=2\\ &y_{1}^{*}=\Psi_{2}\left(y_{2}^{*}\right)=\Psi_{2}(2)=1 \end{aligned} y2∗=Ψ3(y3∗)=Ψ3(1)=2y1∗=Ψ2(y2∗)=Ψ2(2)=1
求得最优路径 y ∗ = ( y 1 ∗ , y 2 ∗ , . . . , y n ∗ ) = ( 1 , 2 , 1 ) y^{*}= (y_1^*,y_2^*,...,y_n^*) = (1,2,1) y∗=(y1∗,y2∗,...,yn∗)=(1,2,1)
import numpy as np
class CRF(object):
'''实现条件随机场预测问题的维特比算法
'''
def __init__(self, V, VW, E, EW):
'''
:param V:是定义在节点上的特征函数,称为状态特征
:param VW:是V对应的权值
:param E:是定义在边上的特征函数,称为转移特征
:param EW:是E对应的权值
'''
self.V = V #点分布表
self.VW = VW #点权值表
self.E = E #边分布表
self.EW = EW #边权值表
self.D = [] #Delta表,最大非规范化概率的局部状态路径概率
self.P = [] #Psi表,当前状态和最优前导状态的索引表s
self.BP = [] #BestPath,最优路径
return
def Viterbi(self):
'''
条件随机场预测问题的维特比算法,此算法一定要结合CRF参数化形式对应的状态路径图来理解,更容易理解.
'''
self.D = np.full(shape=(np.shape(self.V)), fill_value=.0)
self.P = np.full(shape=(np.shape(self.V)), fill_value=.0)
for i in range(np.shape(self.V)[0]):
#初始化
if 0 == i:
self.D[i] = np.multiply(self.V[i], self.VW[i])
self.P[i] = np.array([0, 0])
print('self.V[%d]='%i, self.V[i], 'self.VW[%d]='%i, self.VW[i], 'self.D[%d]='%i, self.D[i])
print('self.P:', self.P)
pass
#递推求解布局最优状态路径
else:
for y in range(np.shape(self.V)[1]): #delta[i][y=1,2...]
for l in range(np.shape(self.V)[1]): #V[i-1][l=1,2...]
delta = 0.0
delta += self.D[i-1, l] #前导状态的最优状态路径的概率
delta += self.E[i-1][l,y]*self.EW[i-1][l,y] #前导状态到当前状体的转移概率
delta += self.V[i,y]*self.VW[i,y] #当前状态的概率
print('(x%d,y=%d)-->(x%d,y=%d):%.2f + %.2f + %.2f='%(i-1, l, i, y, \
self.D[i-1, l], \
self.E[i-1][l,y]*self.EW[i-1][l,y], \
self.V[i,y]*self.VW[i,y]), delta)
if 0 == l or delta > self.D[i, y]:
self.D[i, y] = delta
self.P[i, y] = l
print('self.D[x%d,y=%d]=%.2f\n'%(i, y, self.D[i,y]))
print('self.Delta:\n', self.D)
print('self.Psi:\n', self.P)
#返回,得到所有的最优前导状态
N = np.shape(self.V)[0]
self.BP = np.full(shape=(N,), fill_value=0.0)
t_range = -1 * np.array(sorted(-1*np.arange(N)))
for t in t_range:
if N-1 == t:#得到最优状态
self.BP[t] = np.argmax(self.D[-1])
else: #得到最优前导状态
self.BP[t] = self.P[t+1, int(self.BP[t+1])]
#最优状态路径表现在存储的是状态的下标,我们执行存储值+1转换成示例中的状态值
#也可以不用转换,只要你能理解,self.BP中存储的0是状态1就可以~~~~
self.BP += 1
print('最优状态路径为:', self.BP)
return self.BP
def CRF_manual():
S = np.array([[1,1], #X1:S(Y1=1), S(Y1=2)
[1,1], #X2:S(Y2=1), S(Y2=2)
[1,1]]) #X3:S(Y3=1), S(Y3=1)
SW = np.array([[1.0, 0.5], #X1:SW(Y1=1), SW(Y1=2)
[0.8, 0.5], #X2:SW(Y2=1), SW(Y2=2)
[0.8, 0.5]])#X3:SW(Y3=1), SW(Y3=1)
E = np.array([[[1, 1], #Edge:Y1=1--->(Y2=1, Y2=2)
[1, 0]], #Edge:Y1=2--->(Y2=1, Y2=2)
[[0, 1], #Edge:Y2=1--->(Y3=1, Y3=2)
[1, 1]]])#Edge:Y2=2--->(Y3=1, Y3=2)
EW= np.array([[[0.6, 1], #EdgeW:Y1=1--->(Y2=1, Y2=2)
[1, 0.0]], #EdgeW:Y1=2--->(Y2=1, Y2=2)
[[0.0, 1], #EdgeW:Y2=1--->(Y3=1, Y3=2)
[1, 0.2]]])#EdgeW:Y2=2--->(Y3=1, Y3=2)
crf = CRF(S, SW, E, EW)
ret = crf.Viterbi()
print('最优状态路径为:', ret)
return
if __name__=='__main__':
CRF_manual()
#输出显示
self.V[0]= [1 1] self.VW[0]= [1. 0.5] self.D[0]= [1. 0.5]
self.P: [[0. 0.]
[0. 0.]
[0. 0.]]
(x0,y=0)-->(x1,y=0):1.00 + 0.60 + 0.80= 2.4000000000000004
(x0,y=1)-->(x1,y=0):0.50 + 1.00 + 0.80= 2.3
self.D[x1,y=0]=2.40
(x0,y=0)-->(x1,y=1):1.00 + 1.00 + 0.50= 2.5
(x0,y=1)-->(x1,y=1):0.50 + 0.00 + 0.50= 1.0
self.D[x1,y=1]=2.50
(x1,y=0)-->(x2,y=0):2.40 + 0.00 + 0.80= 3.2
(x1,y=1)-->(x2,y=0):2.50 + 1.00 + 0.80= 4.3
self.D[x2,y=0]=4.30
(x1,y=0)-->(x2,y=1):2.40 + 1.00 + 0.50= 3.9000000000000004
(x1,y=1)-->(x2,y=1):2.50 + 0.20 + 0.50= 3.2
self.D[x2,y=1]=3.90
self.Delta:
[[1. 0.5]
[2.4 2.5]
[4.3 3.9]]
self.Psi:
[[0. 0.]
[0. 0.]
[1. 0.]]
最优状态路径为: [1. 2. 1.]
最优状态路径为: [1. 2. 1.]
四.参考
Datawhale-机器学习算法