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 表示的特征 ...
随机推荐
- kali docker简单使用-vulhub搭建fastjson漏洞环境
准备环境 安装kali和docker参考: https://www.cnblogs.com/lijingrong/p/13396884.html sudo service docker start / ...
- kubernetes环境搭建 -k8s笔记(一)
一.环境准备 1.硬件及版本信息: cpu&内存:2核心,2G 网络: 每台vm主机2块网卡,一块NAT用于上网,别一块配置成 "仅主机模式",网段为192.168.100 ...
- SQLServer访问WebServices提示:SQL Server 阻止了对组件 'Ole Automation Procedures' 的 过程'sys.sp_OACreate' 的访问
问题描述 在数据库中调用webservices, 提示:SQLServer访问WebServices提示:SQL Server 阻止了对组件 'Ole Automation Procedures' 的 ...
- 安装篇八:配置 Nginx 使其支持 MySQL 应用
配置说明 (让nginx MySQL(中间件)之间建立关系) 第一个里程: 编写nginx.php首页文件 第二个里程:重启nginx 第三个里程:访问网页测试 打开浏览器访问:http://47. ...
- Android 安全研究 hook 神器frida学习(一)
在进行安卓安全研究时,hook技术是不可或缺的,常用的有Xposed:Java层的HOOK框架,由于要修改Zgote进程,需要Root,体验过Xposed,整个过程还是很繁琐的,并且无法hook,na ...
- Access denied for user ''@'localhost' to database 'mysql'问题
Access denied for user ''@'localhost' to database 'mysql'问题 MySQL : Access denied for user ''@'local ...
- Spring源码深度解析之Spring MVC
Spring源码深度解析之Spring MVC Spring框架提供了构建Web应用程序的全功能MVC模块.通过策略接口,Spring框架是高度可配置的,而且支持多种视图技术,例如JavaServer ...
- 手写简易版RPC框架基于Socket
什么是RPC框架? RPC就是远程调用过程,实现各个服务间的通信,像调用本地服务一样. RPC有什么优点? - 提高服务的拓展性,解耦.- 开发人员可以针对模块开发,互不影响.- 提升系统的可维护性及 ...
- 基于Let's Encrypt生成免费证书-支持多域名泛域名证书
目录 客户端 certbot acme.sh 安装acme.sh 1. 自动安装 2. 手动安装 3. 测试收否安装成功 使用acme.sh生成证书 1. HTTP 方式 2. DNS 方式 1. 生 ...
- 如何根据角色批量激活SAP Fiori服务
我们知道Fiori的角色跟ERP的角色是不通用的,即使你的账号有SAP_ALL的权限,但打开Fiori的时候一样是空的一片: 只有给账号加上fiori需要的角色,并激活相关服务才能用fiori app ...