返回顶部
首页 > 资讯 > 前端开发 > VUE >怎么理解BiLSTM和CRF算法
  • 232
分享到

怎么理解BiLSTM和CRF算法

2024-04-02 19:04:59 232人浏览 安东尼
摘要

本篇内容介绍了“怎么理解BiLSTM和CRF算法”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1.前言给定

本篇内容介绍了“怎么理解BiLSTM和CRF算法”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

1.前言

给定一个句子 "什么是地摊经济",其正确的分词方式是 "什么 / 是 / 地摊 / 经济",每个字对应的分词标签是 "be / s / be /  be"。从下面的图片可以看出 LSTM 在做序列标注时的问题。

怎么理解BiLSTM和CRF算法

BiLSTM 分词

BiLSTM 可以预测出每一个字属于不同标签的概率,然后使用 Softmax  得到概率最大的标签,作为该位置的预测值。这样在预测的时候会忽略了标签之间的关联性,如上图中 BiLSTM 把第一个词预测成 s,把第二个词预测成  e。但是实际上在分词时 s 后面是不会出现 e 的,因此 BiLSTM 没有考虑标签间联系。

因此 BiLSTM+CRF 在 BiLSTM 的输出层加上一个 CRF,使得模型可以考虑类标之间的相关性,标签之间的相关性就是 CRF  中的转移矩阵,表示从一个状态转移到另一个状态的概率。假设 CRF 的转移矩阵如下图所示。

怎么理解BiLSTM和CRF算法

CRF 状态转移矩阵

则对于前两个字 "什么",其标签为 "se" 的概率 =0.8×0×0.7=0,而标签为 "be" 的概率=0.6×0.5×0.7=0.21。

因此,BiLSTM+CRF 考虑的是整个类标路径的概率而不仅仅是单个类标的概率,在 BiLSTM 输出层加上 CRF 后,如下所示。

怎么理解BiLSTM和CRF算法

BiLSTM+CRF 分词

最终算得所有路径中,besbebe 的概率最大,因此预测结果为 besbebe。

2.BiLSTM+CRF 模型

CRF 包括两种特征函数,不熟悉的童鞋可以看下之前的文章。第一种特征函数是状态特征函数,也称为发射概率,表示字 x 对应标签 y 的概率。

怎么理解BiLSTM和CRF算法

CRF 状态特征函数

在 BiLSTM+CRF 中,这一个特征函数 (发射概率) 直接使用 LSTM 的输出计算得到,如第一小节中的图所示,LSTM  可以计算出每一时刻位置对应不同标签的概率。

CRF 的第二个特征函数是状态转移特征函数,表示从一个状态 y1 转移到另一个状态 y2 的概率。

怎么理解BiLSTM和CRF算法

CRF 状态转移特征函数

CRF 的状态转移特征函数可以用一个状态转移矩阵表示,在训练时需要调整状态转移矩阵的元素值。因此 BiLSTM+CRF 需要在 BiLSTM  的模型内增加一个状态转移矩阵。在代码中如下。

