CRF代码实现及原理(一)

CRF:条件随机场(Conditional Random Field)

代码实现链接:https://blog.csdn.net/cpluss/article/details/88825748

什么样的问题需要CRF模型

如果我们的数据是一个序列,后面的结果受到前面结果的影响,此时就需要我们使用CRF模型。例如,我们假设把一个人的日常生活拍成照片,而一张张着嘴的照片我们无法判断他是吃饭还是在唱歌(or 其他),但是如果这张照片之前有其他照片显示为餐桌、米饭等,我们则基本可以判定他在吃饭;如果显示为ktv,则基本可以判定他在唱歌。

定义

马尔科夫随机场:随机场中某一位置的赋值仅仅和其相邻的位置相关,而与不相邻的位置无关
CRF是马尔可夫随机场的特例,他假设马尔可夫随机场中只有X和Y两种变量,X是给定的,Y则是给定条件下我们的输出。例如在词性标注中,X是词语,Y是词性。若Y是一个马尔可夫随机场,则P(Y|X)是一个CRF。表示Y中变量仅仅受到X和其相邻变量的影响。

线性链条件随机场 (Linear Chain CRF)

实现的过程中,我们一般要求X和Y有相同的结构,即:
X = ( X 1 , X 2 , . . . X n ) , Y = ( Y 1 , Y 2 , . . . , Y n ) X = (X_1, X_2,...X_n), Y = (Y_1, Y_2, ..., Y_n) X=(X1,X2,...Xn),Y=(Y1,Y2,...,Yn)
由此可以得到CRF的数学定义:
P ( Y i ∣ X , Y 1 , Y 2 , . . Y i − 1 , Y i + 1 , . . . Y n ) = P ( Y i ∣ X , Y i − 1 , Y i + 1 ) P(Y_i|X,Y_1,Y_2,..Y_{i-1},Y_{i+1},...Y_{n}) = P(Y_i|X,Y_{i-1},Y_{i+1}) P(YiX,Y1,Y2,..Yi1,Yi+1,...Yn)=P(YiX,Yi1,Yi+1)

Linear-CRF的参数化形式

为了将linear-CRF转化为可以学习的机器学习模型,我们定义了特征函数和权重系数。
第一类:结点特征函数这类特征函数只和当前节点有关,记为:
s l ( y i , x , i ) , l = 1 , 2 , . . . L L 是 当 前 该 节 点 i 的 结 点 特 征 函 数 的 个 数 ( 可 能 不 止 一 个 ) s_l(y_i,x,i),\quad l=1,2,...L\quad L是当前该节点i的结点特征函数的个数(可能不止一个) sl(yi,x,i),l=1,2,...LLi
第二类:转移特征函数,此函数依赖于上下文,记为:
t k ( y i − 1 , y i , x , i ) , k = 1 , 2 , . . . K , K 代 表 结 点 i 转 移 特 征 函 数 的 个 数 ( 可 能 不 止 一 个 ) t_k(y_{i-1},y_{i},x,i),\quad k=1,2,...K,K代表结点i转移特征函数的个数(可能不止一个) tk(yi1,yi,x,i),k=1,2,...KKi

以上两种特征函数,都只能取值为0或者1,因此其特点就在于他们的权重了,权重越大,说明这个函数的重要性越大。
从而得到其参数化形式:在给定x的条件下,输出y(而不是y中某一个单词)的概率
P ( y ∣ x ) = 1 Z ( x ) e x p ( ∑ i , k λ k t k ( y i − 1 , y i , x , i ) + ∑ i , l μ l s l ( y i , x , i ) ) P(y|x) = \frac{1}{Z(x)}exp(\sum_{i,k}\lambda_k t_k(y_{i-1},y_i,x, i)+\sum_{i,l}\mu_ls_l(y_i,x,i)) P(yx)=Z(x)1exp(i,kλktk(yi1,yi,x,i)+i,lμlsl(yi,x,i))
其中Z(x)为规范化因子:
Z ( x ) = ∑ y e x p ( ∑ i , k λ k t k ( y i − 1 , y i , x , i ) + ∑ i , l μ l s l ( y i , x , i ) ) Z(x) = \sum_yexp(\sum_{i,k}\lambda_k t_k(y_{i-1},y_i,x, i)+\sum_{i,l}\mu_ls_l(y_i,x,i)) Z(x)=yexp(i,kλktk(yi1,yi,x,i)+i,lμlsl(yi,x,i))

Linear-CRF的维特比算法解码思路

目的:给定x,求出p(y|x)最大的y。

