条件随机场

条件随机场(conditional random field)是一个比感知机更加强大的模型。

背景知识

机器学习模型谱系图

Sklearn对应机器学习算法决策树
img
使用模板:
img

生成式模型

模拟数据的生成过程,且随机变量x,y存在因果先后关系:现有y再有x。这种关系通过联合分布模拟:

具体流程:

  • 根据p(y)采样y
  • 根据p(x|y)采用x
  • 生成样本概率p(x,y)
  • 通过遍历y的所有取值,获得最大的P(x,y)作为预测结果

通过p(x,y),可以求得p(x)。

但是,p(x)很难准确估计。因为特征之间并不是相互独立的,存在一定的依赖关系。

eg: 中文分词的一元语法:字符“榴”的后一个字符可以确定是“莲”,但是生成式模型直接认为这两个字符相互独立,忽略的这种依赖关系,导致不合符实际。

判别式模型

对生成式模型的改进。跳过了p(x),直接对p(y|x)建模。这样不需要考虑x内的各种依赖关系。

在生成式和判别式中,模型都是多维度随机变量分布。这些随机变量可能相互独立,也可能相互依赖,可以通过概率图模型来进行分析多维随机变量分布。

有向和无向概率图模型

概率图模型

通过图来表示p(x,y),利用结点来表示随机变量,用边来表示有关联的随机变量。

有向图模型

将事情通过前后因果顺序进行连接为有向图。

“发生地震”和“卡车撞墙”会导致“房子摇晃”,同时“发生地震”也会导致“卡车撞墙”,于是将"卡车撞墙"和"发生地震"指向"房子摇晃",“发生地震"指向"卡车撞墙”。

于是多维随机变量的分布可以分解为:

马尔科夫链就是有向图中的一个例子。

无向图模型:

不需要探究事情的前因后果。仅仅指向有关联的结点。

无向图将概率分解为所有最大团上的某函数的乘积。

团: 无向图的完全子图。

极大团:如果一个团不被其他任一团所包含,即它不是其他任一团的真子集,则称该团为图G的极大团

最大团:最大团就是就是结点数最多的极大团。

在上图中,

团有很多:{0,5},{0,1},{0,4,5},{1,2,4}…

极大团:{0,4,5},{1,2,4},{0,1,4},{4,3}

最大团:{0,4,5},{1,2,4},{0,1,4}

无向图模型定义了一些虚拟的因子节点,每个因子节点只连接部分节点,组成更小的最大团

这样,该图的最大团由一个变为了4个,每个最大团变量节点变为了两个。于是,将多为随机变量的联合分布分解为了各个最大团中的因子的乘积。并且该分布为判别式模型最需要的条件概率分布。

a是因子节点,Ca是因子节点对应的函数,xa,ya是因子节点所有连接的变量节点\\a是因子节点,C_a是因子节点对应的函数,x_a,y_a是因子节点所有连接的变量节点\\

在机器学习中,通常将因子函数设为:

其中k为特征编号,fak(xa,ya)为特征函数,Wak为特征的权重其中k为特征编号,f_{ak}(x_a,y_a)为特征函数,W_{ak}为特征的权重

P(y_t|x_t)=\frac{1}{Z(x)}C_t(y_{t-1},y_t,x_t)\
=\frac{1}{Z(x)}exp{\sum_{k=1}^KW_{k}f_{k}(y_{t-1},y_t,x_t)}\其中:
Z(x)=\sum_{y}exp{\sum_{k=1}^KW_{k}f_{k}(y_{t-1},y_t,x_t)}
\K为特征数,f_{k}为特征函数,W_k为特征的权重

define:\\mathbb W ={W_1,W_2,…,W_k}^T\
\mathbb F(y_{t-1},y_t,x_t)={f_1(y_{t-1},y_t,x_t),…,f_k(y_{t-1},y_t,x_t)}\
so:\
P(y_t|x_t)=\frac {exp(\mathbb W\mathbb F(y_{t-1},y_t,x_t))}{Z(x)}

