双向LSTM-CRF模型用于序列标注
!
阅读大概需要5分钟 跟随小博主,每天进步一丢丢
来源:知乎
作者:南开大学 概率论与数理统计硕士 薛晓琳
整理:python遇见NLP
一 文章介绍:
本文是2015年百度的三位作者提出的,主要研究了一系列基于LSTM模型上的序列标注任务的性能。模型包括LSTM,BI-LSTM,LSTM-CRF,BI-LSTM-CRF。序列标注任务分为三个:词性标注,分块和命名实体识别。结果显示BI-LSTM-CRF模型在三个任务上的准确度都很高。
二 模型介绍:
这部分主要介绍了五种模型,LSTM,BI-LSTM,CRF,LSTM-CRF,BI-LSTM-CRF。这里我们就不一一详细赘述了。
三 模型训练过程
以BI-LSTM-CRF为例,在每一步中,把训练数据分为不同的批次,一次处理一个批次。每一个批次包括一些句子,句子的多少由批次大小来决定。对于每一个批次:
- 首先运行BI-LSTM-CRF模型正向传递,该正向传递包括正向和反向状态的正向传递 LSTM,得到所有位置上所有标签的输出得分
- 然后,我们对CRF层进行正向和反向传递,以计算网络输出和状态转换边缘的梯度
- 之后,我们可以将错误从输出反向传播到输入,其中包括LSTM正向和反向状态的反向传递
- 最后,我们更新网络参数,其中包括状态转移矩阵
和原始双向LSTM参数
训练过程的算法伪码如下:
for each epoch do
for each batch do
1) bidirectional LSTM-CRF model forward pass:
forward pass for forward state LSTM
forward pass for backward state LSTM
2) CRF layer forward and backward pass
3) bidirectional LSTM-CRF model backward pass:
backward pass for forward state LSTM
backward pass for backward state LSTM
4) update parameters
end for
end for
四 实验过程和结果
本次实验共使用了三组数据,下面是三组数据的基本情况:
从三组数据中抽取了两种特征,包括拼写特征和上下文特征。
在处理特征连接的时候,本文运用了一个小trick,即把拼写特征和上下文特征直接连到输出,这样可以加速训练速度,并且训练精度类似。
模型训练时的学习率设为0.1,隐含层的数量设置为300,最终模型的性能对比结果如下:
其中Conv-CRF模型是文章(Collobert et al.,2011)中的最好结果,Random和Senna是两种词嵌入的方式。
然后,为了证明模型的鲁棒性,作者又只对单词特征(去掉了拼写和上下文特征)进行了训练,结果如下:
五 总结
本文的创新点在于首次使用BI-LSTM-CRF模型进行了序列标注任务,并且模型结果表现不错。并且作者证明了模型的鲁棒性,以及模型对词嵌入方法的依赖较少,在随机词嵌入的时候,模型的精度表现也不错。
文章地址链接:
arxiv.org/pdf/1508.0199
下载一:中文版!学习TensorFlow、PyTorch、机器学习、深度学习和数据结构五件套!后台回复【五件套】
下载二:南大模式识别PPT后台回复【南大模式识别】
- set使用实例1+lower_bound(val)(个人模版)
- Selenium2+python自动化29-js处理多窗口
- 谷歌「机弦」有何玄机?
- 01字典树贪心查询+建立+删除(个人模版)
- 优先队列(个人模版)
- Numpy教程第2部分 - 数据分析的重要功能
- 最小表示法(个人模版)
- 基于Python-ChatterBot搭建不同adapter的聊天机器人(使用NB进行场景分类)
- 并查集(个人模版)
- Markdown 语法和 MWeb 写作使用说明既然都整理了,捎带手把这个也整理了吧第一级标题<h1>
- 带权并查集(个人模版)
- 我的第一次Pascal程序
- Hive第二天学习内容总结Hive 第三天DDL特别注意一下,没事别删除数据DML
- Codeforces 791B Bear and Friendship Condition(DFS,有向图)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法