读书笔记16:A structured self-attentive sentence embedding(ICLR 2017)

https://arxiv.org/pdf/1703.03130.pdf

本文在其他文章中被提到过,被称作attentive pooling

本文的摘要开门见山,不介绍背景,不介绍别人的工作,直接就说本文提出了一个新的获取可解释的sentence embedding的方法,是通过self-attention实现的。用2D matrix代表embedding,而不是使用vector(由此推测主流的方法可能是embedding成为vector,每一个word最后就只有一个unit来表示)。模型使用了self-attention机制和一个特殊的正则项,一个附加的好处是本文模型得到的embedding可以很容易的做可视化,看出句子具体是哪些部分被编码进embedding中。最后介绍了一下实验结果,在三个数据集上取得不错的效果。

本文的摘要只有两个部分,一个是模型介绍,一个是实验介绍。模型介绍采取的是介绍模型主要特点,而非工作过程,所以从摘要中可能不能看出模型的全貌,只能支离破碎的了解一些特点。

读书笔记16:A structured self-attentive sentence embedding(ICLR 2017)_第1张图片

本文介绍技术部分只用了这一张图,整个技术部分的介绍也是围绕着这一张图展开的。

首先,模型分为两个部分,第一部分为一个bi-directional LSTM,第二部分是一个self-attention机制,用来提供给LSTM输出的hidden states加权求和的权重系数的,有了这些权重系数,再和LSTM输出的hidden state点乘之后,得到的就是想要的embedding了。

首先,有一个sentence,包含n个字符(token),也就是用一个word embedding的序列来表示,这里面的w都是代表word的意思,每一个word embedding都是d维的,下标i代表句子中的第i个word。

为了获得每一个句子的word之间的一些相关性,将S输入到双向LSTM之中,获得两个方向的hidden state

                                                                       

然后两个hidden state连接在一起形成一个hidden state,这样句子就由原来的S变成了hidden state表示的H了,

模型的目的是将任意长的句子都embed成为固定长度的representation,接下来的步骤就是用attention机制将sentence进一步embedding,attention机制的计算是将整个hidden state H作为输入,然后按下式得到attention权重

                                                          

是一个的矩阵,u是双向LSTM单一方向的输出的hidden state的维度,两个方向合起来就是2u,也就是说,会将原本2u×n的H变为 × n的矩阵,接着经过tanh之后,这个式子里的是一个维度是的向量,和tanh的输出点乘之后得到1×n的一个矩阵,也就是对句子的各个word进行加权求和用的attention weights了。但是有一个问题还没有解决,那就是这样生成一个vector 作为加权求和的权重,对于一个句子的不同word的关注程度就只有一种,也就是只能按照一种方式来对句子进行embed,但是同一个句子,我们希望抓取它的不同方面的信息,也就是希望有多组不同的attention weight,以便于从不同的角度解析同一个句子,因此原来的vector 就升级成了r个不同的合并起来的矩阵,原来的式子也变化为

                                                          

这时得到的A是r组不同的attention weights,而不是一组了。之后,用这个A获得固定长度的embedding按下式计算

                                                                                  

M就是最终的embedding结果,尺寸是r×2u,每一行都是把H中的n个不同的hidden state按照权重加权求和得到的,每一行采取的加权求和的权重系数都是不同的。

如果模型仅仅止于此,那么效果可能和设想的不完全一样,可能出现的问题是M虽然有r行,应该是代表从不同的角度对句子进行的embedding,但是如果不加以限制,那么很可能有多行学到的embedding是一样的,造成冗余。为了解决这个问题,作者首先采取的是用KL divergence表征任意两组attention weight vector之间的区分度,然后最大化这个项,但是效果很不好,一般来讲KL都是用在两个之间的,这么一组多个之间用可能是造成不好的原因。这个方法不行,作者就将penalization term换成了

                                                                      

这里的范数是frobenius范数,就是元素绝对值平方和,由于A中的元素都是经过softmax的,因此每一行(代表一组加权求和系数)的元素值求和为1,这个penalization项有两层含义,一个是使得的对角元素尽可能接近1,也就是让每一组attention weights的分布更加集中在某几个word上,极端情况就是权重只集中在一个word上面,这样的对角元素就变成1了,权重分散到越多的word上,由于权重系数的和始终是1,权重系数平方求和得到的值(也就是中对应的对角元素,考虑第i组权重系数,就对应的第i个对角元素)就越小。第二个含义就是使得不同组的权重系数的分布尽可能差别大,考虑中第i行第j列的元素,有,也就是,这个元素是第i组权重系数和第j组权重系数对应元素相乘求和得到的,这两个分布的相似度越高,这个求和值就越大,若是分布完全不同,每个位置都至多只有一组权重系数有取值的话,那么相乘求和得到的就是0。

你可能感兴趣的:(读书笔记16:A structured self-attentive sentence embedding(ICLR 2017))