Exploiting Positional Information for Session-based Recommendation
概
本文讨论了一些 常用 positional encoding 的 forward-awareness, backward-awareness, 并提出了一种新的 forward&backward-awareness 的位置编码. 思想挺简单的, 不过这套概念不错.
符号说明
- \(\bm{P} \in \mathbb{R}^{l \times d}\), 某个位置的位置编码, \(l\) 表示 length, \(d\) 表示 embedding 的维度.
Forward/Backward-awareness
-
在 transformer 架构中, positional encoding 被引入以期望模型能够意识到序列中的时间信息, 通常采用如下的方式注入位置信息:
\[\bm{x}_i + \bm{p}_i, \]其中 \(\bm{x}_i \in \mathbb{R}^d\) 为某个 item 的 embedding, 而 \(\bm{p}_i\) 为 positional encoding.
-
对于 session-based 推荐而言, 我们对于 positional encoding 的要求实际上要更高.
-
Forward-awareness: 位置编码 \(\bm{P} \in \mathbb{R}^{l \times d}\) 是 forward-aware 的, 若对于任意的序列长度 \(m,n \in \mathbb{Z}^+\), 存在非空位置集 \(\mathcal{A} \subset \{0, 1, \ldots, d-1\}\), 使得对于位置 \(p, q\) 而言:
\[\bm{P}_{p,\mathcal{A}}^m = \bm{P}_{q, \mathcal{A}}^n, \quad \text{ if } p = q, \\ \bm{P}_{p,\mathcal{A}}^m \not= \bm{P}_{q, \mathcal{A}}^n, \quad \text{ if } p \not= q. \\ \] -
Backward-awareness: 位置编码 \(\bm{P} \in \mathbb{R}^{l \times d}\) 是 backward-aware 的, 若对于任意的序列长度 \(m,n \in \mathbb{Z}^+\), 存在非空位置集 \(\mathcal{B} \subset \{0, 1, \ldots, d-1\}\), 使得对于位置 \(p, q\) 而言:
\[\bm{P}_{p,\mathcal{A}}^m = \bm{P}_{q, \mathcal{A}}^n, \quad \text{ if } m-p = n-q, \\ \bm{P}_{p,\mathcal{A}}^m \not= \bm{P}_{q, \mathcal{A}}^n, \quad \text{ if } m-p \not= n-q. \\ \] -
我们还是用实际的例子来理解上面的两种条件. 假设有两个序列:
\[s = [s_1, s_2, \ldots, s_m], \\ s' = [s_1', s_2', \ldots, s_n']. \\ \] -
由此, 我们可以得到它们的 embedding 表示:
\[\bm{X} = [\bm{x}_1, \bm{x}_2, \ldots, \bm{x}_m], \\ \bm{X}' = [\bm{x}_1', \bm{x}_2', \ldots, \bm{x}_n']. \\ \] -
一般的推荐模型, 都采用 learnable 的 positional encoding, 此时,
\[\bm{P}_{p, \mathcal{A}}^m = \bm{P}_{p, \mathcal{A}}, \]故该位置编码是 forward-aware 的. 但是不是 backward-aware 的.
-
在 session 推荐中, 我们常常看见 inversed 位置编码, 即:
\[\bm{x}_i + \bm{p}_{m - i + 1}, \]此时:
\[\bm{P}_{p, \mathcal{A}}^m = \bm{P}_{m- p + 1, \mathcal{A}}, \]故这种位置编码是 backward-aware 的.
-
一个位置编码是 forward-aware 的, 那么这种位置编码就能告诉模型当前位置距离起始位置的距离, 反之, 倘若一个位置是 backward-aware 的, 那么这种位置编码就能告知模型当前位置距离最后一个位置. 后者对于抓住用户最新的偏好有特别的作用.
-
可惜无论是 learnable 的, 还是 NLP 中常用的 sinusoidal positonal encoding (SDE):
\[\bm{P}_{p, 2i} = \sin(p / f(i)), \\ \bm{P}_{p, 2i + 1} = \cos(p / f(i)). \\ \]其中 \(i = 0, 1, \ldots, 2/d - 1\), \(p = 0, 1,\ldots, l-1\).
-
为了构造一种 foward&backward-aware 的位置编码, 首先我们定义 reverse sinusoidal positonal encoding (RSPE):
\[\bm{P}_{p, 2i}^l = \sin((l - p - 1) / f(i)), \\ \bm{P}_{p, 2i + 1}^l = \cos((l - p - 1) / f(i)). \\ \]其中 \(i = 0, 1, \ldots, 2/d - 1\), \(p = 0, 1,\ldots, l-1\).
-
可以证明, SDE 仅是 forward-aware 的, RSPE 仅是 backward-aware 的.
Dual Positional Encoding
-
作者的方案是:
\[\bm{P}_{p, 2i}^l = \sin(p / f(i)), \\ \bm{P}_{p, 2i + 1}^l = \cos(p / f(i)), \\ \bm{P}_{p, 2i + d/2}^l = \sin((l - p - 1) / f(i)), \\ \bm{P}_{p, 2i + 1 + d/2}^l = \cos((l - p - 1) / f(i)). \\ \]其中 \(i=0,1,\ldots, d/4\).
-
即, 我们去 embedding 的一半为 forward-aware, 另一半为 backward-aware, 最终的结果就是 forward&backward-aware 的了.