基于自注意力机制的句子表示
相关代码实现已放置在 Github: https://github.com/kenjewu/Structured-Self-Attentive-Sentence-Embedding
句子表示的思路
句子由词所组成,所以一般首先将句子切分为连续的词,对词进行表示,然后将每个词的表示以各种组合方式组合起来表示句子。
常见的词的表示方法有:
- One-Hot 表示
- 词嵌入 (Embedding)
对于 One-Hot 表示存在的问题是,句子的词矩阵将特别稀疏,每个词的表示向量只有一个值为 1,其余全为0。并且任意两个词的表示向量 w1, w2 都是正交的,即 w1 w2T = 0 ,这样就没法表示词的语义之间的关系。而且当数据特别多的时候,此时词的个数特别大,这时候会出现维度诅咒的问题。
对于词嵌入表示方式,是将每个词通过相应的技术用低维的稠密的向量表示,如 Word2Vec, Glove, FastText 等。这样表示的词通过求两个词向量之间的余弦距离可以得到它们之间的语义相似度,并且解决了维度爆炸的问题。
Note: Word2Vec, Glove, FastText 的详细细节可阅读相关论文
词表示组合为句子表示的方法:
假设 句子 sentence : w1, w2, w3, w4
- 拼接, 即将各个词的向量表示拼接起来。
- 相加求平均, 即将各个词的向量表示相加后除词的个数。
CNN + GlobalMaxPooling
通过多个窗口大小的 卷积核抓取信息后,在卷积结果上进行全局最大池化提取特征,并将多个通道的结果拼接起来作为最后句子向量的表示。Bi-LSTM 取最后一步输出
将每个词按次序作为双向的 LSTM 神经网络的输入,取网络最后一步的输出作为句子向量的表示。
- 拼接, 即将各个词的向量表示拼接起来。
基于自注意力的句子的表示
注意力 Attention
可以直观的把注意力想象成我们人类看东西时的过程,如:当你正在和 HR 面试,你的眼睛可以看到我们视野类的所有东西,但是此时我们看的最清楚(或者印象最深) 的是正在和你交流的面试官的脸,而旁边的其他环境如桌椅板凳我们就不是那么在意。再如我们理解英文文章句子意思的时候,我们从头开始读,我们总是对当前句子和它前后的一些句子比较关注,也就是上下文,对离它很有的句子就不是那么在意。这就是注意力的直观感受。在算法设计上,我们用一组带有参数的向量或者矩阵来模拟我们的眼睛,这组参数中,数值更大的部分所对应的位置往往就是在数据相应位置中我们更在意的部分,相对的就是不那么在意的部分。
如图,0.1 与 0.2 所对应的词 w1, w3, w4 就不在那么重要,w2 最后就变得比较重要,这样在要通过词去表示句子的时候,注意力机制就能把我句子中重要的词而减少一些对句子语义有干扰的干扰词的作用。基于自注意力机制与 Bi-LSTM 结合表示句子的模型
在上图的左部分 (a) 中首先将每个词的词词向量放入一个双向的 LSTM 网络中,假定有 n 个词,LSTM 的隐藏单元个数为 u, 那在 LSTM 网络的每个时间步输出可以得到对每个时间步词向量的更高级的抽象表示 Aii,维度为 2u,则所有的词的表示就是一个 n -by-2u 的矩阵。具体计算过程如下:wt表示第 t 步的词向量,则:
h→t=LSTM→(wt,h→t−1)h←