当前位置: 首页 > news >正文

【论文解读系列】NER方向:LatticeLSTM (ACL2018)

文章目录

  • 简介
  • 模型结构
    • LSTM结构
    • Character-Based Model
    • Word-Based Model
    • Lattice Model
    • Decoding 和 Training
  • 缺点:

简介

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 i_t it,遗忘门 f t f_t ft,输出门 o t o_t ot 并用一个新的Cell State c t c_t ct进行信息的线性传输,同时非线性的输出信息到隐藏层的Hidden State h t h_t ht

公式如下:
[ i t o t f t c ~ t ] = [ σ σ σ tanh ⁡ ] ( W [ X t h t − 1 ] + b ) c t = f t ⊙ c t − 1 + i t ⊙ c ~ t h t = o t ⊙ tanh ⁡ ( c 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} itotftc~t = σσσtanh (W[Xtht1]+b)ct=ftct1+itc~tht=ottanh(ct)

从上述公式可以看出:

  • 输入门 i t \mathbf{i}_{t} it 用于控制当前候选状态 c ~ t \tilde{\mathbf{c}}_{t} c~t 有多少信息需要保存。

  • 遗忘门 f t \mathbf{f}_{t} ft 用于控制上一个状态 c t − 1 \mathbf{c}_{t-1} ct1 需要遗忘多少信息。

  • 输出门 o t \mathbf{o}_{t} ot 用户控制当前时刻的状态 c t \mathbf{c}_{t} ct 有多少信息需要输出给 h t \mathbf{h}_{t} ht

文中介绍了3类模型方案,包括 Character-Based Model、Word-Based Model 和 Lattice Model,但是其主要网络结构都是LSTM-CRF。

在这里插入图片描述

Character-Based Model

对于Character-Based模型,输入为字符序列 c 1 , c 2 , … , c m c_{1}, c_{2}, \ldots, c_{m} c1,c2,,cm ,直接输入到LSTM-CRF。其中每个字符 c j c_{j} cj 表征为 x j c = e c ( c j ) , e c \mathbf{x}_{j}^{c}=\mathbf{e}^{c}\left(c_{j}\right) ,\mathbf{e}^{c} xjc=ec(cj)ec 是字符的嵌入矩阵,即字符表征的查找表。通常使用双向的LSTM对输入的字符表征序列 x 1 , x 2 , … , x m \mathbf{x}_{1}, \mathbf{x}_{2}, \ldots, \mathbf{x}_{m} x1,x2,,xm 进行处理,得到从左到右和从右到左 的Hidden State序列 h → 1 c , h → 2 c , … , h → m c \overrightarrow{\mathbf{h}}_{1}^{c}, \overrightarrow{\mathbf{h}}_{2}^{c}, \ldots, \overrightarrow{\mathbf{h}}_{m}^{c} h 1c,h 2c,,h mc h ← 1 c , h ← 2 c , … , h ← m c \overleftarrow{\mathbf{h}}_{1}^{c}, \overleftarrow{\mathbf{h}}_{2}^{c}, \ldots, \overleftarrow{\mathbf{h}}_{m}^{c} h 1c,h 2c,,h mc。再将两个方向的字符表征拼接,即每个字符的Hidden State表示为: h j c = [ h → j c ; h ← j c ] \mathbf{h}_{j}^{c}=\left[\overrightarrow{\mathbf{h}}_{j}^{c} ; \overleftarrow{\mathbf{h}}_{j}^{c}\right] hjc=[h jc;h jc]
最后在 h 1 c , h 2 c , … , h m c \mathbf{h}_{1}^{c}, \mathbf{h}_{2}^{c}, \ldots, \mathbf{h}_{m}^{c} h1c,h2c,,hmc之后接一个标准的CRF层进行序列标注。这里的上标 c c c 表示是字符级别。