方法1:暴力求解出所有的y的概率,取最大的;
方法2:维特比算法,其实就是动态规划
维特比算法的应用范围很广,这里详细讲解:
我们定义一个局部状态 δ i ( l ) \delta_i(l) δi(l),表示在位置i标记l的各个可能取值对应的非规范化概率的最大值,(z(x)并不影响大小),有定义我们可以得到i+1标记为l的表达式:
δ 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)=\mathop {\max}\limits_{1\le j \le m}\left\{\delta_i(j)+\sum_{k=1}^Kw_kf_k(y_i=j,y_{i+1}=l,x,i)\right\},\quad l=1,2,...m δi+1(l)=1jmmax{δi(j)+k=1Kwkfk(yi=j,yi+1=l,x,i)},l=1,2,...m
同时,我们用一个局部状态 ψ i + 1 ( l ) \psi_{i+1}(l) ψi+1(l)来记录使 δ i + 1 ( l ) \delta_{i+1}(l) δi+1(l)达到最大的位置i的标记取值,这个值用来回溯最优解,其递推表达式为:
ψ i + 1 ( l ) = a r g 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\mathop {\max}\limits_{1\le j \le m}\left\{\delta_i(j)+\sum_{k=1}^Kw_kf_k(y_i=j,y_{i+1}=l,x,i)\right\}\quad l=1,2,...m ψi+1(l)=arg1jmmax{δi(j)+k=1Kwkfk(yi=j,yi+1=l,x,i)}l=1,2,...m

解释一下这两个式子,假设我们的输入是 x = ( x 1 , x 2 , . . x n ) x=(x_1,x_2,..x_n) x=(x1,x2,..xn),总共可能的标记有m个(例如词性标注,一句话的句长为n,词性为m个,名词、动词等)

我们首先要明白的是这是一个动态规划问题,我们的思路是从局部最优解得到全局最优解:我们以“start_pos我喜欢踢足球end_pos”为例进行分析(每一个句子都加一个开始标记和结束标记,start_pos的index设置为0,那么“我”的index就是为1。另外我们还假设只有名词(N)、动词(V)、other(O)三种词性,即m=3.):

