LSTM+CRF进行序列标注
为什么使用LSTM+CRF进行序列标注
直接使用LSTM进行序列标注时只考虑了输入序列的信息,即单词信息,没有考虑输出信息,即标签信息,这样无法对标签信息进行建模,所以在LSTM的基础上引入一个标签转移矩阵对标签间的转移关系进行建模。这一点和传统CRF很像,CRF中存在两类特征函数,一类是针对观测序列与状态的对应关系,一类是针对状态间关系。在LSTM+CRF模型中,前一类特征函数由LSTM的输出给出,后一类特征函数由标签转移矩阵给出。
由输入序列x计算条件概率p(y|x)
设输入序列x长度为n,即\(x=(x_1,x_2,...,x_n)\),可能的标签个数为m,即存在\(m^n\)种可能的输出序列\(y=(y_1,y_2,...,y_n)\)。
设LSTM输出的各个时刻各标签的概率为\(E\in\mathbb{R}^{n*m}\),转移矩阵为\(T\in\mathbb{R}{m*m}\),任意序列y的得分为score(y),则:
\[score(y)=\sum_{i=1}^n({E[i,y_i]+T[y_{i-1},y_i]})
\]利用Softmax进行归一化得到序列y的概率:
\[P(y|x)=\frac{e^{score(y)}}{Z(x)},
\\ 其中 Z(x)=\sum_{y}e^{score(y)}
\]取对数得:
\[\ln{P(y|x)}=score(y)-\ln{Z(x)}
\]所以关键是求取上式中的后面部分即\(\ln{Z(x)}\),直接求取的时间复杂度为\(O(m^n)\),考虑使用动态规划来求解。
记\(\alpha(y_i=t_j)=\sum_{y_i=t_j}e^{score(y_i=t_j)}\)为第i时刻输出第j个标签的所有路径得分取取指数的和,则:
\[\alpha(y_{i+1}=t_j)=\sum_{k=1}^m\sum_{y_i=t_k}e^{score(y_i=t_k)+E(i+1,t_j)+T(t_k,t_j)}
\\=e^{E(i+1,t_j)}*\sum_{k=1}^{m}(e^{T(t_k,t_j)}*\sum_{y_i=t_k}e^{score(y_i=t_k)})
\]取对数得:
\[\ln\alpha(y_{i+1}=t_j)=E(i+1,t_j)+\ln{\sum_{k=1}^me^{T(t_k,t_j)}*\alpha(y_i=t_k)}
\\=E(i+1,t_j)+\ln{\sum_{k=1}^me^{T(t_k,t_j)}*e^{\ln\alpha(y_i=t_k)}}
\\=E(i+1,t_j)+\ln{\sum_{k=1}^me^{T(t_k,t_j)+\ln\alpha(y_i=t_k)}}
\]令\(\beta_i=[\ln\alpha(y_i=t_1),\ln\alpha(y_i=t_2),...,\ln\alpha(y_i=t_m)]\in\mathbb{R}^m\),则:
\[\beta_{i+1}=[\ln\sum_{k=1}^me^{\beta_{i,k}+T(t_k,t_0)}+E(i+1,t_0),\ln\sum_{k=1}^me^{\beta_{i,k}+T(t_k,t_1)}+E(i+1,t_1),
\\...,\ln\sum_{k=1}^me^{\beta_{i,k}+T(t_k,t_m)}+E(i+1,t_m)]
\]使用一个m维数组存储\(\beta\)即可编程实现。
通过使用\(-P(y|x)\)作为Loss即可实现端到端的训练。
使用维特比算法得到最优路径
推理时如果直接计算每条路径的得分然后取得分最大的路径则时间复杂度为\(m^n\),再次考虑使用动态规划来求解。
记\(\delta_i\in\mathbb{R}^m\),其第j维\(\delta_{i,j}\)表示i时刻以标签\(t_j\)结尾的所有路径的得分中的最大得分,则:
\[\delta_{i+1,j}=\max_{k}[\delta_{i,k}+T(t_k,t_j)+E(i+1,t_j)]
\\=\max_{k}[\delta_{i,k}+T(t_k,t_j)]
\]同时使用\(Q\in\mathbb{R}^{n*m}\)来方便进行路径回溯,矩阵第i行第j列对应元素\(Q_{i,j}\)表示第i个时刻以标签\(t_j\)结尾时得分最大路径的第i-1时刻所对应的标签,即:
\[Q_{i+1,j}=\arg\max_{k}[\delta_{i,k}+T(t_k,t_j)]
\]通过\(\delta和Q\)进行回溯即可求得最优路径。
编程实现时的注意事项
- 使用数值稳定版本的\(\ln\sum\exp\)函数。
- 对于使用batch实现的批操作,注意针对长度不同的序列要使用mask,计算\(P(y|x)\)以及推理时均需要。
LSTM+CRF进行序列标注的更多相关文章
- TensorFlow教程——Bi-LSTM+CRF进行序列标注(代码浅析)
https://blog.csdn.net/guolindonggld/article/details/79044574 Bi-LSTM 使用TensorFlow构建Bi-LSTM时经常是下面的代码: ...
- ALBERT+BiLSTM+CRF实现序列标注
一.模型框架图 二.分层介绍 1)ALBERT层 albert是以单个汉字作为输入的(本次配置最大为128个,短句做padding),两边分别加上开始标识CLS和结束标识SEP,输出的是每个输入wor ...
- TensorFlow (RNN)深度学习 双向LSTM(BiLSTM)+CRF 实现 sequence labeling 序列标注问题 源码下载
http://blog.csdn.net/scotfield_msn/article/details/60339415 在TensorFlow (RNN)深度学习下 双向LSTM(BiLSTM)+CR ...
- 基于CRF序列标注的中文依存句法分析器的Java实现
这是一个基于CRF的中文依存句法分析器,内部CRF模型的特征函数采用 双数组Trie树(DoubleArrayTrie)储存,解码采用特化的维特比后向算法.相较于<最大熵依存句法分析器的实现&g ...
- 用CRF++开源工具做文本序列标注教程
本文只介绍如何快速的使用CRF++做序列标注,对其中的原理和训练测试参数不做介绍. 官网地址:CRF++: Yet Another CRF toolkit 主要完成如下功能: 输入 -> &qu ...
- BI-LSTM-CRF在序列标注中的应用
1. 前言 在NLP中有几个经典的序列标注问题,词性标注(POS),chunking和命名实体识别(NER).序列标注器的输出可用于另外的应用程序.例如,可以利用在用户搜索查询上训练的命名实体识别器来 ...
- 序列标注(BiLSTM-CRF/Lattice LSTM)
前言 在三大特征提取器中,我们已经接触了LSTM/CNN/Transormer三种特征提取器,这一节我们将介绍如何使用BiLSTM实现序列标注中的命名实体识别任务,以及Lattice-LSTM的模型原 ...
- NLP之CRF应用篇(序列标注任务)
1.CRF++的详细解析 完成的是学习和解码的过程:训练即为学习的过程,预测即为解码的过程. 模板的解析: 具体参考hanlp提供的: http://www.hankcs.com/nlp/the-cr ...
- Bi-LSTM+CRF在文本序列标注中的应用
传统 CRF 中的输入 X 向量一般是 word 的 one-hot 形式,前面提到这种形式的输入损失了很多词语的语义信息.有了词嵌入方法之后,词向量形式的词表征一般效果比 one-hot 表示的特征 ...
随机推荐
- flink1.11报错No ExecutorFactory found to execute the application
使用flink1.11版本时,报错:No ExecutorFactory found to execute the application 查找maven下载的依赖,发现没有下载flink-clien ...
- ElasticSearch中head插件的简单用法
1.首先在左侧打开Query栏. 2.Query下方的第一栏是分别输入es的地址.端口号.index.type. 3.Query下方的第二栏是输入将要执行的方式,旁边的下拉框是辅助选择执行的类型,如图 ...
- Protobuf简单类型直接反序列化方法
我有一个想法,有一个能够进行跨平台的高性能数据协议规范,能够让数据在两个不同的程序之间进行读取,最好能够支持直接将object序列化,那就完美了. 目标 支持任意Object序列化 支持从类似Syst ...
- 用Python写个开心消消乐小游戏
本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理 提到开心消消乐这款小游戏,相信大家都不陌生,其曾在 2015 年获得过玩家最喜爱的移动单机游戏奖,受 ...
- .Net MVC Redirect出现:服务器无法在已发送 HTTP 标头之后设置状态解决方案
使用过滤器控制权限时,若无权则跳转到无权页面,但是每次跳转都会出现 ERROR - System.Web.HttpException (0x80004005): 服务器无法在已发送 HTTP 标头之后 ...
- Redis 设计与实现:字符串 SDS
本文的分析没有特殊说明都是基于 Redis 6.0 版本源码 redis 6.0 源码:https://github.com/redis/redis/tree/6.0 在 Redis 中,字符串都用自 ...
- AspectJ之@DeclareParents注解为对象添加新方法
众所周知,AspectJ可以通过@Before,@After,@Around等注解对连接点进行增强,今天我们来玩一个新注解@DeclareParents.对目标对象增强一个新方法. 场景引入: 现在我 ...
- 常见编译器EOP
delphi: 55 PUSH EBP 8BEC MOV EBP,ESP 83C4 F0 ADD ESP,-10 B8 A86F4B00 ...
- Presto安装完成之后需要做的
Presto因其优秀的查询速度被我们所熟知,它本身基于MPP架构,可以快速的对Hive数据进行查询,同时支持扩展Connector,目前对Mysql.MongoDB.Cassandra.Hive等等一 ...
- java实现读取excel文件内容
package excel; import java.io.FileInputStream; import java.io.InputStream; import java.text.SimpleDa ...