此外,Character-Based模型还可以融合n-gram信息(char+bichar)和分词信息(char+softword)。

  • Char + bichar:直接把bigram的嵌入表示和char的嵌入表示进行拼接作为该字符的嵌入表示。
  • Char + softword:分词信息可以作为soft特征加入到 Character-Based模型中。将分词标签嵌入表征字符嵌入表征拼接
    x j c = [ e c ( c j ) ; e s ( seg ⁡ ( c j ) ) ] \mathbf{x}_{j}^{c}=\left[\mathbf{e}^{c}\left(c_{j}\right) ; \mathbf{e}^{s}\left(\operatorname{seg}\left(c_{j}\right)\right)\right] xjc=[ec(cj);es(seg(cj))]
    其中 e s \mathbf{e}^{s} es是分词标签嵌入表示的嵌入矩阵, s e g ( c j ) seg(c_j) seg(cj)表示对于 c j c_j cj字符的分词标签结果,主要有BMES这4种标签结果,表示该字符分词结果所处的位置。

Word-Based Model

Word-Based模型与Character-Based模型类似。输入为词序列 w 1 , w 2 , . . . , w n w_1,w_2,...,w_n w1,w2,...,wn,每个词 w i w_i wi的词表征: x i w = e w ( w i ) \mathbf{x}_{i}^{w}=\mathbf{e}^{w}(w_i) xiw=ew(wi),其中 e w \mathbf{e}^{w} ew是词嵌入矩阵。同理,也是输入双向LSTM,再将两个结果拼接作为输出的Hidden State。通过 连接softmax和CRF实现序列标注。

Word-Based还可以进一步融合字符信息。词 w i w_i wi中的字符表征记为 x i c \mathbf{x}_{i}^c xic,将两者的拼接结果作为词的新表征:
x i w = [ e w ( w i ) ; x i c ] \mathbf{x}_{i}^{w}=[\mathbf{e}^{w}\left(w_{i}\right);\mathbf{x}_{i}^c] xiw=[ew(wi);xic]
至于如何获取词 w i w_i wi中的字符表征 x i c \mathbf{x}_{i}^c xic,有以下3种方式:

  • Word + char LSTM:直接把每个字符输入到双向LSTM,将两个方向hidden state拼接起来作为词 w i w_i wi的字符表征:
    x i c = [ h → t ( i , len ⁡ ( i ) ) c ; h ← t ( i , 1 ) c ] \mathbf{x}_{i}^{c}=\left[\overrightarrow{\mathbf{h}}_{t(i, \operatorname{len}(i))}^{c} ; \overleftarrow{\mathbf{h}}_{t(i, 1)}^{c}\right] xic=[h t(i,len(i))c;h t(i,1)c]
    其中 t ( i , k ) t(i,k) t(i,k)表示句子中第 i i i个词中索引为 k k k的字符,所以 t ( i , l e n ( i ) ) t(i,len(i)) t(i,len(i)) 表示词 w i w_i wi的最后一个字符。可以看出,这种方式其实只取首尾字符的拼接结果。

  • Word + char LSTM’:与上述方式不同,这种方式使用一个LSTM获得每个字符 c j c_j cj的双向表征,再拼接作为字符的hidden states表征,最后再融入到词表征中。该方式与Liu et al. (2018)的结构相似但是没有使用highway layer。

  • Word + char CNN:使用CNN抽取每个词的字符序列表征,字符表征 x i c \mathbf{x}^c_i xic,字符 c j c_j cj的词向量用 e c ( c j ) \mathbf{e}^c(c_j) ec(cj)表示:

在这里插入图片描述

其中 W C N N \mathbf{W_{CNN}} WCNN b C N N \mathbf{b_{CNN}} bCNN都是待学习的参数, k e ke ke表示kernal size,文中取值为3, m a x max max表示最大池化。

Lattice Model

Lattice LSTM可以看做是Character-Based模型的扩展,其添加了词作为输入(比如下图输入中包括“南京市”,用红色这部分网络结构来抽取特征)和额外的门(下图的绿色线连接的门控单元)来控制信息流动。

