模型介绍

简单来说,lattice LSTM 模型首次融合了字符信息和词汇信息。对比基于字符的方法,融合了词汇的方法显然能带入更多的信息。但对比于基于词汇的方法,lattice LSTM 却避免了LSTM受分词错误的影响带来的效果下降。作者这里举了一个例子:

南京市长江大桥,一般分为“南京市”,“长江大桥”。但基于词汇的方法有可能产生歧义,将其分为“南京”,“市长”,“江大桥”,严重影响网络的性能。

也因此,一般来说,基于字符的方法性能一般优于基于词汇的方法。

LSTM详解

想要读懂 lattice LSTM 的网络结构,就必须先了解清除 LSTM 的网络结构。我们先来看两张经典的 LSTM 网络结构图。

lstm 文本生成原理_神经网络

lstm 文本生成原理_lstm_02


我相信大家肯定知道 LSTM 的三大核心:输入门,遗忘门,输出门,大家看第二张图片,我这里分为了7个步骤来进行讲解,讲解之前,先对字符代表的意思进行了解:

  • lstm 文本生成原理_自然语言处理_03 代表输入的第 lstm 文本生成原理_lstm_04
  • lstm 文本生成原理_lstm_05 代表第 lstm 文本生成原理_神经网络_06
  • lstm 文本生成原理_lstm 文本生成原理_07 代表第 lstm 文本生成原理_神经网络_06
  • σ 代表 sigmod 激活函数

准备完毕,我们根据第二张图对lstm 文本生成原理_lstm_04进行解释:

  1. 将第 lstm 文本生成原理_lstm_04 个字符的字向量与前一个单元输出的隐藏状态进行拼接,作为三个门的输入,拼接指直接把第二个向量拼在第一个向量后面,为 lstm 文本生成原理_lstm_11
  2. 计算遗忘因子 lstm 文本生成原理_自然语言处理_12,计算公式为:lstm 文本生成原理_神经网络_13,简单来说就是输入乘权重加上偏值(偏值在图中没有标出)。
  3. 计算输入因子 lstm 文本生成原理_lstm_14,计算公式为:lstm 文本生成原理_自然语言处理_15
  4. 计算临时单元状态 lstm 文本生成原理_神经网络_16,计算公式为:lstm 文本生成原理_深度学习_17
  5. 计算最终单元状态 lstm 文本生成原理_lstm 文本生成原理_18,计算公式为:lstm 文本生成原理_自然语言处理_19,这个公式很好理解,lstm 文本生成原理_神经网络_20前一个单元遗忘后保留的部分lstm 文本生成原理_深度学习_21当前临时单元状态保留的部分,两部分相加得到最终单元状态。
  6. 计算输出因子 lstm 文本生成原理_lstm 文本生成原理_22,计算公式为:lstm 文本生成原理_自然语言处理_23
  7. 计算隐藏状态 lstm 文本生成原理_神经网络_24,计算公式为:lstm 文本生成原理_神经网络_25,可以理解为最终单元状态要输出多少。

到目前为止,我们已经了解了 LSTM 的所有内部计算,下面进行一个总结:
大家注意看第2、3、4、6这四个步骤的公式,可以发现其基本一致,因此,可以对其进行合并,写成矩阵的形式:

lstm 文本生成原理_lstm 文本生成原理_26

这么一看是不是特别的简洁,也非常好理解。

Lattice LSTM详解

下面就是我们的重头戏了,因为 Lattice LSTM的模型结构还是有些复杂,所以这里我会结合论文进行讲解。

lstm 文本生成原理_神经网络_27

