NLP&NLU

【NLP论文笔记】A Structured Self-atten

2019-06-26  本文已影响0人  蘑菇轰炸机

本文主要用于记录IBM发表于2017年的一篇论文(引用量超过300)。该论文主要是提出了一种句向量的自注意力模型(self-attention)。本笔记主要为方便初学者快速入门,以及自我回顾。

论文链接:https://arxiv.org/pdf/1703.03130.pdf
Github: https://github.com/ExplorerFreda/Structured-Self-Attentive-Sentence-Embedding

基本目录如下:

  1. 摘要
  2. 核心思想
  3. 总结

------------------第一菇 - 摘要------------------

1.1 论文摘要

本文提出了一种新的基于“自注意力”机制的句向量表达方式。传统句向量表达通常是一个1维向量,而本文提出的句向量模型是一个2维矩阵,其中每一行都有各自不同的权重来构成该句子的向量表达。基于此种句向量模型,论文还同时提出了一种“自注意力”机制和一种特殊的模型正则化的方法。利用该种模型的好处就是句子的向量表达变得可视化,让我们清晰看到哪一部分最构成句子的向量。利用该种句向量表达,论文作者在3个公开数据集任务上均取得了优异的效果。

------------------第二菇 - 核心思想------------------

1.1 句向量的表达

在word2vec刚流行的那个年代,大家都致力去寻找更好的词向量的表达,但是却没怎么重视过句向量的表达(因为句子本身由词组成,都有了词的向量,那句向量岂不是理所当然就出来了😄~)。所以,业界主流的生成句向量方法,除了那些非监督的直接的句向量生成方法,更多的情况是人们根据下游任务的需求,来直接有监督的训练句向量的生成(输入是该句的词向量序列)。比如,最简单的就是取RNN的最后一个隐状态的值,作为整个句子的句向量(因为假设句子之前的信息都已经存储进来了),再升级一点,无非就是双向的句子输入,再叠加等等。当然,这种做法的弊端也很明显,因为很难将整个句子的所有语义信息都压缩到最后一个隐状态的值中。因此本文才提出来了一种新的句向量的生成办法,为了能将句子中的每一个词的信息都记录表达下来。而新的生成办法,就是基于文中新提出的“自注意力”机制!

1.2 自注意力机制

本文提出的句向量模型主要包括两部分,第一部分就是一个双向LSTM网络,第二部分是自学习机制。这里我们也跟随文章,用该模型去做一个情感分类的任务。直接上图,方便大家有个全局概念,我再一步步解析。

model.jpg

首先,假设我们有一个句子,含有n个词,表示为,

S = (w_1, w_2, ..., w_n)
其实w_1就代表词wd维词向量,因此,S就是一个n*d的二维矩阵。

然后,我们将S输入到双向LSTM网络,则针对每一个时序(词
)我们能得到一个维度为2u的隐状态向量(假设隐藏层个数为u,又是双向,所以是2倍),则经过网络处理后,我们能得到一个新的隐状态矩阵,

H = (h_1, h_2, ..., h_n)

而我们最终的目标是得到一个固定维度的句向量,因此,我们就需要去寻找上述隐状态的一组线性组合参数。比如,我们的参数是(1,0,0,..0),则表示,我们仅仅用第一个隐状态的值就代表了整个句子。因此,为了得到这样一组线性组合的参数,作者在这边设计了一层简单的神经网络,计算公式为,

a = softmax(w_{s2}tanh(W_{s1}H^T))
其中W_{s1}就是权重矩阵,其维度为d_a*2u,然后w_{s2}就是一组d_a维向量,softmax用以确保权重归一化。然后,向量a就是我们要寻找的一组线性组合参数。

最后,将a与上面求得的H点乘,我们也就得到了最终的句向量表达,后面的就根据下游分类任务,与普通的处理一样。

当然,这种计算的处理机制,往往只会让句子聚焦于其特定的部分,在短句情况下还好,但是在长句的情况下,往往会有多处地方值得我们去聚焦注意,因此,为了更好的表达整个句子的信息,我们需要对句子进行多次自注意力处理,因此,我们将上面的w_{s2}进行扩维度,变成r*d_a矩阵,相当于进行了r次聚焦操作,且每次,聚焦的地方不一样,因此,我们最后得到的线性组合就不止一种,表示为,

A = softmax(W_{s2}tanh(W_{s1}H^T))

因此,最终的句向量M,也被表示为r*2u的矩阵,

M = AH

当然,上述的解法也不是完美的,因为,很有可能,模型每一次学到的线性组合是一样的,因此,我们需要对此添加惩罚项,来鼓励模型学到更多特异性的组合参数。文中设计的一种,惩罚项就是来考虑矩阵A的冗余度,计算公式如下,

P = \left \|(AA^T - I) \right \|_{F}^{2}
底标F就是矩阵的Frobenius 范数,因此该惩罚项也会加入到最终的损失函数中去。大家就想像两种极端情况,比如学到的参数是一样的,那是不是上式子就会偏大。具体大家也可以看下原论文中的解释,应该也是十分清晰易懂的~(当然我相信肯定还有其他的惩罚项设计~)

至此,整一套句向量的生成机制算是讲清楚了。而且,该生成方法还有一个巨大的好处就是,我们可以根据线性的权重来画句子的热力图,让我们清楚的看到,网络最终到底聚焦在了句子的哪一部分。这边也贴一张原文的图,来加深大家的理解。(从中也可以很清晰的看到,加了惩罚项以后,句子的关注点也变多了)

sentence_heatmap.jpg
2.3 论文实验结果分析

论文作者把自己提出的句向量生成算法实现了一遍,并在三个数据集上做了实验。有兴趣的读者可以自行研读实验经过及结果,这里不作展开。而且本文开头也贴了github地址,有兴趣的读者可以去研究一下。

------------------第三菇 - 总结------------------

3.1 总结

到这里,整篇论文的核心思想及其创新点已经说清楚了。本论文主要集中在于阐述一种基于自注意力机制的新的句向量的生成方法,并在多个数据集上验证了该方法的有效性。

简单总结一下本文就是先罗列了一下该论文的摘要,然后谈了一些句向量的生成方法,之后重点介绍了一下自注意力机制的句向量生成方法。总的来说,IBM提出这种句向量的生成方法,也开辟了后续更多nlp中的attention的应用。希望大家读完本文后能进一步加深对该论文的理解。有说的不对的地方也请大家指出,多多交流,大家一起进步~😁

上一篇下一篇

猜你喜欢

热点阅读