<track id="MTevviq"></track>
  • <track id="MTevviq"></track>

        <track id="MTevviq"></track>

        1. 导航菜单
          首页 >  » 正文

          最通俗易懂的BiLSTM

          背景知识

          你唯一须要懂得的是什么叫命名实体辨认。如果你不懂得神经网络,CRF以及其他相干知识也没有关系,我会用通俗易懂的语言来说明明白。

        2. 简介
        3. 在命名实体辨认范畴,基于神经网络的实现方式是非常风行和常用的。举个例子,该文讲述的用词嵌入和字嵌入的BiLSTM-CRF模型就是其中一种。我将以该模型为例说明CRF层的工作原理。

          如果你不知道BiLSTM 和 CRF的实现细节,只须要记住他们是命名实体辨认模型中两个不同的层。

          • 开端之前
          • 我们规定在数据集中有两类实体,人名和组织机构名称。所以,其实在我们的数据集中总共有5类标签:

            B-Person (人名的开端部分)

            I- Person (人名的中间部分)

            B-Organization (组织机构的开端部分)

            I-Organization (组织机构的中间部分)

            O (非实体信息)

            此外,x 是包括了5个单词的一句话(w0,w1,w2,w3,w4)。还有,在句子x中[w0,w1]是人名,[w3]是组织机构名称,其他都是“O”。

            • BiLSTM-CRF 模型
            • 先来扼要的介绍一下该模型。

              如下图所示:

              首先,句中的每个单词是一条包括词嵌入和字嵌入的词向量,词嵌入通常是事先训练好的,字嵌入则是随机初始化的。所有的嵌入都会随着训练的迭代进程被调剂。

              其次,BiLSTM-CRF的输入是词嵌入向量,输出是每个单词对应的预测标签。

              尽管不须要懂得BiLSTM的实现细节,但为了更好的懂得CRF层,我们还是须要知道一下BiLSTM的输出到底是什么意思。

              如上图所示,BiLSTM层的输入表现该单词对应各个类别的分数。如W0,BiLSTM节点的输出是1.5 (B-Person), 0.9 (I-Person), 0.1 (B-Organization), 0.08 (I-Organization) and 0.05 (O)。这些分数将会是CRF层的输入

              所有的经BiLSTM层输出的分数将作为CRF层的输入,类别序列中分数最高的类别就是我们预测的最终成果。

              • 如果没有CRF层会是什么样
              • 正如你所发明的,即使没有CRF层,我们照样可以训练一个基于BiLSTM的命名实体辨认模型,如下图所示。

                因为BiLSTM模型的成果是单词对应各类别的分数,我们可以选择分数最高的类别作为预测成果。如W0,“B-Person”的分数最高(1.5),那么我们可以选定“B-Person”作为预测成果。同样的,w1是“I-Person”, w2是“O”,w3是 “B-Organization” ,w4是 “O”。

                尽管我们在该例子中得到了准确的成果,但实际情形并不总是这样。来看下面的例子。

                显然,这次的分类成果并不正确。

                • CRF层可以学习到句子的束缚条件
                • CRF层可以参加一些束缚来保证最终预测成果是有效的。这些束缚可以在训练数据时被CRF层主动学习得到。

                  可能的束缚条件有:

                  • 句子的开头应当是“B-”或“O”,而不是“I-”。
                  • “B-label1 I-label2 I-label3…”,在该模式中,类别1,2,3应当是同一种实体类别。比如,“B-Person I-Person” 是准确的,而“B-Person I-Organization”则是过错的。
                  • “O I-label”是过错的,命名实体的开头应当是“B-”而不是“I-”。

                  有了这些有用的束缚,过错的预测序列将会大大减少。

                • CRF 层
                • CRF层中的丧失函数包含两种类型的分数,而懂得这两类分数的盘算是懂得CRF的要害。

                  • Emission score
                  • 第一个类型的分数是发射分数(状况分数)。这些状况分数来自BiLSTM层的输出。如下图所示,w0被预测为B-Person的分数是1.5.

                    为便利起见,我们给每个类别一个索引,如下表所示:

                    Xiyj代表状况分数,i是单词的地位索引,yj是类别的索引。依据上表,

                    表现单词w1被预测为B−Organization的分数是0.1。

                    • 转移分数
                    • 我们用tyiyj来表现转移分数。例如,tB−Person,I−Person=0.9表现从类别B−Person→I−Person的分数是0.9。因此,我们有一个所有类别间的转移分数矩阵。

                      为了使转移分数矩阵更具鲁棒性,我们加上START 和 END两类标签。START代表一个句子的开端(不是句子的第一个单词),END代表一个句子的停止。

                      下表是加上START和END标签的转移分数矩阵。

                      如上表格所示,转移矩阵已经学习到一些有用的束缚条件:

                      • 句子的第一个单词应当是“B-” 或 “O”,而不是“I”。(从“START”->“I-Person 或 I-Organization”的转移分数很低)
                      • “B-label1 I-label2 I-label3…”,在该模式中,类别1,2,3应当是同一种实体类别。比如,“B-Person I-Person” 是准确的,而“B-Person I-Organization”则是过错的。(“B-Organization” -> “I-Person”的分数很低)
                      • “O I-label”是过错的,命名实体的开头应当是“B-”而不是“I-”。

                      要怎样得到这个转移矩阵呢?

                      实际上,转移矩阵是BiLSTM-CRF模型的一个参数。在训练模型之前,你可以随机初始化转移矩阵的分数。这些分数将随着训练的迭代进程被更新,换句话说,CRF层可以自己学到这些束缚条件。

                      • CRF丧失函数
                      • CRF丧失函数由两部分组成,真实路径的分数 和 所有路径的总分数。真实路径的分数应当是所有路径中分数最高的。

                        例如,我们的数据集中有如下几种类别:

                        一个包括5个单词的句子,可能的类别序列如下:

                        • 1. START B-Person B-Person B-Person B-Person B-Person END
                        • 2. START B-Person I-Person B-Person B-Person B-Person END
                        • …..
                        • 10. START B-Person I-Person O B-Organization O END
                        • N. O O O O O O O

                        每种可能的路径的分数为Pi,共有N条路径,则路径的总分是

                        ,e是常数e。

                        如果第十条路径是真实路径,也就是说第十条是准确预测成果,那么第十条路径的分数应当是所有可能路径里得分最高的。

                        依据如下丧失函数,在训练进程中,BiLSTM-CRF模型的参数值将随着训练进程的迭代不断更新,使得真实路径所占的比值越来越大。

                        现在的问题是:

                      • 怎么定义路径的分数?
                      • 怎么盘算所有路径的总分?
                      • 当盘算所有路径总分时,是否须要列举出所有可能的路径?(答案是不须要)
                      • 真实路径分数
                      • 盘算真实路径分数,eSi,是非常容易的。

                        我们先集中注意力来盘算Si

                        “START B-Person I-Person O B-Organization O END”这条真实路径来说:

                        句子中有5个单词,w1,w2,w3,w4,w5

                        加上START和END 在句子的开端地位和停止地位,记为,w0,w6

                        Si = EmissionScore + TransitionScore

                        这些分数来自BiLSTM层的输出,至于x0,START 和x6,END ,则设为0。

                        这些分数来自于CRF层,将这两类分数加和即可得到Si 和 路径分数eSi

                        • 所有路径的总分
                        • 如何盘算所有路径的总分呢?我们将以一个玩具的例子详细讲授。

                          这部分是最主要的并且也是比拟难的,但不用担忧,我将用玩具的例子尽可能简略的讲明白里面的细节。

                          Step 1

                          我们定义的丧失函数如下:

                          现在我们把它变成对数丧失函数:

                          由于我们的训练目的通常是最小化丧失函数,所以我们加上负号:

                          前面我们已经很明白如何盘算真实路径得分,现在我们须要找到一个方式去盘算

                          Step 2:回想一下状况分数 和 转移分数

                          为了简化问题,我们假定我们的句子只有3个单词组成:

                          X = [w0, w1 ,w2]

                          另外,我们只有两个类别:

                          LabelSet = {l1, l2}

                          状况分数如下:

                          转移矩阵如下:

                          Step 3:开端斗争!(纸和笔筹备好!)

                          记住:我们的目的是:

                          全部进程是一个分数的积累进程。它的实现思想有点像动态计划。首先,w0所有路径的总分先被盘算出来,然后,我们盘算w0 -> w1的所有路径的得分,最后盘算w0 -> w1 -> w2的所有路径的得分,也就是我们须要的成果。

                          接下来,你会看到两个变量:obs和 previousPrevious存储了之前步骤的成果,obs代表当前单词所带的信息。

                          如果我们的句子只有一个单词,我们就没有之前步骤的成果,所以Previous 是空。我们只能观测到状况分数 obs =【x01,x02】

                          W0 的所有路径总分就是:

                          (请集中注意)

                          你可能怀疑为啥要扩大previous 和 obs 矩阵呢?因为这样操作可以是接下来的盘算相当高效,你很快就能意会到这点。

                          实际上,第二次迭代进程也就完成了。

                          发明了吗,这其实就是我们的目的,

                          读到这边,差不多就大功告成了。这一步,我们再反复一次之前的步骤。

                          跟上一步骤一样。我们用新的previous盘算总分:

                          完结,撒花!

                          我们最终得到了我们的目的,

                          ,我们的句子中共有3个单词和两个类别,所以共有8条路径。

                          2.6 对句子的单词词性做预测

                          在之前章节我们学习了BiLSTM-CRF模型的基础构造和CRF的丧失函数。现在你可以用各种开源框架搭建你自己的BiLSTM-CRF模型(Keras, Chainer, TensorFlow等)。用这些框架最爽的事情就是你不用自己实现反向传布这个进程,并且有的框架已经实现CRF层,这样只须要添加一行代码就能在你的模型中实现CRF进程。

                          本章我们会摸索如何用我们训练好的模型去预测一个句子每个单词的词性。

                          Step 1:BiLSTM-CRF模型得到的发射分数和转移分数

                          假定我们的句子共3个单词组成:

                          并且,我们已经从我们的模型中得到了发射分数和转移分数,如下:

                          转移矩阵:

                          Step 2:开端预测

                          如果你熟习Viterbi算法,懂得这一步的知识点将会非常容易。当然,如果你不熟习也无所谓,全部预测进程和之前求所有路径总分的进程非常相似。我将逐步说明明白,我们先从左到右的次序来运行预测算法。

                          你将会看到两类变量:obs 和 previous。Previous存储了上一个步骤的最终成果,obs代表当前单词包括的信息(发射分数)。

                          Alpha0 是历史最佳的分数 ,alpha1 是最佳分数所对应的类别索引。这两类变量的详细信息待会会做阐明。先来看下面的图片:你可以把这两类变量当做狗狗去森林里玩耍时在路上做的标志,这些标志可以辅助狗狗找到回家的路。

                          现在,我们来观测第一个单词W0,很显然,W0所对应的最佳预测类别是非常容易知道的。比如,如果

                          ,显然,最佳预测成果是l2。

                          看到这里,你可能好奇这跟之前求所有路径分数的算法没什么差别,别急,你马上就会看到不同之处啦!

                          在下一次迭代前更改previous的值:

                          举个例子,如果我们的得分如下:

                          那么我们的previous应当是:

                          这是什么意思呢?其实也就是说previous存储的是当前单词对应各类别的最佳路径得分。W1被预测为L1类别的最高分是0.5,路径是L2->L1,W1被预测为L2类别的最高分是0.4,路径是L2->L2。

                          这边,我们有两个变量来储存历史信息,alpha0 和 alpha1.

                          在本次迭代中,我们将最佳分数存储到alpha0 :

                          同时,最佳分数所对应的类别索引存储到alpha1:

                          类别L1的索引是0,L2的索引是1,所以(1,1)=(L2,L2)。表现当前最佳分数0.5对应的路径是L2->L1,最佳分数0.4对应的路径是L2->L2。(1,1)可以懂得为前一单词分辨对应的类别索引。

                          上面scores有过错,应当是0.5+x21+t11 等

                          更改previous的值:

                          假如我们的得分是:

                          现在我们的previous是:

                          现在,我们选取previous[0] 和previous[1]中最大的分数作为最佳路径。也就是0.9对应的路径是我们的预测成果。

                          同时,每个类别对应的最大得分添加到alpha0 和 alpha1中:

                          Step 3:依据最大得分找到最佳路径

                          这是最后一步,alpha0 和 alpha1将被用来找到最佳路径。

                          先看alpha0,alpha0中最后一个单词对应的类别得分分辨是0.8 和 0.9,那么0.9对应的类别L2就是最佳预测成果。再看alpha1,L2对应的索引是0, “0”表现之前一个单词对应的类别是L1,所以W1-W2的最佳路径是: L1->L2

                          接着往前推,alpha1=(1,1),我们已经知道W1的预测成果是L1,对应的索引是0,(1,1)[0] = 1,所以W0对应的类别是L2。

                          所以我们预测的最佳路径是 L2-> L1 -> L2 。

                          原始文章链接:

                          createmomo.github.io/20

                          createmomo.github.io/20

                          createmomo.github.io/20

                          createmomo.github.io/20

                          createmomo.github.io/20

                          createmomo.github.io/20