label embedding与attention机制在层次文本分类中的简单架构——HAF

每天给你送来NLP技术干货!


来自:小任学不废

Hierarchical Attention-based 

Framework简介

层次文本分类(Hierarchical Text Classification, HTC),就是一个给定的层次标签体系(典型的是树状的结构或者有向无环图结构),预测文本的标签路径(路径中父节点标签对子节点标签存在包含关系),一般是每层都至少有一个标签,所以是一个带路径的多标签分类任务。

4415f3c866c1680c1d2f3ff1b718a1c8.jpeg

▲树状层次标签体系

层次文本分类的解决方案中有把HTC视为seq2seq问题的如seq2tree、A-PNC-B,也有把HTC视为匹配任务的如HiMatch(虽然也用了分类),更传统的是把HTC作为分类任务的如HiAGM、HMCN。

Label Embedding目前在NLP的各个任务上用的都还挺广泛的,用来增强泛化能力,在zero-shot,few-shot等等里面也很常见。而在HTC当中,Label Embedding的应用也是比较广泛的,HTC有一个层次标签体系,为了编码层次之间的关系,目前的很多效果不错的论文会用图网络等方式去编码Label embedding。

这里介绍一个把HTC作为分类任务的模型框架:Hierarchical Attention-based Framework(后文简称HAF),这个框架中用到了Label Embedding、Attention机制等方法,结构比较简单,效果也很不错。

要说这个框架也比较简单,一句话就能描述完:

HAF由多个Unit组成,每一个Unit对应层次标签体系中的一层,负责文本在对应层的编码和预测。上层Unit的预测结果会被送到下一层Unit里面,在Unit内部会在考虑上层结果的同时用当前层的label embedding与token表征做attention用来衡量文本中的token和当前层label的匹配度,从而获取text关于当前层label的编码,然后用于当前层的预测。

29d6246d73df559bf0f8e3d2099426c4.jpeg

▲HAF的大致结构

HAF框架中有几个需要解决的地方:

●label embedding怎么来的

  -要么是随机初始化

  -要么是用label的文本描述做初始化,其实也可以用一个专门的label encoder,当然还有其他的方式(比如下文要介绍的CLED中的concepted-based label embedding)

  -当然还可以使用图网络等方式对预定义好的层次标签体系中进行进一步的编码

●注意力机制需要同时考虑上一层的结果、文本的token表征、本层的label embedding三者,这个注意力怎么做;

●每一层怎么预测,本层给下层的信息是什么

除了上面的主要框架描述,有一些可选的:

●Unit可以是参数不共享的,也可以是共享的。

●Unit的结果是每一层的局部结果(Local),同时还可以有一个全局的结果(Global),两者结合,作为最后的输出

●一般Unit的顺序都是自顶向下的,也可以再加一个自底向上的Unit序列,来个双向的

此外,有一些要吐槽的,最近的工作部分包含了HTC任务,发现很多HTC的论文在评价的时候只管标签对不对,不考虑路径解码,这对于树状的标签体系问题是不大的,只要根据标签体系就可以解码出来,但是对于DAG状的标签体系可能不太合适,DAG状的应该需要解码路径的,比如下图的情况。

0d427f36eaeb591a1cf5f7f6bee669aa.jpeg

▲假设上层AB都被预测了出来,下层C和D都预测了出来,正确的路径是A->C和B->D,那么就有路径解码的问题了

其实能套上HAF的方法有很多,下面介绍两篇利用HAF作为主体架构的HTC论文:HARNN和CLED。

1.

HARNN

论文:Hierarchical Multi-label Text Classification:An Attention-based Recurrent Network Approach

发表方:中国科学技术大学,发表于CIKM-19

论文链接:

http://base.ustc.edu.cn/pdf/Wei-Huang-CIKM2019.pdf

开源代码:

https://github.com/RandolphVI/Hierarchical-Multi-Label-Text-Classification

先做一个定义层次标签体系的定义:一个层数为H的层次标签体系  表示为:   ,其中  是第i层的label的集合,每一层的label的数量为   。

ca4f94dd5a0f13bf8604b42946196b71.png

▲模型整体结构

HARNN是一个RNN的结构,模型包含如下三个部分,结构如上图所示,可以看出HARL模块就是我们上面介绍的HAF框架:

●Documentation Representation Layer,也就是Embedding模块

