《昇思 25 天学习打卡营第 21 天 | LSTM+CRF序列标注模型实现 》

devtools/2024/10/18 10:14:26/

《昇思 25 天学习打卡营第 21 天 | LSTM+CRF序列标注模型实现 》

活动地址:https://xihe.mindspore.cn/events/mindspore-training-camp
签名:Sam9029


序列标注问题概述

序列标注是信息抽取中的一个关键任务,包括分词、词性标注、命名实体识别等。例如,在命名实体识别中,需要识别文本中的地名、人名等实体。

BIOE标注体系

  • B: 表示实体的开始。
  • I: 表示实体的中间部分。
  • E: 表示实体的结束。
  • O: 表示非实体。

条件随机场(CRF)

CRF是一种适合序列标注的概率图模型,能够捕捉标签之间的依赖关系。

线性链CRF

线性链CRF考虑序列中每个Token的标签,并使用发射概率和转移概率来计算整个序列的得分。

实验环境配置

确保安装了MindSpore框架,用于模型的构建和训练。

!pip install mindspore==2.2.14 -i https://pypi.mirrors.ustc.edu.cn/simple

模型构建

定义CRF层

CRF层的实现包括前向训练部分和解码部分。

class CRF(nn.Cell):def init(self, num_tags: int, batch_first: bool = False, reduction: str = 'sum'):# 初始化CRF层参数# ...def construct(self, emissions, tags=None, seq_length=None):# 根据传入的emissions和tags决定是前向计算还是解码# ...

BiLSTM+CRF模型

使用双向LSTM提取序列特征,然后通过Dense层和CRF层进行序列标注。

class BiLSTM_CRF(nn.Cell):def init(self, vocab_size, embedding_dim, hidden_dim, num_tags, padding_idx=0):# 初始化模型参数# ...def construct(self, inputs, seq_length, tags=None):# 前向传播过程# ...

数据准备

准备训练数据,包括输入序列、对应的标签和序列长度。

training_data = [# 示例句子和标签
]
word_to_idx = {word: idx for word, idx in enumerate(vocab)}
tag_to_idx = {tag: idx for tag, idx in enumerate(tags)}

训练模型

实例化模型和优化器,然后进行训练。

model = BiLSTM_CRF(len(word_to_idx), embedding_dim, hidden_dim, len(tag_to_idx))
optimizer = nn.SGD(model.trainable_params(), learning_rate=0.01, weight_decay=1e-4)

训练步骤

定义训练步骤,包括前向传播、损失计算和反向传播。

def train_step(data, seq_length, label):loss, grads = grad_fn(data, seq_length, label)optimizer(grads)return loss

训练过程

使用tqdm库可视化训练过程,并迭代指定的步数。

for i in tqdm(range(steps)):loss = train_step(data, seq_length, label)

模型推理

使用训练好的模型进行推理,获取预测的标签序列。

predict = post_decode(score, history, seq_length)
predicted_tags = sequence_to_tag(predict, idx_to_tag)

思考

在实现LSTM+CRF模型时,CRF层的设计是关键,它需要考虑序列的真实长度和填充问题。此外,Viterbi算法在解码过程中的应用对于找到最优标签序列至关重要。
模型的训练过程中,优化器的选择和学习率的调整对模型性能有显著影响。在本例中,使用SGD优化器,但实际应用中可能需要尝试不同的优化器和超参数。
最后,模型的评估和迭代是提高性能的重要步骤。在实际项目中,可能需要根据验证集上的性能反馈进行多次迭代和调整。


http://www.ppmy.cn/devtools/85895.html

相关文章

notes for datawhale summer camp chemistry task2

[[appendix/Task2_RNN.ipynb|Task2_RNN.ipynb]] 本次的任务是进一步了解 AI4Science 相关知识,然后使用深度学习的方法建模。 你可以从中:了解一些相关历史、了解 SMILES 和分子指纹,并对 RDkit 工具包有更深的认识;探究深度学习…

Zookeeper源码剖析-启动类

文章目录 从启动脚本开始分析ZooKeeper启动脚本 `zkServer.sh` 分析1. 脚本位置2. 脚本结构3. 主要部分3.1 检测环境变量3.2 加载配置文件3.3 设置环境变量3.4 日志配置3.5 启动和停止命令3.6 启动ZooKeeper3.7 停止ZooKeeper4. 其他功能5. 调用方式总结ZooKeeper的 QuorumPeer…

<camera>ISP的处理流程梳理-AAF(抗混叠滤波器)

<camera>ISP的处理流程梳理-开篇 <camera>ISP的处理流程梳理-DPC(坏点校正) <camera>ISP的处理流程梳理-BLC(黑电平校正) <camera>ISP的处理流程梳理-AAF(抗混叠滤波器) <camera>ISP的处理流程梳理-LSC(镜头阴影校正) <camera>ISP的处理流程梳理-AWB(自动…

「豆包Marscode体验官」AI加持的云端IDE——三种方法高效开发前后端聊天交互功能

豆包 MarsCode 是一个集成了AI功能的编程助手和云端IDE,旨在提高开发效率和质量。它支持多种编程语言和IDE,提供智能代码补全、代码解释、单元测试生成和问题修复等功能,同时具备AI对话视图和开发工具。 豆包 MarsCode 豆包 MarsCode 编程助…

SQL进阶技巧:车辆班次问题分析

目录 0 需求描述 1 数据准备 2 问题分析 3 小结 0 需求描述 一班次,可能有多辆车,如果第一辆不出故障,这一班次就只有一辆车,如果出问题有第二辆车,如果出问题有后续多辆,直到把这一班次跑完,如果这一班次只有这一辆,既没before_id也没after_id,如果有多辆,那么第…

微信小程序之计算器

在日常生活中,计算器是人们广泛使用的工具,可以帮助我们快速且方便地计算金额、成本、利润等。下面将会讲解如何开发一个“计算器”微信小程序。 一、开发思路 1、界面和功能 “计算器”微信小程序的页面效果如图所示 在计算器中可以进行整数和小数的…

Mecanim Animation System

动画系统简介 Unity 有一个非常丰富而又复杂的动画系统,官方称其为Mecanim。该系统具有以下功能: 支持从外部导入动画剪辑,如:fbx、mb | ma(Autodesk maya 原件)、.max(3ds Max原件&#xff09…

贪心系列专题篇三

目录 单调递增的数字 坏了的计算器 合并区间 无重叠区间 用最少数量的箭 声明:接下来主要使用贪心法来解决问题!!! 单调递增的数字 题目 思路 如果我们遍历整个数组,然后对每个数k从[k,0]依次遍历寻找“单调递…