1. Why CRF(条件随机场)

如果用softmax给序列中的每一帧都进行分类。并没有直接考虑输出的上下文关联

CRF主要用于序列标注问题,可以简单理解为是给序列中的每一帧都进行分类,既然是分类,很自然想到将这个序列用CNN或者RNN进行编码后,接一个全连接层用softmax激活,如下图所示

 条件随机场

然而,当我们设计标签时,比如用s、b、m、e的4个标签来做字标注法的分词,目标输出序列本身会带有一些上下文关联,比如s后面就不能接m和e,等等。逐标签softmax并没有考虑这种输出层面的上下文关联,所以它意味着把这些关联放到了编码层面,希望模型能自己学到这些内容,但有时候会“强模型所难”。

而CRF则更直接一点,它将输出层面的关联分离了出来,这使得模型在学习上更为“从容”:

CRF在输出端显式地考虑了上下文关联

2. 什么是CRF

当然,如果仅仅是引入输出的关联,还不仅仅是CRF的全部,CRF的真正精巧的地方,是它以路径为单位,考虑的是路径的概率

2.1 模型概要

假如一个输入有nn帧,每一帧的标签有kk种可能性,那么理论上就有knkn种不同的输出。我们可以将它用如下的网络图进行简单的可视化。在下图中,每个点代表一个标签的可能性,点之间的连线表示标签之间的关联,而每一种标注结果,都对应着图上的一条完整的路径。

4tag分词模型中输出网络图

而在序列标注任务中,我们的正确答案是一般是唯一的。比如“今天天气不错”,如果对应的分词结果是“今天/天气/不/错”,那么目标输出序列就是bebess,除此之外别的路径都不符合要求。换言之,在序列标注任务中,我们的研究的基本单位应该是路径,我们要做的事情,是从knkn条路径选出正确的一条,那就意味着,如果将它视为一个分类问题,那么将是knkn类中选一类的分类问题!

这就是逐帧softmax和CRF的根本不同了:前者将序列标注看成是n个k分类问题,后者将序列标注看成是1个分类问题。

3. 序列标注模型中的两种标记模式

3.1 SBME标记法

S 表示 表示单个字的词(single word) , B表示词的开始(begin)即首字,M表示词的中间(Middle)即词的中间字,E表示词的结尾(end),即尾字 一般在用数字这样表示:

# -1, unknown
# 0-> 'S'
# 1-> 'B'
# 2-> 'M'
# 3-> 'E'

样例: 我爱使用小米手机玩王者荣耀   -> 我<S>爱<S>使<B>用<E>小<B>米<M>手<M>机<E>玩<S>王<B>者<M>荣<M>耀<E>

3.2  CS标记法

C 表示 当前的字char和后面字char是连续的,它们共同表示一个词,S 表示 当前字char和后面字char是两个不同的词 。
一般用数字这样表示:#-1,unkonwn# 0  -> 'C'# 1 -> 'S'

样例:   我爱使用小米手机玩王者荣耀  -> 我<S>爱<S>使<C>用<S>小<C>米<C>手<C>机<S>玩<S>王<C>者<C>荣<C>耀<S>

3.3. IOB Inside-outside-beginning (tagging)

IOB Inside-outside-beginning (tagging)
IOB是一种标记技术,IOB foramt是一种在计算机语言学断句中常用的符号(tokens)的形式。

B前缀指代一个语句块的开始;I前缀指代在该语句块(chunk)当中;O前缀指代不在该语句块中。

B标签只在一个标签要紧跟在另一个同类型标签但没有两个标签之间没有O标志的时候使用。O标签显示该符号不属于任何语句块。

An example with IOB format:

Alex I-PER
is O
going O
to O
Los I-LOC
Angeles I-LOC
in O
California I-LOC

Alex is going to Los Angeles in California

I-PER O O O I-LOC I-LOC O I-LOC

Notice how "Alex", "Los" and "California", although first tokens of their chunk, have the "I-" prefix.

另外一个例子

Alex I-PER
going O
Los I-LOC
Angeles I-LOC
California B-LOC

Notice how "California" now has the "B-" prefix, because it immediately follows another LOC chunk.

3.4. IOB2 format

Another similar format which is widely used is IOB2 format, which is the same as the IOB format except that the B- tag is used in the beginning of every chunk (i.e. all chunks start with the B- tag).

例子

Alex B-PER
is O
going O
to O
Los B-LOC
Angeles I-LOC
in O
California B-LOC

3.5. BIOES

Related tagging schemes sometimes include "START/END: This consists of the tags B, E, I, S or O where S is used to represent a chunk containing a single token. Chunks of length greater than or equal to two always start with the B tag and end with the E tag."[4]

Other Tagging Scheme's include BIOES/BILOU, where 'E' and 'L' denotes Last or Ending character is such a sequence and 'S' denotes Single element or 'U' Unit element.

Alex S-PER
is O
going O
with O
Marty B-PER
A. I-PER
Rick E-PER
to O
Los B-LOC
Angeles E-LOC

参考
Wikipedia: Inside-outside-beginning

Text Chunking using Transformation-Based Learning, Ramshaw and Marcus, 1995

4. 代码实现

安装tensorflow-addons. 因为Tensorflow 1 的实现在contrib. tensorflow 2的实现在Tensorflow_addons里面

pip install tensorflow-addons

测试例子