(1)、现在我们拿到了上述的这样一句话,要求我们输出他的词性。我们首先从start_pos开始,从start_pos转变到单词“我”,那么“我”的词性怎么判断呢?这是就需要用到上述的 δ \delta δ参数了,总共生了三个:
δ 1 ( N ) 表 示 开 始 为 s t a r t _ p o s , 第 一 个 单 词 为 N ( 名 词 ) 的 得 分 \delta_1(N) \quad 表示开始为start\_pos,第一个单词为N(名词)的得分 δ1(N)start_posN(
δ 1 ( V ) 表 示 开 始 为 s t a r t _ p o s , 第 一 个 单 词 为 V ( 动 词 ) 的 得 分 \delta_1(V) \quad 表示开始为start\_pos,第一个单词为V(动词)的得分 δ1(V)start_posV(
δ 1 ( O ) 表 示 开 始 为 s t a r t _ p o s , 第 一 个 单 词 为 N ( 其 他 词 ) 的 得 分 \delta_1(O) \quad 表示开始为start\_pos,第一个单词为N(其他词)的得分 δ1(O)start_posN(
此外这里仅仅考虑了前一个词性(此处为start_pos)对当前词性的影响(此处为“我”),还需要添加一个x对“我”的影响,就是前面的提到的结点特征函数,直接加到各个 δ \delta δ参数上,此处不在写明。
然后,我们还得到了3个:
ψ 1 ( N ) = s t a r t _ p o s 表 示 预 测 结 点 1 ( 单 词 “ 我 ” ) 为 名 词 的 路 径 的 上 一 个 结 点 的 词 性 为 s t a r t p o s \psi_1(N)=start\_pos \quad 表示预测结点1(单词“我”)为名词的路径的上一个结点的词性为start_pos ψ1(N)=start_pos1startpos
ψ 1 ( V ) = s t a r t _ p o s 表 示 预 测 结 点 1 ( 单 词 “ 我 ” ) 为 名 词 的 路 径 的 上 一 个 结 点 的 词 性 为 s t a r t p o s \psi_1(V)=start\_pos \quad 表示预测结点1(单词“我”)为名词的路径的上一个结点的词性为start_pos ψ1(V)=start_pos1startpos
ψ 1 ( O ) = s t a r t _ p o s 表 示 预 测 结 点 1 ( 单 词 “ 我 ” ) 为 名 词 的 路 径 的 上 一 个 结 点 的 词 性 为 s t a r t p o s \psi_1(O)=start\_pos \quad 表示预测结点1(单词“我”)为名词的路径的上一个结点的词性为start_pos ψ1(O)=start_pos1startpos
这个就比较特殊了,因为start_pos没有N/B/O的属性,所以都是start_pos。
2、然后我们求出了所有的 δ 1 \delta_1 δ1系列,然后去求第二个单词的词性概率分布
第二个单词是“喜”,如果假设这个“喜”的词性为名词(N),那么其最大得分怎么计算呢:
第一个词性为N的得分加上从词性N到词性N的转移得分(记为t(N,N)): δ 1 ( N ) + t ( N , N ) \delta_1(N) + t(N,N) δ1(N)+t(N,N),注意此处仍然省略了x对第二个单词词性的影响,实现时需要加上去,以下同理,不再赘述。
第一个词性为V的得分加上从词性V到词性N的转移得分(记为t(V,N)): δ 1 ( V ) + t ( V , N ) \delta_1(V) + t(V,N) δ1(V)+t(V,N)
第一个词性为O的得分加上从词性O到词性N的转移得分(记为t(O,N)): δ 1 ( O ) + t ( O , N ) \delta_1(O) + t(O,N) δ1(O)+t(O,N)
上述三个得分的最大值就是我们所需要的 δ 2 ( N ) \delta_2(N) δ2(N)(第二个词性为名词的得分),如下所示:
δ 2 ( N ) = m a x ( δ 1 ( N ) + t ( N , N ) , δ 1 ( V ) + t ( V , N ) , δ 1 ( O ) + t ( O , N ) ) \delta_2(N) = max(\delta_1(N)+t(N,N),\delta_1(V)+t(V,N),\delta_1(O)+t(O,N)) δ2(N)=max(δ1(N)+t(N,N),δ1(V)+t(V,N),δ1(O)+t(O,N))
同理可以得到:
δ 2 ( V ) = m a x ( δ 1 ( N ) + t ( N , V ) , δ 1 ( V ) + t ( V , V ) , δ 1 ( O ) + t ( O , V ) ) \delta_2(V) = max(\delta_1(N)+t(N,V),\delta_1(V)+t(V,V),\delta_1(O)+t(O,V)) δ2(V)=max(δ1(N)+t(N,V),δ1(V)+t(V,V),δ1(O)+t(O,V))
δ 2 ( O ) = m a x ( δ 1 ( N ) + t ( N , O ) , δ 1 ( V ) + t ( V , O ) , δ 1 ( O ) + t ( O , O ) ) \delta_2(O) = max(\delta_1(N)+t(N,O),\delta_1(V)+t(V,O),\delta_1(O)+t(O,O)) δ2(O)=max(δ1(N)+t(N,O),δ1(V)+t(V,O),δ1(O)+t(O,O))
就分别得到了第二个单词为名词、动词、其他词的得分。(再提醒一遍,上面的得分中并没有添加输入x的影响,实际实现时必须要添加)
然后考虑 ψ 2 \psi_2 ψ2参数,我们假设使 δ 2 ( N ) \delta_2(N) δ2(N)取到最大值的是 δ 1 ( V ) + t ( V , N ) \delta_1(V)+t(V,N) δ1(V)+t(V,N),那么 ψ 2 ( N ) = V \psi_2(N)=V ψ2(N)=V,表示第二个单词是名词时,第一个单词是动词。同理可以求出 ψ 2 ( V ) \psi_2(V) ψ2(V) ψ 2 ( O ) \psi_2(O) ψ2(O)
以后的求法就都一样了,直到我们求出了 δ 6 ( N / B / O ) \delta_6(N/B/O) δ6(N/B/O)(最后一个单词“球”各种词性的得分)。这三个得分中,最大的那个就是我们所需要求出的输出序列的最后一个词性。
1、例如 δ 6 ( N ) \delta_6(N) δ6(N)最大,我们就求出了“球”的词性为名词。
2、然后假设 ψ 6 ( N ) = O \psi_6(N)=O ψ6(N)=O,表示上一个词(“足”)的词性为O(其他词)
3、由于得知“足”的词性为O,则可以得到 ψ 5 ( O ) = V \psi_5(O)=V ψ5(O)=V,表示“足”的上一个词的词性为V(动词).
4、一直重复下去,就能得到所有的词性,然后输出,就是我们最后要的结果。

注意,以上计算得分时,都没有考虑到输入x的影响,实际上则需要将x的得分也计算到其中。

然后我们会给出CRF的代码实现和BP算法(调用函数)

你可能感兴趣的:(NLP)