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. Eureka系列(六) TimedSupervisorTask类解析

      为什么要单独讲解TimedSupervisorTask这个类呢?因为这个类在我们DiscoveryClient类的initScheduledTasks方法进行定时任务初始化时被使用得比较多,所以我 ...

  2. Linux-centos-64bit安装MySQL

    1.下载mysql安装包到 /usr/local/soft [root@VM_0_9_centos ~]# cd /usr/local/soft[root@VM_0_9_centos soft]# w ...

  3. 在Centos下使用Siege对Django服务进行压力测试

    Siege是linux下的一个web系统的压力测试工具,支持多链接,支持get和post请求,可以对web系统进行多并发下持续请求的压力测试.今天我们就使用Siege来对Django进行一次压力测试, ...

  4. Matplotlib处理csv文件

    csv模块包含在python标准库中,可用于分析CSV文件中的数据行,让我们能够快速提取感兴趣的值.首先绘制一个简单的折线图: 1 #!usr/bin/env python 2 #*-*Coding= ...

  5. (七)、touch--创建文件或者更新时间戳

    一.命令说明与格式 创建文件并更新时间戳,若要创建的文件名已经存在,则仅仅更新时间戳,而不改变其他任何信息 格式:touch     [选项]   目录名/文件名 选项: -a            ...

  6. 3.自定义view-TextView变色

    1.效果 2.实现原理 自定义Textview,重写onDraw方法,将画布分成两部分,用不同颜色的画笔画 核心代码: @Override protected void onDraw(Canvas c ...

  7. java电脑环境变量配置

    ANT_HOME    D:\apache-ant-1.9.11CLASSPATH       %JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib;%JAVA_HOME%\l ...

  8. 大白话Java多线程,小白都能看的懂的哦

    什么是线程 说到线程我们应该先了解下什么是进程,下面这个图片大家应该都比较熟悉吧. 我们看到的这些单独运行的程序就是一个独立的进程,进程之间是相互独立存在的.我们上面图中的360浏览器.百度云盘等等都 ...

  9. [LeetCode]141. Linked List Cycle判断循环链表

    快慢指针用来判断循环链表  记住 快慢指针有四种常用的应用场景: 1.找到有序链表的中点,快指针到头的时候,慢指针就是中点. 2.判断是不是循环链表,快慢指针相遇就是 3.找到循环链表的起点,以链表头 ...

  10. 5. Longest Palindromic Substring最大回文子串

    int sta = 0; int max = 1; public String longestPalindrome(String s) { /* 判断回文有两种: 1.最大回文子序列求长度: 用动态规 ...