写点什么

用于序列标注问题的条件随机场

  • 2019-09-26
  • 本文字数:3097 字

    阅读完需:约 10 分钟

用于序列标注问题的条件随机场


在此前的文章中,我曾介绍过介绍隐马尔科夫模型,隐马尔科夫模型引入了马尔科夫假设,即当前时刻的状态只与其前一时刻的状态有关。但是,在序列标注任务中,当前时刻的状态,应该同该时刻的前后的状态均相关。于是,在很多序列标注任务中,引入了条件随机场。今天详细介绍条件随机场的理论和及其在实体识别中的应用和 tensorflow 中的实现。

1 条件随机场是什么?

机器学习最重要的任务,是根据一些已观察到的证据(例如训练样本)来对感兴趣的未知变量(例如类别标记)进行估计和推测。


概率模型提供这样一种描述的框架,将学习任务归结于计算变量的概率分布。在概率模型中,利用已知变量推测未知变量的分布称为“推断”,其核心是如何基于可观测变量推测出未知变量的条件分布。具体来说,假定所关心的变量集合为 Y,可观测变量集合为 X,“生成式”模型直接通过训练样本基本联合概率分布 P(Y,X);“判别式”模型通过先计算条件分布 P(Y|X)。


我们前面讲的 HMM 是一种生成式概率图模型,条件随机场(CRF)与 HMM 不同,是一种判别式的概率图模型。CRF 是在给定一组变量的情况下,求解另一组变量的条件概率的模型。


设 X 与 Y 是一组随机变量,P(Y,X)是给定随机变量 X 情况下,随机变量 Y 的条件概率。若随机变量 Y 构成一个无向图 G(V,E),当 X 与 Y 两个随机变量的概率分布满足如下的条件:



则称在给定随机变量序列 X 的情况下,随机变量序列 Y 的条件概率 P(Y,X)构成条件随机场。


简单说明一下上面的条件概率公式:


v 表示 G 中的任一节点,例如 Y1,v~V。n(v)表示与 v 有边连接的节点的集合。上式的含义就是,Y 在 i 时刻的状态,仅与其有边连接的节点有关。


在 NLP 中,常用的是线性链的条件随机场,下面着重介绍下线性链条件随机场以加深理解。



设 X={x1,x2,x3,…xn},Y={y1,y2,y3,…yn}均为线性链表示的随机变量序列,若在给定随机变量序列 X 的情况下,随机变量序列 Y 的条件概率 P(Y,X)构成条件随机场,即满足如下的条件:



从上面的定义可以看出,条件随机场与 HMM 之间的差异在于,HMM 中,Y 在 i 时刻状态与其前一时刻,即 y(i-1)相关。而在 CRF 中,Y 在 i 时刻的状态与其前后时刻,即 y(i-1)与 y(i+1)均相关。


上面大致讲了条件随机场的定义,有什么样的性质。如果读过小 Dream 哥上一篇 HMM 讲解文章的同学,此刻对 CRF 应该就有了大致的了解。


在介绍 CRF 的实际应用之前,还有一些概念需要介绍,就是条件随机场的参数化形式。

2 条件随机场的参数化表现形式

我们先列出来 CRF 的参数化形式。假设 P(Y,X)是随机序列 Y 在给定随机序列 X 情况下的条件随机场,则在随机变量 X 取值为 x 的情况下,随机变量 Y 的取值 y 具有如下关系:




t_k 和 s_l 是特征函数,v_k 和 u_l 是对应的权值


t_k 是状态转移函数,v_k 是对应的权值;s_l 是发射函数,u_l 是对应的权值。好的,假如所有的 t_k,s_l 和 v_k,u_l 都已知,我们要算的 P(Yi =yi|X)是不是就可以算出来啦?


在给定随机序列 X 的情况下,计算概率最大 Y 序列可以用维特比算法,维特比算法在上一章节 HMM 中有详细的介绍,没看的同学可以在点击链接查看。


大家应该还有一大堆的疑问,t_k,s_l 和 v_k,u_l 如何确定和学习?在实际中我们如何使用?小 Dream 如果只讲到这里,就会太让大家失望了。下面我们看看在 tensorflow 里,CRF 是怎么实现的,以及我们如何使用他,经过这一段,大家对条件随机场应该就会有一个较为完整的认识了。

3 tensorflow 里的条件随机场

