乐趣区

关于深度学习:条件随机场CRF的详细解释

条件随机场 (CRF) 由 Lafferty 等人于 2001 年提出,联合了最大熵模型和隐马尔可夫模型的特点,是一种无向图模型,罕用于标注或剖析序列材料,如自然语言文字或是生物序列。近年来在分词、词性标注和命名实体辨认等序列标注工作中获得了很好的成果。

条件随机场是一类最适宜预测工作的判断模型,其中相邻的上下文信息或状态会影响以后预测。CRF 在命名实体辨认、词性标注、基因预测、降噪和对象检测问题等方面都有利用。

在本文中首先,将介绍与马尔可夫随机场相干的根本数学和术语,马尔可夫随机场是建设在 CRF 之上的形象。而后,将具体介绍并解释一个简略的条件随机场模型,该模型将阐明为什么它们非常适合程序预测问题。之后,将在 CRF 模型的背景下探讨似然最大化问题和相干推导。最初,还有一个过对手写辨认工作的训练和推理来演示 CRF 模型。

马尔可夫随机场

马尔可夫随机场(Markov Random Field)或马尔可夫网络(Markov Network)是一类在随机变量之间具备无向图的图形模型。该图的构造决定了随机变量之间的相关性或独立性。

马尔可夫网络由图 G = (V, E) 示意,其中顶点或节点示意随机变量,边示意这些变量之间的依赖关系。

该图能够合成为 J 个不同的团(小的团体 cliques)或因子(factors),每个由因子函数 φⱼ 摆布,其范畴是随机变量 Dⱼ 的子集。对于 dⱼ 的所有可能值,φⱼ (dⱼ) 应该严格为正。

对于要示意为因子或团的随机变量的子集,它们都应该在图中相互连接。所有团的范畴的并集应该等于图中存在的所有节点。

变量的非归一化联结概率是所有因子函数的乘积,即 对于下面显示的 V = (A, B, C, D) 的 MRF,联结概率能够写为:

分母是每个变量可能取的所有可能的因子乘积的总和。它是一个常数示意,也称为配分函数,通常用 Z。

Gibbs Notation

还能够通过对对数空间中的因子函数进行操作,将关节示意为 Gibbs 散布。应用 β (dⱼ) = log (ϕ (dⱼ)),能够用 Gibbs 表示法示意独特的边,如下所示。X 是图中所有随机变量的汇合。β 函数也称为 factor potentials。

这个公式很重要,因为本文将在前面应用 Gibbs 符号来推导似然最大化问题。

条件随机场模型

让咱们假如一个马尔可夫随机场并将其分为两组随机变量 Y 和 X。

条件随机场是马尔可夫随机场的一个特例,其中图满足以下属性:“当咱们在 X 全局条件下,即 当 X 中随机变量的值固定或给定时,汇合 Y 中的所有随机变量都遵循马尔可夫性质 p(Yᵤ/X,Yᵥ,u≠v)=p(Yᵤ/X,Yₓ,Yᵤ~Yₓ),其中 Yᵤ ~ Yₓ 示意 Yᵤ 和 Yₓ 是图中的街坊。”变量的相邻节点或变量也称为该变量的马尔可夫毯(MarkovBlanket)。

满足上述属性的一个这样的图是上面共享的链结构图:

因为 CRF 是一个判断模型,即 它对条件概率 P (Y / X) 进行建模,即 X 总是给出或察看到。因而,该图最终简化为一条简略的链。

当咱们以 X 为条件并试图为每个 Xᵢ 找到相应的 Yᵢ 时,X 和 Y 也别离称为证据变量和标签变量。

验证下面显示的“因子缩减”CRF 模型合乎上面为可变 Y₂所示的马尔可夫属性。由此可见,给定所有其余变量的 Y₂的条件概率最终只取决于相邻节点。

满足马尔可夫性质的变量 Y₂,条件仅取决于相邻变量

CRF 实践和似然优化

让咱们首先定义参数,而后应用 Gibbs 表示法建设联结(和条件)概率的方程。

  1. Label domain:假如汇合 Y 中的随机变量有一个域:{m ϵ ℕ | 1≤m≤M}即前 M 个自然数。
  2. Evidence structure and domain:假如汇合 X 中的随机变量是大小为 F 的实值向量,即∀ Xᵢ ϵ X, Xᵢ ϵ Rˢ。
  3. 设 CRF 链的长度为 L,即 L 个标签和 L 个证据变量。
  4. 令 βᵢ (Yᵢ, Yⱼ) = Wcc ‘ 如果 Yᵢ = c, Yⱼ = c’ 并且 j = i + 1, 否则为 0。
  5. 令 β’ᵢ (Yᵢ, Xᵢ) = W’c。Xᵢ,如果 Yᵢ = c,否则为 0,其中。示意点积,即 W’c ε Rˢ。
  6. 请留神,参数的总数是 M x M + M x S,即每个标签转换有一个参数(M x M 个可能的标签转换)和每个标签(M 个可能的标签)的 S 个参数,这些参数将乘以该标签处的察看变量(大小为 S 的向量)。
  7. 令 D = {(xn, yn)} for n = 1 to N,为由 N 个示例组成的训练数据。

其中似然表达式能够示意如下:

所以训练问题归结为最大化所有模型参数 Wcc’ 和 W’cs 的对数似然。

对于 W’cs 的对数似然梯度推导如下:-

下面等式中的第二项示意 y ’ᵢ等于 c 的边际概率之和(在 y ’ 能够取的所有可能值上),由 xnis 加权。y’-i 这里示意除地位 i 之外每个地位的标签 / y 变量的汇合。