同理,我们先对一些符号和定义进行解释:

  • 模型的输入是一个字符序列,表示为:lstm 文本生成原理_深度学习_28,这里的c代表character这个英文单词。
  • 词汇集合D,这个词汇集合是作者用庞大的文本数据构建出来的。输入额外工作,不是模型的一部分。
  • lstm 文本生成原理_自然语言处理_29 代表一个属于词汇集合D的词汇,这个词汇在句子中的索引be ,这里的 w 代表 word 这个英文单词。以上图为例,lstm 文本生成原理_自然语言处理_30 代表“南京”,lstm 文本生成原理_lstm 文本生成原理_31
  • lstm 文本生成原理_深度学习_32 ,上面说到,lstm 文本生成原理_自然语言处理_33 代表第 j 个字符lstm 文本生成原理_lstm_34是一个字符向量表,通过在表中查找,得到字符 lstm 文本生成原理_自然语言处理_33 的字向量 lstm 文本生成原理_自然语言处理_36lstm 文本生成原理_自然语言处理_36 作为第 j 个单元的输入
  • lstm 文本生成原理_深度学习_38 ,上面说到,lstm 文本生成原理_自然语言处理_29 代表索引从 be 的词汇lstm 文本生成原理_lstm 文本生成原理_40是一个词向量表,通过在表中查找,得到词汇 lstm 文本生成原理_自然语言处理_29 的词向量 lstm 文本生成原理_自然语言处理_42 , **lstm 文本生成原理_深度学习_43

好,介绍完基本符号概念,我们可以正式进行模型详解了。

简单来说,lattice LSTM 模型仍然使用了 LSTM 结构,但不同的是,其在 LSTM 的基础上融合了词汇的信息,所有,问题就变成了2个部分

  • lattice LSTM 模型基本字符的结构
  • lattice LSTM 模型融合词汇信息的结构

我们来跟着论文进行解释:

作者这里列出了模型的第一个公式 Eq 11:

lstm 文本生成原理_lstm 文本生成原理_44


大家看,是不是很熟悉,没错!这就是完完全全的 LSTM,只不过每一个记号的右上角都带了一个小马甲 c ,这里的c指此 LSTM 用来处理字符,提取字符的信息,为了和后面处理词汇的单元做区分

好,因为我们有每一个位置的输入向量 lstm 文本生成原理_lstm 文本生成原理_45,所以我们得到了每一个单元的单元状态向量 lstm 文本生成原理_lstm 文本生成原理_18 和隐藏状态向量 lstm 文本生成原理_神经网络_24

我们已经使用一个 LSTM 结构来提取了字符的信息,下面我们将使用另一个 LSTM 结构来表达词汇信息。我们看作者的第二个公式Eq 13:

lstm 文本生成原理_深度学习_48


你是不是想说,这不还是和 LSTM 结构一样吗,恭喜你,完全正确!!这同样是一个标准的 LSTM 结构,只不过有一点点的不同。

之前的 LSTM每一个单元代表的是一个字符,而这里的 LSTM每一个单元代表一个词汇

我们来分析下此结构不同的地方。大家肯定发现了,就是 门的输入不一样了、三个门变成了两个门,这里为大家来一一解释。

  • 门的输入不一样了:基于字符的 LSTM门的输入是前一个单元的隐藏状态 lstm 文本生成原理_自然语言处理_49 和当前单元的输入 lstm 文本生成原理_自然语言处理_03 的拼接 lstm 文本生成原理_lstm_51,而此 LSTM 用来表示词汇,作者借用此词汇第一个字符的隐藏状态向量 lstm 文本生成原理_自然语言处理_52 来和此词向量 lstm 文本生成原理_自然语言处理_42,从而得到此词汇单元的单元状态向量 lstm 文本生成原理_深度学习_54,所以小马甲从 c 变成了 w
    至于为什么要拼接词汇的第一个字符,我认为是为了强化边界,在后面我会提到。
  • 没有输出门:首先,隐藏状态 h 是用来在最后的CRF层选择标签的。要知道,数据集的标签都是基于字符标的,而词汇没有相应的标签,所以词汇单元不需要计算 h,而输出门的作用就是用来计算 h的,h都不需要了,输出门同样就不需要了。

难度已经渐渐变高了,作者又扔出一条公式 Eq 14:

lstm 文本生成原理_自然语言处理_55

是不是有点蒙了,为什么马甲是c,却用着词汇的索引。笔者当时看到这里也是蒙蒙的。

不用着急,大家看,其实这是第三个 LSTM 结构,但它只保留了一个输入因子,lstm 文本生成原理_自然语言处理_56字向量说明这是一个索引为 e 的字符单元(定性),用来拼接的是 lstm 文本生成原理_lstm_57,是以此字符e结尾的词汇单元的状态向量,还记得 lstm 文本生成原理_lstm_57 是怎么计算的吗,它拼接的是开头字符b的信息,这就意味着作者将(be)这个词的信息融入了 e 这个字符中,并且强化了 be 的边界。 lstm 文本生成原理_lstm_59输入因子,代表的意思是,第e个字符要融入多少词汇(b,e)的信息。