在这里插入图片描述

Lattice LSTM的输入为:字符序列 c 1 , c 2 , . . . , c m c_1,c_2,...,c_m c1,c2,...,cm,与词典 D D D中单词匹配的所有字符子序列记为 w b , e d w_{b,e}^d wb,ed b b b是起始字符的下标, e e e是结束字符的下标。比如对于Figure 1中的句子"南京市长江大桥"的分词结果, w 1 , 2 d w^d_{1,2} w1,2d表示"南京"。模型的输入有4种向量:输入向量、隐藏层输出向量、cell 向量、门控向量。输入向量就是字符向量 x j c = e c ( c j ) \mathbf{x}^c_j=\mathbf{e}^c(c_j) xjc=ec(cj)。LSTM模型的递归结构体现于每个字符 c j c_j cj上使用一个字符cell向量 c j c \mathbf{c}^c_j cjc和一个隐藏层向量 h j c \mathbf{h}^c_j hjc,其中 c j c \mathbf{c}^c_j cjc用来记录从句子开始到字符 c j c_j cj的信息流动,最终将 h j c \mathbf{h}_j^c hjc输入到CRF层进行序列标注。

与character-based模型不同,计算 c j c \mathbf{c}^c_j cjc时要考虑句子中对应词典的子串 w b , e d w^d_{b,e} wb,ed,每个子串串 w b , e d w^d_{b,e} wb,ed的表征为: x b , e w = e w ( w b , e d ) \mathbf{x}^w_{b,e}=\mathbf{e}^w(w^d_{b,e}) xb,ew=ew(wb,ed)。此外,词的cell State c b , e w \mathbf{c}^w_{b,e} cb,ew表示从句子开始的递归状态 x b , e w \mathbf{x}^w_{b,e} xb,ew,计算如下:

[ i b , e w f b , e w c ~ b , e w ] = [ σ σ tanh ⁡ ] ( W w ⊤ [ x b , e w h b c ] + b w ) c b , e w = f b , e w ⊙ c b c + i b , e w ⊙ c ~ b , e w \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} ib,ewfb,ewc b,ew cb,ew= σσtanh (Ww[xb,ewhbc]+bw)=fb,ewcbc+ib,ewc b,ew
其中, i b , e w \mathbf{i}_{b, e}^w ib,ew f b , e w \mathbf{f}_{b, e}^w fb,ew分别是输入门和遗忘门。 h b c \mathbf{h}_b^c hbc c b c \mathbf{c}_b^c cbc分别是来自词的 首字 LSTM单元输出的Hidden State和Cell State,比如计算词长江大桥的cell state, h b c \mathbf{h}_b^c hbc c b c \mathbf{c}_b^c cbc来自于字,而计算大桥的cell State, h b c \mathbf{h}_b^c hbc c b c \mathbf{c}_b^c cbc来自于字。此外需要注意的是,对于word级别的cell没有output gate,这是因为序列标注的标注结果都在character级别上。

通过词的 cell status c b , e w \mathbf{c}^w_{b,e} cb,ew会有更多的递归路径信息流进每个 c j c \mathbf{c}^c_j cjc。例如Figure 2中,输入源 c 7 c \mathbf{c}^c_7 c7c包括 x 7 c \mathbf{x}^c_7 x7c(桥)、 c 6 , 7 w \mathbf{c}^w_{6,7} c6,7w(大桥)、 c 4 , 7 w \mathbf{c}^w_{4,7} c4,7w(长江大桥)。将所有的 c b , e w \mathbf{c}^w_{b,e} cb,ew链接到cell c e c \mathbf{c}^c_e cec,即对这3部分信息进行加权相加。对每个子串的cell status c b , e w \mathbf{c}^w_{b,e} cb,ew使用一个额外的门 i b , e c \mathbf{i}^c_{b,e} ib,ec来控制流进 c e c \mathbf{c}^c_e cec的信息流(原文是 c b , e c \mathbf{c}^c_{b,e} cb,ec,应该是写错了):

