昇思25天学习打卡营第20天|LSTM+CRF序列标注

课程打卡凭证

概述

LSTM(Long Short-Term Memory,长短期记忆网络)和CRF(Conditional Random Field,条件随机场)是序列标注任务中常用的两种模型,它们是在自然语言处理(NLP)领域中常用的模型架构,特别适用于需要对序列中每个元素进行标注的任务,如词性标注、命名实体识别(NER)和语义角色标注等。将LSTM和CRF结合起来,可以充分利用它们各自的优势,提升序列标注的性能。

BIOE标注

BIOE标注是一种在命名实体识别等NLP任务中常用的序列标注方法。它通过对文本中的每个词或字符进行标注,来指示它们是否属于某个实体以及它们在实体中的位置。BIOE标注法由四个标签组成,B表示实体的开始,I表示实体的内部,O表示非实体,E表示实体的结束。如图所示。

CRF模型

CRF是一种用于序列标注和结构化预测的概率图模型。它不假设观测序列的独立性,通过条件概率分布直接对观测序列给定的标签序列进行建模,目标是找到使条件概率最大的标签序列。以下图为例,I前面必定是B或I,四个标签token并非相互独立的,而是具有依赖性,因此适用CRF模型。

CRF模型中,给定观测序列X的标签序列Y的条件概率如下图所示。

其中,计算标签序列得分的Score函数定义如下图所示。它由从xi到yi的发射概率和yi-1到yi的转移概率累加而得。

它也可以转换成如下图所示的形式。其中P表示由标签集合T构造的大小为|T|x|T|的矩阵,用于存储标签间的转移概率。h表示发射概率,是编码层输出的隐状态。

损失函数如下图所示。

经过变形,可得:

这里将被减数称为Normalizer,减数称为Score,相减即可得Loss。

Score计算

Normalizer计算

Viterbi算法

Viterbi算法是一种动态规划算法,它可以在CRF找到最可能的隐藏状态序列,被广泛应用于序列标注任务。

设置初始状态的概率,并初始化路径记录表。

对于每个时间步,计算每个状态的概率,并更新路径记录表。这一步骤通常通过考虑前一个时间步的所有可能状态及其转移概率来实现。

在最后一个时间步,选择具有最大概率的状态作为最优路径的终点。

从终止状态开始,根据路径记录表回溯到初始状态,从而得到最优路径。

CRF层

导入必要的库和模块,生成一个掩码矩阵,用于处理变长序列。

定义CRF类,初始化模型参数,包括标签转移分数、起始转移分数和结束转移分数。

根据输入是否包含标签来调用相应的前向计算或解码函数。

计算给定标签序列的得分和规范化因子,并返回负对数似然。

调用Viterbi解码函数进行解码。

BiLSTM+CRF模型

BiLSTM_CRF类实现了一个结合双向LSTM和CRF的序列标注模型。这里首先通过嵌入层将输入序列转换为向量表示,然后通过双向LSTM提取特征,最后通过CRF层计算最优标签序列或序列标签的损失。

设置一个序列标注任务,使用的训练数据为:"清华大学坐落于首都北京" 和 "重庆是一个魔幻城市",创建单词到索引和标签到索引的映射,使用BiLSTM+CRF模型进行序列标注。

实例化模型,选择优化器。

准备序列标注任务的数据,将单词和标签转换为索引,并进行填充以保证每个序列的长度相同。

使用tqdm库来显示训练进度条,并在每个步骤更新损失信息。

训练结果展示。

预测得分展示。

将预测结果转换成标签序列展示。

相关推荐

  1. 25学习23|LSTM+CRF序列标注

    2024-07-16 20:46:01       23 阅读
  2. 25学习18 | LSTM+CRF序列标注

    2024-07-16 20:46:01       20 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-16 20:46:01       67 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-16 20:46:01       72 阅读
  3. 在Django里面运行非项目文件

    2024-07-16 20:46:01       58 阅读
  4. Python语言-面向对象

    2024-07-16 20:46:01       69 阅读

热门阅读

  1. vue3+vite+ts+pinia+router4后台管理-动态路由生成

    2024-07-16 20:46:01       17 阅读
  2. 【数值计算】学习笔记

    2024-07-16 20:46:01       18 阅读
  3. Docker入门:从安装到实际应用

    2024-07-16 20:46:01       19 阅读
  4. MetaGPT和LangGraph对比

    2024-07-16 20:46:01       19 阅读
  5. Linux基础命令

    2024-07-16 20:46:01       20 阅读
  6. JUC-并发的概念

    2024-07-16 20:46:01       18 阅读
  7. 第五章 初识Sping框架(2023版本IDEA)

    2024-07-16 20:46:01       16 阅读
  8. TCP重传、滑动窗口、流量控制、拥塞控制机制

    2024-07-16 20:46:01       20 阅读