来源:2017.ICLR
使用自注意力进行句子嵌入
本文提出了一种通过引入自我注意来提取可解释句子嵌入的模型。作者不使用向量,而是使用二维矩阵来表示嵌入,矩阵的每一行都参与句子的不同部分。并且作者为模型提出了一个自注意机制和一个特殊的正则化项。并且提供了一种简单的方法来可视化句子的哪些特定部分被编码到嵌入中。
图:将所提出的句子嵌入模型应用于情感分析的示例,并结合了全连接层和 softmax 层。
- 一、模型
- 1.1双向LSTM
假设一个由n个单词组成的句子,这n个单词经过嵌入后,形成一个向量序列S,每个单词嵌入向量为d,则S的形状为n*d:
现在序列 S 中的每个条目都是相互独立的。为了获得单个句子中相邻单词之间的一些依赖性,作者使用双向 LSTM 来处理句子:
连接正向和反向LSTM的隐藏层输出,得到隐藏状态ht。设每个单向的LSTM的隐藏单元数为u,则经过双向LSTM后,每个词维度为2u。为简单起见,将所有 n 个 ht记为 H,H大小为 n×2u。
1.2 自注意力机制
为了将可变长度的句子编码为固定大小的嵌入,通过将H 中的 n 个 LSTM 隐藏向量的线性组合来实现这一点。计算线性组合使用了自注意机制。注意机制以整个 LSTM 隐藏状态 H 作为输入,并输出一个权重向量 a:
这里 Ws1 是一个形状为da*2u的权重矩阵。 ws2是大小为 da 的参数向量,其中 da 是我们可以任意设置的超参数。由于 H 的大小为n*2u,注意力权重向量 a 的大小为n。 softmax()做归一化处理,确保所有计算的权重总和为 1。然后根据a提供的权重对LSTM隐藏状态H求和,该加权和作为输入句子的向量表示m。这种向量表示通常关注句子的特定组成部分,例如一组特殊的相关单词或短语。因此,它有望反映句子中语义的一个方面或组成部分。然而,一个句子中可以有多个成分共同构成整个句子的整体语义,特别是对于长句子。
因此,为了表示句子的整体语义,需要多个 m 来关注句子的不同部分。这里执行多跳注意力。假设我们要从句子中提取 r 个不同的部分,则将 ws2 扩展为一个 r*da 矩阵,记为 Ws2,得到的权重向量 a 变成权重矩阵 A。
这里的softmax() 是沿着其输入的第二维执行的。可以将上述公式视为一个没有偏差的 2 层 MLP,其隐藏单元数为 da,参数为 {Ws2, Ws1}。
然后句子嵌入向量 m 变为 r*2u 嵌入矩阵 M。我们通过将注释矩阵 A 和 LSTM 隐藏状态 H 相乘来计算 r 加权和,得到的矩阵是句子嵌入:
- 二、惩罚项
如果注意力机制总是为所有 r 跳提供相似的总和权重,则嵌入矩阵 M 可能会遇到冗余问题。因此,需要一个惩罚项来鼓励不同注意力跳的总和权重向量的多样性。
评估多样性的最佳方法绝对是任意 2 个总和权重向量之间的 Kullback Leibler 散度。但是,原本KL的散度计算在这里并不适用。作者推测原因为这里的工作是最大化一组 KL 散度(而通常是进行最小化)。注意力权重矩阵 A 在不同的 softmax 输出单元上产生很多足够小的甚至零值,而这些大量的零使训练变得不稳定。并且KL 没有提供但作者想要的特性,即希望每一行都专注于语义的一个方面。作者在此引入一个新的惩罚术语,它克服了上述缺点。与 KL 散度惩罚相比,此项仅消耗三分之一的计算量:使用 A 的点积及其转置,减去单位矩阵,作为冗余的度量。
可以添加到下游任务的损失函数中一起进行最小化。下图为这么设计的依据(懒得翻译了):
- 三、可视化增加可解释性
由于注意力权重矩阵 A 的存在,句子嵌入的解释非常简单。对于句子嵌入矩阵 M 中的每一行,都有其对应的注意力向量 ai。该向量中的每个元素对应于该位置上token的 LSTM 隐藏状态的贡献程度。作者为嵌入矩阵 M 的每一行绘制热图。这种可视化方式给出了嵌入每个部分中编码内容的提示,增加了额外的解释层。(a、b)
第二种可视化方式可以通过对所有标注向量求和,然后将得到的权重向量归一化为总和为 1 来实现。由于它总结了句子语义的所有方面,因此可以大致了解句子的含义、嵌入主要集中在哪一部分。因此可以弄清楚嵌入考虑了哪些词,哪些词被嵌入跳过了。(c、d)
在 Age 数据集上训练的 2 个模型的热图。左列训练没有惩罚项,右列训练有 1.0 惩罚项。 (a) 和 (b) 显示了矩阵嵌入的 30 行中的 6 行所采取的详细注意力,而 (c) 和 (d) 通过总结所有 30 个注意力权重向量来显示整体注意力。