这一节我们以命名实体识别为例,来介绍在 tensorflow 里如何使用条件随机场(CRF)。


命名实体识别与分词一样,是一个序列标注的问题,因为篇幅问题,这里就不展开,不清楚的同学可以先出门百度一下,以后我们再找机会,好好讲一下命名实体识别的项目。


该命名实体识别任务特征提取的网路结构如下:



其他的我们先不看,我们只用知道,自然语言的句子经过神经网络(双向 LSTM)进行特征提取之后,会得到一个特征输出。训练时,将这个特征和相应的标记(label)输入到条件随机场中,就可以计算损失了。预测时,将自然语言输入到该网络,经 CRF 就可以识别该句子中的实体了。


我们来看看具体的代码:



这是我定义的损失层,project_logits 是神经网络最后一层的输出,该矩阵的 shape 为[batch_size, num_steps, num_tags],第一个是 batch size,第二个是输入的句子的长度,第三个标记的个数,即命名实体识别总标记的类别数。targets 是输入句子的 label,即每个字的 label,它的维度为[batch_size, num_steps]。损失层定义了一个 self.trans 矩阵,大小是[num_tags+1, num_tags+1], 加 1 是因为还有一个类别是未定义。


将 project_logit,targets 以及 self.trans 交给 tensorflow 的系统函数 crf_log_likelihood 即可求得损失了。


下面我们进一步来看看 crf_log_likelihood 是怎么实现的:



crf_log_likelihood 函数中分为两步,最终得到 scores:


(1) 调用 crf_sequence_score 函数计算 sequence_scores。


(2) 将 sequence_scores 进行归一化处理。


CRF 参数的学习及 score 计算过程主要在 crf_sequence_score 中进行,我们好好看看这个函数。



从 crf_sequence_score 函数的实现中,我们看出,tf 中的损失值包括一元损失和二元损失。其中 unary_scores 表示的是输入序列之间转化的损失,unary_scores 表示的转化矩阵的损失值。那这两项到底是什么呢?都是两项,是不是和 CRF 的参数化形式感觉有点像?我们看看相关论文是怎么说的。


LampleG, Ballesteros M, Subramanian S, et al. Neural architectures for named entity recognition[J]. arXiv preprint arXiv:1603.01360, 2016.



我们看一下,得分分为两项,第一项:



它表示输入句子中,第 i 个词,取某个标记的概率。


举个例子,假如输入的句子是“Mark Watney visit Mars”, 相应的 label 是[B-PER,E-PER,O,S-LOC],则 P(1,“B-PER”)表示的是第一个词的标记是 B-PER 的概率。所以第一项会是 P(1,“B-PER”)+P(2,“E-PER”)+P(3,“O”)+P(4,“S-LOC”)。


前面提到过,project_logits 是神经网络最后一层的输出,该矩阵的 shape 为[batch_size, num_steps, num_tags]。所以在 tensorflow 的实现中,该矩阵的值会取到 project_logits 矩阵中相应的值,这一点交叉熵有点像,同学们体会一下。


第二项:



它代表的是整个序列从一个标记转化到下一个标记的损失值。它用每一项值从 self.trans 矩阵中取得。它最开始是按照我们初始化的方式初始化的,然后会随着训练的过程优化。


好了,tensorflow 中 crf 就是这么实现的,是不是有种豁然开朗的感觉??


我们来做一个总结,CRF 是一个在给定某一个随机序列的情况下,求另一个随机序列的概率分布的概率图模型,在序列标注的问题中有广泛的应用。


在 tensorflow 中,实现了 crf_log_likelihood 函数。在本文讲的命名实体识别项目中,自然语言是已知的序列,自然语言经过特征提取过后的 logits,是发射矩阵,对应着 t_k 函数;随机初始化的 self.trans 矩阵是状态转移矩阵,对应着参数 s_l,随着训练的过程不断的优化。


CRF 相关的理论及其在 tensorflow 中的实现,就差不多讲完了。但是有一个很关键的点,需要读者们思考一下。在这个实体识别的任务中,经过 LSTM 完成特征提取之后,为什么要接一层 CRF 再得到 scores 和损失值?

总结

条件随机场(CRF)在现今 NLP 中序列标记任务中是不可或缺的存在。太多的实现基于此,例如 LSTM+CRF,CNN+CRF,BERT+CRF。因此,这是一个必须要深入理解和吃透的模型。