●Hierarchical Attention-based Recurrent Layer(HARL),这个是这篇论文提出来的attention based RNN 模块

●Hybrid Predicting Layer,混合预测模块

1

Documentation Representation Layer

本模块主要获取两个representation:

●Token Representation Vectors: 给定一个长度为N的文本序列

  ■将文本过word2vec获取每个token的embedding vector

  ■然后过BILSTM,拼接前向和后向的向量,获取每个token的表征向量V ,  ,其中u是BILSTM的hidden_state的大小

   ■对于整个文本,用average pooling获取整句的表征  ,   

Hierarchical Label Representation Vectors

   ■对于整个多层标签体系,随机为每个Label生成一个embedding

   ■然后按照多层标签体系组装成embedding的Hierarchical category representation vectors S,   其中H是多层标签体系的层数,   是一个   的矩阵,是第i层的所有标签的embedding矩阵,  是第i层的标签的数量,  是embedding的维度。

2

Hierarchical Attention-based Recurrent Layer (HARL)

这里他们考虑使用循环神经网络去建模层级之间的关系,下面介绍一下他们提出的RNN的结构中的Unit:Hierarchical Attention-based Memory (HAM)

3b28276c3b50a452818e0b8ac50e8ada.png

HAM Unit

Hierarchical Attention-based Memory (HAM),包含三个组件:

  • Text-Category Attention(TCA):获取文本和当前层级之间的关系

  • Class Prediction Module(CPM):根据TCA的结果,CPM生成当前层级的表征,并预测当前层级的category

  • Class Dependency Module(CDM):用来生成当前层给下一层的信息

HAM unit的输入是:

  • 文本表征序列  outside_default.png

  • 当前层的label 表征  outside_default.png

  • 上一层传下来的信息   

第h层的HAM unit的整体公式如下:

cd475c2e58fdff3e7711d208a7ecc58c.png

上式中:

TAC:根据attention机制,计算当前层每个label与文本中的每个单词的attention score,从而计算出一个text-label representation

>输入是:

 :上一层的传来的信息,是之前的层对每个token的attention

●  :token 表征

●  :当前层的label 表征

>输出是:

   :第h层的text-label attention score

  :第h层的text-label representation,也就是受第h层label影响的text representation

CPM:就是预测

>输入是:

●  :由token表征平均得到的text表征

●  :text-label representation

>输出是:

●  :第h层的表征

●  :第h层每个label的sigmoid值

CDM:为的是建模不同层之间的依赖关系

>输入是:

  :第h层的text-label attention score (TAC的输出)

  :第h层每个label的sigmoid值(CPM的输出)

>输出是:

  :是第h层的所有token的attention值

接下来详细介绍三个组件:

01

Text-Category Attention (TCA)

432943e03496eabd8b45dd4f75d3e71b.png

TCA的结构

TCA层主要是为了考虑文本与本层以及之前层的信息,让本层label与text交互,使用的是attention机制:

1. 首先,让token表征与上一个Unit传过来的之前层在每个token上的attention score进行元素乘,获得文本经过之前的标签加持过的表征   ,的维度是N*2u;

2. 然后利用下面的公式获取文本中每个单词与当前层每个label的attention score   ,维度是   ,这个也是本组件的输出之一。

25fb6c957b5c446582549672eace4f6d.png

3. 最后这个attention score  与   相乘得到   ,维度是  ,然后在token方向做一个average pooling,获取本层的文本表征   ,维度是   。

02

Class Prediction Module (CPM)

本层就是预测,原始文本的平均表征   与本层的文本表征  拼接,过一层全连接,非线性映射用RELU ,获取到本层的表征  ,然后经过映射后过sigmoid获取本层的结果   。

943ece19b507a73ba7fa7b19b3905ca7.png

ff8cdf9892745a277ef3e22c11be4f42.png

03

Class Dependency Module (CDM)

CDM用来生成当前层给下一层的信息:

● 当前层不同的类别对结果的影响不同,所以他们首先用文本在本层的attention score  与CPM层生成的本层预测结果  进行元素乘,获得weighted text-label attention matrix  。

2bfe33615dd59296eaae229654876346.png

● 然后对  在label的level进行average pooling得到  ,这样得到的向量中有N个元素,是这个level中的所有label,对每个单词的attention,甚至可以说是之前所有的Level对单词的attention。

