20_BiLSTM+CRF

504 阅读4分钟

CRF

  • 条件随机场(Conditional Random Fields, 以下简称CRF)是给定一组输入序列条件下另一组输出序列的条件概率分布模型

随机场->马尔科夫随机场->CRF->linear-CRF

  • 随机场是由若干个位置组成的整体,当给每一个位置中按照某种分布随机赋予一个值之后,其全体就叫做随机场
  • 马尔科夫随机场是随机场的特例,它假设随机场中某一个位置的赋值仅仅与和它相邻的位置的赋值有关,和与其不相邻的位置的赋值无关
  • CRF是马尔科夫随机场的特例,它假设马尔科夫随机场中只有X和Y两种变量,X一般是给定的,而Y一般是在给定X的条件下的输出。这样马尔科夫随机场就特化成了条件随机场。
  • X和Y有相同的结构的CRF就构成了线性链条件随机场(Linear chain Conditional Random Fields,以下简称 linear-CRF)。

image.png

linear-CRF如何学习

  1. 定义特征函数集合,每个特征函数相当于一个得分函数
  2. 定义特征函数权重集合,即每个特征函数的权重
  • 特征函数表达式 f(s,i,li,li1)f(s, i, l_i, l_{i-1})

    • s:句子
    • i:单词位置
    • l:表示标注序列,相当于输出
    • li:表示标注序列的第i个单词的词性
    • li-1: 标注序列前一个单词的词性
    • 输出是0或1:0表示当前句子下第i个单词不符合要求,1表示符合要求
    • 每一个特征函数表示一种约束,用来给当前序列s打分。
  • 从特征函数集合到概率

image.png

  • m表示特征函数集合数
  • n表示序列长度
  • 一个特征函数就得到一个序列的分数

image.png

  • 对所有特征函数集合的值做一个归一化,得到概率值。
  • 目标函数:对应ground truth的概率乘积最大,然后利用梯度下降学习

BiLSTM-CRF

  • BiLSTM提取特征,CRF学习约束

image.png

image.png

序列标注的格式

  • 常用格式:BIO、BIOSE、IOB、BILOU、BMEWO、BMEWO+
  • Beginning 表示某个实体词的开始,Inside表示某个实体词的中间,Outside表示非实体词,End表示某个实体词的结尾,Single表示这个实体词仅包含当前这一个字
  • 基本使用BIO和BIOSE即可

image.png

模型原理

  • 假设输入x和输出y是一个5个字符的序列,
  • 同时标注采用BIO格式,加上START和END标签,就有5个类别。
  • BiLSTM输出就是每个单词对应5个类别的概率值,同时作为CRF输入,
  • CRF得到输入后,(注意是1一个输入序列即5个单词,每个单词对应5个类别的概率,是一个5x5的矩阵),根据约束学习转移概率矩阵。
  • 这里的CRF就有2个特征函数,
    • 1个是对应到节点上的,评估BiLSTM输出,称作Emission Score。

    • 1个是序列5个单词各种组合(5^5)种下,转移概率得分Transition Score

image.png

即整个BiLSTM-CRF通过约束要学习2件事情:

  1. 每个单词正确的词性,即Emission Score, BiLSTM输出学习
  2. 每个单词转移的正确概率,即Transition Score,CRF梯度下降更新学习

损失函数理解

image.png

image.png

image.png

全路径计算优化

  • 类似青蛙爬楼梯,前计算当前步的所有情况,然后计算当前步到下一步的所有情况。这和前面说的全路径是等价的。有一个数学推导:

image.png

  • 在pytorch编程当中,是用obs(当前词状态)和pre(上一步骤结果),采用扩展成矩阵迭代相加的形式实现

image.png

整体框架

image.png

  • 最终输出概率最大的词性序列。
  • 训练过程CRF需要计算所有路径得分,预测过程只需要找到最短路径即可。

viterbi decode 算法

  • 在预测过程中,是根据viterbi算法,来找概率最大的路径。
  • 整体过程如下,有点想半穷举法,在每次前一步穷举中,找到最大概率的路径,然后往后走。

image.png

比如从S到状态B, S-A3-B1是最好的,S-A1-B2是最好的,..., 然后依次从最好的再往后走,最终找出最优的。

image.png

  • N^2是指每一步都要计算每个状态的乘积,B1-3 * C1-3, T是总共的步骤

image.png

  • 代码实现需要两个alpha,一个保存得分,一个保存索引
  • pre保存的就是vertib算法,比如到1状态有2个路径,找出最大的那个。

前向算法代码实现原理

  • pytorch教程中,前向算法实现原理

image.png

计算每个step下各个状态的得分,最后再LSE就是所有路径总得分。