简介
LatticeLSTM 出自于 ACL2018中的Chinese NER Using Lattice LSTM。
论文地址:
https://arxiv.org/abs/1805.02023
有多个版本的代码:
官方版:https://github.com/jiesutd/LatticeLSTM
其他人复现版:https://github.com/LeeSureman/Batch_Parallel_LatticeLSTM
更多、更及时内容欢迎留意微信公众号: 小窗幽记机器学习
LSTM-CRF模型在英文命名实体识别任务中具有显著效果,在中文NER任务中,基于字符的NER模型也明显优于基于词的NER模型(避免分词错误对NER任务的影响)。在基于字符的NER模型中引入词汇信息,确定实体边界,对中文NER任务有明显提升效果。
Lattice LSTM模型是基于词汇增强方法的中文NER的开篇之作。在该模型中,使用了字符信息和所有词序列信息,具体地,当我们通过词汇信息(词典)匹配一个句子时,可以获得一个类似Lattice的结构。这种方式可以避免因分词错误导致实体识别错误,在中文NER任务上有显著效果。
模型结构
LSTM结构
LSTM是RNN的一个变体,能够有效解决梯度消失和梯度爆炸的问题。主要引入了三个门,即输入门$i_t$,遗忘门$f_t$,输出门$o_t$ 并用一个新的Cell State $c_t$进行信息的线性传输,同时非线性的输出信息到隐藏层的Hidden State $h_t$。
公式如下:
$$ \begin{aligned} &{\left[\begin{array}{c} i_{t} \\ o_{t} \\ f_{t} \\ \tilde{c}_{t} \end{array}\right]=\left[\begin{array}{c} \sigma \\ \sigma \\ \sigma \\ \tanh \end{array}\right]\left(W\left[\begin{array}{c} X_{t} \\ h_{t-1} \end{array}\right]+b\right)} \\ &\mathbf{c}_{t}=\mathbf{f}_{t} \odot \mathbf{c}_{t-1}+\mathbf{i}_{t} \odot \tilde{\mathbf{c}}_{t} \\ &\mathbf{h}_{t}=\mathbf{o}_{t} \odot \tanh \left(\mathbf{c}_{t}\right) \end{aligned} $$
从上述公式可以看出:
输入门 $\mathbf{i}_{t}$ 用于控制当前候选状态 $\tilde{\mathbf{c}}_{t}$ 有多少信息需要保存。
遗忘门 $\mathbf{f}_{t}$ 用于控制上一个状态 $\mathbf{c}_{t-1}$ 需要遗忘多少信息。
输出门 $\mathbf{o}_{t}$ 用户控制当前时刻的状态 $\mathbf{c}_{t}$ 有多少信息需要输出给 $\mathbf{h}_{t}$
文中介绍了3类模型方案,包括 Character-Based Model、Word-Based Model 和 Lattice Model,但是其主要网络结构都是LSTM-CRF。
Character-Based Model
对于Character-Based模型,输入为字符序列 $c_{1}, c_{2}, \ldots, c_{m}$ ,直接输入到LSTM-CRF。其中每个字符$c_{j}$ 表征为 $\mathbf{x}_{j}^{c}=\mathbf{e}^{c}\left(c_{j}\right) ,\mathbf{e}^{c}$ 是字符的嵌入矩阵,即字符表征的查找表。通常使用双向的LSTM对输入的字符表征序列 $\mathbf{x}_{1}, \mathbf{x}_{2}, \ldots, \mathbf{x}_{m}$ 进行处理,得到从左到右和从右到左 的Hidden State序列$\overrightarrow{\mathbf{h}}_{1}^{c}, \overrightarrow{\mathbf{h}}_{2}^{c}, \ldots, \overrightarrow{\mathbf{h}}_{m}^{c}$ 和 $\overleftarrow{\mathbf{h}}_{1}^{c}, \overleftarrow{\mathbf{h}}_{2}^{c}, \ldots, \overleftarrow{\mathbf{h}}_{m}^{c}$。再将两个方向的字符表征拼接,即每个字符的Hidden State表示为: $\mathbf{h}_{j}^{c}=\left[\overrightarrow{\mathbf{h}}_{j}^{c} ; \overleftarrow{\mathbf{h}}_{j}^{c}\right]$
最后在$\mathbf{h}_{1}^{c}, \mathbf{h}_{2}^{c}, \ldots, \mathbf{h}_{m}^{c}$之后接一个标准的CRF层进行序列标注。这里的上标 $c$ 表示是字符级别。
此外,Character-Based模型还可以融合n-gram信息(char+bichar)和分词信息(char+softword)。
- Char + bichar:直接把bigram的嵌入表示和char的嵌入表示进行拼接作为该字符的嵌入表示。
- Char + softword:分词信息可以作为soft特征加入到 Character-Based模型中。将分词标签嵌入表征和字符嵌入表征拼接
$$ \mathbf{x}_{j}^{c}=\left[\mathbf{e}^{c}\left(c_{j}\right) ; \mathbf{e}^{s}\left(\operatorname{seg}\left(c_{j}\right)\right)\right] $$
其中$\mathbf{e}^{s}$是分词标签嵌入表示的嵌入矩阵,$seg(c_j)$表示对于$c_j$字符的分词标签结果,主要有BMES这4种标签结果,表示该字符分词结果所处的位置。
Word-Based Model
Word-Based模型与Character-Based模型类似。输入为词序列$w_1,w_2,...,w_n$,每个词$w_i$的词表征:$\mathbf{x}_{i}^{w}=\mathbf{e}^{w}(w_i)$,其中$\mathbf{e}^{w}$是词嵌入矩阵。同理,也是输入双向LSTM,再将两个结果拼接作为输出的Hidden State。通过 连接softmax和CRF实现序列标注。
Word-Based还可以进一步融合字符信息。词$w_i$中的字符表征记为$\mathbf{x}_{i}^c$,将两者的拼接结果作为词的新表征:
$$ \mathbf{x}_{i}^{w}=[\mathbf{e}^{w}\left(w_{i}\right);\mathbf{x}_{i}^c] $$
至于如何获取词$w_i$中的字符表征$\mathbf{x}_{i}^c$,有以下3种方式:
Word + char LSTM:直接把每个字符输入到双向LSTM,将两个方向hidden state拼接起来作为词$w_i$的字符表征:
$$ \mathbf{x}_{i}^{c}=\left[\overrightarrow{\mathbf{h}}_{t(i, \operatorname{len}(i))}^{c} ; \overleftarrow{\mathbf{h}}_{t(i, 1)}^{c}\right] $$
其中 $t(i,k)$表示句子中第$i$个词中索引为$k$的字符,所以$t(i,len(i))$ 表示词$w_i$的最后一个字符。可以看出,这种方式其实只取首尾字符的拼接结果。Word + char LSTM':与上述方式不同,这种方式使用一个LSTM获得每个字符$c_j$的双向表征,再拼接作为字符的hidden states表征,最后再融入到词表征中。该方式与Liu et al. (2018)的结构相似但是没有使用highway layer。
Word + char CNN:使用CNN抽取每个词的字符序列表征,字符表征$\mathbf{x}^c_i$,字符$c_j$的词向量用$\mathbf{e}^c(c_j)$表示:
其中$\mathbf{W_{CNN}}$和$\mathbf{b_{CNN}}$都是待学习的参数,$ke$表示kernal size,文中取值为3,$max$表示最大池化。
Lattice Model
Lattice LSTM可以看做是Character-Based模型的扩展,其添加了词作为输入(比如下图输入中包括“南京市”,用红色这部分网络结构来抽取特征)和额外的门(下图的绿色线连接的门控单元)来控制信息流动。
Lattice LSTM的输入为:字符序列$c_1,c_2,...,c_m$,与词典$D$中单词匹配的所有字符子序列记为$w_{b,e}^d$,$b$是起始字符的下标,$e$是结束字符的下标。比如对于Figure 1中的句子"南京市长江大桥"的分词结果,$w^d_{1,2}$表示"南京"。模型的输入有4种向量:输入向量、隐藏层输出向量、cell 向量、门控向量。输入向量就是字符向量,$\mathbf{x}^c_j=\mathbf{e}^c(c_j)$。LSTM模型的递归结构体现于每个字符$c_j$上使用一个字符cell向量$\mathbf{c}^c_j$和一个隐藏层向量$\mathbf{h}^c_j$,其中$\mathbf{c}^c_j$用来记录从句子开始到字符$c_j$的信息流动,最终将$\mathbf{h}_j^c$输入到CRF层进行序列标注。
与character-based模型不同,计算$\mathbf{c}^c_j$时要考虑句子中对应词典的子串$w^d_{b,e}$,每个子串串$w^d_{b,e}$的表征为:$\mathbf{x}^w_{b,e}=\mathbf{e}^w(w^d_{b,e})$。此外,词的cell State $\mathbf{c}^w_{b,e}$表示从句子开始的递归状态$\mathbf{x}^w_{b,e}$,计算如下:
$$ \begin{aligned} {\left[\begin{array}{c} \mathbf{i}_{b, e}^w \\ \mathbf{f}_{b, e}^w \\ \widetilde{c}_{b, e}^w \end{array}\right] } &=\left[\begin{array}{c} \sigma \\ \sigma \\ \tanh \end{array}\right]\left(\mathbf{W}^{w \top}\left[\begin{array}{c} \mathbf{x}_{b, e}^w \\ \mathbf{h}_b^c \end{array}\right]+\mathbf{b}^w\right) \\ \mathbf{c}_{b, e}^w &=\mathbf{f}_{b, e}^w \odot \mathbf{c}_b^c+\mathbf{i}_{b, e}^w \odot \widetilde{\boldsymbol{c}}_{b, e}^w \end{aligned} $$
其中,$\mathbf{i}_{b, e}^w$和$\mathbf{f}_{b, e}^w$分别是输入门和遗忘门。$\mathbf{h}_b^c$和$\mathbf{c}_b^c$分别是来自词的 首字 LSTM单元输出的Hidden State和Cell State,比如计算词长江大桥
的cell state,$\mathbf{h}_b^c$和$\mathbf{c}_b^c$来自于长
字,而计算大桥
的cell State,$\mathbf{h}_b^c$和$\mathbf{c}_b^c$来自于大
字。此外需要注意的是,对于word级别的cell没有output gate,这是因为序列标注的标注结果都在character级别上。
通过词的 cell status $\mathbf{c}^w_{b,e}$会有更多的递归路径信息流进每个$\mathbf{c}^c_j$。例如Figure 2中,输入源$\mathbf{c}^c_7$包括$\mathbf{x}^c_7$(桥)、$\mathbf{c}^w_{6,7}$(大桥)、$\mathbf{c}^w_{4,7}$(长江大桥)。将所有的$\mathbf{c}^w_{b,e}$链接到cell $\mathbf{c}^c_e$,即对这3部分信息进行加权相加。对每个子串的cell status $\mathbf{c}^w_{b,e}$使用一个额外的门$\mathbf{i}^c_{b,e}$来控制流进$\mathbf{c}^c_e$的信息流(原文是$\mathbf{c}^c_{b,e}$,应该是写错了):
计算字符$c_j^c$的cell state $\mathbf{c}_j^c$,即对所有以$c_j^c$结尾的词的cell state和$c_j^c$的候选状态$\widetilde{\boldsymbol{c}}_j^c$进行加权相加。因此字符$c_j^c$的cell status $\mathbf{c}_j^c$ 的计算如下:
$$ \mathbf{c}_j^c=\sum_{b \in\left\{b^{\prime} \mid w_{b^{\prime}, j}^d \in \mathbb{D}\right\}} \boldsymbol{\alpha}_{b, j}^c \odot \boldsymbol{c}_{b, j}^w+\boldsymbol{\alpha}_j^c \odot \widetilde{\boldsymbol{c}}_j^c $$
上述式子中的$\alpha$是门控归一化结果,门控根据当前词的cell state $\mathbf{c}_{b, e}^w$和字符嵌入$\mathbf{x}_{e}^c$计算如下:
$$ \mathbf{i}_{b, e}^c=\sigma\left(\mathbf{W}^{l \top}\left[\begin{array}{c} \mathbf{x}_e^c \\ \mathbf{c}_{b, e}^w \end{array}\right]+\mathbf{b}^l\right) $$
$\mathbf{i}_{b, j}^c$ 和 $\mathbf{i}_j^c$分别归一化为$\boldsymbol{\alpha}_{b, j}^c$ 和 $\boldsymbol{\alpha}_j^c$,使其求和为$\mathbf{1}$:
$$ \begin{aligned} \boldsymbol{\alpha}_{b, j}^c &=\frac{\exp \left(\mathbf{i}_{b, j}^c\right)}{\exp \left(\mathbf{i}_j^c\right)+\sum_{b^{\prime} \in\left\{b^{\prime \prime} \mid w_{b^{\prime \prime}, j}^d \in \mathbb{D}\right\}} \exp \left(\mathbf{i}_{b^{\prime}, j}^c\right)} \\ \boldsymbol{\alpha}_j^c &=\frac{\exp \left(\mathbf{i}_j^c\right)}{\exp \left(\mathbf{i}_j^c\right)+\sum_{b^{\prime} \in\left\{b^{\prime \prime} \mid w_{b^{\prime \prime}, j}^d \in \mathbb{D}\right\}} \exp \left(\mathbf{i}_{b^{\prime}, j}^c\right)} \end{aligned} $$
以南京市长江大桥
为例,计算桥
的cell state,是通过对长江大桥
,大桥
的cell state,以及桥
的候选cell state,进行加权求和。加权系数,则是对字符和词的门控进行Softmax得到。
需要指出的是,当前字符有词汇融入时,则采取上述公式进行计算;如当前字符没有词汇时,则采取原生的LSTM进行计算。换句话说,当有词汇信息时,Lattice LSTM并没有利用前一时刻的记忆向量$c_{j-1}^c$,即不保留对词汇信息的持续记忆。
Decoding 和 Training
Decoding 部分,就是在$\mathbf{h}_{1},\mathbf{h}_{2},...,\mathbf{h}_{\tau}$之后接一个CRF层计算输出概率,然后选择最大的输出概率argmaxP(y|s)。对于Character-Based Model,$\tau$值为$n$,对于Word-Based Model,$\tau$值为$m$。下面是计算某个标注序列$y$的概率。
$$ P(y \mid s)=\frac{\exp \left(\sum_{i}\left(\mathbf{W}_{\mathrm{CRF}}^{l_{i}} \mathbf{h}_{i}+b_{\mathrm{CRF}}^{\left(l_{i-1}, l_{i}\right)}\right)\right)}{\sum_{y^{\prime}} \exp \left(\sum_{i}\left(\mathbf{W}_{\mathrm{CRF}}^{l_{i}^{\prime}} \mathbf{h}_{i}+b_{\mathrm{CRF}}^{\left(l_{i-1}^{\prime}, l_{i}^{\prime}\right)}\right)\right)} $$
使用一阶Viterbi算法找到得分最高的标注序列,损失函数是带L2正则的log-likelihood loss。
$$ L=\sum_{i=1}^{N} \log \left(P\left(y_{i} \mid s_{i}\right)\right)+\frac{\lambda}{2}\|\Theta\|^{2} $$
缺点:
- 计算性能低下,不能batch并行化。究其原因主要是每个字符之间的增加word cell(看作节点)数目不一致;
- 信息损失:1)每个字符只能获取以它为结尾的词汇信息,对于其之前的词汇信息也没有持续记忆。如对于「药」,并无法获得‘inside’的「人和药店」信息。2)由于RNN特性,采取BiLSTM时其前向和后向的词汇信息不能共享。
- 可迁移性差:只适配于LSTM,不具备向其他网络迁移的特性