### CRF的三个问题 与HMM一样,CRF也存在着三个待求解的问题。在HMM中,我们将观测序列按照时刻逐个的进行计算,但是在CRF中,我们无需拆开观测序列X,相比而言,CRF更加的容易。下面我们具体描述CRF的三个基本问题: * 评估问题: 概率计算的问题。给定P(Y|X), 输入序列X和输出序列Y时,求P(Y_i|X)和P(Y_i,Y_{i-1}|X)的条件概率。 * 解码问题,给定CRF,条件概率分布P(Y|X),观测序列X,求解条件概率最大的状态序列Y。 #### 评估问题 给定相关的约束条件,即给定相关的特征函数和对应的特征函数的权重值。处理这个问题的基本算法采用前向,后向算法,其中我们定义**给定的条件随机场**:γ 定义:M_i(y_{i−1},y_i|x)=exp(∑_{k=1}^Kw_kf_k(y_{i−1},y_i,x))\\ 这样,我们很容易得到序列位置i+1的标记是y_{i+1}时,之前的部分标记序列的非规范化概率递推公式:\\ \\ 1,\quad y_0=start\\ \end{cases}\\ 我们定义β_i(y_i|x)表示序列位置i的标记是y_i时,之后的从i+1到n的部分标记序列的非规范化概率\\ 定义:β_{n+1}(y_{n+1}|x)=\begin{cases} 0, \quad else \\ 于是我们可以计算出计算序列位置i的标记是y_i时的条件概率P(Y_i=y_i|x):\\ 也能够计算序列位置i的标记是y_i,位置i−1的标记是y_{i−1}时的条件概率P(Y_{t-1}=y_{t-1},Y_t=y_i|x):\\

学习问题

我们给定训练数据集X和对应的标记序列Y,K个特征函数fk(x,y),需要学习模型参数特征权重条件概率Pw(y|x),其中条件概率Pw(y|x)和模型权重wk满足以下关系

梯度下降法求解

在使用梯度下降法求解模型参数之前,我们需要定义我们的优化函数,这里采用极大似然函数作为目标函数:

f(w)w=x,yP¯(x)Pw(yx)f(x,y)x,yP¯(x,y)f(x,y)\\\frac{∂f(w)}{∂w}=∑_{x,y}P^¯(x)P_w(y|x)f(x,y)−∑_{x,y}P^¯(x,y)f(x,y)

首先计算第一个句子词性为1,2的非规范化概率:\
δ_1(1)=μ1s1=1\δ_1(2)=μ2s2=0.5

接下来进行递推,计算第二个句子:\
δ_2(1)=max{δ_1(1)+t_2λ_2+μ_3s_3,δ_1(2)+t_4λ_4+μ_3s_3}
\=max{1+0.6+0.8,0.5+1+0.8}=2.4\
δ_2(2)=max{δ_1(2)+μ_2s_2,δ_1(1)+t_1λ_1+μ_2s_2}
\=max{0.5+0.5,1+1+0.5}=2.5\

然后计算第三个句子:\
δ_3(1)=max{δ_2(1)+μ_3s_3,δ_2(2)+t_3λ_3+μ_3s_3}
\=max{2.4+0.8,2.5+1+0.8}=4.3\
δ_3(2)=max{δ_2(1)+t_1λ_1+μ_4s_4,δ_2(2)+t_5λ_5+μ_4s_4}
\=max{2.4+1+0.5,2.5+0.2+0.5}=3.9\

比较max(δ_3(1),δ_3(2),得到y_3=1,再逆推回去\

即最终的结果为(y1,y2,y1),即标记为(名词,动词,名词)。 ## 实现 ```python from pyhanlp.static import download, remove_file, HANLP_DATA_PATH import zipfile CRFLexicalAnalyzer = JClass('com.hankcs.hanlp.model.crf.CRFLexicalAnalyzer') CRF_MODEL_PATH=None root_path=None def test_data_path(): os.mkdir(data_path) CRF_MODEL_TXT_PATH = data_path + "/crf-cws-model.txt" # 下载MSR语料库 root_path = test_data_path() download(data_url, dest_path) archive.extractall(root_path) dest_path = dest_path[:-len('.zip')] sighan05 = ensure_data('icwb2-data', 'http://sighan.cs.uchicago.edu/bakeoff2005/data/icwb2-data.zip') msr_train = os.path.join(sighan05, 'training', 'msr_training.utf8') msr_test = os.path.join(sighan05, 'testing', 'msr_test.utf8') msr_gold = os.path.join(sighan05, 'gold', 'msr_test_gold.utf8') def train(corpus): segmenter.train(corpus, CRF_MODEL_PATH) segment = train(msr_train) ``` 由于运行过程太占时间和内存,直接使用书上的结果图 ![](https://voluntexi.github.io//post-images/1659585417527.png)