48f888b5b164bf599a22119000a468d2.png

● 最后广播一下得到这层传递给下一层的信息   ,为了在下一层对TCA中与文本表征元素乘。

cb9f541bb88b1b591d3b1b7a256a5eba.png

3

Hybrid Predicting Layer

虽然在上面的RNN结构中已经获取了每层的预测结果,但是他们认为这个是local的结果,所以要全体放在一起,再去预测一次,生成Global结果:

● 将每一层的表征  都放在一起,然后在层次的维度去做average:

33b9ba8b04f86b7a4cd4d3793b8518ac.png

● 然后过全连接,再预测

bbb3f5a79debfdd8270f02b9ba1fdec5.png

● 最后把local的结果和global的结果进行合并:参数alpha=0.5,他们做了alpha变化的实验,发现alpha=0.5的时候比单纯用Global或者Local效果要好得多。

536a9d012d8cfb40a0d6caed88330bf1.png

1915cda756c1c5eec1419b1e923e70f7.png

▲对alpha的实验

● 最后用BCE求local和global的loss,再加上L2正则,作为最后的loss。

4

模型结果

效果还是不错的,比之前的HMCN要好上不少。

898f5fae4f86dbbacca546c63796fcbb.png

1) HARNN-LG是不考虑不同层间的依赖关系;2)HARNN-LH是不考虑整个的多层结构的信息;3)HARNN-GH不考虑Local的信息

2.

CLED

论文:Concept-Based Label Embedding via Dynamic Routing for Hierarchical Text Classification

发表方:腾讯,发表于ACL2021

论文链接:

https://aclanthology.org/2021.acl-long.388/

开源代码:

https://github.com/wxpkanon/CLEDforHTC

这篇论文提出了一个Concept的概念,举个例子就是体育下面有足球、篮球、滑冰、冰壶,但其实这里面还可以分足球和篮球都是球类运动,滑冰和冰壶是冰上运动,这里面”球类运动“和”冰上运动“就是他们所谓的concept信息,这个信息可以帮助更好的建模类别之间共享的信息(这个概念我觉得挺好的还,某种程度上算是对数据集中标签层次不够细化的一个弥补吧)。那么怎么捕获concept information呢:

● 如果数据集标注了key word,则直接用

● 如果数据集没有标注key word,则利用卡方检验来抽取top n关键词

04a279472a0dab717eefbc1e70d05ec0.png

模型结构

而模型方面,他们用的整体框架也是HAF,主要包含如下的模块:

  • Text Encoder:获取token 表征

  • Concept-based Classifier Module:负责每一层的编码和分类,这也是论文中的主要模块

  • Concept Share Module:主要是根据concept和label的层次结构生成label表征

  • Label Embedding Attention Layer:主要是生成text关于这一层Label的表征

  • Classifier:就是分类

1

Text Encoder

获取文本embedding之后,使用CNN提取n-gram的特征,然后用BiGRU提取上下文特征,得到每个token的表征  。

2

Concept-based Classifier Module

3c22a8d105e96fe4c9727c53e6795017.png

2.1

Label Embedding Attention Layer

这个模块的输入是长度为|d|的文本序列的token表征S,和长度为  的第i层的label embeddings。具体步骤如下:

●计算文本表征和Label embedding的cosine similarity matrix G,G的维度是  

●使用卷积核F来提取第p个词前后长度为k的特征  , 按理说  的维度是  

●接着采用最大池化得到第p个词对第i层Label的最大关联度   (因为即使有两个label都和第p个词有关,那也只需要最大的那个就OK了)

●然后,对所有的词对第i层label的最大关联度  做softmax,获取本层label关于文本的相关分数   ,  维度是|d|,也就是这一层的labels对词的attention值

●最后,对word-embedding求加权,获得文本关于这一层的label的表征:  。outside_default.png

在CCM的模块图中可以看到,有三部分Attention Layer,分别来自三个地方:

External Knowledge经过EK Encoder得到的EK embedding与文本表征做Attention,这里的External Knowledge其实就是Label的文本描述,EK Encoder就是把label的文本描述的word embedding做averaging pooling。

Predicted soft label embedding与文本表征做Attention,这个Predicted soft label embedding就是上一层预测出来的label的EK Embedding的和。

Concept Share Module:是本层Concept的concept-based label embedding与文本表征做Attention,下面就介绍Concept的表征怎么来的