能够为 dL / dWcc ‘ 计算出相似的推导,后果如下:

这就是标签 - 标签权重的似然导数

当初曾经有了导数和对数似然的表达式,实际上就能够从头开始编写 CRF 模型。能够应用下面提到的方程进行编码,应用相信流传来计算边际并计算出导数,而后应用现成的优化算法(如 L-BFGS)优化。

然而为了简略起见,咱们不会从新创造轮子,咱们应用应用现有的 CRFSuite 库进行演示。

演示 – 手写辨认

到目前为止,应该相当分明 CRF 的构造为什么以及如何使它们成为捕捉程序关系的工作的现实抉择,例如 POS 标记句子、命名实体辨认等。在这个本文中将应用 CRF 进行笔迹检测工作。

为了筹备这个演示的数据集,应用了斯坦福 OCR 数据集和 Gutenberg 我的项目存档的组合。

数据集筹备

斯坦福 OCR 数据集总共蕴含 6877 个手写单词,分为 9 折。每个单词的第一个字符都不是小写字符。对于每个单词中的每个手写字符,数据集蕴含一个长度为 128 的二进制数组,能够将其转换为大小为 16×8 的图像。数据集中的一些单词可视化后果如下:-

通过剖析,我发现整个数据集中的惟一词数量只有 24 个。

咱们心愿 CRF 模型可能学习标记察看值 (xᵢ),这些察看后果是同时呈现的字符像素向量。只管就字符像素向量而言,数据集中有 6,877 个独特的样本,对于 24 个单词组合来说数据量十分的小,可能无奈以概率的形式捕获个别英语中的字符共现和进行单词识别器。

为了解决这个问题,我决定应用所有字符向量示意来创立一个新的数据集。我为字典中的每个字符捕捉了数据集中可用的所有不同字符像素向量变体。在实现后,导入了名著《白鲸记》中呈现的所有单词,并过滤掉所有长度小于 3 或蕴含字母集以外的内容,而后将过滤后的标记转换为小写。这种形式总共提取了 18,859 个单词,而后按词长分成训练集和测试集,。

为了形成 CRF 模型的理论训练和测试集,我应用了我一开始创立的字符到像素数组矢量图。为了创立单词图像 / x,我应用对立采样从字典中为该字符筛选了一个像素数组向量变体。创立的数据集的后果如下:

训练和测试数据集筹备好后,就能够训练模型并依据工作对其进行评估了。

模型训练与评估

这里只粘贴次要代码,全副代码请看最初:

def train_model(X, Y, max_iter_count,  model_store = "handwriting-reco.crfsuite"):
trainer = pycrfsuite.Trainer(verbose=False)

for xseq, yseq in zip(X, Y):
trainer.append(xseq, yseq)

trainer.set_params({
    'c1': 1.0,   # coefficient for L1 penalty
    'c2': 1e-3,  # coefficient for L2 penalty
    'max_iterations': max_iter_count,  # stop earlier

    # include transitions that are possible, but not observed
    'feature.possible_transitions': True
})

trainer.train(model_store)

print(trainer.logparser.last_iteration)

def get_preds(X, model_store = "handwriting-reco.crfsuite"):
tagger = pycrfsuite.Tagger()
tagger.open(model_store)
Y_pred = [tagger.tag(x) for x in X]

return Y_pred

def test_model(X_test, Y_test):
Y_test_pred = get_preds(X_test)

lb = LabelBinarizer()

y_test_combined = lb.fit_transform(list(chain.from_iterable(Y_test)))
y_pred_combined = lb.transform(list(chain.from_iterable(Y_test_pred)))

print "Test accuracy : {}".format(accuracy_score(y_test_combined, y_pred_combined))

应用下面的脚本,我在蕴含 15088 个单词的训练集上训练了一个 CRF 模型,在测试集上达到了靠近 85% 的准确率,看样子还是很不错的。

CRF 与隐马尔可夫模型有何不同

机器学习模型有两个常见的分类,生成式和判别式。条件随机场是一种判断分类器,它对不同类之间的决策边界进行建模。而生成模型是建设数据如何生成的模型,在学习后可用于进行分类。举个简略的例子,奢侈贝叶斯是一种非常简单且风行的概率分类器,是一种生成算法,而逻辑回归是一种基于最大似然预计的分类器,是一种判断模型,同理条件随机场也是。

CRF 与隐马尔可夫模型都用于对程序数据进行建模,但它们是不同的算法。

隐马尔可夫模型是生成式的,它通过对联结概率分布建模来给出输入。而条件随机场具备判断性,对条件概率分布进行建模。CRF 不依赖独立性假如(即标签互相独立),并且防止标签偏差。隐马尔可夫模型是条件随机场的一个十分具体的例子,应用的转移概率是一个常数。hmm 基于奢侈贝叶斯 (Naive Bayes),说奢侈贝叶斯能够从逻辑回归(Logistic Regression) 中导出,而逻辑回归是 crf 的衍生。

CRF 的利用

因为 crf 具备对程序数据建模的能力,因而在自然语言解决中常常应用 crf,并且在该畛域有许多利用。例如词性标记,句子的词性依赖于先前的单词,通过应用利用这一点的特征函数,能够应用 CRF 来学习如何辨别句子中的哪些词对应于哪个 POS。另一个相似的利用是命名实体辨认,或从句子中提取专有名词。条件随机场可用于预测多个变量相互依赖的任何序列。其余利用包含图像中的局部辨认和基因预测。

代码:

https://www.overfit.cn/post/921370f1880e4472814ace6a8ac850da

作者:Aditya Prasad & Ravish Chawla

退出移动版