import tensorflow_addons as tfa
import tensorflow as tf
import numpy as npinputs=tf.random.truncated_normal([2,10,5])
target=tf.convert_to_tensor(np.random.randint(5,size=(2,10)),dtype=tf.int32)
out=tf.keras.layers.Softmax(inputs)lens=tf.convert_to_tensor([9,6],dtype=tf.int32)
log_likelihood,tran_paras=tfa.text.crf_log_likelihood(inputs, target, lens)
batch_pred_sequence,batch_viterbi_score=tfa.text.crf_decode(inputs,tran_paras,lens)
loss=tf.reduce_sum(-log_likelihood)
print('log_likelihood is :',log_likelihood.numpy())
print('batch_pred_sequence is :',batch_pred_sequence.numpy())
print('loss is :',loss.numpy())

输出

log_likelihood is : [-18.046837 -14.958561]
batch_pred_sequence is : [[0 3 1 4 3 4 2 0 4 3][3 0 3 3 2 2 4 1 4 1]]
loss is : 33.005398

CRF(条件随机场) 学习总结相关推荐

  1. NLP系列学习:CRF条件随机场(2)

    NVIDIA DLI 深度学习入门培训 | 特设三场!! 4月28日/5月19日/5月26日一天密集式学习  快速带你入门阅读全文> 正文共3565个字,15张图,预计阅读时间10分钟. 这一篇 ...

  2. 【机器学习基础】数学推导+纯Python实现机器学习算法28:CRF条件随机场

    Python机器学习算法实现 Author:louwill Machine Learning Lab 本文我们来看一下条件随机场(Conditional Random Field,CRF)模型.作为概 ...

  3. NLP系列学习:CRF条件随机场(1)

    NVIDIA DLI 深度学习入门培训 | 特设三场!! 4月28日/5月19日/5月26日一天密集式学习  快速带你入门阅读全文> 正文共1485个字,2张图,预计阅读时间5分钟. 大家好,今 ...

  4. CRF(条件随机场)与Viterbi(维特比)算法原理详解

    摘自:https://mp.weixin.qq.com/s/GXbFxlExDtjtQe-OPwfokA https://www.cnblogs.com/zhibei/p/9391014.html C ...

  5. CRF条件随机场简单解释

    转自:http://www.jianshu.com/p/55755fc649b1 理解条件随机场最好的办法就是用一个现实的例子来说明它.但是目前中文的条件随机场文章鲜有这样干的,可能写文章的人都是大牛 ...

  6. CRF条件随机场模型笔记

    同上一篇<以序列标注为例学习隐马尔可夫模型HMM>一样,仍旧以序列标注问题为例. 序列标注问题是给定一个序列XXX,求一个函数fff,使得XXX通过fff映射得到想要的序列YYY,即: f ...

  7. HMM和CRF 条件随机场详解

    转载于 https://blog.csdn.net/qq_42901761/article/details/104206799 这位大神ffffatgoose总结的很好

  8. 条件随机场(CRF)相关理论知识

    文章目录 无向概率图模型 条件随机场 CRF 实例 线性链条件随机场的简化形式 线性链条件随机场的矩阵形式 linear-CRF的三个基本问题 1,概率计算问题 前向后向概率概述 前向后向概率计算 l ...

  9. python期望输出隐藏_【归纳综述】马尔可夫、隐马尔可夫 HMM 、条件随机场 CRF 全解析及其python实现...

    PR Structured Ⅲ:马尔可夫.隐马尔可夫 HMM .条件随机场 CRF 全解析及其python实现 Content 归纳性长文,不断更新中...欢迎关注收藏 本章承接概率图知识 马尔可夫不 ...

最新文章

  1. Rokid webhook 指南 手把手教你做个懒人
  2. linux命令详解-useradd,groupadd
  3. 存储过程mysql报错1271_mysqldump备份失败以及解决方法汇总
  4. springbootajaxhas been blocked by CORS policy: No ‘Access-Control-Allow-Origin
  5. 太形象了!什么是边缘计算?最有趣的解释没有之一!
  6. 异常:This application has no explicit mapping for /error, so you are seeing this as a fallback.
  7. 信息安全学习路线图_Python学习图谱:学习到困惑的时候可以参考的图谱
  8. C#窗体控件-单选按钮控件RadioButton
  9. iOS Core ML与Vision初识
  10. 学生信息管理系统c 语言程序设计报告,C语言程序设计报告(学生信息管理系统)[1].txt...
  11. SpannableString 给TextView添加不同的显示样式
  12. Maven的parent pom的依赖
  13. 阶段3 2.Spring_02.程序间耦合_8 工厂模式解耦的升级版
  14. 2011年国外最受欢迎的15个电影网站
  15. Kata Container 2.x 和 3.0 安装,内核编译,镜像制作
  16. 我的Python分析成长之路2
  17. html5微杂志源码,H5制作又一利器:分分钟制作一个H5页面
  18. QQ音乐推荐歌单API报错 invalid referer
  19. 梅科尔工作室-华为云ModelArts的简单使用(附详细图解)
  20. 试题 基础练习 字母图形

热门文章

  1. sequelize常见操作使用方法
  2. Android后台服务---无交互时的Service
  3. devexpress 主从表中从主、从表行列值的获得
  4. 创建用户的种类与区分
  5. 面试官系统精讲Java源码及大厂真题 - 01 开篇词:为什么学习本专栏
  6. 【Python】Python库之图形艺术
  7. 【Python】二维数据格式化
  8. C#LeetCode刷题之#342-4的幂(Power of Four)
  9. C#LeetCode刷题之#824-山羊拉丁文​​​​​​​(Goat Latin)
  10. 无法将输入值传递给JavaScript变量