论文解读系列| 03:【NER】FGN模型详解

简介: 汉字作为象形文字有其潜在的特殊字形信息,而这一点经常被忽视。FGN是一种将字形信息融入网络结构的中文NER方法。除了用一个新型CNN对字形信息进行编码外,该方法可以通过融合机制提取字符分布式表示和字形表示之间的交互信息。

基本信息

论文地址:
https://arxiv.org/abs/2001.05272

论文代码:FGN

更多、更及时内容欢迎留意微信公众号小窗幽记机器学习

摘要

汉字作为象形文字有其潜在的特殊字形信息,而这一点经常被忽视。FGN是一种将字形信息融入网络结构的中文NER方法。除了用一个新型CNN对字形信息进行编码外,该方法可以通过融合机制提取字符分布式表示字形表示之间的交互信息。

FGN主要有2个创新点:

  • (1)FGN 提出一种新型的CNN结构,即CGS-CNN,以获取字形信息相邻图之间的交互信息
  • (2)提出一种滑动窗口和注意机制来融合每个字符的BERT表示字形表示。这种方法可以捕获语境和字形之间潜在交互知识。

FGN在4个中文NER数据集上进行了实验。实验表明,FGN+LSTM-CRF在中文NER上刷新记录。

模型结构

FGN可以分为三个阶段:表示阶段、融合阶段和标记阶段。文章也遵循基于字符的序列标签的策略进行中文NER。

image.png

表示阶段

汉字表示主要包括来自BERT的字符表示基于CGS-CNN的字形表示。这些代表的细节表示方法如下。

BERT:BERT是一个多层Transformer编码器,可以对单词或字符进行分布式表示。文章使用预先训练好的中文BERT来编码句子中的每个字符。与一般的fine-tuning策略不同,首先在train data上对BERT进行微调并使用CRF层作为序列标注器(即tagger)。再冻结BERT的参数并将其转移到FGN中。实验表明这一策略确实有效。

CGS-CNN: Figure 2描述了CGS-CNN的结构。

image.png

文章只选择简体中文字体来生成字形向量。这是因为之前的学者研究表明,只使用一种中文字体就能达到与七种字体相媲美的性能。CGS-CNN的输入格式是字符图序列。首先将句子转换为图序列,其中每个字符被替换成50×50的灰度图。非中文字符参数矩阵初始化为0到1之间。再使用2个3×3×3的3D卷积层来编码图序列,每个50×50的图输出8个通道,即8个filter。3D卷积可以从空间和时间两个维度上提取特征,这意味着每个字形向量可以从邻近的图形中获得额外的字形信息。使用填充(padding)对图序列的维度进行填充,以确保通过3D卷积后保持图序列的长度不变,这对基于字符的标注任务来说是必要的。3D卷积的输出再过几组2D卷积和2D最大池化,将每个图压缩成64个通道的2×2田字格结构。为了过滤噪音和空白像素,将2×2结构拉平,并使用1D最大池化来提取每个字符的字形向量。字形向量的向量的大小被设定为64,这比Tianzige-CNN输出1024维小得多。与Glyce模型不同,Glyce使用图像分类任务来学习字形表示,而CGS-CNN在领域数据集中训练整个NER模型时学习CGS-CNN的参数。

融合阶段

文章中使用一个滑动窗口来滑动BERT表示结果和字形表示结果。在滑动窗口中,对每个slice pair计算外积(outer product)以捕捉局部的交互特征。再用Slice-Attention来平衡每个slice pair的重要性,并将它们结合起来,输出一个融合表征。

不同步的滑动窗口(Out-of-sync Sliding Window)

滑动窗口此前已被应用于多模态情感计算。使用滑动窗口的原因是,直接用外积融合向量将指数级地扩大向量大小。这会增加后续网络结构的空间复杂性和时间复杂性。同时,这种方法要求多模态表征具有相同的维度尺寸,这不适合同时滑动BERT向量和字形向量。因为BERT的字符表示比字形表示有更丰富的语义信息,需要更大的向量尺寸。文章使用一个不同步(out-of-sync)的滑动窗口以满足不同的向量大小,同时保持相同的slice数。

