自学内容网 自学内容网

使用 lstm + crf 实现NER

条件随机场CRF

前言

  • CRF是给定一组输入随机变量条件下另一组输出随机变量的条件概率分布的模型。
  • 特点:假设输出随机变量构成马尔卡夫随机场。
  • CRF可以用于不同的预测问题。
  • 但是主要讨论线性链条件随机场,这时问题变成了由输入序列对输出序列的判别模型,形式为对数线性模型,学习方法通常是极大似然估计火正则化的极大似然估计
  • 三个基本问题:概率计算问题,学习问题,预测问题

Step1:概率无向图模型

概率无向图又称马尔可夫随机场。是一个可以由无向图表示的联合概率分布。

1.模型定义

定义无向图表示的随机变量之间存在成对马尔可夫性,局部马尔可夫性,全局马尔可夫性。

  • 成对马尔可夫性:u和v式无向图G中任意两个没有边连接的节点,对应Y_u和Y_v。其他所有节点为O,对应Y_o。成对马尔可夫性指给定Y_o的条件下Y_u和Y_v是条件独立的

P ( Y u , Y v ∣ Y O ) = P ( Y u ∣ Y O ) P ( Y v ∣ Y O ) P(Y_u,Y_v|Y_O)=P(Y_u|Y_O)P(Y_v|Y_O) P(Yu,YvYO)=P(YuYO)P(YvYO)

  • 局部马尔可夫性:

在这里插入图片描述

  • 全局马尔可夫性:

在这里插入图片描述

2.概率无向图模型

无向图G中,联合概率分布满足成对,局部或全局马尔可夫性,就称此联合概率分布为概率无向图模型或马尔可夫随机场

3.因子分解

概率无向图模型最大的特点就是易于因子分解。

  • 团与最大团的概念

概率无向图模型的联合概率可以表示为最大团上的随机变量的函数的乘积的形式。

在这里插入图片描述

Step2:条件随机场的定义

1.定义

在这里插入图片描述

2.参数化形式

在这里插入图片描述

3.简化形式

在这里插入图片描述

4.矩阵形式

在这里插入图片描述

Step3:概率计算

给定条件随机场P(Y|X),输入序列 x 和输出序列 y ,计算条件概率P(Y_i=y_i | x),P(Y_{i-1} = y_{i-1} , Y_i = y_i | x)以及相应的数学期望的问题。

1.前向-后向算法

  • 前向向量 α i ( x ) \alpha_i(x) αi(x)

在这里插入图片描述

递推公式:

或

  • 后向向量 β i ( x ) \beta_i(x) βi(x),同理

在这里插入图片描述

  • Z(x)由前向-后向向量得到

在这里插入图片描述

2.概率计算

在这里插入图片描述

3.期望值计算

在这里插入图片描述

Step4:学习算法

具体优化实现算法:改进迭代尺度法IIS、梯度下降法、拟牛顿法

1.改进迭代尺度法

在这里插入图片描述

其中,

δ = ( δ 1 , δ 2 , . . . , δ K ) T \delta=(\delta_1,\delta_2,...,\delta_K)^T δ=(δ1,δ2,...,δK)T为向量增量,更新参数为 w + δ w+\delta w+δ

在这里插入图片描述

2.BFGS法

在这里插入图片描述

Step5:预测算法

给定条件随机场 P ( Y ∣ X ) P(Y|X) P(YX)和输入序列(观测序列)x,求条件概率最大的输出序列(标记序列) y ∗ y^* y

即对观测序列进行标注

维特比算法

在这里插入图片描述

  • 其中,

在这里插入图片描述

在这里插入图片描述

Step6:PyTorch-crf

note : pytorch-crf 暴露为一个单个 CRF 类,这个类继承自 Pytorch 的 nn.Module

  • 所以他能做到一个普通的网络都能能做到的事情
    • 比如,把 module 转到 设备中
    • 前向传播和反向传播
    • module 的参数管理等
  • 知道以上那一点,一切都好说了

在这里插入图片描述

在这里插入图片描述

计算概率

给定发射分数的,计算一个序列标签的对数概率

在这里插入图片描述

如果有填充,需要传递掩码矩阵张量

在这里插入图片描述

Step7:使用 LSTM + Pytorch-CRF 实现 NER

1.数据集

在这里插入图片描述

在这里插入图片描述

  • 格式

    • 貌似是个 tsv,可以利用这一点对文件进行分析
    • 空行表示一个句子结束
    • 乍一看数据集质量貌似不太好
  • 思路

    • 数据集不多,类别分的那么多没必要,把NAM和NOM合并好了,只保留 GPE, LOC, ORG, PER
    • 用空行表示一句的隔断
    • 写一个 脚本 吧~把数据保存成字典(代码在上方资源处自取)

    在这里插入图片描述

    • 后来又写了两个,把词汇表和类别顺便加上了

    在这里插入图片描述

2.代码

  • 上方资源处自取

  • 这里我嫌收敛太慢了,使用了学习率调度器,调度策略采用了第一次退火到最大学习率的学习率调度器。

    scheduler = OneCycleLR(optimizer, max_lr=0.05, steps_per_epoch=len(train_loader), epochs=num_epochs)
    
    • 最大学习率是 0.05,优化器学习率是 5e-4 ,目的是前期加速收敛
    • 也就是说,学习率会从 0.0001 上升到 0.01 再慢慢退回到 0.0001

    在这里插入图片描述

  • 分为标准的 训练集,开发集,测试集

    • 每轮打印信息

      在这里插入图片描述

  • 最终结果,貌似没有完全收敛

    • 因为这我的 colab 突然坏掉了,不能用 gpu,所以这次是用自己电脑跑的,苹果的M 芯片还是慢了点,不如 A100。而且这周有事,我就训练了两次就不整了

    在这里插入图片描述

  • 最后,我把双向改单向貌似效果好多了,但是没时间了,有急事要出去了

    • 10轮就差点干了之前50轮的效果
  • 在这里插入图片描述


原文地址:https://blog.csdn.net/weixin_46034279/article/details/142583688

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!