LSTM+CRF Pytorch tutorial 之从原理到代码 # 摸着石头入门系列

Pytorch 给出的命名体识别(NER)的小例子,简洁清晰,深入原理及实现细节,比较适合想深入学习又没有好的入门途径的同学。不过他过于简洁,一些理论背景没有介绍,对于咱们这些,在门口晃悠的渣渣掌握起来还是有点儿费劲。

所以,本文打算总结自己的学习过程,从原理到代码,走一遍这个小例子,算是摸着石头入门吧~

outline:

  • 这个模型的用途
  • 模型的结构
  • 几个关键代码的原理

1、模型用途

输入是一句话,或者更严谨一点说是一个多个词(单词)组成的自然序列,然后这个模型其中的实体(比如人名,地名,组织机构名等)识别出来。

比如输入:我爱北京

模型给出标记:O O B-LOC I-LOC

O 其他
O 其他
B-LOC 地点实体开始
I-LOC 地点实体内部

这里只是拿地点实体举个例子,实际应用中,可以标记出任何你想识别的东西,前提是,语料中已经有标记好的训练数据。顺便多说两句,现在(2020年)NER方面最先进的模型都会结合预训练模型,不过这个经典模型任然在其中扮演着一些角色。

2、模型的结构

LSTM+CRF Pytorch tutorial 之从原理到代码 # 摸着石头入门系列_第1张图片

上边是两个图,左边黑白图,右边彩色图。

简单来说,模型分为三层,如黑白图的大括号标出来的那样:

词向量输入层

原始输入的句子,属于非结构化数据,需要变成结构化数据输入模型。此处的变换方式是给每个字随机编号,再利用pytorch自带的Embedding 方法映射成 embedding_dim 维的向量。

0 [e_1, e_2, ..., e_n]
1 [e_1, e_2, ..., e_n]

2 [e_1, e_2, ..., e_n]
3 [e_1, e_2, ..., e_n]

实际中,会用预训练好的词向量表,每个输入字的词向量,从词向量表中查询得到。

Bi-LSTM 层

双向LSTM层,主要用来提取输入数据的特征。因为包括Pytorch在内的框架,已经完美封装了,交给我们的只剩下弄清楚输入、输出,更具体点可能是,输入、输出的维度

能看见的大多博客、知乎里,对这个结构的解释就两点:1、能编码序列输入的双向信息;2、一堆三个门控制的公式。虽然用的一个比一个666,但是都没有解释清楚其中原理。

或许是像我一样,功利性的放弃深入探寻,继续追逐新的模型。

CRF 层

 

 

(先保存,后续继续写。。。2020-5-20)

(有想急于了解的部分,欢迎在评论里留言~)

你可能感兴趣的:(NLP,NER)