理解了这个,下面的就更好理解了,如果还是有些迷迷糊糊的,可以结合下面的公式一起来理解。

下面这个是我认为是 lattice LSTM 模型 的核心公式 Eq 15:

lstm 文本生成原理_lstm 文本生成原理_60

我们之前已经讲解了纯字符的 LSTM 单元状态的计算公式,而Eq15计算的是融合了词汇信息的单元状态。

我们回顾一下单元状态的计算公式:
lstm 文本生成原理_自然语言处理_19
作者这里稍作改变,不使用前一个字符单元 lstm 文本生成原理_lstm 文本生成原理_07,所以从公式中扔掉遗忘门的部分,加上表示字符的马甲 lstm 文本生成原理_lstm 文本生成原理_63,即:
lstm 文本生成原理_lstm 文本生成原理_64
同时,作者在此融入以此字符为结尾的词汇单元的信息,假如以j字符结尾的词汇有三个(a,j),(b,j),(c,j),对应的词汇单元状态有3个 lstm 文本生成原理_lstm_65lstm 文本生成原理_lstm 文本生成原理_66lstm 文本生成原理_lstm_67,采用 lstm 文本生成原理_深度学习_68

lstm 文本生成原理_深度学习_69

是不是挺清晰明了的,每个词汇单元取部分输入 + 本字符单元取部分输入,得到本字符最终的单元状态向量。

但是公式太复杂,简化一下,有多少词以本字符结尾不确实,可以写成求和的形式,用 lstm 文本生成原理_自然语言处理_70 变量来表示 lstm 文本生成原理_自然语言处理_71(词汇的开头),那么 lstm 文本生成原理_自然语言处理_70 要满足的要求是,以 lstm 文本生成原理_自然语言处理_70 开头的词汇要以 lstm 文本生成原理_lstm 文本生成原理_74 结尾,并且属于词汇集合 lstm 文本生成原理_深度学习_75 。即:
lstm 文本生成原理_lstm_76
满足此条件的词汇可以进行求和,则上式变为:
lstm 文本生成原理_lstm_77

到这里已经非常圆满了,只剩最后一个问题,对,就是每个词汇都有一个输入因子(相当于权重),这么多输入因子加和肯定很大,所以要进行归一化,使其加和为1,作者使用的公式为:

lstm 文本生成原理_lstm_78

乍一看,这是啥呀,怎么这么复杂,上上下下,expp,不着急,我们定睛一看,这不就是softmax吗!!再讲softmax文章页太长了,简单来说:

是该元素的指数,与所有元素指数和的比值

假设我们有一个数组,lstm 文本生成原理_自然语言处理_79lstm 文本生成原理_深度学习_80 表示 lstm 文本生成原理_自然语言处理_79 中的第 lstm 文本生成原理_lstm_82 个元素,那么这个元素的Softmax值就是 :
lstm 文本生成原理_lstm_83
每个元素 lstm 文本生成原理_深度学习_80 都变为了 lstm 文本生成原理_神经网络_85,并且 lstm 文本生成原理_lstm 文本生成原理_86,这不就和我们的公式16一样吗!!

归一化后符号发生变化lstm 文本生成原理_lstm_87 变为 lstm 文本生成原理_自然语言处理_88lstm 文本生成原理_自然语言处理_89 变为 lstm 文本生成原理_深度学习_90,放进公式:

lstm 文本生成原理_深度学习_91
终于搞定了,这不就和 Eq15 一模一样吗!!这里的 lstm 文本生成原理_自然语言处理_92 就是融合了词汇信息的字符单元状态向量单元隐藏状态向量 lstm 文本生成原理_深度学习_93 作者使用 最基本的公式:
lstm 文本生成原理_lstm_94
其中:lstm 文本生成原理_自然语言处理_95是第一个 纯字符LSTM 结构计算的, lstm 文本生成原理_自然语言处理_92是最后融合词汇信息的LSTM计算的。

结语

后面的CRF层和损失函数就不说了,要讲解的话文章要长一倍。如果需要的话我会在后面更新新的文章。

以上全是我的个人见解,如果有不对的地方希望大家指正。

公式都是纯手打的,希望大家捧捧场哦!