class BiLSTM_CRF(nn.Module):     def __init__(self, vocab_size, tag2idx, embedding_dim, hidden_dim):         self.Word_embeds = nn.Embedding(vocab_size, embedding_dim)         self.lstm = nn.LSTM(embedding_dim, hidden_dim // 2,                             num_layers=1, bidirectional=True)          # 对应 CRF 的发射概率,即每一个位置对应不同类标的概率         self.hidden2tag = nn.Linear(hidden_dim, self.tagset_size)                  # 转移矩阵,维度等于标签数量,表示从一个标签转移到另一标签的概率         self.transitions = nn.Parameter(             torch.randn(len(tag2idx), len(tag2idx))

给定句子 x,其标签序列为 y 的概率用下面的公式计算。

怎么理解BiLSTM和CRF算法

p(y|x)

公式中的 score 用下面的式子计算,其中 Emit 对应发射概率 (即 LSTM 输出的概率),而 Trans 对应了转移概率 (即 CRF  转移矩阵对应的数值)

怎么理解BiLSTM和CRF算法

score 的计算公式

BiLSTM+CRF 采用最大似然法训练,对应的损失函数如下:

怎么理解BiLSTM和CRF算法

损失函数

其中 score(x,y) 比较容易计算,而 Z(x) 是所有标签序列 (y) 打分的指数之和,如果序列的长度是 l,标签个数是 k,则序列的数量为  (k^l)。无法直接计算,因此要用前向算法进行计算。

用目前主流的深度学习框架,对 loss 进行求导和梯度下降,即可优化 BiLSTM+CRF。训练好模型之后可以采用 viterbi 算法 (动态规划)  找出最优的路径。

3.损失函数计算

计算 BiLSTM+CRF 损失函数的难点在于计算 log Z(x),用 F 表示 log Z(x),如下公式所示。

怎么理解BiLSTM和CRF算法

我们将 score 拆分,变成发射概率 p 和转移概率 T 的和。为了简化问题,我们假设序列的长度为3,则可以分别计算写出长度为 1、2、3 时候的  log Z 值,如下所示。

怎么理解BiLSTM和CRF算法

上式中 p 表示发射概率,T 表示转移概率,Start 表示开始,End 表示句子结束。F(3) 即是最终得到的 log Z(x)  值。通过对上式进行变换,可以将 F(3) 转成递归的形式,如下。

怎么理解BiLSTM和CRF算法

可以看到上式中每一步的操作都是一样的,操作包括 log_sum_exp,例如 F(1):

  • 首先需要计算 exp,对于所有 y1,计算 exp(p(y1)+T(Start,y1))

  • 求和,对上一步得到的 exp 值进行求和

  • 求 log,对求和的结果计算 log

因此可以写出前向算法计算 log Z 的代码,如下所示:

def forward_alGorithm(self, probs):     def forward_algorithm(probs):     """     probs: LSTM 输出的概率值,尺寸为 [seq_len, num_tags],num_tags 是标签的个数     """      # forward_var (可以理解为文章中的 F) 保存前一时刻的值,是一个向量,维度等于 num_tags     # 初始时只有 Start 为 0,其他的都取一个很小的值 (-10000.)     forward_var = torch.full((1, num_tags), -10000.0)  # [1, num_tags]     forward_var[0][Start] = 0.0      for p in probs:  # probs [seq_len, num_tags],遍历序列         alphas_t = []  # alphas_t 保存下一时刻取不同标签的累积概率值         for next_tag in range(num_tags): # 遍历标签              # 下一时刻发射 next_tag 的概率             emit_score = p[next_tag].view(1, -1).expand(1, num_tags)              # 从所有标签转移到 next_tag 的概率, transitions 是一个矩阵,长宽都是 num_tags             trans_score = transitions[next_tag].view(1, -1)              # next_tag_ver = F(i-1) + p + T             next_tag_var = forward_var + trans_score + emit_score              alphas_t.append(log_sum_exp(next_tag_var).view(1))          forward_var = torch.cat(alphas_t).view(1, -1)      terminal_var = forward_var + self.transitions[Stop] # 最后转移到 Stop 表示句子结束     alpha = log_sum_exp(terminal_var)     return alpha

4.viterbi 算法解码

训练好模型后,预测过程需要用 viterbi 算法对序列进行解码,感兴趣的童鞋可以参看《统计学习方法》。下面介绍一下 viterbi  的公式,首先是一些符号的意义,如下:

怎么理解BiLSTM和CRF算法

然后可以得到 viterbi 算法的递推公式

怎么理解BiLSTM和CRF算法

最终可以根据 viterbi 计算得到的值,往前查找最合适的序列

怎么理解BiLSTM和CRF算法

“怎么理解BiLSTM和CRF算法”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注编程网网站,小编将为大家输出更多高质量的实用文章!

--结束END--

本文标题: 怎么理解BiLSTM和CRF算法

本文链接: https://lsjlt.com/news/84938.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 怎么理解BiLSTM和CRF算法
    本篇内容介绍了“怎么理解BiLSTM和CRF算法”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1.前言给定...
    99+
    2024-04-02
  • LRU算法怎么理解
    本篇内容介绍了“LRU算法怎么理解”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!01、前言我们常用缓存提升数据查询速度,由于缓存容量有限,当...
    99+
    2023-06-16
  • 怎样理解和实现KNN算法
    今天就跟大家聊聊有关怎样理解和实现KNN算法,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。knn介绍邻近算法,或者说K最近邻(kNN,k-NearestNeighbor)分类算法是数...
    99+
    2023-06-04
  • 怎么理解PostgreSQL中Clock Sweep算法
    本篇内容介绍了“怎么理解PostgreSQL中Clock Sweep算法”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能...
    99+
    2024-04-02
  • 怎么理解Java算法复杂度
    本篇内容主要讲解“怎么理解Java算法复杂度”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么理解Java算法复杂度”吧!大O符号衡量时间复杂度通常使用”大O符号“。什么是大O符号?我们需要先看...
    99+
    2023-06-02
  • web算法复杂度怎么理解
    本篇内容介绍了“web算法复杂度怎么理解”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!算法学(Algorithmics)是设计和研究算法的科...
    99+
    2023-06-03
  • 如何理解TCP协议、算法和原理
    如何理解TCP协议、算法和原理,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。首先,我们需要知道,我们程序的数据首先会打到TCP的Segment中,然后TCP的S...
    99+
    2023-06-03
  • 怎么理c语言解递归算法
    这篇文章主要讲解了“怎么理c语言解递归算法”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么理c语言解递归算法”吧!算法思路大家都知道,一个方法自己调用自己...
    99+
    2024-04-02
  • 深入理解JavaScript内存管理和GC算法
    目录前言内存的生命周期JavaScript中的内存分配在JavaScript中使用内存释放内存JavaScript中的垃圾回收GC算法引用计数算法标记清除算法标记整理算法V8中的内存...
    99+
    2024-04-02
  • JavaScript数据结构与算法怎么理解
    本篇内容主要讲解“JavaScript数据结构与算法怎么理解”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“JavaScript数据结构与算法怎么理解”吧!前言数据结构与算法这个词相信大家都听过、...
    99+
    2023-07-02
  • 怎么理解Java优先遍历和广度优先遍历算法
    这篇文章主要讲解了“怎么理解Java优先遍历和广度优先遍历算法”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么理解Java优先遍历和广度优先遍历算法”吧!深度优先遍历主要思路是从图中一个未...
    99+
    2023-06-16
  • 深入理解vue2中的VNode和diff算法
    虚拟dom和diff算法是vue学习过程中的一个难点,也是面试中必须掌握的一个知识点。这两者相辅相成,是vue框架的核心。今天我们再来总结下vue2中的虚拟dom 和 diff算法。(学习视频分享:vue视频教程)什么是 VNode我们知道...
    99+
    2022-11-22
    VNode diff算法 Vue vue.js
  • 怎样深入理解vue中的虚拟DOM和Diff算法
    怎样深入理解vue中的虚拟DOM和Diff算法,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。真实DOM的渲染在讲虚拟DOM之前,先说一下真实DOM的渲染。浏览器真实DOM渲...
    99+
    2023-06-22
  • 怎么理解python运算对象、运算符、表达式和语句
    本篇内容主要讲解“怎么理解python运算对象、运算符、表达式和语句”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么理解python运算对象、运算符、表达式和语句”吧!编程的本质就是数据和运算...
    99+
    2023-06-02
  • LRU算法原理解析
    LRU是Least Recently Used的缩写,即最近最少使用,常用于页面置换算法,是为虚拟页式存储管理服务的。 现代操作系统提供了一种对主存的抽象概念虚拟内存,来对主存进行更好地管理。他将主存看成是一个存储在磁盘上的地址空间的高速...
    99+
    2023-01-31
    算法 原理 LRU
  • React的调和算法Diffing算法策略详解
    目录算法策略单节点diffing数组节点diffingkey值的使用要求算法策略 React的调和算法,主要发生在render阶段,调和算法并不是一个特定的算法函数,而是指在调和过程...
    99+
    2024-04-02
  • Python 数据结构:理解算法和数据管理的关键
    ...
    99+
    2024-04-02
  • Paxos算法的通俗理解
    Paxos算法解决的问题是一个分布式系统如何就某个值(决议)达成一致。这个算法被认为是同类算法中最有效的。Paxos与MySQL相结合可以实现在分布式的MySQL数据的强一致性。 Paxos要解决的问题,...
    99+
    2024-04-02
  • 如何理解排序算法
    这篇文章主要讲解了“如何理解排序算法”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“如何理解排序算法”吧!排序是我们生活中经常会面对的问题,体育课的时候,老师...
    99+
    2024-04-02
  • C++运算符重载怎么理解
    这期内容当中小编将会给大家带来有关C++运算符重载怎么理解,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。C++当中除了函数可以重载之外,其实运算符也是可以重载的。我们之前已经接触过一些,可能大家没有意识到...
    99+
    2023-06-22
软考高级职称资格查询
推荐阅读
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作