假设有一个汉字,其字符向量定义为$c_{-} v \in$ $\mathbb{R}^{d^c}$其字形向量为$g_{-} v \in \mathbb{R}^{d^g}$,其中$d^c$和$d^g$分别表示字符向量和字形向量的维度。为确保这两个向量在通过滑动窗口后保持相同数量的slice数,滑动窗口的设置需要满足以下限制:
$$ n=\frac{d^c-k^c}{s^c}+1=\frac{d^g-k^g}{s^g}+1, n \in \mathrm{N}^* $$
其中$n$是一个正整数,代表两个向量的slice数;$k^c$和$s^c$分别表示字符向量的滑动窗口大小和stride的大小。$k^g$和$s^g$分别表示字形向量的滑动窗口大小和跨度stride的大小。为满足上述限制文章使用的策略是限制滑动窗口的超参数,使$d^c$,$k^c$,$s^c$分别是$d^g$,$k^g$,$s^g$的整数倍。为了得到slice pairs,首先计算每一步(即一个stride)滑动窗口的左边界索引位置:

image.png

其中$p_{(i)}^c$和$p_{(i)}^g$分别代表字符和字形向量在第$i$步的滑动窗口的边界索引位置。可以通过以下公式获得每个slice:

image.png

其中为$c_{-} s_{(i)}$和$g_{-} s_{(i)}$分别表示两个向量中的第$i$个slice。$c_{-} v_{(p_{(i)}^c+1)}$表示$c_{-} v$在第$(p_{(i)}^c+1)$个维度的值。为了从局部角度融合两个slice,采用外积法来生成一个交互式张量,如公式所示:

image.png

其中 $m_i$ 表示第 $i$ 个slice pair的融合张量,$c_{-} v_{(p_{(i)}^c+1)} g_{-} v_{(p_{(i)}^g+1)}$表示两者相乘。

再将 $m_i$ 拉平为 $m_i^{\prime} \in \mathbb{R}^{d^c d^g}$。每个字符的 slices 表征可以表示为:

$$ m^{\prime}=\left\{m_1^{\prime}, m_2^{\prime}, \ldots m_{n-1}^{\prime}, m_n^{\prime}\right\}, m^{\prime} \in \mathbb{R}^{n \times\left(k^c c^g\right)} $$

其中 $m^{\prime}$ 包含$n$个slice pairs的融合结果向量,每个向量的维度大小是$k^c k^g$。

Slice-Attention

外积(outer product)为字符级的表示提供了交互式信息,但是与此同时也产生了更多的噪音,因为许多特征是不相关的。参照注意力机制,文章提出了Slice-Attention("切片-注意力"),它可以自适应地量化每个slice pair的重要性,并将它们结合起来以表征一个字符。slice pair的重要性可以如下计算:

image.png

其中,$a_i$表示第$i$个slice pair 的重要性值。Sigmoid函数可以将向量的值范围限制在0和1之间,这样可以确保后续的点乘计算有意义。最终通过加权计算得到每个字符的融合向量:

image.png

序列标注阶段

在做最终的序列标记之前,将每个字符级别上的向量拼接起来。句子的最终表示可以定义为$x=\{x_1,x_2,...,x_\tau\}$,其中$\tau$代表句子的长度。采用BiLSTM作为序列编码器,采用CRF作为解码器获取命名实体标签。简而言之,获取字符向量后直接输入到BiLSTM+CRF。