在这里插入图片描述

计算字符 c j c c_j^c cjc的cell state c j c \mathbf{c}_j^c cjc,即对所有以 c j c c_j^c cjc结尾的词的cell state和 c j c c_j^c cjc的候选状态 c ~ j c \widetilde{\boldsymbol{c}}_j^c c jc进行加权相加。因此字符 c j c c_j^c cjc的cell status c j c \mathbf{c}_j^c cjc 的计算如下:
c j c = ∑ b ∈ { b ′ ∣ w b ′ , j d ∈ D } α b , j c ⊙ c b , j w + α j c ⊙ 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 cjc=b{bwb,jdD}αb,jccb,jw+αjcc jc

上述式子中的 α \alpha α是门控归一化结果,门控根据当前词的cell state c b , e w \mathbf{c}_{b, e}^w cb,ew和字符嵌入 x e c \mathbf{x}_{e}^c xec计算如下:
i b , e c = σ ( W l ⊤ [ x e c c b , e w ] + b l ) \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) ib,ec=σ(Wl[xeccb,ew]+bl)

i b , j c \mathbf{i}_{b, j}^c ib,jc i j c \mathbf{i}_j^c ijc分别归一化为 α b , j c \boldsymbol{\alpha}_{b, j}^c αb,jc α j c \boldsymbol{\alpha}_j^c αjc,使其求和为 1 \mathbf{1} 1

α b , j c = exp ⁡ ( i b , j c ) exp ⁡ ( i j c ) + ∑ b ′ ∈ { b ′ ′ ∣ w b ′ ′ , j d ∈ D } exp ⁡ ( i b ′ , j c ) α j c = exp ⁡ ( i j c ) exp ⁡ ( i j c ) + ∑ b ′ ∈ { b ′ ′ ∣ w b ′ ′ , j d ∈ D } exp ⁡ ( i b ′ , j c ) \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} αb,jcαjc=exp(ijc)+b{b′′wb′′,jdD}exp(ib,jc)exp(ib,jc)=exp(ijc)+b{b′′wb′′,jdD}exp(ib,jc)exp(ijc)

南京市长江大桥为例,计算的cell state,是通过对长江大桥大桥的cell state,以及的候选cell state,进行加权求和。加权系数,则是对字符和词的门控进行Softmax得到。
需要指出的是,当前字符有词汇融入时,则采取上述公式进行计算;如当前字符没有词汇时,则采取原生的LSTM进行计算。换句话说,当有词汇信息时,Lattice LSTM并没有利用前一时刻的记忆向量 c j − 1 c c_{j-1}^c cj1c,即不保留对词汇信息的持续记忆。

Decoding 和 Training

Decoding 部分,就是在 h 1 , h 2 , . . . , h τ \mathbf{h}_{1},\mathbf{h}_{2},...,\mathbf{h}_{\tau} h1,h2,...,hτ之后接一个CRF层计算输出概率,然后选择最大的输出概率argmaxP(y|s)。对于Character-Based Model, τ \tau τ值为 n n n,对于Word-Based Model, τ \tau τ值为 m m m。下面是计算某个标注序列 y y y的概率。

P ( y ∣ s ) = exp ⁡ ( ∑ i ( W C R F l i h i + b C R F ( l i − 1 , l i ) ) ) ∑ y ′ exp ⁡ ( ∑ i ( W C R F l i ′ h i + b C R F ( l i − 1 ′ , l i ′ ) ) ) 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)} P(ys)=yexp(i(WCRFlihi+bCRF(li1,li)))exp(i(WCRFlihi+bCRF(li1,li)))

使用一阶Viterbi算法找到得分最高的标注序列,损失函数是带L2正则的log-likelihood loss。

