1. 为什么使用LSTM+CRF进行序列标注

    直接使用LSTM进行序列标注时只考虑了输入序列的信息,即单词信息,没有考虑输出信息,即标签信息,这样无法对标签信息进行建模,所以在LSTM的基础上引入一个标签转移矩阵对标签间的转移关系进行建模。这一点和传统CRF很像,CRF中存在两类特征函数,一类是针对观测序列与状态的对应关系,一类是针对状态间关系。在LSTM+CRF模型中,前一类特征函数由LSTM的输出给出,后一类特征函数由标签转移矩阵给出。

  2. 由输入序列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即可实现端到端的训练。

  3. 使用维特比算法得到最优路径

    推理时如果直接计算每条路径的得分然后取得分最大的路径则时间复杂度为\(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\)进行回溯即可求得最优路径。

  4. 编程实现时的注意事项

    • 使用数值稳定版本的\(\ln\sum\exp\)函数。
    • 对于使用batch实现的批操作,注意针对长度不同的序列要使用mask,计算\(P(y|x)\)以及推理时均需要。

LSTM+CRF进行序列标注的更多相关文章

  1. TensorFlow教程——Bi-LSTM+CRF进行序列标注(代码浅析)

    https://blog.csdn.net/guolindonggld/article/details/79044574 Bi-LSTM 使用TensorFlow构建Bi-LSTM时经常是下面的代码: ...

  2. ALBERT+BiLSTM+CRF实现序列标注

    一.模型框架图 二.分层介绍 1)ALBERT层 albert是以单个汉字作为输入的(本次配置最大为128个,短句做padding),两边分别加上开始标识CLS和结束标识SEP,输出的是每个输入wor ...

  3. TensorFlow (RNN)深度学习 双向LSTM(BiLSTM)+CRF 实现 sequence labeling 序列标注问题 源码下载

    http://blog.csdn.net/scotfield_msn/article/details/60339415 在TensorFlow (RNN)深度学习下 双向LSTM(BiLSTM)+CR ...

  4. 基于CRF序列标注的中文依存句法分析器的Java实现

    这是一个基于CRF的中文依存句法分析器,内部CRF模型的特征函数采用 双数组Trie树(DoubleArrayTrie)储存,解码采用特化的维特比后向算法.相较于<最大熵依存句法分析器的实现&g ...

  5. 用CRF++开源工具做文本序列标注教程

    本文只介绍如何快速的使用CRF++做序列标注,对其中的原理和训练测试参数不做介绍. 官网地址:CRF++: Yet Another CRF toolkit 主要完成如下功能: 输入 -> &qu ...

  6. BI-LSTM-CRF在序列标注中的应用

    1. 前言 在NLP中有几个经典的序列标注问题,词性标注(POS),chunking和命名实体识别(NER).序列标注器的输出可用于另外的应用程序.例如,可以利用在用户搜索查询上训练的命名实体识别器来 ...

  7. 序列标注(BiLSTM-CRF/Lattice LSTM)

    前言 在三大特征提取器中,我们已经接触了LSTM/CNN/Transormer三种特征提取器,这一节我们将介绍如何使用BiLSTM实现序列标注中的命名实体识别任务,以及Lattice-LSTM的模型原 ...

  8. NLP之CRF应用篇(序列标注任务)

    1.CRF++的详细解析 完成的是学习和解码的过程:训练即为学习的过程,预测即为解码的过程. 模板的解析: 具体参考hanlp提供的: http://www.hankcs.com/nlp/the-cr ...

  9. Bi-LSTM+CRF在文本序列标注中的应用

    传统 CRF 中的输入 X 向量一般是 word 的 one-hot 形式,前面提到这种形式的输入损失了很多词语的语义信息.有了词嵌入方法之后,词向量形式的词表征一般效果比 one-hot 表示的特征 ...

随机推荐

  1. 多个HDFS集群的fs.defaultFS配置一样,造成应用一直连接同一个集群的问题分析

    背景 应用需要对两个集群中的同一目录下的HDFS文件个数和文件总大小进行比对,在测试环境中发现,即使两边HDFS目录下的数据不一样,应用日志显示两边始终比对一致,分下下来发现,应用连的一直是同一个集群 ...

  2. 软件测试最常用的 SQL 命令 | 掌握基本查询、条件查询、聚合查询

    1.DML核心CRUD增删改查 缩写全称和对应 SQL: * DML 数据操纵语言:Data Manipulation Language * Create 增加:insert * Retrieve 查 ...

  3. matplotlib的学习12-Subplot 多合一显示

    import matplotlib.pyplot as plt # matplotlib 是可以组合许多的小图, 放在一张大图里面显示的. 使用到的方法叫作 subplot. plt.figure() ...

  4. SQL注入练习第一天

    MySQL 相关知识 在MySQL中,把[INFORMATION_SCHEMA] 看作是一个数据库,确切说是信息数据库.其中保存着关于MySQL服务器所维护的所有其他数据库的信息.如数据库名,数据库的 ...

  5. 4. 上新了Spring,全新一代类型转换机制

    目录 ✍前言 版本约定 ✍正文 PropertyEditor设计缺陷 新一代类型转换 Converter 代码示例 不足 ConverterFactory 代码示例 不足 GenericConvert ...

  6. 小白数据分析——Python职位全链路分析

    最近在做Python职位分析的项目,做这件事的背景是因为接触Python这么久,还没有对Python职位有一个全貌的了解.所以想通过本次分析了解Python相关的职位有哪些.在不同城市的需求量有何差异 ...

  7. 灯光设置(light)

    clc;clear all;close all; %% 台灯的设置figure('color','k')% 底座fill3([0 1 1 0],[0 0 1 1],[0 0 0 0],'b',... ...

  8. Proguard结合maven使用

    添加插件配置 项目是maven项目,则可以在 pom 的 build 标签下添加插件 <plugin> <groupId>com.github.wvengen</grou ...

  9. JS 获取(期号、当前日期、本周第一天、最后一天及当前月第一、最后天函数)    

    JS 获取(期号.当前日期.本周第一天.最后一天及当前月第一.最后天函数 /** 2 * 获取当前月期号 3 * 返回格式: YYYY-mm 4 * / 5 function getCurrentMo ...

  10. 两个字搞定DDD(领域驱动设计),DDD脱水版(一)修订版

    摘自微信公众号丁辉的软件架构说