Loading [MathJax]/jax/output/CommonHTML/autoload/mtable.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >FLAT:基于 Flat-Lattice Transformer 的中文 NER 模型

FLAT:基于 Flat-Lattice Transformer 的中文 NER 模型

作者头像
口仆
发布于 2021-12-17 12:33:22
发布于 2021-12-17 12:33:22
2.7K0
举报

本文是 「FLAT: Chinese NER Using Flat-Lattice Transformer」 一文的学习笔记。

「摘要」:综合利用字符与词语信息的 Lattice 结构被证明对于中文的命名实体识别具有较好的效果,然而,由于 Lattice 结构较为灵活复杂,大部分现有的基于 Lattice 的模型很难完全利用 GPU并行计算能力,导致推理速度较慢。本论文提出了面向中文 NER 的 FLAT(「F」lat-「LA」ttice 「T」ransformer),其将 Lattice 结构转化为一个由片段(span)构成的平面(flat)结构,每个片段对应一个字符或潜在的词语,以及其在原始 Lattice 中的位置。得益于 Transformer 的能力以及精心设计的位置编码,FLAT 能够在充分利用 Lattice 信息的同时保持极佳的并行化能力。基于四个数据集的实验表明 FLAT 在模型表现与运行效率上要优于其他基于词汇的模型。

1 背景

「命名实体识别」(Named entity recognition,NER)在很多 NLP 下游任务中扮演着重要角色,与英文 NER 相比,中文 NER 往往更加困难,因为其涉及到词语的切分(分词)。「Lattice 结构」被证明能够更好地利用词语信息,避免分词中的错误传播。

如下图 (a) 所示,我们可以通过词表来得到一个句子中的潜在词语,形成一张有向无环图,其中每个节点表示一个字符或是一个潜在词语。Lattice 包括了一个由句子中的字符与潜在词语组成的序列,其并不完全依序排列,词语的首尾字符决定了其的位置(会与字符平行)。Lattice 中的部分词语对于 NER 来说相当重要,以下图为例,「人和药店」一词可以用来区分地理实体「重庆」与组织实体「重庆人」

目前,利用 Lattice 结构进行 NER 的模型发展方向大致可以分为两类:

  1. 设计一个与 Lattice 输入兼容的模型,例如 「lattice LSTM」「LR-CNN」。其中 lattice LSTM 利用一个额外的词语单元来编码潜在词语,并使用 attention 机制来融合每个位置的变数节点,如上图 (b) 所示;LR-CNN 则利用 CNN 来通过不同的窗口大小编码潜在词语。总的来看,RNN 和 CNN 都难以对长距离的依赖进行建模(长距离依赖对于NER 的指代等关系很有用),同时由于动态 Lattice 结构的复杂性,这些方法不能完全地利用 GPU 的并行计算能力。
  2. 将 Lattice 转化为图,使用图神经网络进行编码,例如 「Lexicon-based Graph Network」(LGN) 与 「Collaborative Graph Network」(CGN)。由于图结构并不能完全消除 NER 对序列结构的依赖性,这些方法需要使用 LSTM 作为底层编码器,从而增加了模型的复杂性。

本论文针对当前相关模型的局限性,提出了面向中文 NER 的 「FLAT」 模型。FLAT 模型基于 Transformer 实现,能够利用全连接的 self-attention 来对序列中的长距离依赖建模。为了得到位置信息,Transformer 为序列中的每个 token 引入了位置表示(编码),类似地,在 FLAT 中针对 Lattice 结构设计了一种巧妙的位置编码,如上图 (c) 所示。具体来说,对于一个 token(字符或词语),其会包含两个位置索引:「头位置」「尾位置」,基于这两个位置信息可以将一个 token 集合还原为 Lattice 结构,从而实现直接使用 Transformer 来建模 Lattice 输入。对于 FLAT 来说,Transformer 的自注意力机制可以使得字符直接与任意潜在词语交互,包括自包含词语,例如「药」的自包含词语有「药店」「人和药店」。实验结果表明该模型在中文 NER 上的表现与推理速度要优于其他基于词汇的方法。

