⚠️ Alpha内测版本警告:此为早期内部构建版本,尚不完整且可能存在错误,欢迎大家提Issue反馈问题或建议。
Skip to content

第11章 条件随机场 ​

习题11.1 ​

  写出图11.3中无向图描述的概率图模型的因子分解式。

解答:

解答思路:

  1. 给出无向图中团与最大团的定义;
  2. 给出概率无向图模型的因子分解的定义;
  3. 计算概率无向图模型的因子分解式。

解答步骤:

第1步:无向图中团与最大团的定义

  根据书中第11章的定义11.2的团与最大团:

  定义11.2(团与最大团) 无向图G中任意两个结点均有边连接的结点子集称为团(clique),若C是无向图G的一个团,并且不能再加进任何一个G的结点使其成为一个更大的团,则称此C为最大团(maximal clique)。

第2步:概率无向图模型的因子分解的定义

  根据书中第11.1.2节的概率无向图模型的因子分解定义:

  将概率无向图模型的联合概率分布表示为其最大团上的随机变量的函数的乘积形式的操作,称为概率无向图模型的因子分解(factorization)。

  根据书中第11.1.2节的概率无向图模型的联合概率分布:

  给定概率无向图模型,设其无向图为G,C为G上的最大团,YC表示C对应的随机变量。那么概率无向图模型的联合概率分布P(Y)可写作图中所有最大团C上的函数ΨC(YC)的乘积形式,即

P(Y)=1Z∏CΨC(YC)

其中,Z是规范化因子(normaliztion factor),由式

Z=∑Y∏CΨC(YC)

给出。

第3步:计算概率无向图模型的因子分解式

由图11.3可知,该图是由4个结点组成的无向图,结点分别为Y1,Y2,Y3,Y4,根据第1步的团和最大团定义,可得:

  1. 图中由2个结点组成的团有5个:{Y1,Y2},{Y2,Y3},{Y3,Y4},{Y4,Y2}和{Y1,Y3}
  2. 图中包括2个最大团:{Y1,Y2,Y3}和{Y2,Y3,Y4}
  3. 由于Y1和Y4没有边连接,所以{Y1,Y2,Y3,Y4}不是一个团。

根据第2步中概率图模型的因子分解定义和联合概率分布的计算公式,可得因子分解:

P(Y)=Ψ(1,2,3)(Y(1,2,3))⋅Ψ(2,3,4)(Y(2,3,4))∑Y[Ψ(1,2,3)(Y(1,2,3))⋅Ψ(2,3,4)(Y(2,3,4))]

习题11.2 ​

  证明Z(x)=anT(x)⋅1=1T⋅β0(x),其中1是元素均为1的m维列向量。

解答:

解答思路:

  1. 给出Z(x)的定义公式;
  2. 根据书中第225页前向-后向算法,推导αnT(x)和β0(x);
  3. 证明Z(x)=αnT(x)⋅1
  4. 证明Z(x)=1T⋅β0(x)

解答步骤:

第1步:给出Z(x)的定义式

  根据书中第11.2.4节的条件随机场的矩阵形式:

  假设Pw(y|x)是由式(11.15)~式(11.16)给出的线性链条件随机场,表示对给定观测序列x,相应的标记序列y的条件概率。对每个标记序列引进特殊的起点和终点状态标记y0=start和yn+1=stop,这时标注序列的概率Pw(y|x)可以通过矩阵形式表示并有效计算。
  对观测序列x的每一个位置i=1,2,⋯,n+1,由于yi−1和yi在m个标记中取值,可以定义一个m阶矩阵随机变量

Mi(x)=[Mi(yi−1,yi|x)]

条件概率Pw(y|x)是

Pw(y|x)=1Zw(x)∏i=1n+1Mi(yi−1,yi|x)

其中,Zw(x)为规范化因子,是n+1个矩阵的乘积的(start, stop)元素,即

Zw(x)=[M1(x)M2(x)⋯Mn+1(x)]start,stop

注意,y0=start与yn+1=stop表示开始状态与终止状态,规范化因子Zw(x)是以start为起点stop为终点,通过状态的所有路径y1y2⋯yn的非规范化概率∏i=1n+1Mi(yi−1,yi|x)之和。

第2步:给出αnT(x)和β1(x)的定义式

  根据书中11.3.1节的前向-后向算法:

  对每个指标i=0,1,⋯,n+1,定义前向向量αi(x):