L = ∑ i = 1 N log ⁡ ( P ( y i ∣ s i ) ) + λ 2 ∥ Θ ∥ 2 L=\sum_{i=1}^{N} \log \left(P\left(y_{i} \mid s_{i}\right)\right)+\frac{\lambda}{2}\|\Theta\|^{2} L=i=1Nlog(P(yisi))+2λ∥Θ2

缺点:

  • 计算性能低下,不能batch并行化。究其原因主要是每个字符之间的增加word cell(看作节点)数目不一致;
  • 信息损失:1)每个字符只能获取以它为结尾的词汇信息,对于其之前的词汇信息也没有持续记忆。如对于「药」,并无法获得‘inside’的「人和药店」信息。2)由于RNN特性,采取BiLSTM时其前向和后向的词汇信息不能共享。
  • 可迁移性差:只适配于LSTM,不具备向其他网络迁移的特性

相关文章:

  • java毕业设计成品源码网站基于JSP的网上订餐管理系统|餐饮就餐订餐餐厅
  • Jenkins更新版本和插件导致maven工程job丢失(不显示)或部分功能丧失(svn,ssh)
  • 计算机网络——传输层の选择题整理
  • 多级缓存的原理和实现
  • hadoop学习使用
  • 【WSL2】CENTOS7 安装与配置
  • Python调用OpenCV接口播放本地视频文件、本地和网络摄像头
  • 推进智慧工地建设,智慧工地是什么?建筑工地人必看!
  • 进阶笔录-深入理解Java线程之Synchronized
  • Python性能测试工具汇总
  • java基础之浅聊阻塞队列BlockingQueue
  • 单分散亚微米聚苯乙烯—聚乙酸乙烯酯(P(St-VAc))聚合物微球/聚苯乙烯塑料微球聚乙烯醇相关知识
  • frp记录
  • 阿里巴巴按关键字搜索商品 API 返回值说明
  • 天花板级别的python读取文件方法,真的香.......
  • angular2 简述
  • CSS相对定位
  • Effective Java 笔记(一)
  • Gradle 5.0 正式版发布
  • Javascripit类型转换比较那点事儿,双等号(==)
  • js算法-归并排序(merge_sort)
  • magento 货币换算
  • Map集合、散列表、红黑树介绍
  • Protobuf3语言指南
  • Transformer-XL: Unleashing the Potential of Attention Models
  • vue:响应原理
  • 不发不行!Netty集成文字图片聊天室外加TCP/IP软硬件通信
  • 记一次用 NodeJs 实现模拟登录的思路
  • 讲清楚之javascript作用域
  • 使用Envoy 作Sidecar Proxy的微服务模式-4.Prometheus的指标收集
  • 使用权重正则化较少模型过拟合
  • 算法---两个栈实现一个队列
  • 微信小程序实战练习(仿五洲到家微信版)
  • 详解移动APP与web APP的区别
  • 一个完整Java Web项目背后的密码
  • 一起来学SpringBoot | 第十篇:使用Spring Cache集成Redis
  • 用 Swift 编写面向协议的视图
  • 直播平台建设千万不要忘记流媒体服务器的存在 ...
  • # 计算机视觉入门
  • # 透过事物看本质的能力怎么培养?
  • #Z0458. 树的中心2
  • (3)Dubbo启动时qos-server can not bind localhost22222错误解决
  • (pojstep1.3.1)1017(构造法模拟)
  • (附源码)springboot社区居家养老互助服务管理平台 毕业设计 062027
  • (十六)串口UART
  • (十一)c52学习之旅-动态数码管
  • (原創) 未来三学期想要修的课 (日記)
  • (转)LINQ之路
  • (转)VC++中ondraw在什么时候调用的
  • *上位机的定义
  • .NET Standard / dotnet-core / net472 —— .NET 究竟应该如何大小写?
  • .NET/C# 阻止屏幕关闭,阻止系统进入睡眠状态
  • @ConfigurationProperties注解对数据的自动封装
  • [bzoj1324]Exca王者之剑_最小割
  • [C++]命名空间等——喵喵要吃C嘎嘎