lstm+crf进行实体识别

实体识别

  • Recap
    • lost function
    • 所有路径的log(e^si)之和
    • 用该模型预测输入对应输出
    • 代码时间原因就先不放了(其实是因为撒把小米到键盘上都比我coding的好)

Recap

参考https://www.jianshu.com/p/aed50c1b2930开始这个任务。
crf参考网址:https://www.cnblogs.com/createMoMo/p/7529885.html

知道了lstm的输出格式(即crf中会使用到的emission score,每个位置的单词对应各label的概率),虽然只利用lstm也可以进行预测(每个单词的label取使概率取最大值的即可),但这样的预测在很多时候明显是错的(如i标签出现,在前面未有b的情况下),而条件随机场很好地解决了这个问题(通过在预测时不光考虑emission,也考虑transition)。
crf的lost function表达。难点在于表达log(e^s1+…e sn)和利用训练好的模型预测未见过的句子的label这两个dp算法。

吃完饭回来继续dp+code,之后开始gcn的学习(关系提取)。

lost function

lstm+crf进行实体识别_第1张图片
如果可以表达出来lost function,就可以进行优化,从而update模型参数。

所有路径的log(e^si)之和

假设这样一个toy example:三个words(w0,w1,w2),都是可以从l1和l2两个label里面取。

假设有两个命名为obs(i.e,observe),previous的数据结构。obs的第一列代表到此时分析到的最后一个word,label取为l1,第二列类似。
可以跟着下面这样的方法演算一遍:

wo时:
previous = [x01,x02]
obs为空

w0->w1时:
previous为[x11,x12]
obs = [x01,x02]
在这里要做一些expand,obs多添加一行,第二行与第一行完全一样(代表最后一个单词(目前考虑到的)是l1的路径会在原来的基础上翻倍,考虑从前一个是l1还是l2得到)。
lstm+crf进行实体识别_第2张图片
显然这里需要更新previous(但不知道why update in this way)
previous一直保持有两个元素,第一列是目前最后一个以l1截止,log(e^第一行第一列元素+e第二行第一列元素)
在这里插入图片描述
w0->w1->w2:
lstm+crf进行实体识别_第3张图片
之后用scores更新previous,用previous就可以计算到此为止的路径总和,鉴于w2是最后一词了,此时得到的便是目标值。
lstm+crf进行实体识别_第4张图片
到此为止,就可以表示出来lost function了,也即可以通过梯度下降之类的方法得到模型较为合适的参数了。

用该模型预测输入对应输出

思路:
就是找一条si值最大的路,采用动态规划的思路,因为多考虑一个word时,不仅和此前的sum有关,还和上一步的label有关(转移值不一样),因此previous保存这个信息。

依旧考虑之前的三个词的例子:
w0:
previous = null
obs = [x01,x02] = [0.2,0.8]

w0->w1:
obs = [x11,x12]
previous = [x01,x02]

expand both of them:
scores是一个两行两列的东西,第一行第一列代表w1为l1,且w0也是l1,;而第一行第二列则代表w0是l2。
此时,更新previous,第一个元素是第一列最大值,第二个元素是第二列最大值。

attention:这里要保存一些信息以便于之后得出最大值对应的路径
alpha0中加入此时的previous(一个triple),alpha1也加入一个triple,分别是previous第一列第二列,得到这个最大值的前一个标签,0代表l1,1代表l2.
lstm+crf进行实体识别_第5张图片
如此直到最后一个单词,这时候的previous里两个元素中的最大值就是最可能的标注序列对应的值。此时看看这个值时alpha0里的哪个元素,第0个代表最后一个标签是l1,,否则l2。此时在alpha1里找对应下标的值,0的话就代表前一个标签是l1,1是l2.再利用alpha1以此类推,就可以恢复出完整的最长路径了。(这样看,alpha0不需要,只要previous更新,根据最终previous里最大值下标,再用alpha1恢复就行)

代码时间原因就先不放了(其实是因为撒把小米到键盘上都比我coding的好)

你可能感兴趣的:(nlp基础)