2.2

Concept Share Module

这部分主要介绍Concept的表征怎么来的。在CSM中,会先用Concepts Encoder获取concept的embedding,然后再用concepts sharing via Dynamic Routing来获取concept-based label embedding。

我们知道concept是n个keyword,至于concept的获取方式,上面已经介绍过了。

※2.2.1 Concepts Encoder

给定类别c的语料,他们会获取top-n的关键词(或者用直接标注的)

采用了两种方式获取,获取类别c的concepts的embedding  

●直接用他们的word embedding作为类别c的embedding

●将所有关键词进行k-means聚类,然后选取所有聚类中心的embedding作为类别c的embedding

接下来介绍怎么获取concept的

※2.2.2 Concepts Sharing via Dynamic Routing

他们将CapsNet中的dynamic Routing机制进行了一定的修改,让routing只在类别(l层)以及它的子类别(l+1层)之间进行。

总的思路是,某一个子类可能只与一部分的父类的concept word相关,所以让父类的每个concept word与子类做attention,尝试用父类中与子类最相关的那部分concept word去生成子类的 concept-base label embedding.

791e67ff4a4fdef696da57626e5160ba.png

Dynamic Routing步骤

其中:

● 是指某一个父类的concept i 与 子类 j 的对数先验概率,最初是0;

●然后通过softmax计算每个父类的concept i 与每个子类 j 的权重分数   ,其实就是让父类的每个concept word与子类做attention,尝试用父类中与子类最相关的那部分词去生成子类的 concept-base label embedding;

●接下来对每一个子类,将它的父类的所有concept embedding用加权  得到一个中间的label embedding   ;

●通过对中间embedding进行非线性的挤压,获得子类的 concept-based label embedding   

●根据得到的concept-based label embedding   与父类的concept i之间的相似度,更新   

●在模型的结构图中,其实还可以看到EK ENcoder有条线指向CSM,其实就是他们用label文本描述的word embedding 做 average做   ,效果比随机初始化好。

2.3

Classifier

分类器的输入来自三个Attention Layer的输出,分别是:

●  :来自上一层的结果经过Attention后得到的文本表征,

●  :来自额外知识(class definition)的word embedding求平均得到的label embedding,与文本进行attention得到的文本表征

●  :来自concept-based label embedding 与文本进行attention得到的文本表征;

三个输入拼接在一起,过线性映射,然后过softmax得到最后的输出:

3edde920c74fc05d6f1669be9115a656.png

Loss Function 用的是 cross Entropy

3

模型结果、分析和想法

f81fae9218cfeedf1c9fab5ebba8539e.png

▲比HARNN要好很多,比HIAGM也要好很多

可以看到CLED比之前的模型效果要好很多,在当时这俩数据集上是达到了SOTA,和小伙伴讨论的时候,发现了有几个点:

●WOS上其他论文如HIAGM在他们论文里面的Micro-F1(多分类的时候就是accuracy)都是85%+,Macro-F1才是79左右,不过对比了两篇论文发现数据划分不太一样,CLED的训练集数据更少,测试集数据更多,HIAGM的结果应该是他们重新跑了实验的吧。

●HARNN在DBpedia上的效果不错,但是在WOS上的效果很差,这个我考虑是数据量造成了一些影响,DBpidia的训练数据在27.8W,而WOS的训练数据只有2.8W,此外还有就是HARNN的label embedding是随机初始化的,我猜测可能会有一些影响。

再看看消融实验,分别尝试了:

  • w/o CL是去掉concept-based label embedding,

  • w/o EK是去掉额外只是那个attention模块

  • w/o PRE是去掉上一层传过来的

  • w/o reference in CSM,是去掉用EK做CSM模块的初始化

  • w/o DR是去掉dynamic Routing

04f542223ff452b8103d572c2100726b.png

虽然去掉不同的模块都有一定程度的效果折损,还可以看出去掉上一层的输入,影响最大

各个部件虽然在去掉以后都略有降低,但是降低的都不是很多,降的最多的是PRE,说明上一层传过来的结果还是比较重要的。此外本文提出的concept-based label embedding去掉以后也有一定影响,但并不是最大的,怎么说呢,这个concept的概念感觉还挺不错的(其实算是对数据集标签层次体系不够细化的弥补),虽然有一定的作用,但好像也没有那么大,哈哈。但也不排除有些数据集上上下层之间的关系本来就不太紧密,concept这个假设在某些层不成立的情况。