相关文章
|
JSON 编解码 人工智能
labelme 安装使用及常见问题汇总
labelme批量使用、安装、问题解决 UnicodeDecodeError: ‘gbk‘ codec can‘t decode byte 0xff in position 0 module 'labelme.utils' has no attribute 'draw_label' Polygon must have points more than 2 ModuleNotFoundError: No module named 'skimage' Inconsistent use of tabs and s
labelme 安装使用及常见问题汇总
|
搜索推荐 C++ 开发者
VSCode安装使用教程,保姆级!
本文介绍了Visual Studio Code(VS Code)的安装和基本使用,包括从官网下载安装包,按照步骤在Windows系统上安装,以及设置个性化主题。此外,还强调了安装插件以增强功能,例如安装简体中文插件,并展示了如何搜索和安装插件。VS Code作为一个免费、开源的轻量级编辑器,其丰富的扩展性和高效性使其成为开发者工具的首选。
|
API
code: 400, value is mandatory for this action
code: 400, value is mandatory for this action
5326 1
|
8月前
|
物联网 测试技术
为什么 loss 几乎没用:微调里最容易让人“自嗨”的指标
本文揭示了大模型微调中一个常见误区:过度依赖loss曲线判断训练效果。loss仅反映模型对训练数据的拟合程度,并不衡量实际表现。它可能平稳下降,但模型输出无改善甚至变差。尤其在SFT/LoRA微调中,loss易被“虚假优化”,掩盖行为偏移、泛化缺失等问题。真正关键的是人工对照输出变化,结合loss作为辅助参考,而非决策核心。
|
Linux 测试技术 调度
新工具开源!一款iOS自动化利器(附地址)
tidevice 是阿里的内部的一个小组用来做 iOS 自动化用的工具,通过逆向iOS通信协议,使用纯Python实现。目前淘宝和其他部分事业部已经全面使用了该技术,进行iOS应用的性能采集,UI自动化。
3177 0
新工具开源!一款iOS自动化利器(附地址)
|
存储 运维 监控
首次!阿里云可观测技术论文登上两大国际顶会
首次!阿里云可观测技术论文登上两大国际顶会
524 1
|
存储 缓存 算法
缓存优化利器:5分钟实现 LRU Cache,从原理到代码!
嗨,大家好!我是你们的技术小伙伴——小米。今天带大家深入了解并手写一个实用的LRU Cache(最近最少使用缓存)。LRU Cache是一种高效的数据淘汰策略,在内存有限的情况下特别有用。本文将从原理讲起,带你一步步用Java实现一个简单的LRU Cache,并探讨其在真实场景中的应用与优化方案,如线程安全、缓存持久化等。无论你是初学者还是有一定经验的开发者,都能从中受益。让我们一起动手,探索LRU Cache的魅力吧!别忘了点赞、转发和收藏哦~
918 2
|
机器学习/深度学习
《深度学习梯度消失问题:原因与解决之道》
梯度消失是深度学习训练中的常见问题,严重影响模型性能。其原因包括激活函数选择不当(如Sigmoid)、网络层次过深和权重初始化不合理。解决方法有:选择合适激活函数(如ReLU及其变种)、优化权重初始化(如Xavier、He初始化)、采用批量归一化、引入残差连接、使用LSTM等特殊结构、调整学习率及预训练加微调等策略。
1497 8
|
C语言
【C语言程序设计——循环程序设计】鸡兔同笼问题(头歌实践教学平台习题)【合集】
本教程介绍了循环控制和跳转语句的使用,包括 `for`、`while` 和 `do-while` 循环,以及 `break` 和 `continue` 语句。通过示例代码详细讲解了这些语句的应用场景,并展示了如何使用循环嵌套解决复杂问题,如计算最大公因数和模拟游戏关卡选择。最后,通过鸡兔同笼问题演示了穷举法编程的实际应用。文中还提供了编程要求、测试说明及通关代码,帮助读者掌握相关知识并完成任务。 任务描述:根据给定条件,编写程序计算鸡和兔的数量。鸡有1个头2只脚,兔子有1个头4只脚。
936 5
|
机器学习/深度学习 人工智能 安全
AI在灾害管理中的作用:提高防灾减灾能力
【10月更文挑战第8天】AI技术在灾害管理中的应用正在逐步改变我们对灾害的应对方式。通过发挥AI的优势,我们可以更有效地预防、减轻和应对自然灾害带来的挑战,为构建安全、弹性的社会做出更大贡献。