在复数域空间中构造词嵌入.

1. 位置编码

Transformer中的自注意力运算对输入序列的顺序完全不敏感,因此需要引入额外的机制建模序列的位置信息。一种常见的建模序列信息的方式是使用位置编码,即在词嵌入层将词向量和位置编码向量按位相加,比如在词表中索引为$j$、文本中位置为$pos$的词的向量表示如下:

\[f(j, pos) = f_{we}(j)+f_{pe}(pos)\]

这种位置编码中每个位置的编码向量是独立训练得到的,不同位置的编码向量之间没有明显的约束关系,因此只能建模绝对位置信息,不能建模不同位置之间的相对关系(如邻接和前驱关系)。

2. 复数位置编码

作者提出使用一个以位置为变量的向量值函数而不是词向量和位置编码之和来表示一个词。这个函数是随位置平滑变化的,用来建模词的相对位置关系,比如同一个词在两个相邻位置的词向量表示应该很接近。

不失一般性地定义此函数的值域在复数域中:

\[f(j, pos) = g_j(pos) \in \Bbb{C}^{d_z}\]

一个合理的位置编码应该满足以下两个性质:

\[g_j(pos+n) = Transform(n,g_j(pos))\] \[|g_j(pos)| \leq \delta\]

容易证明在复数域内,如果一个函数满足以上两条性质,当且仅当它采取以下形式:

\[g(pos) = z_2z_1^{pos}, \quad z_1,z_2 \in \Bbb{C},|z_1| \leq 1\]

或写作指数形式:

\[g(pos) = r_2r_1^{pos}e^{i(\theta_2+\theta_1 pos)}, \quad |r_1| \leq 1\]

在实践中可取$|r_1|=1$,此时位置编码函数可写作:

\[g_j(pos) = r_je^{i(\theta_j+\omega_j pos)}\]

其中振幅$r_j$、角频率$\omega_j$和初相位$\theta_j$是要学习的参数。对于不同的位置$pos$,同一个词$j$通过以上函数计算得到的词向量是不同的。

上述复值词向量在实现时为每个词$j$构造三个词向量,这种做法在词嵌入层引入的参数量是常规词嵌入的三倍。为了降低参数量,作者将初相$\theta_j$固定为零,结果表明该做法可以略微提高模型效果。作者进一步设计了两种参数共享方法:

3. 实验分析

作者对比了不使用位置编码、使用可学习的位置编码(PE)、使用三角函数位置编码(TPE)、不使用位置编码的复值词向量(Complex-vanilla)和本文提出的复值词向量(Complex-order)五种设置下,FastText,LSTM,CNNTransformer四种神经网络在文本分类任务上的表现。复值词向量都取得了显著提高。

作者进一步做了一些消融实验,结果表明将初相$\theta_j$设置为可学习会使性能变差;使用参数共享会略微损失性能,但能有效减少参数量。