2 模型

2.1 Transformer 原理概述

本节将对 Transformer 的架构进行简要介绍。对于 NER 任务,我们只需要用到 Transformer encoder,其由「自注意力层」「前馈网络」(FFN)两层组成,每个子层都接了残差连接与层归一化,如下图所示,其中 FFN 是一个位置独立的多层非线性感知机。

对于自注意力层,Transformer 通过独立计算多个头部的 attention 并将其结果按一定权重进行拼接以得到最终的输出,每个头部的计算公式如下:

其中 是 token 的嵌入(第一层)或上一层的输出,

为可学习的参数,且 为每个头部的维数。此外,原始 Transformer 中通过绝对位置编码来捕获序列信息,而 FLAT 中则使用了 Lattice 的「相对位置」进行编码。

2.2 将 Lattice 转化为平面结构

基于词汇表从字符得到一个 Lattice 结构后,我们可以将其展成平面。Flat-lattice 可以被定义为一系列「片段」(span)的集合,每个片段对应一个 「token」、一个 「head」 与一个 「tail」,其中 token 是一个字符或词语,head 与 tail 定义该 token 的首字符与尾字符的在原始序列中的位置索引。对于字符来说,head 与 tail 是相同的。

我们可以通过一个简单的算法来将 flat-lattice 恢复到原始的结构:首先选择 head 与 tail 相同的 token,恢复字符序列;然后对于其他 token 基于 head 与 tail 构建跳跃路径。由于上述转换是可恢复的,文章假定 flat-lattice 能够保持 lattice 原始结构中的所有信息。

2.3 片段的相对位置编码

Flat-lattice 结构由不同长度的片段组成,为了编码片段之间的交互,本文提出了一种编码片段相对位置的方法:对于两个片段 ,他们之间存在三种关系:「相交」「包含」「分离」,这取决与其头与尾的位置。我们将通过一个密集向量来建模这些关系,而不是直接对其进行编码,以包含片段间的更多的细节信息。具体来说,令 表示片段 的头位置与尾位置,我们将通过以下四种相对距离来表明 之间的关系:

最终的相对位置编码通过四个距离的简单非线性变化得到:

其中 是可学习的参数, 表示连接算子(加权和), 的计算方式与原始 Transformer 相同:

其中 表示四种距离中的一种, 表示位置编码的维数的索引(具体的某一维,根据奇偶决定是正弦还是余弦)。自注意力的计算方式采用了原始方法的一个变种(与 transfomer-XL 和 XLNet 相同),具体公式为:

其中 为可学习的参数。公式 (1) 中的 会被 替代,后续的计算方式与原始 Transformer 相同。

经过 FLAT 之后,我们仅将得到的字符表征进行输出,连接到「条件随机场」中进行实体识别(这一部分的原理之后会通过其他文章详述)。FLAT 的整体结构如下图所示:

3 实验

论文使用了四种中文 NER 数据集进行模型评估,基线模型选用 BiLSTM-CRF 与 TENER,并针对不同的对比使用了不同的词汇表。总体跑分(平均 F1 score)结果如下所示,总的来看,不被 mask 的完整 FLAT 模型在所有数据集上均取得了最佳表现。

进一步地,为了检验 FLAT 的两大优势:字符与自包含词语的直接交互以及对长距离依赖的建模,论文分别对自包含词语与字符之间以及长距离词语之间的 attention 进行遮罩后进行了测试,结果表明「自包含词语」相较于「长距离依赖」带来了更大的性能下降。

在计算效能方面,不同模型在 Ontonotes 数据集上的推理速度结果比较如下图所示,由于 FLAT 的简洁性,其可以更有效的进行并行计算,大幅提升推理速度。