最后是一些想法:

●为啥不再加一个用当前label的concept生成当前Label embedding的环节,感觉是不是也可以尝试尝试

●如果Label Embedding可以过一下图网络或者TreeLSTM等等进行进一步的编码,相当于标签层次结构给编码进去(参考HIAGM、HGCRL等),效果是不是会有进一步的提升咧。

上面介绍的两篇文章的时候有点啰嗦了,不过相信看到这里应该也大概更明白HAF是个啥样子了。

那就下篇见啦(*^▽^*)


📝论文解读投稿,让你的文章被更多不同背景、不同方向的人看到,不被石沉大海,或许还能增加不少引用的呦~ 投稿加下面微信备注“投稿”即可。

最近文章

EMNLP 2022 和 COLING 2022,投哪个会议比较好?

一种全新易用的基于Word-Word关系的NER统一模型

阿里+北大 | 在梯度上做简单mask竟有如此的神奇效果

ACL'22 | 快手+中科院提出一种数据增强方法:Text Smoothing


下载一:中文版!学习TensorFlow、PyTorch、机器学习、深度学习和数据结构五件套!  后台回复【五件套】
下载二:南大模式识别PPT  后台回复【南大模式识别】

投稿或交流学习,备注:昵称-学校(公司)-方向,进入DL&NLP交流群。

方向有很多:机器学习、深度学习,python,情感分析、意见挖掘、句法分析、机器翻译、人机对话、知识图谱、语音识别等。

b8b8c2084b439506ff3f99331dbde28e.png

记得备注呦

整理不易,还望给个在看!
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1.项目代码均经过功能验证ok,确保稳定可靠运行。欢迎下载体验!下载完使用问题请私信沟通。 2.主要针对各个计算机相关专业,包括计算机科学、信息安全、数据科学与大数据技术、人工智能、通信、物联网等领域的在校学生、专业教师、企业员工。 3.项目具有丰富的拓展空间,不仅可作为入门进阶,也可直接作为毕设、课程设计、大作业、初期项目立项演示等用途。 4.当然也鼓励大家基于此进行二次开发。在使用过程,如有问题或建议,请及时沟通。 5.期待你能在项目找到乐趣和灵感,也欢迎你的分享和反馈! 【资源说明】 基于PyTorch的BERT文本分类项目python源码+项目说明+数据集+详细注释.zip 本项目仅仅提供了最基础的BERT文本分类模型,代码是作者在入门NLP时自己写的,对于初学者还算比较好理解,细节上有不足的地方,大家可以自行修改。 数据集是从清华大学的[THUCNews](http://thuctc.thunlp.org/)提取出来的部分数据。 训练集有5万条数据,分成了10类,每类5000条数据。 ```JSON {"体育": 5000, "娱乐": 5000, "家居": 5000, "房产": 5000, "教育": 5000, "时尚": 5000, "时政": 5000, "游戏": 5000, "科技": 5000, "财经": 5000} ``` 验证集有5000条数据,每类500条数据。 ```JSON {"体育": 500, "娱乐": 500, "家居": 500, "房产": 500, "教育": 500, "时尚": 500, "时政": 500, "游戏": 500, "科技": 500, "财经": 500} ``` 数据集放在了百度网盘上:链接: https://pan.baidu.com/s/1FVV8fq7vSuGSiOVnE4E_Ag 提取码: bbwv 模型描述 整个分类模型首先把句子输入到Bert预训练模型,然后将*句子的embedding*(CLS位置的Pooled output)输入给一个Linear,最后把Linear的输出输入到softmax。 ![Figure 1: Model](figure/model.png) 环境 | 硬件 | 环境 | | ---- | ---- | | GPU | GTX1080 | | RAM | 64G | | 软件 | 环境 | | ---- | ---- | | OS | Ubuntu 18.04 LTS | | CUDA | 10.2 | | PyTorch | 1.6.0 | | transformers | 3.2.0 | 结果 分类报告: ``` * Classification Report: precision recall f1-score support 体育 1.00 0.99 0.99 500 娱乐 0.99 0.92 0.96 500 家居 0.96 0.73 0.83 500 房产 0.83 0.94 0.88 500 教育 0.94 0.75 0.84 500 时尚 0.89 0.99

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值