作者介绍


小 Dream 哥,公众号“有三 AI”作者。该公号聚焦于让大家能够系统性地完成 AI 各个领域所需的专业知识的学习。


原文链接


https://mp.weixin.qq.com/s/79M6ehrQTiUc0l_sO9fUqA


2019-09-26 18:372207

评论

发布
暂无评论
发现更多内容

OASA 厂商三未信安完成与 Anolis OS 及其衍生版适配,密码卡性能与稳定性获验证

OpenAnolis小助手

操作系统 龙蜥社区 龙蜥生态

快节奏业务增长,还是得App混合开发

FinFish

APP开发 混合开发 小程序技术 小程序容器技术

大厂裁员潮背后的真相:这 5 类程序员最危险(附转型指南)

飞算JavaAI开发助手

BSO收购InterCloud,强化高性能云连接解决方案

财见

天润云2024财报:AI收入增长72.5%,营收毛利再创新高!

天润融通

数字货币交易所开发中的常见问题与解决方案

区块链软件开发推广运营

交易所开发 dapp开发 链游开发 公链开发 代币开发

新闻速递丨Altair与JetZero达成战略合作,共拓翼身融合飞机技术新纪元

Altair RapidMiner

仿真 hyperworks 航空航天 CFD FlightStream

推荐 5 个 火火火火 的CMS开源.Net项目

不在线第一只蜗牛

.net 开源

探讨React Native与小程序结合的技术架构

xuyinyin

2025年3月文章一览

codists

Python

国产化替代是个伪命题?被误解多年的开源软件,如今怎么样了

禅道项目管理

信创 企业安全 开源软件 项目管理软件 国产化替代

布鲁可第3届BFC创作赛第2季度「破茧赛季」正式启幕,赛事体系迎来新升级

财见

Mac电脑必备文件管理器推荐,MacBook文件资源管理软件哪家强?

阿拉灯神丁

MacBook CleanMyMac Mac软件 文件管理软件 Path Finder

SysOM AI 可观测体系:零侵入、低开销,让系统透明化

OpenAnolis小助手

AI 运维 操作系统 龙蜥社区 AI可观测

什么是DNS劫持?DNS劫持如何预防和应对?(国科云)

防火墙后吃泡面

SpringAI用嵌入模型操作向量数据库!

伤感汤姆布利柏

ShareSDK全面适配鸿蒙NEXT

MobTech袤博科技

sharesdk mobtech 鸿蒙 os

朱啸虎后,人形机器人赛道,风口下的冷思考!

机器人头条

机器人 科技 大模型 人形机器人 具身智能

2025年局域网聊天软件推荐,打造高效便捷的局域网沟通利器

BeeWorks

即时通讯 私有化部署 IM即时通讯 局域网视频软件

智能设备操作系统闭源化浪潮下,小程序生态重构与技术创新

FinFish

操作系统 小程序容器 小程序技术 闭源操作系统

携手龙蜥,Alinux 最佳 AI 镜像服务商公布,堡塔、飞致云等 6 家企业实力登榜

OpenAnolis小助手

AI 操作系统 龙蜥社区 Alibaba Cloud Linux

AI思维导图生成器哪个好?5个导图软件大盘点!

职场工具箱

思维导图 办公软件 AI软件 AIGC 思维导图软件

SpringAI用嵌入模型操作向量数据库!

王磊

MobPush标签推送新范式,精准触达就这么玩

MobTech袤博科技

消息推送 mobpush

即刻体验|腾讯云AI代码助手正式搭载DeepSeek-V3-0324顶级模型,开发效率直接提升100倍!

CodeBuddy

快节奏业务增长,还是得App混合开发

Speedoooo

APP开发 小程序容器 混合开发 小程序容器技术

SITA收购CCM,通过将旅游技术与高端设计相结合

财见

CAD中绘制带宽度属性的多段线方法

极客天地

CAD中对象的等分操作方法

极客天地

Go/Rust 疯狂蚕食 Java 市场?老牌语言的 AI 化自救之路

飞算JavaAI开发助手

非凸科技走进北大汇丰,揭秘数智交易前沿技术与人才密码

非凸科技

用于序列标注问题的条件随机场_AI&大模型_小Dream哥_InfoQ精选文章