此外,论文还评估了 FLAT 相比 TENER 在 NER 上的具体性能提升,以及 FLAT 与 BERT 的兼容性,具体结果可以参考原文。

4 总结

本文提出了一种包含词汇信息的 Flat-lattice Transformer 模型,用于中文 NER 任务。模型的核心是将 Lattice 结构转化为一系列片段的集合,并融入可训练的相对位置编码。试验结果表明模型在预测性能与推理速度上都要优于其他基于词汇的模型。

PS:在相关工作中,作者提到了一篇将 Lattice 与 Transformer 结合的类似文章:「Porous Lattice Transformer」,并指出 FLAT 与模型的主要区别在于对位置信息的表示差异。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-12-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 口仆 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
AutoDL算力租用++Pycharm中SSH、SFTP连接远程服务器[通俗易懂]
创建一个新的Pycharm项目(如果你的代码在服务器上,你需要用一个新的纯Python项目同步服务器上的项目,那么进行这一步)
全栈程序员站长
2022/09/07
9K0
AutoDL算力租用++Pycharm中SSH、SFTP连接远程服务器[通俗易懂]
Pycharm远程连接服务器(windows下远程修改服务器代码)[通俗易懂]
http://blog.csdn.net/duankaifei/article/details/41898641
全栈程序员站长
2022/09/27
10.3K0
Pycharm远程连接服务器(windows下远程修改服务器代码)[通俗易懂]
pycharm无法连接服务器_pycharm部署项目到服务器
Pycharm 连接服务器是最为常用的内容,本文记录了 Pycharm 连接服务器的方法。
全栈程序员站长
2022/09/28
5K0
pycharm无法连接服务器_pycharm部署项目到服务器
django服务器_pycharm配置远程服务器解释器
可以看到,刚刚新建的test环境右边的[SSH configuration]中已经出现了一个服务器地址名。按下图红框操作
全栈程序员站长
2022/11/16
1K0
django服务器_pycharm配置远程服务器解释器
pycharm本地远程连接服务器,并在本地调试服务器代码
以pycharm professional 2019.1版本为例(使用学校邮箱注册,可以走教育通道) 本地系统:Ubuntu16.04
烤粽子
2021/07/07
8.5K0
pycharm本地远程连接服务器,并在本地调试服务器代码
pycharm远程部署_远程连接服务器失败
File → Settings → Project:XXX →Python Interpreter
全栈程序员站长
2022/09/25
24.3K0
pycharm远程部署_远程连接服务器失败
Pycharm如何远程调试服务器(使用Pipenv管理虚拟环境)「建议收藏」
1.随便准备一个项目工程,在本地用Pipenv创建一个虚拟环境并生成Pipfile和pipfile.lock文件,如下:
全栈程序员站长
2022/09/27
6270
Pycharm如何远程调试服务器(使用Pipenv管理虚拟环境)「建议收藏」
Pycharm远程调试服务器代码(使用P
1.随便准备一个项目工程,在本地用Pipenv创建一个虚拟环境并生成Pipfile和pipfile.lock文件,如下:
py3study
2020/01/16
5.3K0
pycharm配置远程服务器_服务器asp环境配置
首先介绍下我本人情况,我在 windows 笔记本电脑上下载了 Pycharm 专业版,因为我本人只是用来跑代码,想把代码自动同步起来,因此特地通过 Pycharm 来远程使用 Linux 上配置好的环境,加速代码运行。当然大家也可以使用Xshell等软件,使用命令行来操作。
全栈程序员站长
2022/09/27
7K0
pycharm配置远程服务器_服务器asp环境配置
linux服务器安装pycharm_服务器
如果你想使用 pycharm 的远程 SSH 功能在服务器上跑代码,记得一定要下载 专业版(社区版不支持 SSH )。
全栈程序员站长
2022/09/27
1.9K0
linux服务器安装pycharm_服务器
termux安装ssh服务_python ssh连接
大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。 Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺
全栈程序员站长
2022/09/28
4.2K0
termux安装ssh服务_python ssh连接
[Pycharm] 远程连接服务器
File->Settings->Project->Python Interpreter
全栈程序员站长
2022/09/27
11.4K0
[Pycharm] 远程连接服务器
如何配置Pycharm实现本地编写代码远程到服务器编译并同步代码
本文主要介绍如何使用Pycharm进行远程开发,使用内网穿透工具实现异地连接服务器编译代码与项目同步。
YY的秘密代码小屋
2024/06/14
2.9K0
如何配置Pycharm实现本地编写代码远程到服务器编译并同步代码
pycharm远程部署_pycharm 远程调试
File → Settings → Project:XXX →Python Interpreter
全栈程序员站长
2022/11/17
1.9K0
pycharm远程部署_pycharm 远程调试
Pycharm配置远程调试
在搞深度学习的时候,我们在本地开发,但是需要在服务器去运行工程,所以需要使用Pycharm进行远程配置,可以实现本地代码自动同步到服务器,并在本地使用服务器的解释器。
代码的路
2023/09/06
8830
Pycharm配置远程调试
Pycharm 实现远程部署和调试,原来这么简单
一般代码本地调试完成后,需要运行到服务器上,比如自动化测试脚本、爬虫脚本等,所以第一步需要将项目上传到服务器,然后在服务器上进行调试和运行。
吾非同
2020/12/07
1.8K0
Pycharm 实现远程部署和调试,原来这么简单
手把手教你用Pycharm连接远程Python环境
这个要从我的一次经历说起,有一次我帮朋友爬取一些东西,由于类别不同,分了几次爬取,这一次我写好规则之后,依然正常爬取,由于我本人比较善良,加上数据量目测并不是太多,并没有使用代理ip,并且将scpay的速度控制的比较慢,一般爬取时,一般也就几分钟而已,泡一杯咖啡喝几口就完了。
Python进阶者
2021/02/05
4.7K0
手把手教你用Pycharm连接远程Python环境
使用 PyCharm 远程调试 Django 程序「建议收藏」
这阵子组内流行使用 Django 写管理端程序。大家习惯了在 Windows 上使用 PyCharm 等 IDE 快速方便地进行开发,但是由于管理端使用了一些公司的公共组件,而这些组件又只提供了 Linux 上的 Python 接口,因此必须在 Linux 上运行 Django 程序。值得庆幸的是,大多数的 IDE 都提供了远程调试功能, PyCharm 也可以经过简单配置进行远程调试。
全栈程序员站长
2022/09/27
1.9K0
PyCharm 配置远程python解释器和在本地修改服务器代码
先说说自己的使用场景,我是在什么情况下,需要将IDE配置成这样的环境来方便我的工作。
Lansonli
2021/10/09
1.5K0
云服务器上运行python程序(PyCharm本地编辑同步服务器+Anaconda)挂载跑实验详细教程[通俗易懂]
背景:前段时间帮学长跑实验,在电脑上挂着得跑15个小时左右。白天跑,半夜跑,跑了5、6次,一次因为电脑死机,一次因为PyCharm闪退。跑了那么久全白费,想想就气。而且在本地跑实验十分占用CPU等资源,耗电又有风险。想着自己还有个服务器,这2天就捣鼓了下怎么在服务器上跑实验。总结下步骤,避免大家采坑。
全栈程序员站长
2022/09/12
9.6K0
云服务器上运行python程序(PyCharm本地编辑同步服务器+Anaconda)挂载跑实验详细教程[通俗易懂]
推荐阅读
相关推荐
AutoDL算力租用++Pycharm中SSH、SFTP连接远程服务器[通俗易懂]
更多 >
交个朋友
加入HAI高性能应用服务器交流群
探索HAI应用新境界 共享实践心得
加入架构与运维学习入门群
系统架构设计入门 运维体系构建指南
加入架构与运维工作实战群
高并发系统设计 运维自动化实践
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档