α0(y|x)={1,y=start0,否则

递推公式为:

αiT(yi|x)=αi−1T(yi−1|x)Mi(yi−1,yi|x),i=1,2,⋯,n+1

又可表示为

αiT(x)=αi−1T(x)Mi(x)

αi(yi|x)表示在位置i的标记是yi,并且从1到i的前部分标记序列的非规范化概率,yi可取的值有m个,所以αi(x)是m维列向量。

  同样,对每个指标i=0,1,⋯,n+1,定义后向向量βi(x):

βn+1(yn+1|x)={1,yn+1=stop0,否则βi(yi|x)=[Mi+1(yi,yi+1|x)]βi+1(yi+1|x)

又可表示为

βi(x)=Mi+1(x)βi+1(x)

βi(yi|x)表示在位置i的标记为yi,并且从i+1到n的后部分标记序列的非规范化概率。

  根据参考文献 Shallow Parsing with Conditional Random Fields 中的第2章Conditional Random Fields:

αi={αi−1Mi,0<i⩽n1,i=0βiT={Mi+1βi+1T,1⩽i<n1,i=n

  由上述可得:

  1. 当观测序列x有n个结点时,有
αnT(x)=α0T(x)M1(x)⋯Mn(x)

其中y0=start和yn=stop分别表示开始状态和终止状态,且Z(x)=[M1(x)M2(x)⋯Mn(x)]start, stop

  1. 当观测序列x有n-1个结点时,有
β1(x)=M2(x)⋯Mn(x)βn(x)

其中y1=start和yn=stop分别表示开始状态和终止状态,且Z(x)=[M2(x)⋯Mn(x)]start, stop

第3步:证明Z(x)=αnT(x)⋅1

∵α0(y|x)={1,y0=start0,否则

∴αnT(x)⋅1=α0T(x)M1(x)⋯Mn(x)⋅1=1T⋅M1(x)⋯Mn(x)⋅1=Z(x)

第4步:证明Z(x)=1T⋅β1(x)

∵βn(yn|x)={1,yn=stop0,否则

∴1T⋅β1(x)=1T⋅M2(x)⋯Mn(x)βn(x)=1T⋅M2(x)⋯Mn(x)⋅1=Z(x)

综上所述:Z(x)=anT(x)⋅1=1T⋅β1(x),命题得证。

习题11.3 ​

  写出条件随机场模型学习的梯度下降法。

解答:

解答思路:

  1. 给出条件随机场模型的对数似然函数;
  2. 写出条件随机场模型学习的梯度下降法。

解答步骤:

第1步:条件随机场模型的对数似然函数

  根据书中第11章的定理11.2的线性链条件随机场的参数化形式:

  定理11.2(线性链条件随机场的参数化形式) 设P(Y|X)为线性链条件随机场,则在随机变量X取值为x的条件下,随机变量Y取值为y的条件概率具有如下形式:

P(y|x)=1Z(x)exp⁡(∑i,kλktk(yi−1,yi,x,i)+∑i,lμlsl(yi,x,i))

其中,

Z(x)=∑yexp⁡(∑i,kλktk(yi−1,yi,x,i)+∑i,lμlsl(yi,x,i))

式中,tk和sl是特征函数,λk和μl是对应的权值。Z(x)是规范化因子,求和是在所有可能的输出序列上进行的。

  根据书中第11.2.3节的条件随机场的简化形式:

设有K1个转移特征,K2个状态特征,K=K1+K2,记

fk(yi−1,yi,x,i)={tk(yi−1,yi,x,i),k=1,2,⋯,K1sl(yi,x,i),k=K1+l;l=1,2,⋯,K2

然后,对转移特征与状态特征在各个位置i求和,记作

fk(y,x)=∑i=1nfk(yi−1,yi,x,i),k=1,2,⋯,K

用wk表示特征fk(y,x)的权值,即

wk={λk,k=1,2,⋯,K1μl,k=K1+l;l=1,2,⋯,K2

于是,条件随机场可表示为

P(y|x)=1Z(x)exp⁡∑k=1Kwkfk(y,x)Z(x)=∑yexp⁡∑k=1Kwkfk(y,x)

  根据书中第11.4.1节的条件随机场模型的对数似然函数:

当Pw是一个由式(11.15)和式(11.16)给出的条件随机场模型时,对数似然函数为

L(w)=∑j=1N∑k=1Kwkfk(yj,xj)−∑j=1Nlog⁡Zw(xj)

  将对数似然函数求偏导,可得

g(w(n))=∂L(w)∂w(n)=∑j=1Nfn(yj,xj)−∑j=1N1Zw(xj)⋅∂Zw(xj)∂wn=∑j=1Nfn(yj,xj)−∑i=1N1Zw(xi)⋅∑j=1N[(exp⁡∑k=1Kwkfk(yj,xi))⋅fn(yj,xi)]

  梯度函数为

∇L(w)=[∂L(w)∂w(0),⋯,∂L(w)∂w(N)]

第2步:写出条件随机场模型学习的梯度下降法

  根据书中附录A 梯度下降法的算法:

算法A.1(梯度下降法)
输入:目标函数f(x),梯度函数g(x)=∇f(x),计算精度ε;
输出:f(x)的极小值x∗。
(1)取初始值x(0)∈Rn,置k=0。
(2)计算f(x(k))。
(3)计算梯度gk=g(x(k)),当∥gk∥<ε时,停止迭代,令x∗=x(k);否则,令pk=−g(x(k)),求λk,使

f(x(k)+λkpk)=minλ⩾0f(x(k)+λpk)

(4)置x(k+1)=x(k)+λkpk,计算f(x(k+1))。当∥f(x(k+1))−f(x(k))∥<ε或 ∥x(k+1)−x(k)∥<ε时,停止迭代,令x∗=x(k+1)。
(5)否则,置k=k+1,转步骤(3)。

条件随机场模型学习的梯度下降法:

输入:目标函数f(w),梯度函数g(w)=∇f(w),计算精度ε
输出:f(w)的极大值w∗
(1)取初始值w(0)∈Rn,置k=0。
(2)计算f(w(n))。
(3)计算梯度gn=g(w(n)),当∥gn∥<ε时,停止迭代,令w∗=w(n);否则,令pn=−g(w(n)),求λn,使

f(w(n)+λnpn)=maxλ⩾0f(w(n)+λpn)

(4)置w(n+1)=w(n)+λnpn,计算f(w(n+1))。当∥f(w(n+1))−f(w(n))∥<ε或 ∥w(n+1)−w(n)∥<ε时,停止迭代,令w∗=w(n+1)。
(5)否则,置n=n+1,转步骤(3)。

习题11.4 ​

参考图11.6的状态路径图,假设随机矩阵M1(x),M2(x),M3(x),M4(x)分别是

M1(x)=[000.50.5],M2(x)=[0.30.70.70.3]M3(x)=[0.50.50.60.4],M4(x)=[0101]

求以start=2为起点stop=2为终点的所有路径的状态序列y的概率及概率最大的状态序列。

解答:

解答思路:

  根据书中第223页条件随机场的矩阵形式,以及例题11.2,通过自编程实现计算所有路径状态序列的概率及概率最大的状态序列。

解答步骤:

python
import numpy as np


class CRFMatrix:
    def __init__(self, M, start, stop):
        # 随机矩阵
        self.M = M
        #
        self.start = start
        self.stop = stop
        self.path_prob = None

    def _create_path(self):
        """按照图11.6的状态路径图,生成路径"""
        # 初始化start结点
        path = [self.start]
        for i in range(1, len(self.M)):
            paths = []
            for _, r in enumerate(path):
                temp = np.transpose(r)
                # 添加状态结点1
                paths.append(np.append(temp, 1))
                # 添加状态结点2
                paths.append(np.append(temp, 2))
            path = paths.copy()

        # 添加stop结点
        path = [np.append(r, self.stop) for _, r in enumerate(path)]
        return path

    def fit(self):
        path = self._create_path()
        pr = []
        for _, row in enumerate(path):
            p = 1
            for i in range(len(row) - 1):
                a = row[i]
                b = row[i + 1]
                # 根据公式11.24,计算条件概率
                p *= M[i][a - 1][b - 1]
            pr.append((row.tolist(), p))
        # 按照概率从大到小排列
        pr = sorted(pr, key=lambda x: x[1], reverse=True)
        self.path_prob = pr

    def print(self):
        # 打印结果
        print("以start=%s为起点stop=%s为终点的所有路径的状态序列y的概率为:" % (self.start, self.stop))
        for path, p in self.path_prob:
            print("    路径为:" + "->".join([str(x) for x in path]), end=" ")
            print("概率为:" + str(p))
        print("概率最大[" + str(self.path_prob[0][1]) + "]的状态序列为:",
              "->".join([str(x) for x in self.path_prob[0][0]]))
python
# 创建随机矩阵
M1 = [[0, 0], [0.5, 0.5]]
M2 = [[0.3, 0.7], [0.7, 0.3]]
M3 = [[0.5, 0.5], [0.6, 0.4]]
M4 = [[0, 1], [0, 1]]
M = [M1, M2, M3, M4]
# 构建条件随机场的矩阵模型
crf = CRFMatrix(M=M, start=2, stop=2)
# 得到所有路径的状态序列的概率
crf.fit()
# 打印结果
crf.print()
以start=2为起点stop=2为终点的所有路径的状态序列y的概率为:
    路径为:2->1->2->1->2 概率为:0.21
    路径为:2->2->1->1->2 概率为:0.175
    路径为:2->2->1->2->2 概率为:0.175
    路径为:2->1->2->2->2 概率为:0.13999999999999999
    路径为:2->2->2->1->2 概率为:0.09
    路径为:2->1->1->1->2 概率为:0.075
    路径为:2->1->1->2->2 概率为:0.075
    路径为:2->2->2->2->2 概率为:0.06
概率最大[0.21]的状态序列为: 2->1->2->1->2

参考文献 ​

【1】Sha F, Pereira F. Shallow Parsing with Conditional Random Fields[C]. Proceedings of the 2003 Conference of the North American Chapter of the Association for Computational Linguistics